๐Ÿ“š Dto์™€ Entity๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ , ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๋…ธ์„ยท2023๋…„ 1์›” 29์ผ
6

soobook (Spring+JPA Project)

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

์ž‘๋…„์— ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ entity๋ฅผ view์— ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๊ฐ€ Dto๋กœ ๋ณ€ํ™˜ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๋ฐ”๊ฟจ์—ˆ๋Š”๋ฐ, Entity์™€ dto์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•˜๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์•„ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค.
(์ผ๊ธฐ ๊ฐ™์ด ์จ์งˆ ์ˆ˜๋„ ์žˆ๊ณ , ๊ตฌ๊ธ€ ์ƒ๋‹จ์— ๋…ธ์ถœ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๊ธ€์ด ๋  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค!)



โญ Dto์™€ Entity๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ 

entity์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ์—์„œ dto๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ viewํ•œํ…Œ ๋ฐ˜ํ™˜ํ•œ ์ด์œ ๋Š” ์ฒซ ๋ฒˆ์งธ ์ด์œ ๋Š” Entity์˜ setter๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด์„œ์˜€์ง€๋งŒ ์ด์™€ ๋”๋ถˆ์–ด ๋‚ด๊ฐ€ ์ฐพ์•„๋ณธ entity์™€ dto๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ ์–ด๋ณด๊ฒ ๋‹ค.


โ˜‘๏ธ Entity๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค.

entity๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜๋ฉด ์›ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ ์ž์›์˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—”ํ‹ฐํ‹ฐ๋ฅผ UI๊ณ„์ธต์— ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ด๋ธ” ์„ค๊ณ„๋ฅผ ํ™”๋ฉด์— ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด๋‚˜ ๋‹ค๋ฆ„์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ์œผ๋กœ๋„ ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•œ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.
๋˜ํ•œ dto๋Š” setter๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ entity์—์„œ setter๋Š” ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

โ˜‘๏ธ ํ™”๋ฉด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ๋Š” ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ž๋™๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ์ •๋ณด๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋„๋ฉ”์ธ ๊ฐ์ฒด Member๋Š” ๊ทธ ์ด์ƒ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•„์š” ์ด์ƒ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์†์„ฑ๋“ค๊นŒ์ง€ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. (๋ณด์•ˆ์—๋„ ์•ˆ์ข‹๊ณ  ์†๋„๋„ ๋Š๋ ค์ง)
๊ทธ๋ฆฌ๊ณ  ์ž๋™๋กœ๊ทธ์ธ ์—ฌ๋ถ€์™€ ๊ฐ™์€ ์†์„ฑ์€ Member์— ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
์ด์™€ ๊ฐ™์ด Dto์™€ Entity์˜ ์ฐจ์ด๋กœ ์ธํ•ด Dto์™€ Entity๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


โ˜‘๏ธ Entity๋ฅผ ๊ทธ๋Œ€๋กœ view์— ๋„˜๊ธฐ๋ฉด, view์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€ํ™”๊ฐ€ Model์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ์‰ฝ๋‹ค.

์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ค˜์•ผ ํ•  ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

โ˜‘๏ธ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

jpa์—์„œ ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ controller์—์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ตญ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ ธ ์Šคํƒ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
jpa์—์„œ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด @JsonManagedReference์™€ @JsonBackReference์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, @JsonIgnore์„ ์“ฐ๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ Dto๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „๊ธฐ๋„ ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๊ธฐ์—๋„ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.

โ˜‘๏ธ validation ์ฝ”๋“œ์™€ ๋ชจ๋ธ๋ง ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” DB์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งค์นญ๋˜๋Š” ํ•„๋“œ๊ฐ€ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ž‘์„ฑ๋˜์–ด์žˆ๋Š” ๊ณณ์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์†์„ฑ์—๋Š” @Column, @JoinColumn , @ManyToOne, @OneToOne ๋“ฑ์˜ ๋ชจ๋ธ๋ง์„ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

์—ฌ๊ธฐ์— ๋งŒ์•ฝ @NotNull, @NotEmpty, @NotBlank ๋“ฑ๊ณผ ๊ฐ™์€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฐ’์˜ validation์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ๋” ๋ณต์žกํ•ด์ง€๊ณ  ๊ทธ๋งŒํผ ๊ฐ€๋…์„ฑ์ด ์ €ํ•˜๋œ๋‹ค.

์ด๋•Œ, ๊ฐ๊ฐ์˜ ์š”์ฒญ์— ํ•„์š”ํ•œ validation์„ DTO์—์„œ ์ •์˜ํ•œ๋‹ค๋ฉด, ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ข€ ๋” ๋ชจ๋ธ๋ง๊ณผ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.



โญ Dto์™€ Entity ๋ณ€ํ™˜ ์œ„์น˜์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

๊ทธ๋Ÿผ Dto์™€ Entity๋ฅผ ์–ด๋””์„œ ๋ณ€ํ™˜ํ•ด์•ผ ํ• ๊นŒ?
์ผ๋‹จ์€ (controller-service-repository ๊ณ„์ธต์ธ ๊ฒฝ์šฐ) repository์—์„œ dto์™€ entity์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. Repository๋Š” Entity์˜ ์˜์†์„ฑ์„ ๊ด€์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋‹ˆ๊นŒ ๊ตณ์ด ์ฐพ์•„๋ณด์ง€ ์•Š์•„๋„ repository์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒŒ ์˜ณ์ง€ ์•Š๋‹ค๋Š” ์ƒ๊ฐ์€ ์ž์—ฐ์Šค๋Ÿฌ์› ๋‹ค.

๊ทธ๋Ÿผ service vs controller ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.



โ˜‘๏ธ Entity -> Dto (์‘๋‹ต)

Serice๊ฐ€ entity๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , Controller๊ฐ€ dto๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

  • View์— ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ Domain ๊ฐ์ฒด์— ํฌํ•จ๋˜์–ด Controller(ํ‘œํ˜„ ๊ณ„์ธต)๊นŒ์ง€ ๋„˜์–ด์˜จ๋‹ค.
  • Controller๊ฐ€ ์—ฌ๋Ÿฌ Domain ๊ฐ์ฒด๋“ค์˜ ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•ด์„œ DTO๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฒฐ๊ตญ Service(์‘์šฉ ๊ณ„์ธต) ๋กœ์ง์ด Controller์— ํฌํ•จํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ Domain ๊ฐ์ฒด๋“ค์„ ์กฐํšŒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ Controller๊ฐ€ ์˜์กดํ•˜๋Š” Service์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋น„๋Œ€ํ•ด์ง„๋‹ค.
    ์ถœ์ฒ˜ : DTO์˜ ์‚ฌ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•˜์—ฌ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์ด ์žˆ์ง€๋งŒ, service์˜ ์ž์œ ๋„๊ฐ€ ๋†’์•„์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

service๊ฐ€ entity๋ฅผ dto๋กœ ๋ณ€ํ™˜ํ•ด์„œ controller์—๊ฒŒ ๋ฐ˜ํ™˜

service์—์„œ entity๋ฅผ dto๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด, controller๋Š” ๊ทธ dto ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ view์— ๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.
'๋กœ์ง'์„ service๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด๊ธฐ๋„ ํ•˜๋Š”๋ฐ
Dto๋Š” view์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ๊ทธ๋Ÿผ Dto๋ฅผ service ๊ณ„์ธต์—์„œ ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋งŒ์•ฝ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด? service ๊ณ„์ธต๊นŒ์ง€ ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.
๋˜ํ•œ serive์—์„œ view์—๊ฒŒ ์ „๋‹ฌํ•  ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” view์— entity๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋‹ค๊ฐ€ dto๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ,

๋‹ค๋ฅธ Service์—์„œ ํ˜„์žฌ Service๋ฅผ ํ˜ธ์ถœ ํ•˜๊ณ  ์‹ถ์€๋ฐ DTO๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋‹ˆ๊นŒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค

๊ทธ๋ž˜์„œ dto๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋œฏ์–ด๊ณ ์ณค๋˜ ๊ฒƒ ๊ฐ™๋‹ค. Serice๊ฐ€ entity๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , Controller๊ฐ€ dto๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜€๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค. (์ด๊ฒŒ service์˜ ์ž์œ ๋„๊ฐ€ ๋†’๋‹ค๋Š” ๋ง!)



โ˜‘๏ธ Dto -> Entity (์š”์ฒญ)

controller๊ฐ€ dto๋ฅผ entity๋กœ ๋ณ€ํ™˜ํ•ด์„œ service์—๊ฒŒ ์ „๋‹ฌ

Controller๊ฐ€ View์—์„œ ์ „๋‹ฌ๋ฐ›์€ DTO๋งŒ์œผ๋กœ Entity๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ๋กœ๊ทธ์ธํ•  ๋•Œ, LonginDto์—๋Š” ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •๋ณด๋งŒ ์žˆ๋Š”๋ฐ ์ด ์ •๋ณด๋งŒ์œผ๋กœ Member entity ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค. Member ์—๋Š” ํšŒ์› ์ด๋ฆ„, ํšŒ์› id, ๋น„๋ฐ€๋ฒˆํ˜ธ, ํšŒ์› ์ฃผ์†Œ, ๋“ฑ๊ธ‰ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ Dto์—๋Š” Entity์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. (ex. ์•ฝ๊ด€ ์ •๋ณด)
๋”ฐ๋ผ์„œ controller๊ฐ€ dto๋ฅผ entity๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฑด (service์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ)
controller์—๊ฒŒ ๋ฒ„๊ฑฐ์šด ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

controller๊ฐ€ Dto๋ฅผ service์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , service์—์„œ entity๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

service์— Dto๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋Š” ์ ์—์„œ ์•ฝ๊ฐ„์€ ์ข…์†์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, service ํ•จ์ˆ˜ ์ƒ๋‹จ์—์„œ Dto->Entity ์ž‘์—…์„ ํ•ด์ฃผ๊ณ  ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” Dto๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ํŒ€์›๋“ค๋ผ๋ฆฌ ์•ฝ์†ํ•˜๋ฉด ์ข…์†์„ ์ตœ์žฌํ•œ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
๋‚˜๋Š” controller๊ฐ€ dto๋ฅผ entity๋กœ ๋ณ€ํ™˜ํ•ด์„œ service์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์œ„ ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” ์ด๊ฒŒ ๋” ๋‚˜์€ ์„ ํƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.





๋‚˜๋Š” ์ฒ˜์Œ์— service์—์„œ Dto->Entity, Entity->Dto ์ž‘์—…์„ ๋‘˜ ๋‹ค ํ•ด์ฃผ์—ˆ๋‹ค. dto์™€ entity๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๋‚ด๋ถ€ ๋กœ์ง์— ํ•ด๋‹นํ•˜๊ณ  service์˜ ์—ญํ• ๊ณผ ์–ด์šธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตณ์ด entity->dto, dto->entity ์ด ๋‘ ๊ณผ์ •์„ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๋Š” ๊ฒŒ ๊น”๋”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ serive๊ฐ€ ๋‘ ๋ณ€ํ™˜ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

(์ด๊ฑด ๊ทธ๋ƒฅ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค)
๊ทผ๋ฐ service์—์„œ Dto๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒŒ ๊ฑธ๋ฆฌ๊ธฐ๋„ ํ•˜๊ณ , Dto๋งŒ์œผ๋กœ entity๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ์–ด๋ ต์ง€๋งŒ entity๋ฅผ ๊ฐ€์ง€๊ณ  dto๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฑด service ๊ณ„์ธต์ด๋‚˜ controller ๊ณ„์ธต์ด๋‚˜ ๋น„์Šทํ•  ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ service์—์„œ๋Š” ๋ฐ”๋กœ dto->entity ํ•ด์„œ ์ดํ›„์—” entity๋งŒ ์‚ฌ์šฉํ•˜๊ณ , service๋Š” controller์—๊ฒŒ entity๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ controller๊ฐ€ entity->dto ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค ์ƒ๊ฐ์ด๋‹ค.





โญ Dto์™€ Entity ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€?


โ˜‘๏ธtoEntity์™€ toDto

Member

public MemberDto toMemberDto(){
    MemberDto memberDto = new MemberDto();
    ...
    return memberDto;
}
    }

LoginDto

public Member toEntity(){
    ...
    return new Member(this.getName(), homeAddress, workAddress, this.getEmail(), this.password);
}

๋‚œ ์ฒ˜์Œ์— Entity์— toDto() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , Dto์— toEntity() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณ€ํ™˜ํ–ˆ๋‹ค.
๊ทผ๋ฐ Entity๊ฐ€ Dto๋ฅผ ์•Œ๊ณ ์žˆ๋Š” ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ์ข‹๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. Entity๋Š” ํ•ต์‹ฌ ํด๋ž˜์Šค์ธ๋ฐ Dto ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด toDto()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋„ ๋ฐ”๊ปด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Entity์˜ ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ Entity๊ฐ€ Dto์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.

์ด๊ฑด ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ Dto์—์„œ toDto()์™€ toEntity()๋ฅผ ๋‘˜ ๋‹ค ๊ตฌํ˜„ํ•ด์ฃผ๋Š” ๊ฑธ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ฒ˜์Œ์— ์ด ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ ์•ˆ๋‚ฌ๋˜ ์ด์œ ๊ฐ€ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด entity๋ฅผ dto๋กœ ๋ฐ”๊ฟ€ ๋•Œ dto ๊ฐ์ฒด๊ฐ€ ์žˆ์–ด์•ผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? ๊ทธ๋Ÿผ ์ด๋ฏธ dto๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ๋ฐ”๊พธ์ง€? ๋ผ๋Š” ์ƒ๊ฐ ๋•Œ๋ฌธ์ด์˜€๋‹ค.
๊ฒฐ๋ก ์ ์œผ๋ก  ์ •์ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ์ฒด ์—†์ด ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ Dto ์•ˆ์— ๋‘ ํ•จ์ˆ˜๋ฅผ ๋‹ค ๋„ฃ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


โ˜‘๏ธ builder ํŒจํ„ด๊ณผ ์ •์ ํŒฉํ† ๋ฆฌ๋ฉ”์„œ๋“œ

์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์•„์ดํ…œ1, ์•„์ดํ…œ2๋ฅผ ์ฝ์œผ๋ฉด์„œ ๊ธฐ์กด ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ Builder๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์—๋„ ์จ๋†จ์ง€๋งŒ Dto์•ˆ์— entity->dto, dto->entity ํ•จ์ˆ˜๋ฅผ ๋‘˜ ๋‹ค ๋„ฃ์œผ๋ฉด์„œ ์ •์ ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๊พธ์—ˆ๋Š”๋ฐ, ๋ฐ”๊พธ๋ฉด์„œ toDto๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ช…๋ณด๋‹ค ์ •์ ํŒฉํ† ๋ฆฌ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ง€์ผœ from์ด๋‚˜ of์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ˆ˜์ •ํ•˜์˜€๋‹ค.





์ฐธ๊ณ ํ–ˆ๋˜ ๊ธ€๋“ค
[DTO] DTO์˜ ์‚ฌ์šฉ๋ฒ”์œ„์— ๋Œ€ํ•˜์—ฌ
DTO์˜ ์‚ฌ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•˜์—ฌ
Service์—์„œ DTO๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ?
์š”์ฒญ๊ณผ ์‘๋‹ต์œผ๋กœ ์—”ํ‹ฐํ‹ฐ(Entity) ๋Œ€์‹  DTO๋ฅผ ์‚ฌ์šฉํ•˜์ž

profile
์ง„์งœ๋ฅผ ์•Œ๋ฉด ๊ณ๊ฐ€์ง€๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค

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

comment-user-thumbnail
2024๋…„ 4์›” 10์ผ

์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ