사이먼's 코딩노트

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

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

[Java] 게시판 제작(5)

simonpark817 2024. 2. 22. 17:39

[게시판 제작 ~ing]

  • 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
  • 게시판 제작(4) 까지는 기본 게시판의 구조를 만들어보았다면, 이제부터는 보다 더 디테일한 부분들을 추가 및 수정할 예정입니다.
  • 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
 

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 detail 고유번호" 명령어를 통해 원하는 게시물의 정보를 열람할 때 마다 조회수가 1씩 늘어나도록 구현해봅시다.
  • 아래 코드는 기존 작성된 코드 중 Main 메서드의 "article list"와 "article detail" 부분과 Article 클래스 부분에 추가 및 수정 작성하였다.
class Article {
    int id;
    String regDate;
    String title;
    String body;
    int hit;
    public Article(int id, String regDate, String title, String body) {
        this.id = id;
        this.regDate = regDate;
        this.title = title;
        this.body = body;
        this.hit = 0;
    }
    public void increaseHit() {
        hit++;
    }
}
else if(cmd.equals("article list")) {
    if(articles.size() == 0) {
        System.out.println("게시물이 없습니다.");
        continue;
    }

    System.out.println("번호 | 조회수 | 제목");
    for(int i = articles.size() - 1; i >= 0; i--) {
        Article article = articles.get(i);
        System.out.printf("%4d | %4d | %s\n", article.id, article.hit, article.title);
    }

}
else if(cmd.startsWith("article detail ")) {
    String[] cmdBits = cmd.split(" ");

    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = null;

    for(int i = 0; i < articles.size(); i++) {
        Article article = articles.get(i);

        if(article.id == id) {
            foundArticle = article;
            break;
        }
    }

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

    foundArticle.increaseHit();

    System.out.printf("번호 : %d\n", foundArticle.id);
    System.out.printf("최초등록날짜 : %s\n", foundArticle.regDate);
    System.out.printf("제목 : %s\n", foundArticle.title);
    System.out.printf("내용 : %s\n", foundArticle.body);
    System.out.printf("조회수 : %d\n", foundArticle.hit);
}
  • 가장 먼저 Article 클래스에 조회수를 저장할 hit라는 변수를 만들어준다.
  • 조회수는 최초에 0이기 때문에 생성자를 통해 따로 매개변수를 받지않고 0으로 세팅해준다. [this.hit = 0]
  • 추가로 조회수는 일정하게 1씩 증가하기 때문에 Article 클래스에서 increaseHit() 라는 메서드를 만들어서 1씩 증가하도록 해준다.
  • "article list" 에서는 2가지만 수정해주면 된다. 첫번째로 번호, 조회수, 제목을 출력해주는 출력문을 수정해준다. 두번째는 서식지정자를 통해 넘겨받는 조회수를 추가한다.
  • "article detail" 에서는 게시물을 열람했을 때 실제로 조회수가 1이 증가해야되기 때문에 게시물 정보를 출력하기 전에 Article 클래스에서 생성한 increaseHit() 메서드를 호출해서 조회수 1을 증가시킨다. [foundArticle.increaseHit()]
  • 마지막으로 게시물 정보에도 마찬가지로 조회수를 보여주는 출력문을 추가한다.

 

[게시판 실행 시 테스트 데이터 생성]

  • 다음은 게시판을 최초에 실행했을 때 게시물에 무조건 "article write"를 해줘야 게시물을 확인할 수 있는 상황을 없애고자 테스트 데이터를 게시판 실행과 동시에 생성하는 메서드를 구현해보자.
  • 아래 코드는 기존 작성된 코드 중 Article 클래스 부분과 Main 클래스와 메서드, 그리고 새로 추가한 makeTestDate 메서드 부분에 추가 및 수정 작성하였다.
class Article {
    int id;
    String regDate;
    String title;
    String body;
    int hit;
    public Article(int id, String regDate, String title, String body, int hit) {
        this.id = id;
        this.regDate = regDate;
        this.title = title;
        this.body = body;
        this.hit = hit;
    }
    public Article(int id, String regDate, String title, String body) {
        this(id, regDate, title, body, 0);
    }
    public void increaseHit() {
        hit++;
    }
}
public class Main {
    private static List<Article> articles = new ArrayList<>();

    public static void main(String[] args) {
        System.out.println("== 프로그램 시작 ==");

        makeTestData();

        Scanner scanner = new Scanner(System.in);

        int lastArticleId = 0;
private static void makeTestData() {
    System.out.println("테스트 데이터를 생성합니다.");

    articles.add(new Article(1, Util.getNowDateStr(), "제목1", "내용1", 6));
    articles.add(new Article(2, Util.getNowDateStr(), "제목2", "내용2", 24));
    articles.add(new Article(3, Util.getNowDateStr(), "제목3", "내용3", 192));
}
  • 테스트 데이터에 들어갈 정보는 우리가 작성하는 게시물 정보와 동일하게 고유 번호, 날짜, 제목, 내용, 조회수이다.
  • 최초에 테스트 데이터를 생성할 때 조회수를 사용자가 원하는 숫자를 넣고 싶다면 Article 클래스의 생성자를 수정을 해야한다.
  • 기존에 있던 Article() 생성자의 매개변수에 hit 변수를 받도록 하고, 테스트 데이터가 아닌 사용자가 직접 작성한 게시물은 조회수가 0부터 시작해야되는 것은 변함이 없기 때문에 Article() 생성자를 오버로딩해준다. 오버로딩은 같은 이름의 메서드지만 매개변수의 개수나 타입이 다른 메서드를 의미한다.
  • 이렇게 Article() 생성자가 오버로딩되어 2개가 됐을 때 인자값으로 조회수를 넣거나 안넣어도 모두 정상동작을 하게 된다.
  • 매개변수에 조회수가 포함되지 않은 Article 생성자는 this메서드를 사용해서 hit 값을 0을 넘겨준다.
  • 기존의 articles은 Main 메서드에서 생성된 배열이고 지역변수이다.
  • 우리가 원하는건 makeTestData() 라는 새로운 메서드를 생성하여 articles라는 배열에 테스트 데이터를 저장하는 것이기 때문에 articles는 전역변수(인스턴스 변수)로 선언되어야 한다.
  • 그렇기 때문에 기존에 Main 메서드에 있던 배열 객체 생성 코드를 Main 클래스로 옮겨준다. 이 때 private static를 붙혀주는 것이 좋다. [private static List<Article> articles = new ArrayList<>()]
  • private를 붙이는 이유는 articles가 Main 클래스 밖에서 쓸 일이 없기 때문이다.
  • 여기까지 완성했다면 다음은 실제로 테스트 데이터를 저장하는 makeTestData() 메서드를 생성해야한다.
  • makeTestData() 메서드에는 테스트 데이터를 생성한다는 출력문과 함께 전역변수인 articles에 각 게시물 정보를 add 해준다. 이 때 Article 객체 생성과 동시에 인작값으로 생성자 매개변수를 맞춰 테스트 데이터를 넣어준다.
  • 생성된 makeTestDate() 메서드는 Main 메서드의 상단에서 호출해준다.

 

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

게시판 5차 동작

 

반응형

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

[Java] 게시판 제작(7)  (0) 2024.02.26
[Java] 게시판 제작(6)  (0) 2024.02.23
[Java] 게시판 제작(4)  (0) 2024.02.21
[Java] 게시판 제작(3)  (0) 2024.02.21
[Java] 게시판 제작(2)  (0) 2024.02.21