사이먼's 코딩노트
[Java] 게시판 제작(11) 본문
[게시판 제작 ~ing]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
[게시물 리스트에 작성자 이름 표시]
- 현재 구현된 "article list" 명령어는 게시물을 조회하면서 고유 번호, 조회수, 제목이 출력된다.
- 이번에는 게시물 리스트에 작성자 이름을 추가해봅시다.
- 먼저 Article을 생성하는 정보에 회원의 Id가 필요하다.
package org.example.dto;
public class Article extends Dto {
public String title;
public String body;
public int hit;
public int memberId; // 회원 ID
public Article(int id, String regDate, int memberId, String title, String body, int hit) {
this.id = id;
this.regDate = regDate;
this.memberId = memberId;
this.title = title;
this.body = body;
this.hit = hit;
}
public Article(int id, String regDate, int memberId, String title, String body) {
this(id, regDate, memberId, title, body, 0);
}
public void increaseHit() {
hit++;
}
}
- 위 코드는 Article.java 클래스로 Article 생성 시 필요한 기본 변수들을 정리해 놓았다.
- 해당 부분에서 게시물 리스트에 작성자 이름을 표시하기 위해서는 Article 생성자의 매개변수에 memberId를 추가해준다.
articles.add(new Article(1, Util.getNowDateStr(), 1, "제목1", "내용1", 10));
- 추가로 ArticleController.java 클래스에서 테스트 데이터를 만들 때 위에서 추가한 memberId 인자를 추가해준다.
for(int i = forListArticles.size() - 1; i >= 0; i--) {
Article article = forListArticles.get(i);
String writerName = null;
List<Member> members = Container.memberDao.members;
for(Member member : members) {
if(article.memberId == member.id) {
writerName = member.name;
break;
}
}
System.out.printf("%4d | %6s | %6d | %s\n", article.id, writerName, article.hit, article.title);
}
- 마지막으로 각 컨트롤러에서 반복문을 통해 Id를 비교하면서 작성자를 저장하는 코드를 추가한다.
- 각 컨트롤러에 대한 코드는 작성된 코드가 긴 관계로 상단의 리포지터리를 참고 부탁드립니다.
- 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.
[문제점 개선]
- 현재까지 구현된 게시판 프로그램에서 문제점이 있다면 다음과 같은 문제가 있다.
- 게시물 Article은 프로그램 시작과 동시에 테스트 데이터 3개를 가지고 생성된다.
- 이 때 article write를 하면 고유 번호 4번부터 순서대로 게시물이 추가되는 것이 로직상 올바른 구조이다.
- 다른 명령어를 사용하지 않고 오직 article write만 사용하면 게시물을 추가 시 고유 번호의 증가에 대한 문제점은 없다.
- 하지만 현재 article delete를 통해 최초 테스트 데이터 중 하나를 삭제하고 article write를 하면 고유 번호가 하나씩 증가되어 쓰이지 않고 전에 쓰였던 고유 번호가 사용되면서 게시물 번호가 엉키게되는 문제점이 발생한다.
- 예를 들어 article write로 4, 5번 게시물을 추가하면 article delete로 2번 게시물을 지웠다고 가정하자, 그리고 다시 article write로 게시물을 추가하면 고유 번호는 6번이 되어야 정상이지만 5번으로 생성된다.
- 위 문제의 해결 방법은 기존의 ArticleController.java 클래스에서 각 고유 번호의 사이즈에 1을 더하는 부분을 지우고 lastId라는 새로운 변수를 생성하여 고유 번호를 1번부터 지정하도록 한다.
- 마지막으로 테스트 데이터를 만드는 makeTestData() 메서드에서는 생성자에 ID 부분을 숫자로 작성하지 않고 생성된 변수 lastId를 사용한다.
package org.example.dao;
public abstract class Dao {
// 자식에게만 lastId 변수를 물려주겠다. (public, private를 쓰지않고)
protected int lastId;
Dao() {
lastId = 0;
}
public int getLastId() {
return lastId;
}
public int getNewId() {
return lastId + 1;
}
}
Container.articleDao.add(new Article(Container.articleDao.getNewId(), Util.getNowDateStr(), 1, "제목1", "내용1", 10));
Container.articleDao.add(new Article(Container.articleDao.getNewId(), Util.getNowDateStr(), 2, "제목2", "내용2", 32));
Container.articleDao.add(new Article(Container.articleDao.getNewId(), Util.getNowDateStr(), 2, "제목3", "내용3", 103));
- 각 컨트롤러에 대한 코드는 작성된 코드가 긴 관계로 상단의 리포지터리를 참고 부탁드립니다.
[로그인 기능 추가]
- 게시판 제작의 다음 단계는 로그인 기능입니다.
- 로그인 기능은 member login이라는 명령어와 함께 로그인이 가능하도록 하고, 기존에 회원을 조회하여 회원 정보가 없다면 로그인이 불가능하고 비밀번호가 틀리다면 다시 비밀번호를 입력하도록 한다.
- 먼저 MemberController.java 클래스에 명령어 케이스를 추가해준다.
case "login":
doLogin();
break;
- 그 다음은 MemberController.java 클래스에 doLogin과 관련된 메서드를 아래과 같이 추가해준다.
private void doLogin() {
System.out.printf("로그인 아이디 : ");
String loginId = sc.nextLine();
System.out.printf("로그인 비번 : ");
String loginPw = sc.nextLine();
// 입력받은 아이디에 해당하는 회원이 존재하는지 확인
Member member = getMemberByLoginId(loginId);
if(member == null) {
System.out.println("해당 회원은 존재하지 않습니다.");
return;
}
if(member.loginPw.equals(loginPw) == false) {
System.out.println("비밀번호를 다시 입력해주세요.");
return;
}
loginedMember = member;
System.out.printf("로그인 성공!! %s님 환영합니다!!\n", loginedMember.name);
}
private Member getMemberByLoginId(String loginId) {
int index = getMemberIndexByLoginId(loginId);
if(index == -1) {
return null;
}
return members.get(index);
}
- 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.
반응형
'프로젝트 > [Java] 게시판 제작' 카테고리의 다른 글
[Java] 게시판 제작(13) (0) | 2024.03.25 |
---|---|
[Java] 게시판 제작(12) (0) | 2024.03.25 |
[Java] 게시판 제작(10) (0) | 2024.03.07 |
[Java] 게시판 제작(9) (0) | 2024.03.04 |
[Java] 게시판 제작(8) (0) | 2024.03.04 |