연관관계 주인은 FK를 가진 오브젝트이다.
자바에선 User오브젝트 데이터베이스에선 User 테이블이 들고있는 것
Board, Reply도 마찬가지이다.
기존의 방식(mybatis 등)에서는 상세보기 페이지를 나타낼 때
User, Board, Reply 이 세 개를 join해서, select해서 해당 페이지에 데이터를 다 들고오게된다.
select * from Board
where Id = 1;
그런데 ORM을 사용하게 되면 이 Board 테이블만 select하면 된다.
설명하자면, 상세보기 페이지에서 Board만 select해서 요청하면 User정보를 같이 준다.
왜냐면 Board가 User 오브젝트를 들고 있기 때문이다.
현재 Board 오브젝트가 User 오브젝트는 들고 있는데 Reply 오브젝트를 들고 있지 않다.
따라서 Board.java에 Reply 정보도 작성해보자
private User user는 Board에 User가 한 명이라 이렇게 작성했지만
Reply의 경우 private Reply reply로 작성하면 안된다.
reply는 여러 개이기 때문이다.
따라서 이렇게 private List<Reply> reply; 로 작성해준다.
java.util의 List를 import 시키면 된다.
Reply 테이블
Id | Content | userId | boardId |
1 | 혼자먹냐? ㅋ | 2 | 1 |
2 | ㅋㅋㅋㅋ | 3 | 1 |
Board 테이블
Id | title | content | userId | createDate | |
1 | 도토리 좋아 | 도토리 맛있다람.. | 1 | 2022.05.05 | |
Board 테이블에 replyId를 둘 경우 하나의 컬럼은 원자성을 가져야한다는 1정규화에 어긋난다.
따라서 FK는 Reply 테이블의 boardId에 있어야한다. Board 테이블에 있어서는 안된다.
따라서 코드를 이렇게 작성하면 된다.
그런데 fetch 전략을 왜 EAGER로 굳이 명시해서 적었을까?
그 이유는 @OneToMany의 기본 fetch 전략이 FetchType.LAZY 이기 때문이다.
LAZY는 지연로딩이라고 하고 EAGER는 즉시로딩이라고 한다.
만약 덧글에 펼치기 버튼이 있고, 이 펼치기 버튼을 누르기 전까지
덧글들이 바로 보여질 필요가 없다면 LAZY 전략을 사용해도 된다.
하지만 이 프로젝트의 경우 상세보기창에서 덧글들이 바로 보여져야 하니까
기본적으로 설정되어 있는 LAZY가 아닌 EAGER를 사용하기 위해 이렇게 명시한 것이다.
참고자료 : https://youtu.be/DtMmXQl4_hw
'자바 스프링 > 부트 블로그 JPA 프로젝트' 카테고리의 다른 글
#12 select 테스트 및 페이징 (0) | 2022.05.06 |
---|---|
#11 insert 테스트와 enum 사용법 (1) | 2022.05.06 |
#9 JPA와 DB테이블 생성(User, Board, Reply) (0) | 2022.05.05 |
#8 스프링 부트의 yml과 jsp파일 리턴 (0) | 2022.05.04 |
#7 lombok 설치와 사용 (0) | 2022.05.04 |