테이블 간 연관관계를 설정할 때 사용하며, 1:N 관계에서 @JoinColumn은 외래 키 매핑 시 사용한다.
단, name 속성에는 매핑할 외래 키의 이름을 설정한다(해당 테이블의 필드명을 가져오는 것이 아님 !)
여지껏 이 부분에 대해서 잘못 생각하고 있었다..
name 속성에는 상대 테이블의 필드명을 넣어주어야 한다고 생각했는데, 그게 아니라 JoinColumn을 해와서 내 테이블에서 표시해줄 필드의 이름이었다 ..!
@JoinColumn을 주로 다(N)쪽에서 사용했는데, 1:N의 관계에서 외래키의 주인은 N이다.
그렇다면 다 쪽에서 상대 테이블과 매핑을 어떻게 하는것이지 ..? 하는 생각이 들었다.
@JoinColumn 안에 있는 설명이다.
referencedColumnName은 선택사항이며, 해당 외래 키의 컬럼이 참조하는 열의 이름이다.
여기에 설명된 경우 이외의 엔터티 관계 매핑과 함께 사용되는 경우 참조되는 열은 대상 엔터티의 테이블에 있다.
결국 해당 referencedColumnName 속성을 생략하는 경우, 자동으로 대상 테이블의 PK 값으로 지정된다는 것이다.
따라서 referencedColumnName 속성을 사용하지 않아도 PK 값이 잘 매핑이 되는 것이었다 ..
매핑하고자 하는 상대 테이블의 기본키가 복합키로 이루어져 있는 경우에는 어떻게 할까?
예를 들어 Parent 엔티티의 PK가 2개인 경우 설정하고 싶다면,
@JoinColumns({
@JoinColumn(name = "grand_parent_id"),
@JoinColumn(name = "parent_id")
})
private Parent parent;
이렇게 @JoinColumns 에너테이션 안에 @JoinColumn을 넣어주면 된다!
혹시 상대 테이블의 PK가 2개인데 이쪽 테이블에서는 1개의 컬럼만 받아오고 싶다면 어떻게 될까?
Failed to initialize JPA EntityManagerFactory: An association that targets
entity 'com.PK가두개인엔티티경로' from entity
'com.1개만받은엔티티경로' has 1 '@JoinColumn's but the primary key has 2 columns
예상한 결과긴 하지만 오류가 난다 ..!
오류 내용도 원래 테이블은 2개의 컬럼이 기본키인데, 너는 한개만 설정했어..! 라는 내용이다.
서버 쪽 코드를 작성하고 있는데, ADMIN 권한을 주기 전이라 기본 값을 USER로 설정해두었다.
그 후에 ADMIN 권한을 줄 수 있도록 코드를 변경했는데
일반 USER 권한으로는 회원가입이 되는데,
ADMIN으로 진행하려고 하면 원래대로 일반 USER 권한으로 테이블에 들어가게 됐다 .. 이유가 뭐지 ㅠ
일단 코드를 다시 보기로 했다.
혹시 조건을 잘못 주었는지 살펴보았는데, 딱히 잘못 작성한 부분은 없었다 ..
회원가입을 할 때, 원래는 username과 password만 입력하면 되지만,
admin으로 회원가입을 하고싶은 경우에는 adminToken도 같이 입력해서 넘겨주면
조건을 판단하여 adminToken이 일치하면 ADMIN 권한으로 회원 가입을 할 수 있다.
회원가입할 때 받는 SignupRequestDto를 봤더니, username과 password가 있고,
boolean 타입의 admin과 String adminToken이 추가로 있었다.
그래서 입력할 때, "admin" : true 를 추가로 입력했더니
그제서야 ADMIN 권한을 가진 사용자로 회원가입을 할 수 있었다.
이전에 테스트를 진행했을 때는 admin의 값이 false로 고정이 되어있었고, 이 부분을 true로 바꿔주는 명령어가 따로 존재하지 않아서 계속 USER 권한으로 회원가입이 되었던 것 같다.
adminToken의 값의 일치 여부를 판단하는 UserService에서의 코드를 변경했다.
조건에 따라서 adminToken의 값이 입력된 adminToken의 값과 일치하는 경우,
권한을 ADMIN으로 설정함과 동시에 admin 값을 false에서 true로 변경해주었다.
코드를 이전에 실습하던 것 그대로 가져왔는데,
아마도 이전에 실습했던 코드에서는 html 페이지가 있어서 달랐던 듯 하다.
html 페이지에서는 admin 권한을 주고싶다면 checkbox에 체크를 해서 boolean 타입의 admin 값이 true로 바뀌었던 것 같다.
지금 나는 서버쪽 코드만 작성하고 있기 때문에 체크박스가 따로 없어서 admin이 true로 바뀔 수 없었던 것이다..!
따라서 boolean 타입의 admin 필드를 아예 사용하지 않거나, 직접 admin 값을 true로 변경해주는 방법으로 해결할 수 있었다.
서버 쪽의 코드를 작동시키다 보니,
html 페이지와 같이 있을 때와 다른 부분이 있어 살짝 혼동이 왔던 듯 하다.
하지만 서버 쪽 코드를 잘 작성하고,
작동하도록 만들어두면 html 페이지가 있을 때도 잘 할 수 있을 듯 하다 !