๐Ÿก DDD ์ ์šฉํ•˜๊ธฐ - 2

ozzingยท2022๋…„ 11์›” 2์ผ
0

DDD

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

DDD ์ ์šฉํ•˜๊ธฐ - 1 ๊ฐœ๋…์„ ํ† ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


1. ๋งคํ•‘ ๊ตฌํ˜„

  • ์—”ํ‹ฐํ‹ฐ๋Š” @Entity๋กœ ๋งคํ•‘
  • ํ•œ ํ…Œ์ด๋ธ”์— ์—”ํ‹ฐํ‹ฐ์™€ ๋ฐธ๋ฅ˜๊ฐ€ ๊ฐ™์ด ์žˆ์„ ๊ฒฝ์šฐ์— ๋ฐธ๋ฅ˜๋Š” @Embeddable, ๋ฐธ๋ฅ˜ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” @Embedded๋กœ ๋งคํ•‘

Aggregate ๋‹จ์œ„๋กœ ๋ฌถ์€ ๊ทธ๋ฆผ

์ง€๋‚œ๋ฒˆ์— ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์„ ๊ฐ€์ ธ์™€ ๋ณด์•˜๋‹ค. DDD ์ ์šฉ ์ด์ „๊ณผ ๊ฐ€์žฅ ๋‹ฌ๋ผ์ง„ ์ ์€ Question์ด Entity์—์„œ Value๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Form๊ณผ Question์€ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐธ๋ฅ˜ ์ปฌ๋ ‰์…˜์„ ๋ณ„๋„ ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. @ElementCollection๊ณผ @CollectionTable์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด Form ํ…Œ์ด๋ธ” Question ํ”„๋กœํผํ‹ฐ

    @OneToMany(mappedBy = "form")
    private List<Question> questionList;

๋ฐธ๋ฅ˜ ์ปฌ๋ ‰์…˜ ํ…Œ์ด๋ธ” ๋งคํ•‘ ํ›„

    @ElementCollection
    @CollectionTable(name = "Question", joinColumns = @JoinColumn(name = "orderId"))
    @OrderColumn(name = "questionId")
    private List<Question> questionList;

์ด๊ณณ์—์„œ ์กฐ์ธํ•˜๊ณ ์ž ํ•˜๋Š” ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ @CollectionTable์˜ name์œผ๋กœ ์ง€์ •ํ•˜๊ณ  joinColumns๋กœ ์™ธ๋ถ€ํ‚ค๋กœ ์“ฐ์ผ ์ปฌ๋Ÿผ๋ช…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜, @OrderColumn์„ ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๋กœ ์“ฐ์ผ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด Question ํ…Œ์ด๋ธ”

@Getter
@Setter
@Entity
@Table(name = "Question")
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
public class Question extends AbstractTimestamp {
		...
}

๋ฐธ๋ฅ˜ ์ปฌ๋ ‰์…˜ ํ…Œ์ด๋ธ” ๋งคํ•‘ ํ›„

@Embeddable
@EqualsAndHashCode(of = "id")
public class Question extends AbstractTimestamp {
		...
        
        protected Question() {
        }
        
        ...
}

์ผ๋Œ€์ผ ๊ด€๊ณ„์˜ Value์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @Entity ๋Œ€์‹  @Embeddable๋กœ ๋งคํ•‘ ์„ค์ •ํ•œ๋‹ค.
์ด์ „๊ณผ๋Š” ๋‹ฌ๋ฆฌ Value๋Š” ๋ถˆ๋ณ€ํ•ด์•ผํ•˜๋ฏ€๋กœ Getter, Setter๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , JPA ์ ์šฉ์„ ์œ„ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” protected๋กœ ์ง€์ •ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณดํ˜ธํ•œ๋‹ค.


2. ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง

์ „์ฒด ๊ตฌ์กฐ

์ด์ „์—๋Š” ์œ„์™€ ๊ฐ™์€ ๊ณ„์ธตํ˜• ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Controller ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ controller ํŒจํ‚ค์ง€ ํ•˜์œ„์— ์œ„์น˜ํ–ˆ๋‹ค. ํŒจํ‚ค์ง€๋งŒ์„ ๋ณด๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ ํŒŒ์•…์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํŒจํ‚ค์ง€๋งˆ๋‹ค ๋„ˆ๋ฌด ๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ๊ทธ๋“ค๋ผ๋ฆฌ์˜ ์—ฐ๊ด€๊ด€๊ณ„ ํŒŒ์•… ๋“ฑ์ด ์–ด๋ ต๋‹ค.

ํ˜„์žฌ presentation, application, domain, infrastructure ๊ฐ ๊ณ„์ธต ์•ˆ์—์„œ ๋„๋ฉ”์ธ๋ณ„๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • presentation : Controller๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. Mapper๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ๋งž๊ฒŒ ๊ฐ€๊ณตํ•ด์„œ ๋„˜๊ฒจ์ค€๋‹ค.
  • application : Facade๋ผ๊ณ  ๋ช…๋ช…ํ–ˆ์œผ๋ฉฐ ํ•ด๋‹น ์š”์ฒญ์— ํ•„์š”ํ•œ ์ž‘์—…๋“ค์„ ์ •์˜ํ•˜๊ณ  ํ˜ธ์ถœํ•œ๋‹ค. Domain Service ์™ธ์˜ ์•Œ๋ฆผ ์ „์†ก ๊ฐ™์€ ๊ธฐํƒ€ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.
  • domain : Entity, Domain Service, infrastructure์—์„œ ๊ตฌํ˜„ ๋  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๋„๋ฉ”์ธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์ด๋‚˜ ๋„๋ฉ”์ธ ๊ฐ’์œผ๋กœ ์ด๋ค„์ง€๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค์ด ์ˆ˜ํ–‰๋œ๋‹ค.
  • infrastructure : ๊ฐ€์žฅ low level ๊ตฌํ˜„์ฒด๋กœ ๊ธฐ์ˆ ์  ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. DIP ๊ฐœ๋…์„ ํ™œ์šฉํ•˜์—ฌ domain ๊ณ„์ธต์—์„œ ์ถ”์ƒํ™” ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ํŒจํ‚ค์ง€๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— ์žˆ์–ด์„œ Info, Command, Request, Response ๋“ฑ์˜ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹ธ์ฃผ์–ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค. ํŒจํ‚ค์ง€ ์˜์กด ๋ฐฉํ–ฅ์ด ๋ชจ๋‘ domain ๊ณ„์ธต์„ ๋ฐ”๋ผ๋ณด๊ณ , ๋„๋ฉ”์ธ ๋ณ„ ์‘์ง‘๋„๊ฐ€ ๋†’์•„์กŒ๋‹ค.

์˜ˆ์‹œ

์•„์ง ์‘์šฉ ์„œ๋น„์Šค ๋‹จ๊ณ„๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„ ๋‹ค์†Œ ์กฐ๊ทธ๋งฃ์ง€๋งŒ ํ˜„์žฌ๊นŒ์ง€์˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋ฅผ ์˜ˆ์‹œ๋กœ ๊ฐ€์ ธ์™”๋‹ค. constant๋Š” Entity์— ํฌํ•จ๋œ ENUM ๊ฐ’๋“ค์„ ๋ชจ์•„๋†“์€ ํŒจํ‚ค์ง€๋‹ค.

๋ณ€๊ฒฝํ•œ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ธฐ์กด์—๋Š” PlanStatus๊ฐ€ ์–ด๋””์— ์“ฐ์ด๋Š”๊ฑด์ง€ ๋ฐ”๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค๋ฉด, User ๋„๋ฉ”์ธ ์•ˆ์— ์ž๋ฆฌํ•œ PlanStatus๋Š” ์œ ์ €์˜ ๊ตฌ๋งค ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ„์„ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค. ๋˜ ๊ฐ™์€ ํŒจํ‚ค์ง€ ์•ˆ์— ์œ„์น˜ํ•˜์—ฌ ํŒจํ‚ค์ง€๊ฐ„ import๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ฌ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๊ทธ ์™ธ์—๋„ ์„ค๊ณ„์‹œ ๊ณ ๋ คํ•  ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋„๋ฉ”์ธ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ œ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ ์ œ๊ฑฐ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง€๊ณ  ์ดํ•ด๊ฐ€ ์‰ฌ์›Œ์ง
  • ๋‚˜๋จธ์ง€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋„ ์˜๋ฏธ๊ฐ€ ๋šœ๋ ทํ•ด์ง

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ์™„์ „ํ•ด์•ผํ•œ๋‹ค.

  • ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ์‹œ๋‚˜, ํ‘œํ˜„ ์˜์—ญ์—์„œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ์™„์ „ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์ฆ‰์‹œ ๋กœ๋”ฉ ์„ค์ •ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ, ์กฐํšŒ์˜ ๋นˆ๋„๊ฐ€ ๋ณ€๊ฒฝ์˜ ๋นˆ๋„๋ณด๋‹ค ํ›จ์”ฌ ๋†’๊ณ  ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ๋”ฐ๋ผ ํŠน์ • ํ…Œ์ด๋ธ”์€ ์ฆ‰์‹œ ๋กœ๋”ฉ์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€