[LG U+ ์œ ๋ ˆ์นด 3๊ธฐ] DTO vs Entity ์ฐจ์ด์  ์ •๋ฆฌ ๋ฐ ์ดํ•ด

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์—์„œ ๊ฐ€๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

dto vs entity

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๋‹ค


โน ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

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