객체의 참조는 필드를 매핑한다. 이 필드를 매핑하긴 위해선 @JoinColum을 이해할 필요가 있다.
@Entity
public class Member {
@Id
@Colunm(name = "MEMBER_ID")
private String id;
private String username;
//연관관계 매핑
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//연관관계 설정
private void setTeam(Team team) {
this.team = team;
}
//Getter, Setter
}
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
//Getter, Setter
}
위 예제는 간단한 회원과 팀의 연관관계를 나타내고 있으면 객체의 참조매핑을 JPA로 구성한 코드이다. 회원 객체와 팀 객체는 단방향 관계로 구성되어 있으며, 회원 객체의 필드값으로 팀을 나타내고 있다.
회원 엔티티에 있는 연관관계를 나타내기 위한 어노테이션이 있는 것을 확인할 수 있다. 우선 @ManyToOne은 연관관계의 매핑의 다중성을 나타내는 어노테이션이며, 다중성을 정리하는 포스팅을 따로 할 예정이므로 일단 넘어가도록 한다.
@JoinColum 어노테이션을 보면 name=TEAM_ID 속성이 되어 있는 것으로 유추할 수 있듯이 조인컬럼은 외래키를 매핑할 때 사용한다는 것을 알 수 있다.
회원과 팀을 테이블(DB관점)에서 볼 때는 외래키를 이용하여 지정하므로 객체(ORM관점)도 외래 키를 지정하는 것이 필요하다.
@JoinColum 속성
외래키를 매핑할 때 사용하는 @JoinColum의 속성이다.
속성 | 기능 | 기본값 |
name | 매핑할 외래 키 컬럼명 | 필드명_[참조하는 테이블의 기본 키 컬럼명] |
referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본 키 컬럼명 |
foreignKey (DDL) | 외래 키 제약조건을 직접 지정할 때 사용하며, 테이블을 생성할 때만 사용한다. | |
unique nullable insertable updatable columnDefinition table |
@Column의 속성과 동일하다. |
참고로 @JoinColumn은 생략이 가능하다.
생략하였을 경우 외래키를 찾을 때 기본 전략을 이용하게 된다.
예를 들면 위 예시에서
@ManyToOne
private Team team;
기본 전략인 필드명_[참조하는 테이블의 기본 키 컬럼명] 를 사용하게 된다.
team(필드명) + _TEAM_ID(참조하는 테이블의 기본 키 칼럼명) = team_TEAM_ID
name과 referencedColumnName의 차이를 알아야 한다.
JPA를 처음 사용할 때 따로 기본공부를 하지 않고 예제를 그냥 따라하면서 진행하였고, 한동안 name 속성을 오해하고 사용하고 있었다.
@Entity
public class Member {
...
//연관관계 매핑
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private Long id;
...
}
위 코드 처럼 @JoinColumn(name = "TEAM_ID")의 해당 name 속성에 매핑되는 값이 반드시 Team 엔티티에 정의된 id(식별자) 칼럼 명하고 일치해야 되는지 알았다. 그래서 항상 반대쪽(Team) 식별자명과 반드시 일치시켜 진행하였다.
이러한 오해는 대부분 @JoinColumn 어노테이션 활용 시 referencedColumnName를 생략하고 기본값 전략을 쓰기 때문인 것 같다.
name 속성은 단순히 회원 엔티티에서 참조하는 팀 엔티티 필드의 외래키 명칭을 정의하는 속성이며, referencedColumnName는 해당 외래 키가 대상 테이블의 어떤 컬럼을 참조하는지를 지정해 주는 속성이다.
그렇기 때문에 name 속성을 팀의 컨벤션에 맞게 자유롭게 지정해도 되지만, referencedColumnName은 정해진 칼럼명을 반드시 지켜야 한다.
추가적으로
사실 @JoinColumn을 온전히 이해하기 위해선 연관관계의 다중성과 연관관계의 주인에 대한 이해가 있어야한다. 그 부분은 따로 공부하여 포스팅을 추가하도록 하자.
참조
김영한님의 인프런 강의와 책으로 참조하였습니다.
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
https://www.yes24.com/Product/Goods/19040233
자바 ORM 표준 JPA 프로그래밍 - 예스24
자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고
www.yes24.com
'Framework > JPA' 카테고리의 다른 글
[JPA] 연관관계 편의 메서드 (0) | 2024.04.29 |
---|---|
[JPA] 양방향 연관관계와 연관관계의 주인(with mappedBy) (0) | 2024.04.26 |
[연관관계 매핑 기초] 단방향 연관관계와 객체와 테이블의 차이 (0) | 2024.03.21 |
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2024.03.15 |
[JPA] 엔티티 매핑 - 필드와 컬럼 매핑 (0) | 2024.03.14 |