DTO(Data Transfer Object)๋ ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด
๋ก ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ์ง ์๋ ์์ํ ๋ฐ์ดํฐ๋ก๋ง ์ด๋ฃจ์ด์ง ๊ฐ์ฒด์ด๋ค.
DTO๋ ์๋ ๋ค ๊ฐ์ง ์ญํ ๋ง์ ์ํํด์ผ ํ๋ค.
1. getter
2. setter
3. serialize
4. deserialize
๊ฐ์ฒด ์งํฅ์ ๊ด์ ์ผ๋ก ๋ณด๋ฉด, '๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ(Separation of Concerns, SoC)'๋ฅผ ์ํด ์ฌ์ฉํ๋ค.
ํ ํธ์ถ์ ์ฌ๋ฌ ๋๋ฉ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํ๊ณ ์ ์ ํ๋๋ฐ ๋ง์ ๋น์ฉ์ด ๋ ๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ํต์์ ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํธ์ถ์ ๋๋ ๋น์ฉ์ด ๋ ํฌ๋ค.
w/o DTO
response: { "User": {} }
response: { "Payment": {} }
response: { "Product": {} }
w/ DTO
response: {
"User": {},
"Payment": {},
"Product": {}
}
ํ ์ฃผ๋ฌธ์ ๋ํ ์ ๋ณด๊ฐ '๊ณ ๊ฐ ์ ๋ณด / ๊ฒฐ์ ์ ๋ณด / ์ํ ์ ๋ณด'๋ก ๋๋์ด์ ธ ์์ ๋, FE๊ฐ ๊ฐ๊ฐ์ ๋๋ฉ์ธ์ ์๋ง๋ ํค๋ก ์กฐํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค ๊ฒฐํฉํ๊ฒ ๋๋ฉด ์ด ์ธ ๋ฒ์ API ํธ์ถ์ด ํ์ํ๋ค. ๋ฐ๋ฉด DTO๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋๋ฉ์ธ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ API ํธ์ถ๋ง์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
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 ์ ์ง๋ณด์ ๋น์ฉ์ด ์ถ๊ฐ๋ก ๋ค์ง ์๋๋ค.
๋๋ ํน์ ์ปฌ๋ผ์ด ์ฌ๋ผ์ง๊ฑฐ๋, ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ทธ๋๋ก 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์ด๋ผ๋ ์ปฌ๋ผ๋ช
์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ฃผ์๋ค.