inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

ORM 질문드립니다 !

287

한창훈

작성한 질문수 20

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를 싹 갈아엎고 설계부터 다시하자는 쪽으로 기울고 있는 상태인데, 꼬인 생각도 도움받고 싶고 마지막 결정전에 선생님의 의견이 너무 듣고싶었습니다.

JPA java

답변 2

1

한창훈

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

1

김영한

안녕하세요. 창훈님

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

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

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

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

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

화이팅!

실무 조언 관련 질문입니다.

0

38

1

H2데이터베이스 파일 생성

0

46

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

48

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

46

1

JPQL 메소드와 락

0

48

1

Delivery @OneToOne

0

55

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

85

2

UnsupportedOperationException 발생

0

80

3

H2 Database 연결이 안됩니다.

0

87

2

연관관계 매핑 질문드립니다.

0

78

2

h2데이터베이스 실행오류

0

103

2

persistence.xml

0

101

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

75

1

영속성 컨텍스트

0

60

1

JPA 프록시

0

87

1

Native Query와 MyBatis

0

62

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

81

1

임베디드 타입 예시 코드 관련 질문

0

110

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

89

3

인텔리제이 패키지 커서 단축키 질문

0

103

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

134

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

67

1

임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.

0

95

1

데이터베이스가 초기화되는 것 같아요

1

172

2