사이먼's 코딩노트

[Java] 게시판 제작(13) 본문

프로젝트/[Java] 게시판 제작

[Java] 게시판 제작(13)

simonpark817 2024. 3. 25. 22:30

[게시판 제작 ~ing]

 

GitHub - psm817/full_stack_proj_2024_03

Contribute to psm817/full_stack_proj_2024_03 development by creating an account on GitHub.

github.com

 

[게시물 수정/삭제 시 접근 제한]

  • 게시판 제작의 다음 단계는 게시물 수정/삭제 시 접근 제한이다.
  • 지난번엔 게시물 작성 시에만 로그인이 되어있지 않다면 article write를 수행하지 못하도록 제한하였다.
  • 이번에는 게시물 수정 및 삭제 시에 로그인이 되어있지 않다면 article modify와 article delete를 수행하지 못하도록 함과 동시에 로그인 된 회원은 오직 자신의 게시물과 수정 및 삭제 가능하도록 한다.

 

  • 다음은 ArticleController.java 클래스의 doModify()와 doDelete() 메서드를 수정한 코드이다.
public void doModify(String cmd) {
    String[] cmdBits = cmd.split(" ");
    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = getArticleById(id);

    if(foundArticle == null) {
        System.out.printf("%d번 게시물이 존재하지 않습니다.\n", id);
        return;
    }

    if(foundArticle.memberId != loginedMember.id) {
        System.out.println("권한이 없습니다.");
        return;
    }

    System.out.printf("제목 : ");
    String title = sc.nextLine();
    System.out.printf("내용 : ");
    String body = sc.nextLine();

    foundArticle.title = title;
    foundArticle.body = body;
    System.out.printf("%d번 게시물이 수정되었습니다.\n", id);
}

public void doDelete(String cmd) {
    String[] cmdBits = cmd.split(" ");
    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = getArticleById(id);

    if(foundArticle == null) {
        System.out.printf("%d번 게시물이 존재하지 않습니다.\n", id);
        return;
    }

    if(foundArticle.memberId != loginedMember.id) {
        System.out.println("권한이 없습니다.");
        return;
    }

    articles.remove(foundArticle);
    System.out.printf("%d번 게시물이 삭제되었습니다.\n", id);
}
  • 각 메서드에 추가된 코드는 하나의 조건문이다.
  • 만약 수정 또는 삭제하고자 하는 게시물인 foundArticle의 memberId와 로그인 된 회원인 loginedMember의 id가 서로 다르다면 권한이 없습니다라는 출력문과 함께 해당 명령어의 기능을 제한한다.

 

[명령어 실행 전 가드에 의한 요청 필터링]

  • 현재 로그인이 되어야만 가능한 명령어는 article write 뿐이다.
  • 해당 명령어 외에 반드시 로그인이 되어야만 실행이 가능한 명령어가 있고, 로그아웃을 해야만 실행이 가능한 명령어가 있다.
  • 위와 같은 세부적인 기능을 위해 명령어를 실행하기 전 가드 역할을 하는 switch문을 만들어 필터링을 하는 작업을 해야한다.

 

  • 다음은 App.java 클래스에서 추가된 코드의 일부분이다.
String actionName = controllerName + "/" + actionMethodName;

switch(actionName) {
    case "article/write" :
    case "article/modify" :
    case "article/delete" :
    case "member/logout" :
        if(Controller.isLogined() == false) {
            System.out.println("로그인 후 이용해주세요.");
            continue;
        }
        break;
}

switch(actionName) {
    case "member/join" :
    case "member/login" :
        if(Controller.isLogined()) {
            System.out.println("로그아웃 후 이용해주세요.");
            continue;
        }
        break;
}
  • App.java 클래스에서 사용자가 입력한 명령어를 받아 Controller에 연결하여 doAction() 메서드를 실행시키기 전, 가드 역할을 하는 switch문을 추가했다.
  • actionName은 controllerName과 actionMethodName을 합친 문자열로 예를 들어 게시물 작성이면 actionName은 "article/write" 를 담고있다.
  • actionName을 조건으로 로그인이 필요한 명령어끼리, 로그아웃이 필요한 명령어끼리 묶어 요청 필터링을 한다.
  • 전에 이미 "article write"와 "member login", "member logout"은 해당 명령어를 실행하는 메서드에서 직접적인 필터링을 해줬기 때문에 해당 코드는 삭제를 하고 App에서 초기 제한을 걸도록 한다.

 

[문제점 개선]

  • 현재까지 구현된 게시판 프로그램에서 문제점이 있다면 다음과 같다.
  • "article list"을 통해 게시물 리스트 조회를 할 때, 작성자 부분에 게시물을 작성한 사람의 이름이 아닌 해당 회원의 id 숫자 값을 보여준다.
  • 이번에는 해당 부분을 숫자가 아닌 작성자 이름으로 수정해봅시다.

 

  • 다음은 ArticleController.java 클래스의 showList() 메서드를 수정한 코드이다.
public void showList(String cmd) {
    if(articles.size() == 0) {
        System.out.println("게시물이 없습니다.");
        return;
    }

    String searchKeyword = cmd.substring("article list".length()).trim();

    List<Article> forListArticle = articles;

    if(searchKeyword.length() > 0) {
        forListArticle = new ArrayList<>();

        for(Article article : articles) {
            if(article.title.contains(searchKeyword)) {
                forListArticle.add(article);
            }
        }

        if(forListArticle.size() == 0) {
            System.out.printf("%s 검색 결과, 조회된 게시물이 없습니다.\n", searchKeyword);
            return;
        }
    }


    System.out.println("번호 |   작성자 | 조회 | 제목");
    for(int i = forListArticle.size() - 1; i >= 0; i--) {
        Article article = forListArticle.get(i);

        String writerName = null;

        List<Member> members = Container.memberDao.members;

        for(Member member : members) {
            if(article.memberId == member.id) {
                writerName = member.name;
            }
        }

        System.out.printf("%4d | %5s | %4d | %s\n", article.id, writerName, article.hit, article.title);
    }
}
  • 현재 articles와 members는 모두 Dao를 통해 각 ArticleDao와 MemberDao 클래스에서 리스트를 생성하고 있으며, Dao는 Container만을 통해 연결이 가능하다.
  • 게시물 리스트에서 작성자의 id 번호가 아닌 이름이 출력되도록 하기 위해선 먼저 문자열 writerName 변수를 만들어준다.
  • 그 다음, ArticleController.java 클래스에 MemberDao를 import 시켜 members에 등록된 회원들을 모두 연결시킨다.
  • 반복문을 통해 모든 회원을 조회하면서 만약 게시물의 memberId와 회원의 id가 같다면 작성자가 일치하다는 판단 하에 writerName에 해당 게시물을 작성한 회원의 이름을 저장하고 출력해준다.

 

  • 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.

개선된 게시판 동작 6

 

 

 

 

 

반응형

'프로젝트 > [Java] 게시판 제작' 카테고리의 다른 글

[Java] 게시판 제작(15)  (0) 2024.03.27
[Java] 게시판 제작(14)  (0) 2024.03.25
[Java] 게시판 제작(12)  (0) 2024.03.25
[Java] 게시판 제작(11)  (0) 2024.03.10
[Java] 게시판 제작(10)  (0) 2024.03.07