목록전체 글 (261)
당니의 개발자 스토리
상속관계 매핑이번 시간에는 고급 맵핑, 그러니까 주로 상속관계 맵핑에 대해서 알아보겠습니다.우선 목차를 보시면 상속관계 맵핑이라는 것을 jpa가 어떻게 지원하는지, 그러니까 객체의 상속관계를 테이블에 어떻게 맵핑하는지 이것에 대해서 설명을 드릴 거구요. 그리고 이제 @MappedSuperclass 라고 속성만 상속하는 건데, 그것에 대해서 설명 드리고 실전 예제에서 이 상속관계 맵핑을 어떻게 사용하는지 보여드리겠습니다.상속관계 맵핑입니다.우선 객체는 상속관계가 있죠. 그런데 이제 관계형 데이터베이스에는 상속관계가 사실 상속관계 비슷하게 지원하는 데이터베이스들도 있는데 사실 객체의 상속관계랑은 또 다르거든요. 그런데 이제 그나마 데이터적으로 보면 객체의 상속관계와 비슷한 모델이 있어요. 그게 뭐냐면 관계형..
실전 예제 3 - 다양한 연관관계 매핑이번 시간에는 실전 예제 3번, 이전시간까지 다양한 연관관계 맵핑을 배웠으니까, 그거를 가지고 배웠던 연관관계 맵핑을 한번 녹여보겠습니다.지금 보시면 배송이라는 게 추가가 됐고요. 일대일 연관관계를 설명 드리려고 주문과 배송을 일대일 관계로 잡았고요. 그리고 상품과 Category가 다대다, *로 표시되어 있는 게 다 입니다.이렇게 했을 때 이제 ERD는 orders의 Delivery_id, 그러니까 주문과 배송을 할 때, '일대일 관계일 때 Delivery_id, 즉 Foregin Key를 어디에 넣을 거야?' 라고 했을 때 저는 선호하는 방법인 주 테이블에 넣기로 결정을 했습니다. 그리고 Category랑 Item은 다대다 관계에요. 하나의 상품이 여러 개 Cat..
다대다 [N:M]다대다 연관관계에 대해서 알아보겠습니다.이전까지는 중요했는데 결론부터 말씀드리면 실무에서 전 이거를 쓰면 안 된다고 봐요. 맵핑이 있어서 그렇긴 한데, 암튼 왜 쓰면 안 되는지 설명드리는 거기 때문에 뭐 알고 안 써야지 모르면 이런거를 쓰고 싶단 말이에요.우선 관계형 데이터베이스는 정규화된 테이블 두 개로 다대다 관계를 표현할 수가 없어요. 그래서 어떻게 야매로 하는 방법이 있긴 한데 아무튼 결론적으로는 안 돼요. 그래서 어떻게 하냐면, 연결 테이블이라는 걸 추가해서 연결 테이블, 조인 테이블 등등 이름이 여러 가지가 있는데 이거를 일대다-다대일 관계로 풀어내야 돼요.뭐냐면 하나의 회원이 여러 개의 상품을 선택할 수 있거나 주문할 수 있거나 그래요.그러면 아래 그림처럼 이렇게 만든단 말이..
일대일 [1:1] 이번에는 일대일 관계에 대해서 설명을 드리겠습니다.일대일 관계는 그 반대도 일대일 이겠죠. 그리고 일대일 관계는 재미있는 게 뒤에서 보시면 알겠지만 외래키를 뭘 기준으로 나누냐면, 주 테이블이나 대상 테이블 중에 외래키를 아무데나 다 넣을 수 있어요. 예를 들어서 Member랑 Team이 있으면 Member에도 외래키를 넣어도 되고 Team에도 외래키를 넣어도 돼요. 왜냐? 이게 일대일 관계이기 때문에 가능한 거거든요. 대칭적인 거죠. 그러니까 여기 넣든, 저기 넣든 상관없는 거예요. 둘 중에 한군데만 넣으면 돼요.그래서 저는 기준을 어떻게 나누냐면 주 테이블에 외래키를 넣거나, 대상 테이블에 외래키를 넣거나 이거를 가지고 저는.. 이제 뭔가 두 테이블이 있어요. 예를 들어 MEMBER..
일대다 [1:N]오늘은 일대다.여기서는 '일'이 연관관계 주인입니다. 자 그러면 1 방향에서 외래키를 관리하겠다는 거거든요?이렇게 일대다 라는 단방향 방향이라는 맵핑이 있습니다. 이게 가능합니다. 우선 밑밥을 먼저 깔면 저는 이 모델은 권장하지 않습니다. 그런데 어쨌든 이게 표준 스펙에서 지원하는 거기 때문에 제가 설명을 드리는 거고요. 저는 실무에서 이 모델은 거의 가져가지 않습니다. 그런 이유들도 뒤에 쭉 설명을 드릴게요.일단 일대다 단방향이라는 게 있고요. 보시면 Member랑 Team을 뒤집었어요. Team이 1이고 Member가 N이잖아요. 근데 Team을 중심으로 이제 뭘 해보겠다는 거예요. Team에서 외래키도 관리하고.아무튼 Team과 Member가 있는데 Team이 List members..
다대일 [N:1]이번 시간에는 다양한 연관관계 맵핑에 대해서 알아보겠습니다.우선 이번 시간에는 연관관계 맵핑에 나오는 것을 대부분 다 알아보는 시간입니다. 딱 정리를 해드릴 거고요. 기본적인 고려 사항이랑 다대일, 일대다, 일대일, 다대다. 사실 연관관계라는 것은 이렇게 다중성으로 따지고 보면 사실 이 네 가지가 다거든요. 이 네 가지 케이스를 다 정리를 해서 말씀드리겠습니다.그리고 이 네 가지 케이스들을 다 포함하는 연관관계 맵핑을 실전 예제 3번으로 해보겠습니다.우선 연관관계 맵핑 시에 고려해야 될 사항이 세 가지가 있는데요.다중성, 다중성이라는 것은 일대다 뭐 이런 거겠죠. 그리고 단방향이냐, 양방향이냐, 그리고 양방향일 때의 연관관계의 주인, 이렇게 세 가지를 꼭 고려하셔야 되구요.다중성은 아까 ..
실전 예제 2 - 연관관계 매핑 시작이번 시간은 실전 예제 두 번째 시간입니다.지난 시간에는 연관관계를 몰랐으니까 연관관계 맵핑을 안하고 단순하게 DB 테이블에 맞춰서 설계를 했는데 그것을 객체스럽게 실전 예제 1번에다가 연관관계 맵핑을 씌워보겠습니다.보시면 기존과 테이블 구조는 완전히 동일하고요. 하나의 Member가 여러 개의 주문을 할 수 있는 일대다 구조고, 주문과 아이템이 있는데 하나의 주문이 여러 개의 아이템을 주문할 수 있기 때문에, 다대다를 일대다, 다대일로 풀어낸 ORDER_ITEM 이라는 테이블이 있습니다. 그래서 실전 예제 1번이랑 테이블 구조는 완전히 동일합니다.그리고 이제 참조를 사용하도록 바꿔 볼게요.결론적으로는 보시면 Member가 Order와 일대다고, Order가 Item과..
양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리이제 양방향 맵핑 시에 가장 많이 하는 실수.연관관계 주인의 값을 입력하지 않음. 이걸 예시로 보여드릴게요.자 이거는 정말 많이 실수하시는 부분이고 커뮤니티에도 질문이 한 번씩 올라와요.자 여기 보시면 정말 단순하게 Team 하나 만들고 Member 하나 만들었단 말이에요.Member와 Team의 순서를 좀 바꿔 볼게요.그리고 제가 team.getMembers().add(member) 해서 집어넣었어요. 분명히 지금 연관관계로는 집어넣은게 맞죠?Member에는 아무것도 손 댄게 없어요. 이제 어떻게 되는지 실행을 해보면,Insert 쿼리는 분명히 두 방이 나갔어요. 그럼 db에 가보시면,지금 Member 테이블을 보면 memberId, username..