dtoVo

DTO vs VO vs Entity

๊ฐœ๋… ์ •๋ฆฌ

Dto

๋ ˆ์ด์–ด ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€๋ณ€ ๊ฐ์ฒด.

Vo

์˜๋ฏธ ์žˆ๋Š” ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด. ํ•ต์‹ฌ ์—ญํ• ์€ equals()์™€ hashcode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์†์„ฑ์˜ ๋ชจ๋“  ๊ฐ’๋“ค์ด vo๊ฐ์ฒด๋งˆ๋‹ค ๊ฐ’์ด ๊ฐ™์•„์•ผ ๊ฐ™์€ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Entity

repository์™€ ๋งž๋‹ฟ์•„ ์žˆ๋Š” ํด๋ž˜์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค-ํ…Œ์ด๋ธ”์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

dto vs entity๋ฅผ ์„ค๋ช…ํ•ด๋ณด๋ฉด, entity ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด์„œ dto์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  1. entity๋ฅผ requeest/response๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ค€๋‹ค. entityํด๋ž˜์Šค๋Š” ๋งŽ์€ ์„œ๋น„์Šค ํด๋ž˜์Šค์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ค‘์‹ฌ์  ์—ญํ• ์„ ํ•˜๋Š”๋ฐ response๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ entityํด๋ž˜์Šค๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋งŽ์€ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ entityํด๋ž˜์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  entity๋ฅผ request/response๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์€ ddd๊ทœ์น™์— ์–ด๊ธ‹๋‚œ๋‹ค. request/response๋Š” view layer์— ๋งž๋‹ฟ์•„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  2. entityํด๋ž˜์Šค์—๋Š” setter๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค. (setter๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค dto์—๋„ ์ ์šฉ๋œ๋‹ค. ์ ˆ๋Œ€์ ์œผ๋กœ dto์—์„œ setter๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ •๋ง setter๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ฏผ ํ•œ ํ›„ setter๋ฅผ ์ ์šฉ์‹œ์ผœ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. setter๊ฐ€ ์—†์„์ˆ˜๋ก ๋กœ์ง์ด ๊น”๋”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

    setter๋ฅผ ๋‘๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ’๋“ค์ด ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋ณ€ํ•  ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค๊ฒŒ ๋œ๋‹ค. ๊ฐ’ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” public method๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ •ํ•ด์ง„ ๊ฐ’์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, entity์˜ ์†์„ฑ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜์†์„ฑ ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•œ entity์˜ ์ˆœ์ˆ˜์„ฑ์ด ๋ชจํ˜ธํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— entity์˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ dto๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์–ด๋–ป๊ฒŒ dto,vo๋ฅผ ๊ตฌ๋ถ„์ง€์–ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

dto, vo์˜ ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„๋ณด๋‹ค๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๋ฅผํ…Œ๋ฉด, kotlin์„ ์‚ฌ์šฉํ•œ spring bootํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ dto๋ฅผ data class๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด equals()์™€ hashcode()๊ฐ€ ์ž๋™์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜์–ด dto๊ฐ€ ๊ณง vo์˜ ์†์„ฑ์ธ 'ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.'์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

fun main(args: Array<String>) {
  val person1 = Person("John")
  val person2 = Person("John")
  person1.age = 10
  person2.age = 20
  println(person1)
  println(person2)
}

data class Person(val name: String) {
    var age: Int = 0
}

์œ„์™€ ๊ฐ™์ด ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด Person ํด๋ž˜์Šค์˜ primary constructor์— ์„ ์–ธ๋œ name์— ๋Œ€ํ•ด์„œ equals()์™€ hashcode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ฃผ์˜ํ•  ์ ์€ primary constructor์— ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋งŒ data class์˜ ์†์„ฑ์ด ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. dataClass๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šคํด๋”์— ์“ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜์ž. ์•„๋ž˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

Person(name=John)
Person(name=John)

name ํ”„๋กœํผํ‹ฐ๋งŒ data class์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ age๋Š” toString()์—์„œ ์ œ์™ธ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์„คํ•˜๊ณ , ์ค‘์š” ํฌ์ธํŠธ๋Š” dto, vo๋Š” ๋ชจ๋‘ ํšจ๊ณผ์ ์ธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์ด๋ฏ€๋กœ ํšจ๊ณผ์ ์ธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— ์ค‘์ ์„ ๋‘๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜๊ณ , strictํ•œ ๊ฐœ๋… ๊ตฌ๋ถ„์—๋Š” ๋„ˆ๋ฌด ์–ฝ๋งค์ด์ง€ ๋ง๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Last updated