Re: [KSUG] JPA 영속성 전이 저장 (다대일 양방향 매핑)

186 views
Skip to first unread message

Jisung Ahn

unread,
Aug 27, 2019, 9:00:15 PM8/27/19
to ks...@googlegroups.com
음..

JPA로 모든 화면을 처리하시려고 하면 않됩니다. 
복잡성과 성능저하에  빠져 죽게 됩니다. 


괜히 CQS( Command and Query Separation ) 이라는 개념이 요즘 유행하는게 아닌지라..

어플리케이션의 성격이 화면 출력이 운좋게 도메인 모델 단위로 처리하면 된다면 모를까..
JPA(ORM)으로는 Command만 처리하고 화면에 뿌려 주는것은 다른 방법을 찾으시는게 편할겁니다. (mybatis라던가 Jooq라던가) 

그리고 일단 화면에서 들어오는 요청은 Request Model이지 도메인 모델이 아니라는것을 먼저 생각하시고.

이게 말이 길어지는데 요즘에 번역판 나온 클린 아키텍처 책을 사서 빠르게 읽어 보시는것을 추천합니다.  






2019. 8. 28. 오전 8:57, A-YUL's Daddy <kim...@gmail.com> 작성:

영속성 전이에 대해서 공부 / 테스트 중 궁금한 사항이 있습니다.

자바 ORM 표준 JPA 프로그래밍 책에서도 일대다 단방향의 문제를 지적하고 다대일양방향 매핑을 권장하더군요. 단방향 매핑으로 진행할 경우 parent_child_list 테이블이 별도로 생성되어(조인 테이블) 여러 측면에서 (성능, 관리) 좋지 않음을 이해 했습니다. 그래서 아래 코드와 같이 다대일양방향 매핑으로 변경후 테스트 해 봤습니다. public class Parent { @Id @Column(name="parent_id") @GeneratedValue private long id; private String parentValue; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) @Builder.Default private List<Child> childList = new ArrayList<Child>(); } public class Child { @Id @Column(name = "child_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String childValue; @ManyToOne @JoinColumn(name = "parent_id") @JsonIgnore private Parent parent; } @PostMapping public ResponseEntity<Parent> save(@RequestBody Parent p){ return new ResponseEntity<Parent>(s.save(p), HttpStatus.OK); } @Transactional public Parent save(Parent p) { return repo.save(p); } 그런데 child 테이블 parent_id column 에 null 이 들어가더군요 생각해보니 ajax --> controller --> service 로 넘어온 Parent 객체의 정보를 보면 parent -> child 는 매핑되어 있으나 (json 형태를 보면), child 입장에서는 parent 를 알수 없으니 이러한 현상이 발생하는 것 아닐까... 생각 됩니다. 그래서 service 에서 간단하게 child.setParent(parent); 코드를 삽입해 봤습니다. @Transactional public Parent save(Parent p) { for(Child c : p.getChildList()) { c.setParent(p); // <-- child 입장에서 parent 를 set 해주는 작업 } return repo.save(p); } 이렇게 하니 정상 동작하네요.... 화면으로 부터 넘어오는 객체의 형태가 복잡해질 수록 다대일 매핑이 많아지고 depth 도 더 깊어지게 됩니다. 그러면 위와 같이 child 입장에서 parent 를 set 해주는 loop 도 이중/삼중으로 될 가능성도 있습니다. 위와 같이 처리하는 것이 맞는지 ... 의문이 드네요
혹시 다른 방법은 없을까요?

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/a52514a5-088e-4806-a0dc-53696a43299e%40googlegroups.com을(를) 방문하세요.

A-YUL's Daddy

unread,
Aug 28, 2019, 7:47:14 PM8/28/19
to Korea Spring User Group Q&A
@narusas 답변 고맙습니다. 

일단 제가 궁금해했던 부분은 Entity 의 setter 에서 parent 를 set 해주도록 설정하여 Service 에서는 아무런 작업하지 않고 RequestBody로 Mapping 될때 자동으로 부모를 알려주도록 해서 해결 했습니다. 

내용은 블로그에 정리해 두었으니 https://kimyhcj.tistory.com/353 혹시 필요하신 분이 있다면 도움이 되었으면 좋겠네요.

말씀해 주신것 처럼 CQS 에 대한 이해를 위한 공부가 필요해 보이네요. 

추천해 주신 "클린 아키텍쳐" 책도 읽어봐야 겠습니다. 

고맙습니다. 좋은 하루 되세요.

2019년 8월 28일 수요일 오전 10시 0분 15초 UTC+9, narusas 님의 말:
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ks...@googlegroups.com에 이메일을 보내세요.
Reply all
Reply to author
Forward
0 new messages