@JoinColumn은 외래키를 지정할 때 사용되는 어노테이션이다.
외래 키는 1:N 관계에서 N 부분에 지정해준다.
이유는 데이터베이스는 컬렉션을 담을 수가 없기 때문이다. 컬렉션이라고 하면 자바의 List나 Map과 같다고 보면 된다.
따라서 N 부분에 외래키를 지정해주고, 그 필드 데이터에 @JoinColumn을 설정해주도록 하자.
// UserEntity 에서의 PhoneNumber 설정
@OneToMany(mappedBy = "user")
private List<Phone> phone = new ArrayList<Phone>();
// PhoneEntity 에서의 User 설정
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
한 사람은 여러 가지의 핸드폰을 가질 수 있다.
이것은 사람이 1, 핸드폰이 N인 관계이다. 따라서 외래키는 N쪽인 핸드폰 엔티티에 작성하는 것이 옳다.
위 코드를 보면 한 명의 유저가 여러 개의 핸드폰을 가질 수 있기에 List로 핸드폰에 대한 데이터를 담을 수 있도록 코드를 작성했다.
핸드폰 엔티티에서는 하나의 핸드폰에 대한 정보를 갖고 있다. 그 정보 중, 해당 핸드폰의 소유자가 반드시 존재하기 때문에 유저에 대한 필드 값을 정의해준다. 이 부분이 바로 FK(외래키)이다.
위에서 미리 언급했지만, 외래키를 지정할 때 사용되는 어노테이션이 @JoinColumn이다. 해당 컬럼은 해당 필드 데이터를 외래키로 지정하여 다른 테이블에 있는 특정 데이터가 해당 키를 이용하여 자신의 테이블에 데이터를 저장할 수 있게 한다.
@OneToMany와 @ManyToOne의 경우 해당 어노테이션이 선언된 클래스 또는 테이블의 관점에서 보면 이해할 수 있다.
유저의 관점에서 핸드폰은 여러 개가 존재하기 때문에 1:N 관계이며, 핸드폰의 관점에서는 소유자는 단 한 명이자 핸드폰의 갯수는 여러 개가 될 수 있으므로(핸드폰 번호가 여러 개일 경우도 포함) N:1 관계이다.
핸드폰 엔티티에서 User 타입으로 user라고 필드명을 선언해주었다.계속 언급하지만 1:N 관계에서 N 쪽이 연관관계의 주인이 되므로 1 입장에서는 해당 필드명에 매핑시켜줘야 한다.
따라서 유저 엔티티 쪽에 List로 선언된 phone 쪽에 mappedBy = "외래키의 필드명"(여기선 user)을 작성하여 연관관계에 대한 어노테이션 작성을 완료할 수 있다.
'Java > Spring' 카테고리의 다른 글
Spring Boot + MyBatis (0) | 2023.04.13 |
---|---|
@JsonManagedReference와 @JsonBackReference (0) | 2022.12.22 |
Spring + MySQL 연동 (0) | 2022.11.24 |
@RequestParam과 @PathVariable (0) | 2022.11.22 |
Junit 테스트 (0) | 2022.11.03 |