2025. 10. 20. 15:26ใJava
๐งฉ DTO vs Entity — ๊ผญ ์์์ผ ํ ์ฐจ์ด
๋ฐฑ์๋ ๊ฐ๋ฐ์์๋ Entity์ DTO์ ๊ตฌ๋ถ์ด ๋งค์ฐ ์ค์ํ๋ค.
๋ ๋ค “๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ฐ์ฒด”์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ญํ ๊ณผ ๊ด๋ฆฌ ์ฃผ์ฒด๊ฐ ์์ ํ ๋ค๋ฅด๋ค.
์ด ๊ฐ๋
์ ์ดํดํ์ง ๋ชปํ๋ฉด JPA ์์์ฑ ์ปจํ
์คํธ๋ API ์ค๊ณ์์ ํฐ ํผ๋์ด ์๊ธด๋ค.
โถ ๋จผ์ ๊ฐ๋ ๋ถํฐ ์ ๋ฆฌํด๋ณด์
Entity๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ํ
์ด๋ธ๊ณผ ๋งคํ๋๋ ์์ ๊ฐ์ฒด๋ค.
JPA๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, persist(), merge(), remove() ๋ฑ์ ์์
์ ์ํํ๋ฉด
์ํฐํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ค.
๋ฐ๋ฉด DTO (Data Transfer Object)๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๋จ์ํ ์ด๋ฐ์ฉ ๊ฐ์ฒด๋ค.
DB์ ์ง์ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ, Controller ↔ Service ↔ View ์ฌ์ด์ ๋ฐ์ดํฐ ์ ๋ฌ๋ง ๋ด๋นํ๋ค.
โท Entity์ DTO์ ์ญํ ์ฐจ์ด
| ๊ตฌ๋ถ | Entity | DTO (Data Transfer Object) |
|---|---|---|
| ์ญํ | DB ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ฒด | Controller ↔ Service ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ฉ ๊ฐ์ฒด |
| ๊ด๋ฆฌ ์ฃผ์ฒด | JPA (์์์ฑ ์ปจํ ์คํธ) | ๊ฐ๋ฐ์ ์ง์ ์์ฑ (JPA์ ๋ฌด๊ด) |
| ์ํ ์ถ์ | O (๋ณ๊ฒฝ ๊ฐ์ง Dirty Checking) | X (๋จ์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ง ์ํ) |
| ์ ์ฅ ์์น | entity ํจํค์ง |
dto ํจํค์ง |
| ์ฃผ ์ฌ์ฉ ์์น | Repository, EntityManager | Controller, Service, API ์๋ต |
| DB ๊ด๋ จ ์์ | Insert / Update / Delete / Select ๋์ | DB์ ์ง์ ์ฐ๊ด ์์ |
| ์ฃผ ๋ชฉ์ | ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ, ์ํ ๊ด๋ฆฌ | ๋ฐ์ดํฐ ์ ๋ฌ, ํ๋ฉด ์ถ๋ ฅ์ฉ |
โธ ์์๋ก ์ดํดํ๊ธฐ
โ Entity ์์ (DB ํ ์ด๋ธ๊ณผ ๋งคํ)
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
private int price;
// Getter, Setter
}
→ ์ค์ DB์ book ํ
์ด๋ธ๊ณผ 1:1 ๋งคํ๋๋ค.
→ JPA๊ฐ ๊ด๋ฆฌํ๋ฉฐ, persist() ํธ์ถ ์ DB์ INSERT SQL์ด ์๋ ์์ฑ๋๋ค.
โ DTO ์์ (๋ฐ์ดํฐ ์ ๋ฌ์ฉ)
public class BookDTO {
private String title;
private int price;
public BookDTO(String title, int price) {
this.title = title;
this.price = price;
}
// Getter, Setter
}
→ DB์ ๋ฌด๊ดํ ๋จ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ก, ์์ฒญ(Request)๊ณผ ์๋ต(Response) ์์๋ง ์ฌ์ฉ๋๋ค.
→ Controller์์ ์
๋ ฅ๊ฐ์ ๋ฐ์ Service๋ก ๋๊ธฐ๊ฑฐ๋, Service์์ ๊ฐ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค.


๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํดํ๊ธฐ ํธํ๋ค
โน ๋น์ ๋ก ์ดํดํ๊ธฐ
Entity๋ “๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ง ๋ ์ฝ๋”๋ผ๋ฉด,
DTO๋ “๊ทธ ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ์ ๊น ์ ๋ฌํ๋ ํ๋ฐฐ ์์”๋ค.
Entity๋ JPA๊ฐ ๊ด๋ฆฌํ๊ณ ์ํ๊ฐ ์ถ์ ๋์ง๋ง,
DTO๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ ์ฎ๊ธฐ๋ ์์ ๊ฐ์ฒด๋ค.
๐ ์ฆ, Entity๋ ์ค์ฒด์ด๊ณ , DTO๋ ๋ณต์ฌ๋ณธ์ด๋ค.
โบ ์ค๋ฌด์์ DTO๊ฐ ํ์ํ ์ด์
- ๋ณด์์ฑ — ๋น๋ฐ๋ฒํธ, ๋ด๋ถ ์๋ณ์ ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋ ธ์ถ ๋ฐฉ์ง
- ์ฑ๋ฅ ์ต์ ํ — ํ์ํ ํ๋๋ง ์ ์กํ์ฌ ์๋ต ํฌ๊ธฐ ๊ฐ์
- ์ ์ง๋ณด์์ฑ ํฅ์ — Entity ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์ธ๋ถ API ์ํฅ ์ต์ํ
- ๊ณ์ธต ๋ถ๋ฆฌ — Controller, Service, Repository ์ฑ ์ ๋ช ํํ ๊ตฌ๋ถ
โป ์ค์ ์ฝ๋ ํ๋ฆ ์์
// Controller
@PostMapping("/books")
public ResponseEntity<String> saveBook(@RequestBody BookDTO dto) {
bookService.save(dto);
return ResponseEntity.ok("์ ์ฅ์๋ฃ");
}
// Service
@Transactional
public void save(BookDTO dto) {
Book book = new Book();
book.setTitle(dto.getTitle());
book.setPrice(dto.getPrice());
bookRepository.save(book);
}
์ด๋ ๊ฒ Controller์์๋ DTO๋ก ์์ฒญ์ ๋ฐ๊ณ ,Service์์ Entity๋ก ๋ณํํ์ฌ DB์ ์ ์ฅํ๋ค.
์ด ํ๋ฆ์ด ๋ฐ๋ก “๊ณ์ธต ๊ฐ ์ญํ ๋ถ๋ฆฌ”์ ํต์ฌ์ด๋ค.
โผ ํต์ฌ ์์ฝ
| ๊ตฌ๋ถ | ํต์ฌ ์์ฝ |
|---|---|
| Entity | DB์ ์ง์ ์ฐ๊ฒฐ๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ฒด (JPA๊ฐ ์ํ ๊ด๋ฆฌ) |
| DTO | ๋ฐ์ดํฐ ์ ๋ฌ์ฉ ๊ฐ์ฒด๋ก, API ์์ฒญ/์๋ต์ ์ฌ์ฉ๋จ |
| ๋ถ๋ฆฌ ์ด์ | ๋ณด์, ์ ์ง๋ณด์, ์ฑ๋ฅ, ๊ณ์ธต ๊ตฌ์กฐ ๋ถ๋ฆฌ |
๐ ํ ์ค ์ ๋ฆฌ
Entity๋ ์์์ฑ ์ปจํ
์คํธ๊ฐ ๊ด๋ฆฌํ๋ '๋ฐ์ดํฐ์ ์ค์ฒด'์ด๊ณ ,
DTO๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ '๋ณต์ฌ๋ณธ'์ด๋ค.
Entity๋ DB๊ฐ ๋ค๋ฃจ๊ณ , DTO๋ ์ฌ๋(๋ก์ง)์ด ๋ค๋ฃฌ๋ค.
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JDBC ๊ณต๋ถ ๋ฐ ์ค์ต (0) | 2025.09.30 |
|---|