자바에서는 데이터 전송을 위해 DTO(Data Transfer Object)라는 개념을 가지고 있는데요. 이는 다양한 계층 간 데이터 전달의 효율성을 목적으로 극대화 하기 위해 사용되는 클래스 틀을 의미하는데요.
물론 자바에는 DTO만 있는건 아니고, VO(Value Object), DAO(Data Access Object), Entity와 같이 특정 목표를 위해만들어진 그릇? 같은 객체가 존재하는데요.
지금 당장은 이러한 DTO가 와닿지 않지만, 후에 MVC 모델을 이용한 웹 어플리케이션을 개발할 때 DTO 개념을 사용하기 때문에 지금은 개념 정도로만 알아두시는 것을 추천합니다.
보안 및 매핑 목적으로 자주 사용되기도 하는 이 DTO의 골자는 다음 코드와 같습니다.
public class MemberDTO { // 상수 필드 선언 private final String name; private final int age; // 생성자 생성 public MemberDTO(String name, int age) { this.name = name; this.age = age; } //getter 메서드 설정 (setter는 보안 목적으로 사용 x) public String getName() { return name; } public int getAge() { return age; } // 상속받은 Object 클래스의 toString 메서드 재정의 @Override public String toString() { return "MemberDTO{name='" + name + "', age=" + age + "}"; } // 상속받은 Object 클래스의 hashCode 메서드 재정의 @Override public int hashCode() { return Objects.hash(name, age); } // 상속받은 Object 클래스의 equals 메서드 재정의 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; MemberDTO memberDTO = (MemberDTO) obj; return age == memberDTO.age && Objects.equals(name, memberDTO.name); } public static void main(String[] args) { MemberDTO member1 = new MemberDTO("Re_Go", 30); MemberDTO member2 = new MemberDTO("Re-Go", 29); // getter 메서드 호출 System.out.println(member1.getName()); System.out.println(member1.getAge()); // toString 메서드 호출 System.out.println(member1.toString()); // hashCode 메서드 호출 System.out.println(member1.hashCode()); // equals 메서드 호출 System.out.println(member1.equals(member2)); } }
특히 이러한 코드를 반복적으로 작성하는것은 비효율적이라는 것인데, 이를 지원하기 위해 Java 14부터 record
객체가 추가되었는데(물론 잘 사용은 안됨),
위에서 살펴본 DTO를 자동으로 추가해준다는 장점을 가지고 있어 매우 유용하게 사용되는 객체중 하나입니다.
// Member 레코드 생성 public record Member(String name, int age) { public static void main(String[] args) { Member member1 = new Member("Re_Go", 30); Member member2 = new Member("Re-Go", 29); // getter 메서드 호출 (접두사를 get으로 쓰지 않고 멤버 이름과 같게 자동 생성됩니다.) System.out.println(member1.name); System.out.println(member1.age); // toString 메서드 호출 System.out.println(member1.toString()); // hashCode 메서드 호출 System.out.println(member1.hashCode()); // equals 메서드 호출 System.out.println(member1.equals(member2)); } }
참고로 이 record 객체와 비슷한 지원을 해주는 롬복(Lombok) 이라는 커스텀 라이브러리가 있는데요. 해당 내용은 이곳을 참조하시기 바립니다.