tuter77

게시판 만들기(5) - review 엔티티 만들기. 본문

GroupStudy

게시판 만들기(5) - review 엔티티 만들기.

tuter77 2023. 1. 29. 20:28

● 앞서 공부했던 내용 피드백.

 

▷ 피드백

이전의 블로그 게시글에 올려놓은 코드들을 팀장님이 피드백 해주셨는데, 일단 독자적으로 코드를 쓴것이 아니라 실망하신 눈치였다.

능력부족이 체감되었지만, 그래도 각 기능들이 swagger를 통해 정상작동하여서 나름은 뿌듯했었다.(계속하다보면 나만의 코드도 쓸수있지않을까..)어쨌든 궁금했던, 어노테이션과 RequestDTO Body의 연관성에 대해선 원래는 크게 연관이 없다고 하셨다.다만 DTO 파일 내에선 어노테이션 중 @SETTER가 기존엔 파라미터 바디로 바꾸어주는 역할을 해서 해당 어노테이션을 제거하면 작동을 하지 않아야한다는데, 왜 그런지는 멘토님께 문의하기로 했다.

다만, 요청으로 오는 파라미터는 json(네트워크 상 주고받는 경량의 데이터 형식) objectMapper로 파싱(데이터를 뽑아내서 배열 등의 형태로 저장하는 과정) 되고, form 태그로 들어온 데이터가 Setter 어노테이션으로 들어간다고 한다고 추가적으로 설명해 주셨는데 잘 이해가가지않아 찾아봤다.

 

- json의 형태

 

요청들은 위와 같은 형태로 서버에 전달된다는데, 이 형식그대로라면 데이터를 사용할 수 없어서 사용할 수 있게끔 변경해주는게 parsing이라는 것 같다.

또한 이렇게 parsing된 데이터들이 setter라는 어노테이션을 통해 코드에 기재한 매개변수로 제공되어 각 기능들에서 사용할 수 있게 해준다는 것.

얼추 의미는 사용할 수 있게 가공했다는 정도는 알겠다.

다만, 아까 말한것처럼 어떻게 @setter가 없이 작동되는지는 해결하지 못했다.

 

 

▷ 다음 과제

댓글기능을 구현하려고 했지만, 데이터가 헬스장의 정보여서 리뷰로 엔티티 이름만 바꾸어 구현하기로 했다.규칙은 Review 엔티티와 healthInfo 엔티티를 양방향 관계로 설정하고, 내용으로는 id와 컨텐츠만 넣는것이다.원래는 각 리뷰의 CRUD역시 구현해야하나 나를 포함한 조원들이 아직 CRUD를 독자적으로 만들어보지 않아 다음으로 미루게 되었다.

 

 

● Review 엔티티 만들기

 

▷ HealthInfo 엔티티

        @Id
        @Column(name = "healthInfo_id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        
        // ..
        
        @Builder.Default
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "healthInfo")
        private List<Review> reviews = new ArrayList<>();

        public void addReview(Review review, String title, String contents){
                reviews.add(review);
                review.setTitle(title);
                review.setContents(contents);
        }

 

먼저 일대다의 관계가 될, 기존의 healthInfo 엔티티에는 위와 같이  id값을 PK로 지정하고 column 어노테이션과 이름을 달아 Review 엔티티에서 참조할 수 있게 했다.

그리고 아래에, @Builder.Default 어노테이션은 초기화에 사용하기위해 넣었는데, 초기화 값을 정하지도 못하고 명확히 이해하지 못해서 일단 두었다.

그리고 연관관계 설정을 위한 Onetomany 어노테이션을 통해 Review 엔티티와 일대다의 관계를 맺었다. 

괄호 안의 옵션은 n+1문제를 위해 로딩방식을 lazy로 설정하고, 엔티티의 상태 변화를 전이하기 위해(영속성 관리) cascade.all을 넣었다. 

이어 mappedBy옵션으로 Review에 생성될 healthInfo라는 변수가 관계의 주인임을 표기했다.

아래 List 구문은 Review 를 리스트로 받게끔 선언한 내용이다.

 

addReview 메서드는 아직 사용하진 않았는데, 후에 Review를 작성하면 타이틀과 set 메서드를 이용해 내용을 추가해서 

review 리스트에 더해주는 내용이다. 매개변수로 위 3가지를 받고있다.

 

▷ Review 엔티티

 

@Entity
@Getter
@Setter
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String contents;

    @ManyToOne
    @JoinColumn(name = "healthInfo_id")
    private HealthInfo healthInfo;

}

Review 엔티티는 healthInfo 엔티티와 다대일의 관계를 맺는 연관관계의 주인으로 만들었다.

데이터가 각 헬스장의 정보이므로, 헬스장에 대한 리뷰가 여러개 달릴 수 있다는 의미이다.

 

id는 기본값으로 가지고 title과 content를 멤버변수로 가진다. 위에 getter와 setter 어노테이션이 있어 다른 클래스에서 get(), set() 메서드로 값을 받거나 변경할 수 있다.

맨 아래에 Manytoone 어노테이션으로 다대일의 관계임을 선언하고, JoinColumn어노테이션에 앞서 설정한 healthInfo의 id값을 참조 값으로 사용함을 선언했다.

 

위 내용은 2023.01.09에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/38