본문 바로가기
Spring/끄적끄적

@JoinColumn(name =" ", referecedColumnName= " ")

by wch_t 2024. 7. 15.

1. 개요

프로젝트 코드 리뷰를 하다가, `@JoinColumn(name =" ", referecedColumnName= " ")`을 보고 "referecedColumnName? 이게 뭐지??" 하는 생각에 구글링을 해 찾아보았다.

 

그러던 중, 김영한님 강의에서의 좋은 Q&A가 있어 '간략하게나마 정리해야겠다' 라는 마음에 글을 쓰게 됐다.

 

그럼 지금까지 프로젝트를 할 때 `@JoinColumn(name =" ")으로만 외래키(FK)에 대한 연관관계 매핑을 했었는데, 이번에 보게 된 referecedColumnName는 무엇일까??

 

 


 

2. @JoinColumn 이란?

들어가기 전, @JoinColumn에 대해서 간략히 복습해보자.

 

@JoinColumn은 Entity 간의 연관관계 매핑할 때 사용하는 어노테이션으로,

연관관계의 주인(보통 多) Entity에서 FK로 정의하고 사용된다.

 

https://wch-0625.tistory.com/24

 

5. 연관관계 매핑 기초

*연관관계가 필요한 이유 테이블은 외래 키로 join을 사용해서 연관된 테이블을 찾는다. 객체는 참조를 사용해서 연관된 객체를 찾는다. → 이러한 차이를 해소하기 위해, "각 entity 간의 연관관계

wch-0625.tistory.com

 

 

1) 속성

name

- 외래키(FK)로 사용될 컬럼의 이름

 

referencedColumnName

- 외래키(FK)가 조인할 대상 테이블의 column

- 생략 시, 대상 테이블의 기본키(PK)로 자동 지정됨.

 

 

 

2) 예시

------------ 테이블 ------------

Member

- memberId(PK)

- teamId(FK)

 

Team

- teamId(PK)

 

------------- 객체 -------------

Member {

  @JoinColumn(name="teamId")

  Team team;

}

 

 

이 예시에서는 referencedColumnName이 생략되었기 때문에, Team 테이블의 PK로 자동 지정된다.

따라서 "Member.teamId(FK) -> Team.teamId(PK)"를 조인하면서 연관관계가 처리된다.

 

referencedColumnName을 PK가 아닌 다른 컬럼에 직접 지정할 수도 있지만 정규화 관점에서 권장하지는 않는다.

 

 

 

이처럼 DB에서 참조 무결성을 유지하기 위해, FK는 일반적으로 다른 테이블의 PK를 참조한다.

따라서 FK가 PK 값이 아닌 다른 컬럼을 참조하게 되면 데이터의 무결성이 깨질 수도 있고, 해당 컬럼에 대한 인덱스 또한 없을 가능성이 높아 성능이 저하될 수도 있다.

 

따라서 referencedColumnName를 생략하여, FK가 연관관계 테이블의 PK를 참조하도록 두는 것이 좋다.

 

 


 

참고문헌.

- https://www.inflearn.com/questions/113969/joincolumn-%EC%9D%98-name-referencedcolumnname-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4