-
spring data jdbc 관계 매핑TIL 2021. 4. 24. 19:21
jpa를 쓰다가 spring data jdbc를 쓰니 관계 매핑을 하는 게 굉장히 마음에 들지 않는 부분이 많아서
정리해본다.
0. 기본 설정
1. 일대일
2. 일대다
3. 다대일
4. 다대다
0. 기본 설정으로 디펜던시 추가
프로퍼티 추가
schema.sql
일대일을 위한 구조
유저는 팀의 외래 키를 가지고 있으며 그 이름은 상대방 table이름 이어야 한다.
1. 일대일
Team.class user.class team과 user는 일대일 관계
한쪽이 객체로 가지고 있으면 쉽게 구현이 가능하다.
팀에 선수를 배치하고 팀을 출력하면
잘 출력된다.
또는 한 테이블로 만들고 Embedded 사용하던가.
2. 일대다
일대다는 set, list, map으로 구현이 가능하다.
2-1. set
db구조는 일대일과 동일하다. user가 다 team이 일 형태
team.class user.class team 만 변경된 형태이다. set으로 user를 관리한다.
test code
발생되는 쿼리
2-2.
list 이용
리스트는 순서가 있는 구조이기에 자식 테이블에 '부모 테이블 이름_key int'라는 칼럼을 넣어줘야 한다.
아마 이것을 이용해 순서를 유지하는 것 같다.
부모 테이블 이름_key int 칼럼 추가
발생 쿼리
order by에서 key를 사용한다.
2-3.
map 사용
list와 비슷하게 '부모 테이블 이름_key 적당한 타입'이라는 칼럼을 자식에게 추가해야 한다.
team.class key는 String type으로 정했다.
테스트 코드
발생 쿼리
3. 다대일
spring data jdbc는 일대일 구조만 객체를 가지고 있는 구조이고
나머지 구조는 부모 쪽 id를 가지고 있는 형태로 이루어진다.
하지만 양방향 구조는 이뤄지고 있지 않으므로 반대편에서는 list로 user를 관리하고 있진 않는다.
테스트 코드
auto_increment라서 먼저 team을 save 했다.
후에 팀 id로 검색하면 여러 명의 user들이 나온다.
4. 다대다
다대다는 일대다 다대일로 풀어서 만들어 본다.
team과 user 사이에는 이제 agent가 끼어들게 되었다.
agent table에서는 일대다 관계처럼 반대편의 외래 키를 가지고 있어야 한다. 이름은 상대방 table이름(set으로 관리 중)
테스트 코드
발생 쿼리
team을 db에서 가져오면 중간 테이블인 agent가 나온다.
선수를 구하고 싶으면 agent에서 선수의 id를 얻어서 다시 db에서 find해와야 한다.
jpa는 객체를 담고 있어서 fetch조인으로 어떻게 어떻게 하면 바로 받을 수 있지만
spring data jdbc는 안 되는 것 같다.
github.com/ChoiGiSung/SpringBoot/tree/master/spring-boot-playground-2021-spring-data-jdbc-setup
ChoiGiSung/SpringBoot
스프링 부트 연습. Contribute to ChoiGiSung/SpringBoot development by creating an account on GitHub.
github.com
mappedCollection 어노테이션도 있는데
아마 외래키명을 custom하면 달아주는 것 같다.
'TIL' 카테고리의 다른 글
2021.04.26 기록장 (0) 2021.04.25 2021.04.25 기록장 (0) 2021.04.25 2021.04.24 기록장 (0) 2021.04.24 2021.04.23 기록장 (0) 2021.04.22 2021.04.22 기록장 (0) 2021.04.21