05장. 연관관계 매핑 기초
이전까지 한쪽 방향에서 접근하는 단방향 매핑에 대해서 봤는데요. 이번엔 양방향 매핑에 대해 살펴보도록 하겠습니다.
양방향 연관관계
우선 연습 코드부터 보도록 하겠습니다. Player
엔티티와 Team
엔티티가 있구요. 서로 1:N 관계로 매핑되고 있습니다.
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Player> players = new ArrayList<Player>();
// constructor, getter, setter ..
}
@Entity
public class Player {
@Id
@Column(name = "PLAYER_ID")
private String id;
private String userName;
@OneToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
// constructor, getter, setter ..
}
// main문 트랜잭션 내 코드만 명시
Team team1 = new Team("team1", "팀1");
em.persist(team1);
Player player1 = new Player("player1", "회원1");
player1.setTeam(team1);
em.persist(player1);
Player player2 = new Player("player2", "회원2");
player2.setTeam(team1);
em.persist(player2);
Team team = em.find(Team.class, "team1");
List<Player> players = team.getPlayers();
for (Player player : players) {
System.out.println("player : " + player.getUserName());
}
// 이하코드
여기서 제가 기대하던 코드는 아래와 같습니다.
player : 회원1
player : 회원2
하지만 기대와 달리 for문이 돌지않았고 그 말은 players에 데이터가 안 담겨있다는 것이었습니다. 분명 @OneToMany(mappedBy = "team")
어노테이션을 통해서 player1.setTeam(team1);
또는 player2.setTeam(team1);
가 실행이 되었을 때 Team
내의 List<Player> players
에도 자동으로 값이 들어갈 줄 았았거든요. 하지만 그렇지 않았습니다.
여러가지 삽질 끝에 mappedBy = "team"
설정은 DB에서 외래키 설정을 해주지만 객체 간의 연관관계는 따로 만들어주지 않는다는 것을 알았고 그 부분은 수동으로 매핑해줘야 함을 알 수 있었습니다.
그럼 어떻게 해결할 수 있을까?
이를 해결하기 위해선 연관관계를 맺는 메서드를 별도로 만들고 이를 처리할 수 있도록 하여야합니다. 그래서 위 main문 내 7줄, 11줄에서 setter로 팀을 설정했던 부분에서 좀 더 확장하여 Team
내에 다음과 같은 메서드를 만들었습니다.
public void add(Player player) {
this.players.add(player);
player.setTeam(this);
}
결국 추가된 부분은 위에서 this.players.add(player);
이구요. List<Player>
내에 수동으로 값을 넣어 연관관계를 매핑한 것입니다. 그리하여 main문내 각 Player
에 대해 Team
을 양방향 연관관계를 맺는 과정은 다음과 같이 표현할 수 있습니다.
Player player1 = new Player("player1", "회원1");
team1.add(player1); // 양방향 연관관계 매핑
em.persist(player1);
오늘 많은 부분을 정리하진 못했지만 중요하게 깨달음은 부분은 위에서 언급한 바와 같이 DB에서 엔티티간 관계는 mappedBy
와 같은 설정을 통해 설정이 가능하지만 객체 간 연관관계는 수동으로 해줘야 한다는 점입니다!
'Book > programming' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 08장. 프록시와 연관관계 관리 (0) | 2019.01.02 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초3 (0) | 2018.12.27 |
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초 (0) | 2018.12.26 |
[자바 ORM 표준 JPA 프로그래밍] 03장. 영속성 관리 (0) | 2018.12.18 |
프로가 되기 위한 웹기술 입문3 (2) | 2018.11.09 |