인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

김종완[와니Wani]님의 프로필 이미지
김종완[와니Wani]

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 관계를 맺을때 궁금한 점입니다.

작성

·

780

1

개인적으로 객체지향을 공부하면서 궁금증이 생겨서 질문 드립니다!

도메인을 설계하실때

만약 Member라는 도메인에서 여러가지 자동차를 가진다는 관점에서

@OneToMany(cascade = CascadeType.ALL)

를 사용하고 ArrayList를 활용해 1:N 관계를  맺을때, 무조건 이런 컬렉션을 사용해야 하나요??

https://jojoldu.tistory.com/412

이 블로그 글을 봤을때, Car라는 클래스를 Cars라는 일급컬렉션으로 만들고 그 Cars라는 List를 사용하려고 하면

1:N관계로 매핑하는건 불가능하겠죠?

그럼 JPA에서는 일급컬렉션을 사용할 일이 있을까요??

언제나 좋은강의 감사합니다!

답변 4

5

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

안녕하세요. 와니님^^

일급 컬렉션을 사용하는 것은 좋은 설계 방법중 하나이기 때문에 일급컬렉션이 필요하면 사용하면 됩니다.

하지만 모든 디자인 원칙에는 항상 트레이드 오프가 존재합니다.

현재 비즈니스 로직에서 일급 컬렉션을 사용하는게 더 좋으면 일급 컬렉션을 사용하면 되고, 단순히 리스트를 받아서 처리해도 문제가 없으면 리스트로 처리해도 됩니다. 예를 들어서 비즈니스 로직이 매우 단순하고, 또 단순히 리스트를 돌리면서 출력하는 로직만 있다면 일급 컬렉션을 만드는게 큰 의미가 없겠지요. 반대로 비즈니스 로직이 매우 복잡하고, 리스트의 내용을 가지고 뭔가 계산하는 로직들이 많이 있다면 일급 컬렉션이 이 업무를 담당해주면 좋습니다. 추가로 비즈니스 로직이 파편화 되지 않고, 일급 컬렉션이 관리를 해주니 재사용성도 높아지겠지요.

JPA를 사용해도 일급컬렉션을 사용할 수 있습니다. 예를 들어서 주문 내역을 List<Order> orders로 가지고 왔는데, 리스트는 사실 비즈니스 로직을 제공할 수 있는 방법이 없지요. List가 제공하는 기능만 사용할 수 있으니까요. 그래서 일급 컬렉션을 하나 만들어두고 그 안에 JPA에서 조회한 List<Order> orders를 넣어주면 일급 컬렉션을 통해서 많을 것을 제공할 수 있습니다.

추가로 클린코드 책 6. 객체와 자료 구조를 읽어보시면, 말씀드린 트레이드 오프에 대한 몇가지 인사이트를 얻으실 수 있습니다.

감사합니다.

4

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

안녕하세요. 와니님

JPA에서 연관관계는 일대다의 경우 명확하게 컬렉션을 사용해야 합니다. 단일 객체를 사용할 수 없습니다.

대신 임베디드 타입(@Embedded) 으로 한번 감싸면 어느정도 원하는 목표를 달성하실 수 있을꺼에요.

하지만 임베디드 타입으로 한번 감싸면 JPQL등을 작성할 때, 그리고 실제 개발할 때, 객체를 한번 더 거쳐야 하기 때문에 오는 불편함들도 많습니다. 이런 점들을 고려하셔서 결정하시면 됩니다. (저는 이런 불편함 점들 때문에 실용적인 관점에서 JPA 연관관계에 일급 컬렉션은 잘 사용하지는 않습니다.)

감사합니다.

3

정말 감사합니다. 단번에 궁금증이 해소되었습니다. 특히 

이 부분에 대해서 고민을 많이 했는데, 뭔가 해결된 느낌입니다  :D

언제나 친절한 답변 감사합니다 

2

친절한 답변 감사합니다. 실무에 대해서 조금더 알게 되었네요!

조금더 일급컬렉션에 대해서 질문드립니다!

1. 그러면 실무에서 일급 컬렉션 자체를 만들어서 쓰는 일이 아예 없을까요?? 

2. 일급 컬렉션은 List같은 객체들을 외부에서 손쉽게 내용을 변경하지 못하게 사용한다는 이유로 사용하는데 

만약 외부에서 도메인에 대한 리스트를 조절할수 있으면 생각치 못한 상황이 벌어질수 있지 않나요?

언제나 친절한 영한님을 기다리고 있습니다 :D

김종완[와니Wani]님의 프로필 이미지
김종완[와니Wani]

작성한 질문수

질문하기