๐Ÿ“ฆ DTO

ozzingยท2024๋…„ 1์›” 23์ผ
1

DTO

DTO(Data Transfer Object)๋Š” ๊ณ„์ธต ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด์ด๋‹ค.

DTO๋Š” ์•„๋ž˜ ๋„ค ๊ฐ€์ง€ ์—ญํ• ๋งŒ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

1. getter
2. setter
3. serialize
4. deserialize

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ด€์ ์œผ๋กœ ๋ณด๋ฉด, '๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Separation of Concerns, SoC)'๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

์žฅ์ 

1. ํ˜ธ์ถœ ํšŸ์ˆ˜ ๊ฐ์†Œ

ํ•œ ํ˜ธ์ถœ์— ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํ•ฉํ•˜๊ณ  ์ •์ œํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ์ด ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ†ต์ƒ์ ์œผ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ˜ธ์ถœ์— ๋“œ๋Š” ๋น„์šฉ์ด ๋” ํฌ๋‹ค.

w/o DTO

response: { "User": {} }

response: { "Payment": {} }

response: { "Product": {} }

w/ DTO

response: {
			"User": {},
            "Payment": {},
            "Product": {}
		  }

ํ•œ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ '๊ณ ๊ฐ ์ •๋ณด / ๊ฒฐ์ œ ์ •๋ณด / ์ƒํ’ˆ ์ •๋ณด'๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์„ ๋•Œ, FE๊ฐ€ ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์— ์•Œ๋งž๋Š” ํ‚ค๋กœ ์กฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค ๊ฒฐํ•ฉํ•˜๊ฒŒ ๋˜๋ฉด ์ด ์„ธ ๋ฒˆ์˜ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋ฉด DTO๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์˜ API ํ˜ธ์ถœ๋งŒ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

2. FE - ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฒฐํ•ฉ ๋ฐฉ์ง€

FE๊ฐ€ ๋„๋ฉ”์ธ์˜ ๋ชจ๋ธ๊ณผ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. DTO๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ, ๋„๋ฉ”์ธ์˜ ๋ชจ๋ธ๋ง์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด FE๋„ ๊ทธ์— ๋งž์ถ”์–ด ๋Œ€์‘ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

1๋ฒˆ

response: {
			"Angle": "90",
  			"Side": "4"
		  }

2๋ฒˆ

response: {
			"Shape": "Rectangle"
		  }

ํ•œ ์˜ˆ์‹œ๋กœ '90๋„ / 4๊ฐœ์˜ ๋ณ€'์„ ๋„๋ฉ”์ธ์ด ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, FE๋Š” ์‚ฌ๊ฐํ˜•์ธ์ง€๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๋‹ค. 1๋ฒˆ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ, 2๋ฒˆ๊ณผ ๊ฐ™์ด ๋ชจ๋ธ์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๊ทธ์— ๋งž์ถ”์–ด FE๋„ Response๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์ข…์ข… ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์‹œ๋กœ๋Š” ๋‹จ์ˆœํžˆ ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ Shape์ด GeometricShape์œผ๋กœ ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ, ์ด๋Ÿฌ๋‚˜ ์ €๋Ÿฌ๋‚˜ FE๋Š” ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ value๊ฐ€ ์ค‘์š”ํ•  ๋ฟ ์ปฌ๋Ÿผ๋ช… ์ž์ฒด๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์‚ฌ์ „์— ์ •์˜ํ•ด๋‘” DTO์—์„œ Shape์ด๋ผ๋Š” ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๊พธ์ค€ํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค๋ฉด FE ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ถ”๊ฐ€๋กœ ๋“ค์ง€ ์•Š๋Š”๋‹ค.
๋˜๋Š” ํŠน์ • ์ปฌ๋Ÿผ์ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜, ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์‘๋‹ต ๊ฐ’ ์ •์ œ

๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ FE์— ์ „๋‹ฌํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ ๋„๋ฉ”์ธ์˜ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

w/o DTO

response: {
			"id": "1234",
  			"name": "Kim",
  			"password": "4321",
  			"regDate": "2024-01-24",
  			"plan": "Standard"
		  }

w/ DTO

response: {
			"id": "1234",
  			"name": "K*m",
  			"plan": "Standard"
		  }

๋ฌผ๋ก  ์œ„์™€ ๊ฐ™์ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๊ฒ ์ง€๋งŒ, ๊ทน๋‹จ์ ์ธ ์˜ˆ์‹œ๋กœ ์œ ์ € ์ •๋ณด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต ์—†์ด ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋…ธ์ถœ ๋˜๋ฉด ๋‹ค์–‘ํ•œ ๊ณ ๋‚œ์ด ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์œ ์ €์˜ ์ด๋ฆ„์„ ๊ผญ ๋ชจ์ž์ดํฌ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” BE์—์„œ ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ DTO์— ๋‹ด์•„ FE์— ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ ‡๋“ฏ FE์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ’์€ ์ œ๊ฑฐํ•˜๊ณ , ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๋„ ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ€๊ณตํ•˜์—ฌ DTO๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

์—…๋ฌด ์ค‘ BE์—์„œ๋Š” ๋‘ ๊ฐœ์˜ Enum์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฐ’์ด์ง€๋งŒ FE์—์„œ๋Š” ํ•œ ๊ฐœ์˜ Enum์œผ๋กœ๋„ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์„œ DTO์— ์–ด๋–ป๊ฒŒ ๋‹ด์•„์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

response: {
			"gender": "female",
  			"age": "minor"
		  }

๊ฐ„๋‹จํ•˜๊ฒŒ '์„ฑ๋ณ„ / ๋ฏธ์„ฑ๋…„์ž ์—ฌ๋ถ€'๋กœ ๋ชจ๋ธ์— ์ €์žฅ๋˜๊ณ  ์žˆ๋Š” ์œ ์ €์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๊ณ  ์˜ˆ๋ฅผ ๋“ค์—ˆ๋‹ค.
์ด ๋ฐ์ดํ„ฐ๊ฐ€ ํ™”๋ฉด ์ƒ์—์„œ๋Š” 'man / woman / boy / girl' ๋„ค ์ข…๋ฅ˜์˜ ๋ผ๋””์˜ค ๋ฒ„ํŠผ์œผ๋กœ ํ‘œํ˜„๋˜์–ด, FE๋Š” ๋„ค ์ข…๋ฅ˜ ์ค‘ ์–ด๋””์— ์†ํ•˜๋Š”์ง€๋งŒ ํ•„์š”๋กœ ํ–ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ BE์— ์„ฑ๋ณ„๊ณผ ๋ฏธ์„ฑ๋…„์ž ์—ฌ๋ถ€๋กœ ์œ ์ € ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ , DTO์—๋Š” gender์™€ age ๋Œ€์‹  userType์ด๋ผ๋Š” ์ปฌ๋Ÿผ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ฃผ์—ˆ๋‹ค.

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