예를들어
MyBatis에서 게시글 하나를 조회 한다면
작성자 - user 테이블
게시글 - board 테이블
댓글 - reply 테이블
select * from
board b
left join user u on user.id = u.id = b.userId
left join reply r on r.id = r.id = b.userId
where b.id = 1
이런식으로 조인을 이용한 쿼리문을 작성해야한다.
JPA에선
아래 쿼리를 작성하면 jpa는 자동으로 join을 해준다.
select * from
where id = 1;
JAVA > JPA > DB
jpa는 board라는 모델이 필요함을 인식하고
"Entity설정시 board는 user라는 object을 들고 있다"
라고 인식을해 jpa는 join을 자동으로 날려준다.
1개의 게시글엔 1명의 게시자가 오고 여러개의 댓글이 올 수 있다.
@ManyToOne(fetch = FetchType.EAGER)
// EAGE전략 1:1의 정보 무조건 들고와야하는 정보
// ManyToOne = Board, User = One 한명의 유저는 여러 게시글 작성할 수 있음을 선언!
@JoinColumn(name="userId")
// userId라는 key로 들어감
private User user; // DB는 오브젝트 저장불가 Foreign key, 자바는 오브젝트를 저장할 수 있다. 자바는 DB에 맞춰 key값을
@OneToMany(mappedBy="board", fetch=FetchType.EAGER)
// 댓글 펼치기 버튼이 있이 있으면 LAZY전략 > 없으면 데이터를 안들고옴
// mappedBy가 있으면 연관관계의 주인이 아니다 db에 컬럼을 만들지 말라고 선언
// fk는 reply테이블의 board
// board를 select 할때 join문을 통해 값을 얻기 위해 있다
private List<Reply> reply;
그러나 user 뿐만 아니라 댓글 reply정보도 필요한데
그러나 어떻게 보면 필요없는 데이터(*)도 들고 올 수 있다.