์..
JPA๋ก ๋ชจ๋ ํ๋ฉด์ ์ฒ๋ฆฌํ์๋ ค๊ณ ํ๋ฉด ์๋ฉ๋๋ค.ย
๋ณต์ก์ฑ๊ณผ ์ฑ๋ฅ์ ํ์ ย ๋น ์ ธ ์ฃฝ๊ฒ ๋ฉ๋๋ค.ย
๊ดํ CQS( Command and Query Separation ) ์ด๋ผ๋ ๊ฐ๋
์ด ์์ฆ ์ ํํ๋๊ฒ ์๋์ง๋ผ..
์ดํ๋ฆฌ์ผ์ด์
์ ์ฑ๊ฒฉ์ด ํ๋ฉด ์ถ๋ ฅ์ด ์ด์ข๊ฒ ๋๋ฉ์ธ ๋ชจ๋ธ ๋จ์๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ค๋ฉด ๋ชจ๋ฅผ๊น..
JPA(ORM)์ผ๋ก๋ Command๋ง ์ฒ๋ฆฌํ๊ณ ํ๋ฉด์ ๋ฟ๋ ค ์ฃผ๋๊ฒ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ผ์๋๊ฒ ํธํ ๊ฒ๋๋ค. (mybatis๋ผ๋๊ฐ Jooq๋ผ๋๊ฐ)ย
๊ทธ๋ฆฌ๊ณ ์ผ๋จ ํ๋ฉด์์ ๋ค์ด์ค๋ ์์ฒญ์ Request Model์ด์ง ๋๋ฉ์ธ ๋ชจ๋ธ์ด ์๋๋ผ๋๊ฒ์ ๋จผ์ ์๊ฐํ์๊ณ .
์ด๊ฒ ๋ง์ด ๊ธธ์ด์ง๋๋ฐ ์์ฆ์ ๋ฒ์ญํ ๋์จ ํด๋ฆฐ ์ํคํ
์ฒ ์ฑ
์ ์ฌ์ ๋น ๋ฅด๊ฒ ์ฝ์ด ๋ณด์๋๊ฒ์ ์ถ์ฒํฉ๋๋ค. ย
์์์ฑ ์ ์ด์ ๋ํด์ ๊ณต๋ถ / ํ
์คํธ ์ค ๊ถ๊ธํ ์ฌํญ์ด ์์ต๋๋ค.
์๋ฐ 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์(๋ฅผ) ๋ฐฉ๋ฌธํ์ธ์.