오늘의하루

JPA 연관 관계 매핑 - start 본문

Spring/JPA

JPA 연관 관계 매핑 - start

오늘의하루_master 2024. 1. 14. 21:38

JPA에서 연관 관계 매핑에 대해 쉬운 이해를 하기 위해서는 객체와 테이블의 연관 관계의 차이를 이해해야한다.

객체를 테이블에 맞추어 그대로 모델링 한다면 객체 간 협력 관계를 만들 수 없게 된다.

테이블은 외래키(FK)로 조인하여 연관 된 테이블을 찾을 수 있지만 객체는 참조를 통해 연관된 객체를 찾을 수 있게 된다.
아래는 Member 테이블과 Team 테이블이 N:1관계일때 Entity를 어떻게 만들어야 하는지에 대해 작성하였다.

  • Member 테이블은 Team 테이블의 Id값을 외래키(FK)로 가지고 있다.
// 객체를 테이블에 맞추어 데이터 중심으로 모델링 한 경우
@Entity
public class Team{
    @Id
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String teamName;
}


@Entity
public class Member{
    @Id
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private Long teamId;
    
    private String userName;
}

// 객체 지향 모델링 (단방향)
@Entity
public class Team{
    @Id
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String teamName;
}

@Entity
public class Member{
    @Id
    @Column(name = "MEMBER_ID")
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")`
    private Team team;
    
    private String userName;
}

//양방향 매핑
@Entity
public class Team{
    @Id
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String teamName;
    
    @OneToMany(mappedBy = "team")
    List<Member> members = new ArrayList<>();
}

@Entity
public class Member{
    @Id
    @Column(name = "MEMBER_ID")
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")`
    private Team team;
    
    private String userName;
}

양방향 연관관계의 주인과 mappedBy

객체의 두 관계 중 하나를 연관관계의 주인으로 지정하는 것이다.

이때 지정된 주인은 등록 및 수정이 가능하지만 주인이 아닌쪽은 읽기만 가능하다.

주인이 아닌 곳에서 mappedBy속성으로 주인을 지정해 줄 수 있다.

그럼 누구를 주인으로 해야할까?

아직 정확한 이유는 알 수 없지만 테이블 구조 상 외래키가 있는 곳을 주인으로 지정하면 여러가지 문제를 해결할 수 있다.

그리고 만약 주인이 아닌 곳에서 아무리 등록 및 수정을 하여도 실제 DB에서는 아무런 일이 생기지는 않는다.

하지만 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하는것이 좋다.

실무에서 항상 기억해야 하는 점

처음부터 양방향 연관관계를 맺으려고 하지말고 우선 단방향 매핑으로 연관관계를 완성시켜야 한다.

객체가 양방향으로 연결되어 있다는 말은 객체의 입장에서 좋지 못한 소리이기 때문이다.

그러므로 우선 단방향 매핑을 완벽하게 한 후 추후 양방향 연관관계는 필요할 경우 추가해서 사용해도 늦지 않다.

이는 자바 코드 몇줄이면 가능하며 테이블에 아무런 영향을 주지 않기 때문이다.

Comments