Spring-Boot,JPA로 질문/답변 게시판 구현(28)

Spring-Boot, JPA로 질문/잡변 게시판 구현 및 배포

자바지기님 유튜브 강의 정리

5-1 회원과 질문간의 관계 매핑 및 생성일 추가

  • 데이터베이스에서 one-to-many, many-to-one, many-to-many개념이 있는데, 회원과 질문간에도 같은 방식으로 매핑할 수 있다.

    • 1명의 회원은 여러개의 질문을 남길 수 있다.
    • 각각의 질문은 한명의 회원이 쓸 수 있다.
    • 회원 - 질문 : one - to - many / 질문 - 회원 : many - to - one
  • 관계를 맺을 때 User에서 Question에대한 목록을 가지고 있도록관계를 맺을 수 있고, Question에 String으로 되어있는 writer를 User객체로 바꾸어 관게를 맺을 수 있다. 쌍방의 관계를 맺도록 설계할 수도 있다.

    • 대부분의 객체설계에서 회원 데이터가 가장 최상위에 놓인다.
  • Question에서 User를 볼 수 있도록 관계를 맺어 보자.

    @Entity
    public class Question {
      @Id
      private Long id;
      @ManyToOne
      @JoinColumn(foreignKey =  @ForeignKey(name = "fk_question_writer"))
      private User writer;
      ...
      public Question(User writer, String title, String contents) {
        this.writer = writer;
        this.title = title;
        this.contents = contents;
      }
    }
    
    • String writer대신 User writer사용
      • Constructor나 QuestionController.java도 변경된 사항 수정
      • 객체에서 getMethod를 사용하여 객체를 꺼내오려는 작업이 많을수록 리팩토링 요소이다. 객체를 꺼내오는것보다 객체를 전달하는것이 좋다.
    • Question과 User관계는 Many-to-one이므로 어노테이션 추가
    • @JoinColumn(foreignKey = @ForeignKey(name = "fk_question_writer"))로 foreign key의 이름을 지정할 수 있다.
    • 테스트를 해보면 Question 테이블에 Writer_ID가 나오는것을 볼 수 있다. Foreign Key로 지정했기 때문에 User객체의 ID인 Long id가 출력되는것이다.

여기까지 실습

  • 테스트 결과 출력화면에서 writer가 User.toString()로 나오기 때문에 수정해야한다. index.html에서

    <!-- index.html-->
    ...
    <a href="./user/profile.html class="author"></a>
    
  • 날짜 시간이 고정되어있다. 이 부분도 수정해보자.

    //Question.java
    @Entity
    public class Question {
      ...
      private LocalDateTime createDate;
      ...
      public Question(User writer, String title, String contents ) {
        this.writer = writer;
        this.title = title;
        this.contents = contents;
        this.createDate = LocalDateTime.now();
      }
        
      private String getFormattedCreatedDate() {
          return createDate.format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
      }
    }
    
    • LocalDateTime 클래스는 자바8에 추가된 클래스이다. 기존에 날짜관련 자바 API가 좋지 않아서 외부 API를 쓰곤 했는데 자바8에 추가되어 그냥 쓰면된다.
    • LocalDateTime.now()를 DB로 확인해보면 이상한 문자열이 출력되는데 이를 포맷팅하기 위해 getFormattedCreatedDate()메서드를 추가했다.
  • index.html에서도 시간 출력부분을 수정한다.

    <!-- index.html -->
    ...
    <span class="time"></span>
    
    • jsp에서는 get메서드의 get을 지우고 메서드명을 적어주면 된다고 해서 테스트 해봤는데 mustache도 똑같이 적용된다.

여기까지 실습

  • :raising_hand_man: 실습 할 때 createDate를 LocalDateTime객체로 선언하지않았다. 어짜피 now메서드가 static이므로 LocalDateTime.now().format(DateTimeFormatter.ofPattern())으로 inline으로 구현했다.

    private String createDate;
      
    public Question(User writer, String writer, String contents) {
      super();
      this.writer = writer;
      this.title = title;
      this.contents = contents;
      this.createDate = LocalDateTime.now()
          .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
    

댓글남기기