05장. 연관관계 매핑 기초
객체 간의 관계는 참조(주소)를 사용하는 것과 달리 테이블은 외래키를 사용해서 관계를 맺습니다. 저자는 이번 장에서 주요 키워드로 다음 세 가지로 정리했는데요. 간략하게 살펴보겠습니다.
방향(Direction) : 우선 종류론 [단방향, 양방향]이 있습니다. 한쪽만 참조하면 '단방향', 양쪽에서 보다 참조하면 '양방향'입니다.
방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향이다?
이 말은 단뱡향(멤버 → 팀)이라고 했을 때 멤버 필드에 팀과 관련된 필드가 있지만 팀 객체엔 멤버 필드가 없습니다. 하지만 테이블에서는 SQL의 JOIN문을 통해서 (멤버→팀)이든 (팀→멤버)이든 양방향으로 접근이 가능하다는 말입니다.
- 다중성(Multiplicity) : [다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)]이 있습니다. 이것은 객체 간 어떤 관계이고 그것을 어떻게 정의하느냐에 따라 다르겠죠?
- 연관관계의 주인(owner) : 객체를 양방향 연관관계로 만들면 그 연관관계의 주인을 정해야 한다는 것입니다.
방향, 다중성에 대해선 그 종류를 보니 어느정도 이해가 가는데 연관관계의 주인은 왜 필요한지, 또 그 중요성에 대해선 아직은 감이 없네요.
단뱡향 연관관계
(멤버→팀)의 단방향 관계라고 했을 때 Member 엔티티 내에 연관관계 매핑을 다음과 같이 할 수 있습니다.
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
여기서 어노테이션을 좀 살펴보고 가겠습니다. @ManyToOne
은 다중성을 나타내는데 앞(Many)이 현재 엔티티, 뒤(One)에 관계맺을 엔티티를 의미하구요. 다대일(N:1)로 관계를 맺는다는 얘기이죠? @JoinColumn
은 외래 키를 매핑할 때 사용하는데요. name 속성은 매핑할 외래 키 이름(테이블 내 필드명)을 말합니다. 이 어노테이션은 생략이 가능하며 생략시 default설정으로 매핑됩니다.
@JoinColumn
속성에 대해 살펴보겠습니다.
외래키 제약조건을 지정할 수 있다는 것은 뭘까요?
외래키 제약조건은 두 에티블 간 관계설정을 통해 데이터의 무결성을 보장하는 것을 말합니다. 구체적으로 외래키 테이블이 참조하는 기준 테이블의 열은 PK이거나 UNIQUE 제약조건이 설정되어야 한다는 것인데요. JPA에선 foreignKey = @ForeignKey(name = "fk_question_writer")
와 같이 외래키 제약조건의 이름을 명시적으로 지정할 수 있구요.
그리고 @ManyToOne
속성에 대해서도 간단하게 살펴볼게요. 페치전략이나 영속성 전이부분은 조금 더 이해가 필요할 것 같습니다.
연관관계를 사용할 때 객체를 통해 연관된 엔티티를 조회가 가능합니다. 다만 수정의 경우 Entity Manger에 update와 같은 기능이 없기 때문에 새로운 값을 다시 저장합니다. 그렇게 엔티티 값을 변경해두기만 하면 트랜잭션 커밋시 플러시가 일어나면서 변경 감지 기능을 통해 수정 쿼리가 생성되어 DB에 반영되는 것입니다. 연관된 엔티티의 삭제의 경우 먼저 기존의 연관관계를 값을 null로 바꾸어두고 없애야 합니다. 그렇게 하지 않으면 외래 키 제약조건으로 인해 오류가 발생하기 때문입니다.
'Book > programming' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초3 (0) | 2018.12.27 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초2 (0) | 2018.12.26 |
[자바 ORM 표준 JPA 프로그래밍] 03장. 영속성 관리 (0) | 2018.12.18 |
프로가 되기 위한 웹기술 입문3 (2) | 2018.11.09 |
프로가 되기 위한 웹기술 입문2 (0) | 2018.11.08 |