JPA 연관관계 매핑중, 실무에서 가장 많이 쓰이는 1:N (일대다) 매핑에 대해서 알아보자. 일대다 매핑을 하기 위해서 하나의 팀에 여러명의 멤버가 속해있는, 1:N 관계를 생각해보자. 관계 매핑에는 방향성과 외래키의 주인 두 가지 상황이 발생 한다.(객체와 테이블간의 패러다임 불일치 때문에) 일반적으로 객체에서는 참조를 통해서 방향성을 갖는다.
객체에서 방향성이란?
1 2 3 4
@Data publicclassMember{ private Team team; }
memeber.getTeam() 을 통해서 team을 조회할 수 있다. 즉, member -> team간의 단방향(방향성)을 갖지만, 반대의 방향성은 존재하지 않는다. 만약에 반대 상황도 존재할려면
@Test publicvoidsave(){ // given Team team = new Team(); team.setName("A팀"); teamRepository.save(team); // team 저장
Member member = new Member(); member.setName("andrew"); member.setAge(32L); member.setTeam(team); //member의 team setting memberRepository.save(member); //member 저장
Hibernate: call next value for hibernate_sequence Hibernate: insert into team (name, id) values (?, ?) Hibernate: call next value for hibernate_sequence Hibernate: insert into member (age, name, team_id, id) values (?, ?, ?, ?) Hibernate: select member0_.id as id1_0_0_, member0_.age as age2_0_0_, member0_.name as name3_0_0_, member0_.team_id as team_id4_0_0_, team1_.id as id1_1_1_, team1_.name as name2_1_1_ from member member0_ left outer join team team1_ on member0_.team_id=team1_.id where member0_.id=?
실제 나간 쿼리를 살펴보면, team 테이블에 데이터를 저장하고, member 테이블에 저장하고, 결과를 select해온다. 기본 left outer join 키워드가 나간것을 주목하자! 각각 Team과 Member가 저장되고, member.getTeam()를 통해서 객체 그래프 탐색까지 잘 되는 것을 확인할 수 있습니다.