사이먼's 코딩노트
[Java] 게시판 제작(13) 본문
[게시판 제작 ~ing]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
[게시물 수정/삭제 시 접근 제한]
- 게시판 제작의 다음 단계는 게시물 수정/삭제 시 접근 제한이다.
- 지난번엔 게시물 작성 시에만 로그인이 되어있지 않다면 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에 해당 게시물을 작성한 회원의 이름을 저장하고 출력해준다.
- 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.
반응형
'프로젝트 > [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 |