Back End/🍀 Spring Boot

record 이해 및 활용

James Wetzel 2025. 2. 2. 13:37

`record`는 **Java 16부터 정식 도입된 특별한 클래스 타입**으로, **데이터 전달용 객체를 간결하게 정의**하기 위해 만들어졌습니다. 기존의 `Class` 작성 방식보다 훨씬 적은 코드로 **불변(immutable) 데이터 객체**를 생성할 수 있습니다.

---

### ✨ **record의 3대 특징**
1. **불변성**: 모든 필드가 `final`로 자동 설정
2. **자동 메서드 생성**: 생성자, `equals()`, `hashCode()`, `toString()` 자동 구현
3. **간결한 문법**: 데이터 구조를 선언하는 데 집중

---

### 📍 **기존 Class vs record 비교**
#### 1. **전통적인 DTO 클래스 (Before)**

public class LoginRequest {
    private final String email;
    private final String password;

    public LoginRequest(String email, String password) {
        this.email = email;
        this.password = password;
    }

    // 게터 메서드
    public String getEmail() { return email; }
    public String getPassword() { return password; }

    // equals(), hashCode(), toString() 구현 필요
}



#### 2. **record 사용 (After)**

public record LoginRequest(String email, String password) {}
// 생성자, 게터, equals(), hashCode(), toString() 자동 생성 ✅



### 🛠 **record 사용 예시**

// 레코드 생성
LoginRequest request = new LoginRequest("user@test.com", "1234");

// 데이터 접근 (게터는 getXXX()가 아닌 필드명 그대로 사용)
String email = request.email();  // "user@test.com"
String password = request.password(); // "1234"



### ✅ **record의 장점**
- **코드 양 90% 감소**: 반복적인 보일러플레이트 코드 제거
- **가독성 향상**: 데이터 구조가 한눈에 들어옴
- **스레드 안전**: 불변 객체이기 때문에 동시성 문제 최소화
- **의도 명확화**: 순수 데이터 저장용임을 명시적으로 표현

---

### ⚠️ **record 사용 시 주의점**
1. **상속 불가**: 다른 클래스를 상속받을 수 없음
2. **필드 추가 불가**: 선언 시 명시한 필드 외 추가 불가
3. **Lombok과 차이점**: `@Data`와 달리 **세터(setter)가 생성되지 않음**

---

### 💡 **실무에서 record의 주요 사용처**
1. **API 요청/응답 DTO** (예: 로그인, 회원가입 폼)
2. **데이터 캡슐화가 필요한 도메인 객체** (예: 좌표값 `Point(int x, int y)`)
3. **복합 키(Composite Key) 정의** (JPA `@Embeddable` 대체)

자바의 `record`는 **간결함과 안정성을 동시에 잡은 혁신적인 기능**으로, DTO/VO 작성 시 적극 활용해보세요! 😊

728x90
반응형