인프런 커뮤니티 질문&답변

듀크님의 프로필 이미지
듀크

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

ORM 질문드립니다 !

작성

·

202

0

안녕하세요?

고퀄리티 강의에 친절한 답변들까지 항상 감사드리고있습니다.

Querydsl 강의까지 로드맵을 완료하고 다시 복기하고있습니다.

저는 지금 취업한지 한달 된 주니어입니다.

선생님의 JPA 강의를 보면서 회사의 레거시 시스템에서 마이바티스를 들어내고 JPA로 갈아 엎어보려고 하고 있는데요.

그러기 전에 앞서 JPA를 잘하기 위해 제가 취업할 때 만들었던 마이바티스 기반의 포트폴리오를 먼저 JPA로 갈아 엎어보고 있습니다.

그런데 계속 보다보니 처음엔 "쉽네!" 라고 생각했던 부분들에서 점점 이상한 의문이 드는 것 같아 몇가지 질문드립니다.

계속 생각이 꼬리를 물고 이어지다보니 제 생각이 많이 꼬여있는 상태인 것 같습니다.

1. Member와 Team 엔티티가 있고, Member가 Team을 @ManyToOne으로 보고있는 다대일 단방향 관계로 설정했다고 가정하면,

DB상에서는 Member에 Team FK가 있는 상태이며 join을 통해 Member가 Team을 참조할 수 있고, Team이 Member를 참조할 수 있습니다. 

하지만 JPA상에서는 뭔짓을 해도 필드가 없기때문에 Team에서는 Member를 참조할 수 없고,

Member에서 Team을 가져올수밖에 없는 일방적인 상황이 되기때문에 괴리감이 생깁니다.

그래서 계속해서 Team에도 Member를 향해 @OneToMany를 걸고 mappedBy를 하고 있는 저를 볼 수 있습니다.

이게 지금 올바른 상태인지 궁금합니다. 단지 제가 RDB의 사고방식에 익숙해져 있기때문인가 라는 의심이 듭니다.

RDB에서 양방향으로 조회를 할 수 있다고 해서 객체상태에서까지 꼭 양방향 조회가 되게끔 하는게 올바른걸까요?

2. 회사의 JPA코드들은 대체적으로 @OneToMany / @ManyToOne들밖에 안보이는데 제가 취업하기 전 만든 포트폴리오의 ERD를 보면서 테이블 매핑을 하다보면 자꾸 @OneToOne이 보이고 선생님께서 쓰지 말라고 하셨던, 써야하는 일이 생긴다면 일대다 다대일로 풀어내라고 하셨던 @ManyToMany를 써야만 하는, 흔히 매핑테이블이라고 하는 구조가 많이 보입니다.

이건 포트폴리오를 만들시기의 제가 설계를 개떡같이 해서 이런건가 싶은데 맞는걸까요? 대충 테이블 10개정도에 절반가까이가 그런 상태입니다.

그러니까 DB설계를 제대로했다면 과연 회사코드처럼 @OneToOne과 @ManyToMany을 볼일 없이 @ManyToOne과 @OneToMany로 다 해결할 수 있었을까 하는 의문이 생깁니다.

3. 2번과 비슷하게 제가 만든 포트폴리오의 테이블에는 PK가 없는 테이블이 상당수 존재하는데 이걸 JPA로 매핑하려고 보니 @Id를 PK에 걸어야하는데 걸데가 없는겁니다. 그래서 유니크하다고 생각되는 컬럼에 일단 붙이긴 했는데 JPA를 사용하는 경우에는 테이블에 무조껀 PK가 있는게 더 효율적이고 조금이나마 올바른 방법일까요?

제 생각에도 정말 어처구니 없는 질문들이라고 생각되기도 하는데 지금 제 상태가 많이 이상한가봅니다...ㅋㅋㅋ;

현재 제 심정으로는 아예 DB를 싹 갈아엎고 설계부터 다시하자는 쪽으로 기울고 있는 상태인데, 꼬인 생각도 도움받고 싶고 마지막 결정전에 선생님의 의견이 너무 듣고싶었습니다.

답변 2

1

듀크님의 프로필 이미지
듀크
질문자

늦은시간에 빠른답변 ㄷㄷ.. 정말 감사드립니다 !

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 창훈님

1. Member와 Team 엔티티가 있고, Member가 Team을 @ManyToOne으로 보고있는 다대일 단방향 관계로 설정했다고 가정하면 ...

-> 이 경우 JPQL을 적극 사용하시면 됩니다. 실무에서는 JPQL을 자주 사용합니다. JPQL을 사용하면 조인을 통해서 반대 방향도 찾을 수 있습니다. 그래도 잘 안풀리면 mappedBy를 쓰셔도 됩니다.

2. 네 실무에서는 대부분 @ManyToOne, @OneToMany를 사용합니다. @ManyToMany는 강의에서 언급 드린 것 처럼 사용하면 안됩니다. @OneToOne도 생각보다 자주 사용할 일은 없습니다.

3. PK가 없는 테이블은 존재하면 안됩니다. 모든 테이블에는 PK가 필수로 있어야 합니다.

이제 공부했으니! 처음부터 깔끔하게 다시 설계해보시면 더 크게 성장하실 수 있을거에요.

화이팅!

듀크님의 프로필 이미지
듀크

작성한 질문수

질문하기