์ถ์ฒ
ChatGPT
DTO Data Trasfer Object
์ ์
DTO(Data Transfer Object)๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ณ์ธต ๋๋ ์์คํ ๊ฐ์ ์ ์กํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค. DTO๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๊ณ , ๋คํธ์ํฌ ์ ์ก, ํ์ผ ์ ์ฅ, API ์๋ต ๋ฑ์์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ฒด๋ก ํ์ฉํ๋ค.
ํน์ง
๋ฐ์ดํฐ ์ ์ก ๋ชฉ์
DTO๋ ์ฃผ๋ก ๋ฐ์ดํฐ ์ ์ก์ ๋ชฉ์ ์ผ๋ก ํ๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ์ง ์๋๋ค.
๋จ์์ฑ
DTO๋ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๊ธฐ ์ํ ํ๋์ ํด๋น ํ๋์ ์ ๊ทผํ๊ธฐ ์ํ getter/setter ๋ฉ์๋๋ก ๊ตฌ์ฑ๋๋ค.
์ง๋ ฌํ ๊ฐ๋ฅ
๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ํํ๋ก ๊ตฌํ๋๋ค.
๋ฌด์ํ
DTO๋ ๋ณดํต ๋ฌด์ํ(stateless) ๊ฐ์ฒด๋ก ์ฌ์ฉ๋๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅ
DTO๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ(mutable) ๊ฐ์ฒด๋ก ์ค๊ณ๋๋ค.
์ฌ์ฉ ์์
API ์๋ต ๊ฐ์ฒด
REST API ์์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ JSON ๊ฐ์ฒด
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒฐ๊ณผ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ผ๋ก ์ ๋ฌํ ๋ ์ฌ์ฉ
๋ฐ์ดํฐ ์ ๋ฌ
ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ๋๋ ์๋ก ๋ค๋ฅธ ์์คํ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ
์์ ์ฝ๋
public class UserDTO {
private String username;
private String email;
private int age;
public UserDTO(String username, String email, int age) {
this.username = username;
this.email = email;
this.age = age;
}
// Getter and Setter methods
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
VO Value Object
์ ์
VO(Value Object)๋ ๋ถ๋ณ(immutable) ๊ฐ์ฒด๋ก์ ํน์ ๋๋ฉ์ธ ๋ชจ๋ธ ๋ด์ ๊ฐ์ ํํํ๋ ๊ฐ์ฒด๋ค. VO๋ ์ฃผ๋ก ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ๋๋ฉฐ, ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ๋์ผํ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋๋ค.
ํน์ง
๋ถ๋ณ์ฑ
VO๋ ๋ถ๋ณ์ผ๋ก ์ค๊ณ๋์ด, ์์ฑ ํ์๋ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด์ด๋ค. ๋ถ๋ณ์ฑ์ VO์ ํต์ฌ ํน์ง์ด๋ค.
๊ฐ ๊ธฐ๋ฐ ๋๋ฑ์ฑ
VO๋ ๊ฐ์ฒด์ ์๋ณ์๊ฐ ์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๋ฑ์ฑ์ ํ๋จํ๋ค. ์ฆ, ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ VO๋ ๋์ผํ๋ค๊ณ ๊ฐ์ฃผํ๋ค.
๋น์ฆ๋์ค ๋ก์ง ํฌํจ
VO๋ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ ์ ์์ผ๋ฉฐ, ํน์ ๋๋ฉ์ธ์ ๊ท์น์ ์บก์ํํ ์ ์๋ค.
์ฌ์ฌ์ฉ ๊ฐ๋ฅ
VO๋ ๋์ผํ ๊ฐ์ ๋ํด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ํน์ฑ ๋๋ฌธ์ ์ค๋ ๋ ์์ ์ฑ์ ๊ฐ์ง ์ ์๋ค.
๋ถ๋ณ ํด๋์ค
Java์์ VO๋ ๋ณดํต ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธํ๊ณ , ์์์์์ ๋ชจ๋ ํ๋๋ฅผ ์ด๊ธฐํํ๋ค.
์ฌ์ฉ ์์
๊ธ์ก ํํ
ํตํ ๊ฐ์ ๋ํ๋ด๋ Money ๊ฐ์ฒด
์ฃผ์ ํํ
Address ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์ฃผ์ ์ ๋ณด๋ฅผ ์บก์ํ
์ขํ ํํ
์ขํ๋ฅผ ๋ํ๋ด๋ Point ๊ฐ์ฒด
๋น์ฆ๋์ค ๋ชจ๋ธ
๋๋ฉ์ธ ๋ชจ๋ธ ๋ด์ ๋น์ฆ๋์ค ๊ท์น์ ํํ
์์ ์ฝ๋
public class Money {
private final double amount;
private final String currency;
public Money(double amount, String currency) {
this.amount = amount;
this.currency = currency;
}
public double getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
// equals and hashCode based on values
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Money money = (Money) o;
return Double.compare(money.amount, amount) == 0 &&
currency.equals(money.currency);
}
@Override
public int hashCode() {
return Objects.hash(amount, currency);
}
}
DTO์ VO์ ์ฐจ์ด์
ํน์ง | DTO Data Transfer Object | VO Value Object |
๋ชฉ์ | ๋ฐ์ดํฐ ์ ์ก | ํน์ ๋๋ฉ์ธ ๊ฐ ํํ |
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ | ๋ณ๊ฒฝ ๊ฐ๋ฅ(mutable) | ๋ถ๋ณ(immutable) |
๋น์ฆ๋์ค ๋ก์ง ํฌํจ ์ฌ๋ถ | ๋น์ฆ๋์ค ๋ก์ง ์์ | ๋น์ฆ๋์ค ๋ก์ง ํฌํจ ๊ฐ๋ฅ |
๋๋ฑ์ฑ ํ๋จ | ๊ฐ์ฒด์ ์ฐธ์กฐ(์๋ณ์) ๊ธฐ์ค | ๊ฐ ๊ธฐ๋ฐ ๋๋ฑ์ฑ |
์ฌ์ฉ ๋ฒ์ | ์์คํ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก, API ์๋ต ๋ฑ | ๋๋ฉ์ธ ๋ชจ๋ธ ๋ด์ ๊ฐ ํํ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง ์บก์ํ |
์ค๊ณ | ๋จ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ(gette/sette) | ๋ถ๋ณ ๊ฐ์ฒด๋ก ์ค๊ณ(final ํ๋, equals/hashCode ๊ตฌํ) |
์ค์ฉ์ ์์
DTO ์ฌ์ฉ ์์ : RESTful API
import java.util.List;
public class ProductDTO {
private String id;
private String name;
private double price;
private List<String> tags;
public ProductDTO(String id, String name, double price, List<String> tags) {
this.id = id;
this.name = name;
this.price = price;
this.tags = tags;
}
// Getters and Setters
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
}
์ค๋ช
- RESTful API ์๋ต: ProductDTO๋ API์์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฌ์ฉ๋๋ค.
- ๋ฐ์ดํฐ ์บก์ํ: ์ ํ์ ID, ์ด๋ฆ, ๊ฐ๊ฒฉ, ํ๊ทธ ๋ฑ์ ํฌํจํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๋ค.
VO ์ฌ์ฉ ์์ : ๊ธ์ต ๋๋ฉ์ธ
import java.util.Objects;
public class Currency {
private final String code;
private final String name;
public Currency(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
// equals and hashCode based on values
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Currency currency = (Currency) o;
return code.equals(currency.code) &&
name.equals(currency.name);
}
@Override
public int hashCode() {
return Objects.hash(code, name);
}
}
์ค๋ช
- ๊ธ์ต ๋๋ฉ์ธ์์์ ์ฌ์ฉ: Currency ๊ฐ์ฒด๋ ํน์ ํตํ์ ์ฝ๋์ ์ด๋ฆ์ ํํํ๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด: ํตํ ๊ฐ์ฒด๋ ์์ฑ ํ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ํตํ ์ฝ๋์ ์ด๋ฆ์ด ์ผ์ ํด์ผ ํ๋ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ค.
๊ฒฐ๋ก
DTO์ VO๋ ๋ชจ๋ ์ํํธ์จ์ด ์ค๊ณ์์ ์ค์ํ ์ญํ ์ ํ์ง๋ง, ๊ทธ ๋ชฉ์ ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค. DTO๋ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด, VO๋ ๋น์ฆ๋์ค ๋๋ฉ์ธ ๋ด์์ ๊ฐ์ ํํํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๋ ๊ฐ๋ ์ ์ ์ ํ ์ฌ์ฉํจ์ผ๋ก์จ, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
ChatGPT ๊ธ์ ์ถ์ฒ
์ถ์ฒ
- Java Design Patterns
- ๋ด์ฉ: DTO ๋ฐ VO ํจํด์ ๋ํ ์์ธํ ์ค๋ช ๊ณผ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋งํฌ: Java Design Patterns - DTO
?? ChatGPT๊ฐ ๋์๊ฒ ์๋ ค์ฃผ๋ ์ถ์ฒ์ ์๋ฌธ์ ๊ฐ์ง๊ฒ ๋๋ค. ๋ชป ์ฐพ๊ฒ ๋ค ์ด ๋งํฌ
- Effective Java by Joshua Bloch
- ๋ด์ฉ: Value Object ํจํด๊ณผ ๋ถ๋ณ ๊ฐ์ฒด์ ์ค์์ฑ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
- ๋งํฌ: Effective Java
- Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
- ๋ด์ฉ: ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์์ ๋ค์ํ ํจํด๊ณผ ๊ทธ ํ์ฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
- ๋งํฌ: Design Patterns
https://java-design-patterns.com/patterns/data-transfer-object/
https://java-design-patterns.com/patterns/value-object/#when-to-use-the-value-object-pattern-in-java.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๊ฐ๋ณ ์ธ์ Varargs (0) | 2024.08.08 |
---|---|
[์ฉ์ด][Java] Pass by Value, Pass by Reference + ์๋ฐ์์์ ์ฌ์ฉ (0) | 2024.08.08 |
[Java] ๋ฐฐ์ด๋ ๊ฐ์ฒด์ธ๊ฐ (0) | 2024.08.08 |
[์ฉ์ด] ํ์ดํผ์ค๋ ๋ฉ๊ณผ ๋ฉํฐ์ฝ์ด (1) | 2024.08.07 |
[Java] String์ intern() ์ฌ์ฉ ์์ ์ฑ๋ฅ ๋ฌธ์ ์ ์ต์ ํ (0) | 2024.08.07 |