세 객체의 역할과 차이
"DTO·VO·Entity·Model — 다 비슷한 자바 클래스인데 왜 이름이 4 개?"
실제로 코드만 보면 비슷합니다. 차이는 「어디서 어디로 가는 그릇이냐」.
식당의 그릇이 용도에 따라 다른 모양이듯, 객체도 어디로 가느냐에 따라 다른 이름.
package com.smhrd.domain;
public class Board { // 본 과정의 도메인 — DB 한 행과 1:1
private int num;
private String title;
private String writer;
private String content;
// getter/setter (또는 Lombok @Data)
public int getNum() { return num; }
public void setNum(int num) { this.num = num; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
// ...
}
public class Money {
private final int amount;
private final String currency;
public Money(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
public Money add(Money other) { // 「값」으로 의미 있는 동작
if (!this.currency.equals(other.currency))
throw new IllegalArgumentException();
return new Money(this.amount + other.amount, this.currency);
}
public int getAmount() { return amount; }
public String getCurrency() { return currency; }
// setter 없음 (불변)
}
equals / hashCode 를 값 기준으로 재정의하는 것이 관례
// 본 과정에선 사용 안 함 — JPA 의 개념을 참고로만
@Entity
public class BoardEntity {
@Id @GeneratedValue
private Long num;
private String title;
// ...
}
@GetMapping("/board/view")
public String view(@RequestParam int num, Model model) {
Board b = service.find(num);
model.addAttribute("board", b);
return "board/view";
}
<!-- view.jsp 에서 -->
<h1>${board.title}</h1>
<p>작성자: ${board.writer}</p>
<div>${board.content}</div>
| 이름 | 책임 | 특징 | 본 과정에서 |
|---|---|---|---|
| DTO | 계층 간 운반 | getter/setter | 핵심 — Member·Board 같은 도메인 클래스 |
| VO | 값 표현 | 불변, 동등성 | 드물게 (Money 등) |
| Entity | DB 한 행 | JPA | 사용 안 함 |
| Model | JSP 로 전달 | Spring 인터페이스 | Controller 매개변수 |
실무 코드에서는 한 클래스가 여러 역할을 하기도 합니다:
Board / Member 는 — VO 처럼 「데이터」 운반, DTO 처럼 계층 간 이동, Entity 처럼 DB 행 표현엄격히 구분하기보다 — 「이 클래스가 어디서 어디로 가는 그릇인가」 를 안다면 충분.
Member, Board, Reply) — DTO·VO 접미사 안 붙임com.smhrd.domainMemberJoinDTO 같은 명시적 이름 (후속 차시에서)
package com.smhrd.domain;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data @AllArgsConstructor @NoArgsConstructor
public class Member {
private String id;
private String pwd;
}
단 몇 줄. @Data 한 줄이 getter / setter / equals / hashCode / toString 을 컴파일 시점에 자동 생성합니다.
// 위 코드는 다음과 동일 (Lombok 이 자동 생성)
public class Member {
private String id;
private String pwd;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getPwd() { return pwd; }
public void setPwd(String pwd) { this.pwd = pwd; }
public boolean equals(Object o) { ... }
public int hashCode() { ... }
public String toString() { ... }
}
두 Model 이 같은 단어지만 다른 의미. 헷갈리지 마세요.
DTO·VO·Model — 모두 「자바 클래스인데 이름만 다른 것」 으로 막연.
각 이름의 의미 차이를 안다. 본 과정에선 단순한 이름으로 통일.
Member, Board) · 패키지 com.smhrd.domain