์ฐธ๊ณ ์ฌ์ดํธ
• ๋ ๋ ๋งจ(React์ Typescript๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์)๋์ ํฐ์คํ ๋ฆฌ
์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ DTO๋ฅผ ์ ์ํด์ผํ๋ ์ผ์ด ์๊ฒผ๋ค.
DTO์ ๋ํด ๊ฐ๋ ์ด ๋ถ์กฑํ์ฌ ์ ๋ฆฌํด๋ณด์๋ค.
๐ฆDTO
DTO (Data Transfer Object)๋ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ๋๋ฉ์ธ ๋ชจ๋ธ ๋์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
์ด๋, ๊ณ์ธต์ด๋ Presentation(View, Controller), Business(Service), Persistence(DAO, Repository)๋ฑ์ ์๋ฏธํ๋ค.
์ฃผ๋ก ๋ฐฑ์๋ API์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ ์ํ ํ์ ์ด๋ฉฐ ์๋ฃ๊ตฌ์กฐ์ฒด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
• ๋ชฉ์ : ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ์ ์ํ๊ณ ํ์ ์์ ์ฑ์ ๋ณด์ฅ
• ์ฌ์ฉ ์์น: API ์์ฒญ(request)์ด๋ ์๋ต(response)์์ ์ฌ์ฉ
DTO๋ ๋ฉ์๋ ํธ์ถ์ ์ค์ด๋ ๊ฒ์ ์ฃผ ๋ชฉ์ ์ผ๋กํ๋ค.
DTO๋ ์์ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ฐ์ดํฐ์ ๋ํ getter, setter๋ง ๊ฐ์ ธ์ผํ๋ค.
DTO๋ ์ด๋ ํ ๋น์ง๋์ค ๋ก์ง์ ๊ฐ์ ธ์๋ ์๋๋ค.
DTO๋ ์ ์ฅ, ๊ฒ์, *์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๋ก์ง๋ง์ ๊ฐ์ ธ์ผํ๋ค.
*์ง๋ ฌํ: DTO๋ฅผ Byte, JSON, XML ๋ฑ์ ํํ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ญ์ง๋ ฌํ๋ ๊ทธ ๋ฐ๋๋ฅผ ์๋ฏธํ๋ค.
๐ค ์ DTO๋ฅผ ์จ์ผํ ๊น?
DTO๋์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ณ์ธต๊ฐ ์ ๋ฌ์ ์ฌ์ฉํ๋ฉด, UI ๊ณ์ธต์์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ฉ์๋ค๋ฅด ํธ์ถํ๊ฑฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝ ์ํฌ ์ ์๋ค. ๋ํ UIํ๋ฉด๋ง๋ค ์ฌ์ฉํ๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ ๋ณด๋ ์์ดํ๋ค. ํ์ง๋ง, ๋๋ฉ์ธ ๋ชจ๋ธ์ UI์ ํ์ํ์ง ์์ ์ ๋ณด๊น์ง ๊ฐ์ง๊ณ ์๋ค. ์ฆ, ๋๋ฉ์ธ ๋ชจ๋ธ์ ์บก์ํํ์ฌ ๋ณดํธํ ์ ์๋ค.
๋ํ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ณ์ธต๊ฐ ์ ์กํ๋ฉด ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ๊ฐํ๊ฒ ๊ฒฐํฉํ ์ ์๋ค. ๋ทฐ์ ์๊ตฌ์ฌํญ ๋ณํ๋ก ๋๋ฉ์ธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์ผ์ด ์๊ธฐ๋๊ฒ์ ์ข์ง ์๋ค. DTO๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ฒฐํฉ์ ๋์จํ๊ฒ ๋ง๋ค ์ ์๋ค.
1. ๋ฐ์ดํฐ ์บก์ํ
• ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์จ๊น
• ํด๋ผ์ด์ธํธ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ ธ์ถ
2. API ๋ฒ์ ๊ด๋ฆฌ
• ๋๋ฉ์ธ ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋์ด๋ DTO๋ ์ ์ง ๊ฐ๋ฅ
• API ํธํ์ฑ์ ์ ์งํ๋ฉด์ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
3. ์ฑ๋ฅ ์ต์ ํ
• ํ์ํ ๋ฐ์ดํฐ๋ง ์ ์กํ์ฌ ๋คํธ์ํฌ ๋ถํ ๊ฐ์
• ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ์ง
4. ๋ณด์ ๊ฐํ
• ๋ฏผ๊ฐํ ์ ๋ณด๋ DTO์์ ์ ์ธ ๊ฐ๋ฅ
• ๊ถํ์ ๋ฐ๋ฅธ ๋ค๋ฅธ DTO ์ฌ์ฉ ๊ฐ๋ฅ
5. ์ ์ฐ์ฑ ํฅ์
• ํด๋ผ์ด์ธํธ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ DTO ๊ตฌ์กฐ ์กฐ์ ๊ฐ๋ฅ
• ๋ค์ํ ํด๋ผ์ด์ธํธ์ ๋ง๋ ๋ค์ํ DTO ์ ๊ณต ๊ฐ๋ฅ
6. ๋ช ํํ ํ์ ๋ณด์ฅ
7. ์ฝ๋ ์๋์์ฑ ๋ฐ ํ์ ์ฒดํฌ๋ก ๊ฐ๋ฐ ํจ์จ ์ฆ๊ฐ
8. ๋ฐฑ์๋ ์ธํฐํ์ด์ค ๋๊ธฐํ
๐ฅ ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ๋น๊ตํด๋ณด๊ธฐ
// ๋๋ฉ์ธ ๋ชจ๋ธ
class User {
id: number;
username: string;
password: string; // ๋ฏผ๊ฐํ ์ ๋ณด
email: string;
role: string;
createdAt: Date;
updatedAt: Date;
// ๋น์ฆ๋์ค ๋ก์ง
changePassword(newPassword: string) { ... }
validateEmail() { ... }
}
// DTO (ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก)
class UserDTO {
id: number;
username: string;
email: string;
role: string;
// password๋ ์ ์ธ (๋ณด์)
// ๋น์ฆ๋์ค ๋ก์ง ๋ฉ์๋๋ ์ ์ธ
}
ํ์ํ ๊ฐ๋ง ์์ ๋ฝ์ ์ฌ์ฉ ๊ฐ๋ฅ.
๐คDTO๋ ์ด๋ค ๊ณ์ธต๊น์ง ์ฌ์ฉ๋์ด์ผ ํ ๊น?
์ผ๋จ, DTO ์์ ๊ณ์ธต(Persistence Layer)๊น์ง ๋๋ฌํ๋ ๊ฒ์ ๊ณตํต์ ์ผ๋ก ์ง์ํ๋ ๋ชจ์์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, Controller์ Service ๋ ์ด์ด ๋ ์ค DTO๋ ์ด๋์ ๋ณํ๋์ด์ผ ํ ๊น?
๋งํดํ์ธ๋ฌ๋ Service Layer๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง. ์ฆ, ๋๋ฉ์ธ์ ๋ณดํธํ๋ ๋ ์ด์ด๋ผ๊ณ ๋งํ๋ค.
์ฆ, ์ด ์ ์๋ฅผ ๋ช ํํ ์งํค๊ธฐ ์ํ์ฌ Presentation Layer์ ๋๋ฉ์ธ์ ๋ ธ์ถํด์๋ ์๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ด์ ์ผ๋ก ๋๋ฉ์ธ์ ์๋น์ค ๋ ์ด์ด์์ DTO๋ก ๋ณํ๋์ด ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌ๋์ด์ผํ๋ค.
๐ง ๋ ์ด์ด ๊ตฌ์ฑ ์์๋ณด
1. ํ๋ ์ ํ ์ด์ ๋ ์ด์ด (Presentation Layer)
- ์ญํ : ์ฌ์ฉ์์ ์ธํฐํ์ด์ค์ ์ํธ์์ฉ, ์์ฒญ/์๋ต ์ฒ๋ฆฌ
- ๊ตฌ์ฑ: ์ปจํธ๋กค๋ฌ(Controller), ๋ทฐ(View), API ์๋ํฌ์ธํธ
ํน์ง
- ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ ์๋น์ค ๋ ์ด์ด๋ก ์ ๋ฌ
- ์๋น์ค ๋ ์ด์ด์์ ๋ฐํ๋ DTO๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
- ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ง์ ์ฌ์ฉํ์ง ์์
2. ์๋น์ค ๋ ์ด์ด (Service Layer)
- ์ญํ : ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ, ๋๋ฉ์ธ ๋ณดํธ
- ๊ตฌ์ฑ: ์๋น์ค ํด๋์ค๋ค
ํน์ง
- ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ
- ๋๋ฉ์ธ ๋ชจ๋ธ์ DTO๋ก ๋ณํํ์ฌ ํ๋ ์ ํ ์ด์ ๋ ์ด์ด์ ์ ๋ฌ
- ํธ๋์ญ์ ๊ด๋ฆฌ, ๊ถํ ๊ฒ์ฆ ๋ฑ ์ดํ๋ฆฌ์ผ์ด์ ์๋น์ค ์ ๊ณต
3. ๋๋ฉ์ธ ๋ ์ด์ด (Domain Layer)
- ์ญํ : ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ท์น ์ ์
- ๊ตฌ์ฑ: ๋๋ฉ์ธ ๋ชจ๋ธ, ๋๋ฉ์ธ ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค
ํน์ง
- ๋น์ฆ๋์ค ๊ท์น๊ณผ ๋ก์ง์ ํฌํจํ๋ ๋๋ฉ์ธ ๋ชจ๋ธ ์ ์
- ๋ค๋ฅธ ๊ณ์ธต์ ์์กดํ์ง ์๋ ๋ ๋ฆฝ์ ์ธ ๊ณ์ธต
- ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD)์ ํต์ฌ
4. ์ธํ๋ผ์คํธ๋ญ์ณ ๋ ์ด์ด (Infrastructure Layer)
- ์ญํ : ๊ธฐ์ ์ ์ธ๋ถ์ฌํญ ๊ตฌํ
- ๊ตฌ์ฑ: ๋ ํฌ์งํ ๋ฆฌ ๊ตฌํ์ฒด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ, ์ธ๋ถ API ์ฐ๋
ํน์ง
- ๋๋ฉ์ธ ๋ ์ด์ด์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ธ๋ถ ์๋น์ค์์ ํต์ ๋ด๋น
- ๊ธฐ์ ์ ์ธ๋ถ์ฌํญ์ ์บก์ํ