본문 바로가기

Programming/과거포스팅

[JPA] - 연관관계 매핑1

연관관계 매핑1


JPA는 엔티티가 핵심이라고 보면 되는데 앞의 포스팅에서는 단순히 테이블과 엔티티의 매핑만 확인을 했다. 이번에는 테이블과 테이블의 관계를 엔티티와 엔티티의 관계로 어떻게 표현할 수 있을지에 대해서 알아본다.


MEMBER와 TEAM 테이블이 있다.

MEMBER와 TEAM 테이블은  N:1의 관계에 있다.


테이블은 

TEAM 테이블과 MEMBER 테이블로 나뉠테고 MEMBER에 TEAM ID가 외래키로 생성될 것이다.

그리고 데이터베이스에서는 MEMBER.TEAM_ID와 TEAM.ID로 조인을 할 것이다. 

바로 지금 다룰 연관관계가 바로 테이블과 테이블의 관계를 엔티티와 엔티티로 매핑하는 것을 의미한다.

객체에는 조인이라는 개념이 없다. 그렇기 때문에 연관관계를 객체지향적으로 맺어줘야 하는데 코드를 보면 아주 쉽게 이해가 된다.


@Entity
public class Member {

    @Id 
    @Column(name = "MEMBER_ID")
    @GeneratedValue
    private Long id;

    @Column
    private String name;
    
    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    private Team team;
    ...
}


@Entity
public class Team {
	
	@Column(name="TEAM_ID")
	@Id
	@GeneratedValue
	private Long id;
	
	@Column
	private String name;
       ...
}


위의 두개의 엔티티를 보면 조인시 컬럼과 컬럼의 매핑을 어노테이션으로 처리하고 있는데

    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    private Team team;


@ManyToOne를 통해 N:1관계를 명시하고

@JoinColumn 사용하여 연관관계를 맺고 있다.

중요한 점은 변수의 타입이 Team엔티티라는 것이다. 기존 쿼리로 연관관계를 맺기 위해서는 Team테이블에 팀을 저장하고 Team의 id값을 Member테이블의 team_id 컬럼에 저장한다. JPA는 이러한 패러다임의 불일치를 @JoinColumn과 객체 참조를 통해서 해결한다.


Team team = new Team(); team.setName("team1"); em.persist(team); Member member1 = new Member(); member1.setName("멤버1"); member1.setTeam(team); em.persist(member1); Member member2 = new Member(); member2.setName("멤버2"); member2.setTeam(team); em.persist(member2);

위의 코드는 연관관계를 저장하는 코드이다. team을 만들고 setTeam만 해주면 해당 team의 id가 mamber테이블의 team_id와 매핑이 된다.