😀 Jerry/면접 질문

[1분 면접] record를 DTO로 사용하는 이유

Jerry_K 2025. 3. 7. 15:29

📌 면접 답변

record

  • 불변성 (Immutable)을 기본으로 한다.
  • 기본 클래스와 달리 모든 필드가 final 키워드로 선언
  • 필드 선언으로 자동으로 생성자, getter, equals(), hashCode(), toString() 등의 메서드 자동으로 생성
  • 객체 생성 후 변경 불가능
  • 단순히 데이터 캡슐화 목적으로 사용

 

기존 코드

// 기존 클래스 기반 DTO
public class MemberDto {

	private final String name;
	private final String email;
	private final int age;

	public MemberDto(String name, String email, int age) {
		this.name = name;
		this.email = email;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	
	public String getEamil() {
		return email;
	}
	
	public int getAge() {
		return age;
	}
}
  • 생성자 및 여러 메서드 선언

 

record  코드

// Record. 생성자, getter, hashCode(), equals(), toString() 자동 완성
public record MemberDto(String name, String email, int age) {}
  • 간단하게 필드, 생성자, 메서드 선언

 

 

record로 생성한 모든 객체는 DTO인가 ?

  • 모든 reord 객체가 DTO인 것은 아니다.
    • DTO가 변경 가능해야 하는 경우 record 사용 X 
    • DTO가 상속이 필요한 경우 record 사용 X
  • record는 단순히 데이터를 캡슐화하는 역할
  • 때문에 DTO 외에도 VO 등의 다양한 용도로 쓰임

 

record와 VO 비교

공통점

  • 객체의 상태가 변경되지 않는 것을 보장
  • 데이터를 캡슐화하여 표현하는 데 초점
  • 값 기반의 동등성을 가짐
    • 동등성이란 서로 다른 두 객체의 값이 같은 것
    • 객체의 메모리 주소가 아니라 내부 값이 같은지를 비교

 

차이점 

  • VO
    • 도메인 모델내에서 특정 개념을 표현
    • 도메인 로직과 밀접하게 관련
  • record
    • 단순히 데이터를 캡슐화하여 전달하는데 의미

→ record가 VO 구현에 적합하지만, VO의 모든 특성을 대체하지는 않는다.

 

 

record의 한계

  • record는 extends를 사용하여 다른 클래스 상속 불가능 
  • 필드가 final로 선언되어 확장이 어려움 
  • 주로 데이터 전달하려는 목적으로 설계
    • 때문에 비즈니스 로직 포함지 않는다.

📌 내 답변

record 키워드는 자동으로 Getter, 생성자 등을 생성해준다.  

그 중 필드 값을 final로 불변하게 선언하기 때문에 데이터 전송에도 변형없이 안전하게 보낼 수 있다.

때문에 DTO로도 사용 될 수 있다.

 

 

답변 보충

  • 모든 필드를 포함하는 생성자, Getter 뿐만 아니라, equals(), hahsCode(), toString() 도 자동 생성
  • DTO는 데이터를 전송하기 위한 객체로, 반드시 불변일 필요는 없음 

https://www.maeil-mail.kr

 

매일메일 - 기술 면접 질문 구독 서비스

기술 면접 질문을 매일매일 메일로 보내드릴게요!

www.maeil-mail.kr

 

 

매일 메일의 면접 질문 정리