사이먼's 코딩노트

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

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

[Java] 게시판 제작(11)

simonpark817 2024. 3. 10. 19:10

[게시판 제작 ~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 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를 비교하면서 작성자를 저장하는 코드를 추가한다.

 

  • 각 컨트롤러에 대한 코드는 작성된 코드가 긴 관계로 상단의 리포지터리를 참고 부탁드립니다.

 

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

개선된 게시판 동작 3

 

[문제점 개선]

  • 현재까지 구현된 게시판 프로그램에서 문제점이 있다면 다음과 같은 문제가 있다.
  • 게시물 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);
}

 

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

개선된 게시판 동작 4

 

반응형

'프로젝트 > [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