SpringBoot + MariaDB 10-1 댓글 모델(LAZY,EAGER 선택)
스토리 게시물에 이제 댓글을 달려고하는데 무엇이필요할까
내용 시간 유저 어떤이미지에 댓글인지 등 여러가지의 데이터가 들어가게된다
그럼 생각해야할게 테이블을 만들어야한다
왜? 그냥 image에다가 comment라고 댓글 추가하면 안되나요?
네 list화시켜 여러데이터를 담는다 하더라도 테이블의 컬럼하나에는 하나의 값만 존재하여야한다
안녕,좋은사진이네요,... 옆과같이 , 로 구분하여 한컬럼에 데이터를 여러개 넣는방식은 굉장히 안좋다
그렇기때문에 한컬럼에는 하나의값이 들어가도록 만들어보자.
Comment.java
package com.cos.photogramstart.domain.comment;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(length=100,nullable = false)
private String content;
@ManyToOne(fetch = FetchType.EAGER)
private User user;
@ManyToOne(fetch = FetchType.EAGER)
private Image image;
private LocalDateTime createDate;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
Comment의 기준으로 생각하면 user와 image를 한개만 가질 수 있고
user와 image를 기준으로 생각하면 comment를 여러개 가질 수 있다
그렇다면 Comment클래스이니 comment가 기준이되며 ManyToOne어노테이션이 붙게된다
fetchType.EAGER과 fetchType.LAZY의 선택
왜 어쩔땐 EAGER이고 어쩔땐 LAZY일까 생각해보면 이러하다
지금 위와같이 데이터가 한개이면 EAGER로 join해서 가져오는게 좋다 왜냐하면 User의 LAZY코드를보면
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
@JsonIgnoreProperties({"user"})
private List<Image> images;
리스트를 가져오게되어있다 그럼 정보수정이나 사진등록할때 이미지 리스트가 필요한가? 절대아니다 근대 만약 LAZY가 아니라 EAGER이라면 필요없는데도 계속 조인을하여 DB에 무리가 갈것이다 하지만 LAZY라면 필요할때만 Controller에서 요청을하니 DB에 필요없는 힘소비가 사라지게되는것이다
결론
한개만 가져오는것이면 EAGER을 사용하고
여러개를 가져온다면 LAZY를 사용하자
Repository생성해주기
CommentRepository.java 인터페이스
package com.cos.photogramstart.domain.comment;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CommentRepository extends JpaRepository<Comment, Integer>{
}