์๋ฐ DTO vs Record, ๋ฌด์์ ์ฌ์ฉํด์ผ ํ ๊น?
์๋ฐ DTO vs Record, ๋ฌด์์ ์ฌ์ฉํด์ผ ํ ๊น? ๊ด๋ จ
๋ณธ๋ฌธ์ ์์ฆIT์ ๋ฒ์ญ๊ฐ Jane Heo๊ฐ ํจ๊ป ์์ํ ์ฌ ํฌ๋ฆฌ์๋(Ashutosh Krishna)์ ๊ธ <DTO vs Record in Java: Which Should You Use?>์ ๋ฒ์ญํ ๊ธ์ ๋๋ค. ํ์์ธ ์์ํ ์ฌ ํฌ๋ฆฌ์๋๋ ์ํธ์์ค(Thoughtworks) ์ธ๋์ง์ฌ์์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ก ์ผํ๋ฉฐ, ํด์ฌ๋ ธ๋(Hashnode), ๋ฏธ๋์(Medium) ๋ฑ์์ ๊ฐ๋ฐ์๋ค์ ์ํ ๊ธ์ ์ฐ์ฌ ์ค์ ๋๋ค.
ํ์์๊ฒ ํ๋ฝ์ ๋ฐ๊ณ ๋ฒ์ญํ์ผ๋ฉฐ, ๊ธ์ ํฌํจ๋ ๊ฐ์ฃผ(*ํ์)๋ โ๋ฒ์ญ์์ฃผโ์ ๋๋ค.
์ค๋์ Java ๊ฐ๋ฐ์์ DTO(Data Transfer Object, ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด)์ Record(๋ ์ฝ๋)์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ข ์ข Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๊ณ์ธต ๊ฐ ๋๋ ์๋น์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด DTO(Data Transfer Object, ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด)๋ฅผ ์ฌ์ฉํฉ๋๋ค. DTO๋ ๋ณต์กํ ๋์์ด๋ ๋ก์ง ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ธฐ ์ํ ๊ฐ๋จํ ๊ฐ์ฒด์ ๋๋ค. ์ด ๊ฐ์ฒด์ ์ญํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ ํ์ํ ๊ณณ์ ์ ๋ฌํ๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฐ๋ฐ Java 14์์ ์๋ก์ด ๊ธฐ๋ฅ์ธ โRecordโ๊ฐ ๋์ ๋์์ต๋๋ค. Record๋ DTO์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋ฐ ์ด์ ์ ๋ง์ถ ํน๋ณํ ํด๋์ค ์ ํ์ ๋๋ค. ์ค์ํ ์ฐจ์ด์ ์ Record๋ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํด์ผ ํ๋ ๋ง์ ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด ์ค๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, Getter(๊ฒํฐ)[1]๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ , ๋๋ฑ์ฑ ๊ฒ์ฌ๋ toString() ๋ฉ์๋๋ ์์์ ์ฒ๋ฆฌํด ์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ Java 16์์ ์์ ํ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ฉด์ Record๋ Java์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊น๋ํ๊ณ ํ๋์ ์ธ ๋ฐฉ๋ฒ์ด ๋์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ DTO์ Record๋ฅผ ๋น๊ตํ๋ ๊ฑธ๊น์? ๊ทธ ์ด์ ๋ ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๋ ๋น์ทํ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง Java๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ธ์ DTO๋ฅผ ์ฌ์ฉํ๊ณ ์ธ์ Record๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ DTO์ Record์ ์ฐจ์ด์ ์ ์์๋ณด๊ณ , ํนํ ํ๋์ ์ธ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ค ๊ฒ์ด ๋ ์ ํฉํ์ง ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
DTO๋?
DTO(Data Transfer Object)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๋ถ๋ถ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋์ํค๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋จํ Java ๊ฐ์ฒด์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๋ ์ปจํ ์ด๋๋ผ๊ณ ์๊ฐํ ์ ์์ฃ . ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ DTO๋ ์๋น์ค ๊ณ์ธต์์ ์ปจํธ๋กค๋ฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋, ์ปจํธ๋กค๋ฌ์์ ๋ทฐ ๊ณ์ธต์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
DTO๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ ์๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ ์ฃผ์ด, ์ฝ๋๊ฐ ๋ ์ฒด๊ณ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก DTO์๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ณต์กํ ๋์์ด ์์ต๋๋ค. ๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ์ญํ ๋ง ํฉ๋๋ค.
DTO๋ ์ด๋ป๊ฒ ๊ตฌํ๋ ๊น?
DTO๋ ๋ณดํต ์ผ๋ฐ์ ์ธ Java ํด๋์ค๋ก ๊ตฌํ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ DTO๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ํฌํจํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ด๋ private ํ๋
- ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์์ ํ๊ธฐ ์ํ Getter์ Setter ๋ฉ์๋
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์(Constructor)
- ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๊ฑฐ๋ ์ถ๋ ฅํ ๋ ์ ์ฉํ
toString()
,hashCode()
,equals()
๋ฉ์๋๋ฅผ ์ฌ์ ์(Override)
๋ค์์ UserDTO ํด๋์ค์ ์์ ๋๋ค:
import java.util.Objects;
public class UserDTO {
private String name;
private int age;
private String email;
// ์์ฑ์
public UserDTO(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Getter์ Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// toString() ๋ฉ์๋ ์ฌ์ ์
@Override
public String toString() {
return "UserDTO{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
// ๊ฐ์ฒด ๋น๊ต๋ฅผ ์ํด equals() ๋ฉ์๋ ์ฌ์ ์
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserDTO userDTO = (UserDTO) o;
return age == userDTO.age && Objects.equals(name, userDTO.name) && Objects.equals(email, userDTO.email);
}
// hashCode() ๋ฉ์๋ ์ฌ์ ์
@Override
public int hashCode() {
return Objects.hash(name, age, email);
}
}
์ด UserDTO ํด๋์ค๋ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค: ์ด๋ฆ, ๋์ด, ์ด๋ฉ์ผ๊ณผ ๊ฐ์ ์ ๋ณด์
๋๋ค. ๋ํ ๋ ๊ฐ์ UserDTO
๊ฐ์ฒด๋ฅผ ๋น๊ตํ ์ ์๋ equals()
๋ฉ์๋, ๊ณ ์ ํ ํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ hashCode()
๋ฉ์๋, ๊ทธ๋ฆฌ๊ณ ์ฝ๊ธฐ ์ฝ๋๋ก ์ถ๋ ฅํ๋ toString()
๋ฉ์๋์ ๊ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค.
Info
Lombok(๋กฌ๋ณต)[2] ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ์์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ DTO๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ํ์ง๋ง Record๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ(immutability)์ ๊ฐ์ง๋ฉฐ, ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
UserDTO๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
public class UserDTOUsageExample {
public static void main(String[] args) {
UserDTO user = new UserDTO("Ashutosh", 25, "ashutosh@example.com");
// ๋ฐ์ดํฐ ์ ๊ทผ
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getEmail());
// toString() ๋ฉ์๋ ์ฌ์ฉ
System.out.println(user);
// ๊ฐ์ฒด ๋น๊ต
UserDTO anotherUser = new UserDTO("Vishakha", 22, "vishakha@example.com");
System.out.println(user.equals(anotherUser));
}
}
์ถ๋ ฅ:
#
# Ashutosh
# 25
# ashutosh@example.com
# UserDTO{name='Ashutosh', age=25, email='ashutosh@example.com'}
# false
#
Record๋?
Record๋ Java 14์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ์ผ๋ก ๋์ ๋์๊ณ , Java 16์์ ์ ์์ผ๋ก ์ถ์๋ ํน๋ณํ ์ ํ์ ํด๋์ค์ ๋๋ค. Record๋ ๋ถ๋ณ(Immutable) ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ด๋ ๋ฐ ์ด์ ์ ๋ง์ถ๊ณ ์์ผ๋ฉฐ, ๊ธฐ์กด ํด๋์ค(DTO ๋ฑ)์์ ํ์ํ๋ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ๋ง์ด ์ค์ฌ์ค๋๋ค.
DTO์์๋ ์์ฑ์, Getter, equals()
, hashCode()
, toString()
๋ฉ์๋๋ฅผ ์ง์ ์์ฑํด์ผ ํฉ๋๋ค. ํ์ง๋ง Record๋ฅผ ์ฌ์ฉํ๋ฉด Java๊ฐ ์ด ๋ชจ๋ ๊ฒ๋ค์ ์๋์ผ๋ก ์์ฑํด ์ค๋๋ค. ๋๋ถ์ ๊ฐ๋จํ ๋ถ๋ณ ๊ฐ์ฒด, ์ฆ ๋ฐ์ดํฐ๋ง ๋ด๋ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ฃผ์ ํน์ง
- ๋ถ๋ณ์ฑ: ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ DTO์๋ ๋ค๋ฅด๊ฒ ํ ๋ฒ Record๋ฅผ ๋ง๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ: ํ๋๋ง ์ ์ธํ๋ฉด Java๊ฐ ์๋์ผ๋ก ์์ฑ์, Getter,
equals()
,hashCode()
,toString()
๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ค๋๋ค. - Setter ์์: Record๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ Setter ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
๋ค์์ ์์ ๋ณด์๋ UserDTO์ ๋์ผํ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ UserRecord๋ฅผ Record๋ก ๋ง๋๋ ์์ ๋๋ค:
public record UserRecord(String name, int age, String email) {
}
์ด๊ฒ ๋์ ๋๋ค. ๋จ ํ ์ค๋ง์ผ๋ก Java๋ ์๋์ผ๋ก ๋ค์์ ์์ฑํด ์ค๋๋ค:
- ์์ฑ์:
new UserRecord(String name, int age, String email)
- ๊ฐ ํ๋์ ๋ํ Getter ๋ฉ์๋:
name()
,age()
,email()
- ๋ ๊ฐ์ UserRecord ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋
equals()
๋ฉ์๋ - ๊ณ ์ ํ ํด์ ์ฝ๋๋ฅผ ์์ฑํ๋
hashCode()
๋ฉ์๋ - ๋ฌธ์์ด ํํ์ ๋ฐํํ๋
toString()
๋ฉ์๋: ์๋ฅผ ๋ค์ด,UserRecord[name=Ashutosh, age=25, email=ashutosh@example.com]
๊ฐ์ ํํ๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
UserRecord
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
public class UserRecordUsageExample {
public static void main(String[] args) {
UserRecord user = new UserRecord("Ashutosh", 25, "ashutosh@example.com");
// ๋ฐ์ดํฐ ์ ๊ทผ
System.out.println(user.name());
System.out.println(user.age());
System.out.println(user.email());
// toString() ๋ฉ์๋ ์ฌ์ฉ
System.out.println(user);
// ๊ฐ์ฒด ๋น๊ต
UserRecord anotherUser = new UserRecord("Vishakha", 22, "vishakha@example.com");
System.out.println(user.equals(anotherUser));
}
}
์ถ๋ ฅ:
#
# Ashutosh
# 25
# ashutosh@example.com
# UserRecord[name=Ashutosh, age=25, email=ashutosh@example.com]
# false
#
UserRecord
๋ฅผ ์ฌ์ฉํ๋ฉด Getter, ์์ฑ์, equals()
, hashCode()
, toString()
๋ฉ์๋๋ฅผ ์ผ์ผ์ด ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. Record๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ๊ณ ๊น๋ํ๊ฒ ๋ง๋ค ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ Record๋ฅผ ์ฌ์ฉํ ๊น?
- ๋ถํ์ํ ์ฝ๋ ๊ฐ์: ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํด์ผ ํ๋ Getter ๋ฉ์๋๋
equals()
๋ฉ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ์ธ ํ์๊ฐ ์์ต๋๋ค. - ๋ถ๋ณ์ฑ ๋ณด์ฅ: ๊ฐ์ฒด๊ฐ ์์ฑ๋ ํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ง๋ค์ด, ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ช ํํ ์๋: Record๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ์ถ๊ฐ์ ์ธ ๋์์ด๋ ๋ก์ง ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๊ฒ์์ ๋ถ๋ช ํ๊ฒ ์ ์ ์์ต๋๋ค.
DTO์ Record ๋น๊ตํ๊ธฐ
์ด์ DTO์ Record์ ๋ํด ์์๋ดค์ผ๋, ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
๋ถ๋ณ์ฑ(Immutability)
Record๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ, ํ ๋ฒ ์์ฑ๋ Record ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ๋ณ์ฑ ๋๋ถ์ ๋ฐ์ดํฐ๋ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ด๋ ์ค๋ ๋ ์์ (Thread-safe)ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, UserRecord
์์๋ name
, age
, email
ํ๋๊ฐ ์์ฑ๋ ๋๋ง ์ค์ ๋๊ณ , ์ดํ์๋ ์์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, DTO๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ, ๊ฐ์ฒด๊ฐ ์์ฑ๋ ํ์๋ ํ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. DTO๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ ค๋ฉด Setter ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋, final ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํฉ๋๋ค. ๋ถ๋ณ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Record: ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- DTO: ๋ถ๋ณ์ฑ์ ์ ์งํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์ฝ๋ ์ค๊ณ๊ฐ ํ์ํ๋ฉฐ, ๋ณต์กํ ์ฝ๋๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
public class ImmutabilityExample {
public static void main(String[] args) {
UserDTO userDTO = new UserDTO("Ashutosh", 25, "ashutosh@example.com");
userDTO.setAge(26); // DTO๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ๋ณ๊ฒฝ์ ํ์ฉํฉ๋๋ค.
UserRecord userRecord = new UserRecord("Ashutosh", 25, "ashutosh@example.com");
userRecord.name = "Jane"; // ์ด๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
}
}
๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋(Boilerplate Code)
Record
์ ํฐ ์ฅ์ ์ค ํ๋๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋, ์ฆ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค๋ ์ ์
๋๋ค. DTO๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณดํต Getter, Setter, ์์ฑ์, equals()
, hashCode()
, toString()
๋ฉ์๋๋ฅผ ์ง์ ์์ฑํด์ผ ํ์ง๋ง, Record
๋ ์ด๋ฌํ ๋ฉ์๋๋ค์ ์๋์ผ๋ก ์์ฑํด ์ค๋๋ค.
๋ฐ๋๋ก, DTO๋ ์ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. Lombok ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ผ ์ ์์ง๋ง, Record
๋งํผ ๊ฐ๋จํ์ง๋ ์์ต๋๋ค.
- Record: ์์ฑ์, Getter,
equals()
,hashCode()
,toString()
์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. - DTO: ์ง์ ๊ตฌํ์ด ํ์ํ๊ฑฐ๋ Lombok ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ํํ ๋ฐฉ์
Record
๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Record
์ ์ธ์๋ ํ๋๋ง ํฌํจ๋๋ฏ๋ก ์ฝ๋๊ฐ ๋ ๊น๋ํ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ํนํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋ง์ ํ๋ก์ ํธ์์ ์ ์ง๋ณด์๊ฐ ๋ ์ฉ์ดํฉ๋๋ค.
// Record: ๊ฐ๊ฒฐํ๊ณ ๋จ์ํ ์ฝ๋
public record UserRecord(String name, int age, String email) {}
๋ฐ๋ฉด, DTO๋ ์ฝ๋๊ฐ ๋ ๊ธธ์ด์ง๋๋ค:
// DTO: ๋ ๋ง์ ์ฝ๋ ํ์
public class UserDTO {
private String name;
private int age;
private String email;
// ์์ฑ์, Getter, Setter, toString(), equals(), hashCode()...
}
Record
๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฉ๋์์ ๋ช
ํํ๊ฒ ๋๋ฌ๋ด๋ฉฐ, DTO๋ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ ์ถ๊ฐ ๋ก์ง์ผ๋ก ์ธํด ๋ณต์กํด์ง ์ ์์ต๋๋ค.
์ปค์คํฐ๋ง์ด์ง(Customization)
DTO์ ์ฅ์ ์ค ํ๋๋ ์ปค์คํฐ๋ง์ด์ง์ด ์ฉ์ดํ๋ค๋ ์ ์
๋๋ค. DTO์์๋ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ, ๋ฐ์ดํฐ ๋ณํ ๋ฉ์๋ ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค(์์ DTO์์๋ ๊ถ์ฅ๋์ง ์์ง๋ง ๊ฐ๋ฅ). ์๋ฅผ ๋ค์ด, email
ํ๋๊ฐ ์ ํจํ ํ์์ธ์ง ํ์ธํ๋ ๊ฒ์ฆ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, Record
๋ ์ปค์คํฐ๋ง์ด์ง์ด ์ ํ์ ์
๋๋ค. Record
๋ ๊ฐ๋ณ๊ณ ๋ถ๋ณ์ฑ์ ์ ์งํ๋๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ์ํ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณต์กํ ๋ก์ง์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ง์ฝ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ์ปค์คํฐ๋ง์ด์ง๋ ๋์์ด๋ ๋ก์ง์ด ํ์ํ๋ค๋ฉด, DTO๊ฐ ๋ ์ ์ฐํ ์ ํ์
๋๋ค.
DTO์์ ์ปค์คํฐ๋ง์ด์ง ์์:
public class UserDTO {
private String email;
// ์ด๋ฉ์ผ ํ์์ ๊ฒ์ฆํ๋ ๋ฉ์๋
public boolean isValidEmail() {
return email != null && email.contains("@");
}
}
Record
์์๋ ์ด๋ฐ ์ปค์คํฐ๋ง์ด์ง์ ๋ณดํต Record
์ธ๋ถ์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. Record
๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ๋ง ์ง์คํ๊ณ , ๊ฒ์ฆ ๊ฐ์ ๋ก์ง์ ๋ค๋ฅธ ๊ณณ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ์ ์ฐ๊ด์ฑ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ์์น ์ค ํ๋๋ ๋ถ๋ณ์ฑ(Immutability)์
๋๋ค. ์ฆ, ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ํ ๋ฒ ์์ฑ๋ ํ์๋ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. Record
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ด๋ฏ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์์น๊ณผ ์ ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ์์คํ
์ ์ ํฉํ ์ ํ์
๋๋ค.
- ๋ถ๋ณ์ฑ์ ๋ง๊ฒ ์ค๊ณ๋์์ผ๋ฉฐ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ์กฐํ๋ ์ํ ๋ณํ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ๋ง์ต๋๋ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ด ์์ธกํ ์ ์๊ณ , ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋ ์คํ์ผ์ ์ด์งํฉ๋๋ค.
๋ฐ๋ฉด, DTO๋ ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ, ๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ์๋์ ์ธ ์ค์ ์ด ํ์ํฉ๋๋ค. DTO๋ ์ํ ๋ณ๊ฒฝ์ด ํํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ๋ ์ ํฉํฉ๋๋ค.
- ์ ์ฐํ์ฌ ๋ช ๋ นํ ๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ ํฉํฉ๋๋ค.
- ๊ฐ๋ณ์ฑ์ ์ฌ์ฉํ๋ฉด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์๋ ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
DTO์ Record๋ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
DTO์ Record ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ ๋๋ ์ฌ์ฉ ์ฌ๋ก, ํ๋ก์ ํธ ์๊ตฌ์ฌํญ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํ๋ Java ๋ฒ์ ์ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค.
DTO๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
1. ๋ฐ์ดํฐ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ
๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์์ฑ ํ ์์ ํด์ผ ํ ๋๋ DTO๊ฐ ๋ ์ ํฉํฉ๋๋ค. DTO๋ ๋ณดํต ๊ฐ๋ณ์ ์ด์ด์ ํ๋ ๊ฐ์ ํ์์ ๋ฐ๋ผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๊ณ์ํด์ ์ ๋ฐ์ดํธ๋๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.
์์
์น ์ ํ๋ฆฌ์ผ์ด์ ์์, ์ฌ์ฉ์ ๋ฑ๋ก ์์์ ํตํด ์ฒ์์ ์ผ๋ถ ํ๋๊ฐ ๋น์ด ์๋ ์ํ๋ก UserDTO๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ๋กํ์ ์ ๋ฐ์ดํธํ๋ฉด์ ํด๋น UserDTO์ ๊ฐ๋ค์ด ๋ณ๊ฒฝ๋์ด์ผ ํ ์๋ ์์ต๋๋ค.
2. ์ถ๊ฐ์ ์ธ ๋์์ด๋ ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ
DTO๋ ๊ฒ์ฆ, ๋ณํ, ๋๋ ์ถ๊ฐ ๋ฉ์๋ ๋ฑ ๋ง์ถคํ ๋์์ ์ถ๊ฐํ๋ ๋ฐ ๋ ์ ์ฐํฉ๋๋ค. ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ ์ด์์ผ๋ก ๋์ํด์ผ ํ ๋ ์๋ฅผ ๋ค์ด, ์ด๋ฉ์ผ ํ์์ ํ์ธํ๊ฑฐ๋ ์ ๋ ฅ์ ์ ์ ํ๋ ๋ก์ง์ด ํ์ํ ๋๋ DTO๊ฐ ๋ ์ ํฉํฉ๋๋ค.
์์
UserDTO์ ์ด๋ฉ์ผ ํ์์ ๊ฒ์ฆํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ ์ ์ด๋ฉ์ผ์ด ์ ํจํ์ง ํ์ธํ ์ ์์ต๋๋ค.
3. ์ด์ ๋ฒ์ ์ Java(16 ์ด์ ๋ฒ์ )์ ํธํ์ด ํ์ํ ๊ฒฝ์ฐ
Java 16 ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ผ๋ฉด Record๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด์ DTO๋ Lombok(๋กฌ๋ณต)๊ณผ ๊ฐ์ ๋์์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ์ํํด์ผ ํฉ๋๋ค.
์์
๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ด Java 11 ๋๋ Java 8์ ์ง์ํด์ผ ํ๋ค๋ฉด Record๋ ์ ํ์ง๊ฐ ์๋๋ฏ๋ก, ๊ธฐ์กด์ DTO ๋ฐฉ์์ ์ ์งํด์ผ ํฉ๋๋ค.
Record๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
1. ๊ฐ๊ฒฐํ๊ณ ๋ถ๋ณ์ฑ์ ๊ฐ์ง ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒฝ์ฐ
Record๋ ๊ฐ๋ณ๊ณ ๋ถ๋ณ์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ ๋ ์ด์์ ์ ๋๋ค. Record๋ ํ์์ ์ธ ๋ฉ์๋๋ค(์์ฑ์, Getter, equals(), hashCode(), toString())์ ์๋์ผ๋ก ์์ฑํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํํ์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์์
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์๋น์ค ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค๋ฉด, UserRecord๊ฐ ์๋ฒฝํ ์ ํ์ผ ์ ์์ต๋๋ค.
2. ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ ์ ์ก์ด ํ์ํ ๊ฒฝ์ฐ
์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ๋ง ํ๊ณ ์์ ํ ํ์๊ฐ ์๋ค๋ฉด Record๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Record๋ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋น์ค ๊ณ์ธต์ผ๋ก ๋๋ ์๋น์ค ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
์์
Record๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณ์ธต์์ REST ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. ์ต์ Java ์ ํ๋ฆฌ์ผ์ด์ (Java 16 ์ด์)์์
ํ๋ก์ ํธ์์ Java 16 ์ด์์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด Record
๋ฅผ ์ถฉ๋ถํ ํ์ฉํ ์ ์์ต๋๋ค. Record
๋ ์ต์ Java ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ ํํ์ ๊ฐ์ํํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๊ธฐ์กด DTO๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ถํ์ํ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์
Java 17 ๊ธฐ๋ฐ์ ์น ์๋น์ค์์ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ์ํด Record
๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์?
DTO์ Record
์ ์ฑ๋ฅ์ ๋น๊ตํ ๋ ์ฐจ์ด๋ ํฌ์ง ์์ง๋ง, ๋ช ๊ฐ์ง ์ค์ํ ์์๋ค์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
Record
๋ ์ค๊ณ์ ๊ฐ๊ฒฐํ๋ฏ๋ก DTO๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ Record
๊ฐ ์ง์ Getter, Setter, equals()
, hashCode()
, toString()
๋ฉ์๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ค์ด Java ์ปดํ์ผ๋ฌ์ ์ํด ์๋์ผ๋ก ์ต์ ํ๋์ด ์์ฑ๋๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ค์ด๋ญ๋๋ค.
์์
- DTO๋ ๊ฐ๊ฐ์ ์ฐ์ฐ์ ๋ํด ๋ณ๋์ ํ๋์ ๋ฉ์๋(
getName()
,setName()
๋ฑ)๊ฐ ํ์ํฉ๋๋ค. - ๋ฐ๋ฉด,
Record
๋ ๋ด๋ถ์ ์ผ๋ก ํ๋๋ง ๊ฐ์ง๊ณ ํ์ํ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก, ๋ ์ ์ ์์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ถ๋ณ์ฑ๊ณผ ์ค๋ ๋ ์์ ์ฑ
Record
๋ ๋ถ๋ณ(immutable)์ด๋ฏ๋ก, ํนํ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฑ๋ฅ์์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. Record
๋ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ๊ฐ์ ๊ณต์ ๋ ๋ ๋๊ธฐํ๋ ์ ๊ธ(locking) ๋ฉ์ปค๋์ฆ์ด ํ์ํ์ง ์์ต๋๋ค. ์ด๋ ์ค๋ ๋ ๊ฐ ๊ฒฝ์(thread contention)์ผ๋ก ์ฑ๋ฅ์ด ์ ํ๋๋ ์ํฉ์์ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, ๊ฐ๋ณ(mutable) DTO๋ฅผ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ทผ์ ๋๊ธฐํํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ์ฑ๋ฅ์ ์ถ๊ฐ์ ์ธ ๋ถ๋ด์ด ์๊ธฐ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์
DTO์ Record ๋ชจ๋ ์ผ๋ฐ์ ์ธ Java ๊ฐ์ฒด(POJO, Plain old Java object)์ด๋ฏ๋ก ๋์ผํ ๊ฐ๋น์ง ์ปฌ๋ ์
์ฒ๋ฆฌ์ ๋ฐ๋ผ ๊ด๋ฆฌ๋ฉ๋๋ค. ํ์ง๋ง Record
๊ฐ ๋ ๊ฐ๊ฒฐํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ฑฐ๋ ์ ์ง๋ ์ ์์ด, ๊ฐ๋น์ง ์ปฌ๋ ์
์ด ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด๋ ๋๋์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ๋ฅ ํฅ์์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
CPU ์ค๋ฒํค๋
Record
๋ ์ปดํ์ผ๋ฌ์ ์ํด ์๋ ์์ฑ๋๋ฉฐ ์ฑ๋ฅ์ ์ต์ ํํ๋๋ก ์ค๊ณ๋์ด ์์ด, ๊ฐ์ฒด ์์ฑ, ๋ฉ์๋ ํธ์ถ, ๋น๊ต ์์
(equals()
, hashCode()
)์์ CPU ์ฑ๋ฅ์ด ์กฐ๊ธ ๋ ํฅ์๋ ์ ์์ต๋๋ค. ํนํ ๋ณต์กํ DTO์ ๊ฒฝ์ฐ, ์๋์ผ๋ก ๊ตฌํ๋ ๋ฉ์๋์์ ๋นํจ์จ์ฑ์ด ๋ฐ์ํ ์ ์๋๋ฐ, Record
๋ ์ผ๊ด๋๊ณ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ์์
์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ ํจ์จ์ ์
๋๋ค.
์ค์ ์ฑ๋ฅ
์ค์ ๋ก๋ DTO์ Record
๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋งค์ฐ ์ ๊ฑฐ๋ ๋ฌด์ํ ๋งํ ์์ค์ผ ๊ฒ์
๋๋ค. Record
์ ๊ฐ๊ฒฐํจ์ด ํน์ ์๋๋ฆฌ์ค์์ ์ฝ๊ฐ์ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง, ์ค์ ๋ก๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋์ ์ฒ๋ฆฌ๋์ ์๊ตฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
, ๋๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ(์: ๋ชจ๋ฐ์ผ ๋๋ IoT ์ฅ์น)์์๋ง ๋์ ๋ ์ ๋์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๊ฒฝํํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
์ง๊ธ๊น์ง DTO์ Record
์ ์ฃผ์ ์ฐจ์ด์ , ๊ฐ ์ฌ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ฐ์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ง๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. DTO๋ ์ ์ฐ์ฑ, ๊ฐ๋ณ์ฑ, ๊ทธ๋ฆฌ๊ณ ๋ง์ถคํ ๋์์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, Record
๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒฐํ๊ณ ๋ถ๋ณํ๊ฒ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ด์์ ์ด๋ฉฐ, ์ต์ Java ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉํฉ๋๋ค.
DTO์ Record
๋ฅผ ์ ํํ๋ ๊ฒ์ ๊ฒฐ๊ตญ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ๊ฐ๋ณ์ฑ์ด ํ์ํ๊ฑฐ๋ ์ปค์คํ ๋ก์ง์ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด, DTO๊ฐ ๋ ์ ํฉํฉ๋๋ค.
- ๊ฐ๊ฒฐํ๊ณ ๋ถ๋ณ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ ํธํ๊ณ Java 16 ์ด์์ ์ฌ์ฉํ๋ค๋ฉด, Record๊ฐ ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ธ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ๊ฐ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ์ด๋ฅผ ์ธ์ ์ฌ์ฉํด์ผ ํ ์ง ์ดํดํ๋ฉด ๋ ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด Java ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.