반응형

JPA 를 하며 Entity 에 수 많은 어노테이션을 달면서 느낀 점이 

내가 이걸 다 알고 사용하는 것은 맞을까? 였다.

 

Lombok 은 불필요한 코드와 작업을 줄여주는 Spring 을 사용하면서 정말 필수적인 라이브러리지만 그 원리와 사용해야할 때를 제대로 파악하지 못하고 사용한다면 코드를 분석하는 입장에서는 혼동을 줄 수 있고 필요없는 동작을 시행하여 효율적인 코딩하는데 좋은 방법은 아니다. 

 

우선 생성자를 생성하는 @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor  의 개념에 대해서 알아보자

 

@NoArgsConstructor

이 어노테이션은 매개변수 (Args) 가 없는 생성자 (Constructor) 를 자동으로 생성한다. 그러나 만약 (final 필드가 존재할 경우) 이 생성자를 생성할 수 없다면 컴파일과정에서 오류를 뱉을 것이다. 또한 @NonNull 같은 제약조건이 있는 필드에 대해 체크를 생성하지 않으므로 이러한 제약 조건은 해당필드가 나중에 올바르게 초기화될 때까지 일반적으로 충족되지 않을 수 있다.  이는 해당 필드가 나중에 올바르게 초기화될 떄까지 일반적으로 충족되지 않을 수 있다. 하이버네이트와 같은 서비스 제공자 인터페이스는 매개변수가 없는 생성자를 필요로 하는데 이 때 @Data 또는 다른 생성자 어노테이션과 함꼐 사용 할 수 있다. 

요약 : 매개변수가 없는 생성자 자동생성

사용 예 : 

import lombok.NoArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor // 자동 생성된 기본 생성자
public class User {

    private Long userId;
    private String userName;
    private String email;

    // 추가 필드와 메소드 생략
}

 <생성자 예시> 
 public User() {
    // 기본 생성자, 특별한 동작이 필요 없으므로 비워둘 수 있다.
}

<사용 예시>
public class Main {
    public static void main(String[] args) {
        User user = new User(); // 기본 생성자를 활용하여 객체 생성
        user.setUserId(1L);
        user.setUserName("John Doe");
        user.setEmail("john.doe@example.com");
        
        // 사용자 정보 출력
        System.out.println(user.getUserName());
    }
}

 

 

@RequiredArgsConstructor

이 어노테이션은 특별한 처리가 필요한 각 필드마다 1개의 매개변수를 생성하는 생성자를 생성한다. 초기화되지 않은 final 필드는 매개변수로 받고 @NonNull로 표기된 필드 중 초기화 되지 않은 필드도 매개변수로 받는다. @NonNull 로 표기된 필드에 대해서는 명시적인 null 체크도 생성이 된다. 이 생성자는 @NonNull 로 표기된 필드가 null 인 경우에 NullPointException 을 던진다. 매개변수의 순서는 클래스 내의 필드가 나타나는 순서와 일치한다.  

요약 : 특정 필ㄷ그를 초기화하는 생성자를 자동 생성 주로 final 필드나 required 필드 생성자 간편 생성 하는 데 사용

사용 예 : 

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor // 자동 생성된 생성자
public class UserService {

    private final UserRepository userRepository; // final 필드

    public void createUser(User user) {
        userRepository.save(user); // 사용자 저장 로직
    }
}

<생성자 예시>
public UserService(UserRepository userRepository) {
    this.userRepository = userRepository; // 주입받은 필드 초기화
}

 

@AllArgsConstructor

 이 어노 테이션은 클래스 내의 모든 필드마다 1개의 매개변수를 생성하는 생성자를 생성한다. @NonNull 로 표기된 필드는 해당 매개변수에 대한 null 체크를 생성한다.  이러한 어노테이션은 생성자를 항상 private 으로 만든다. 

요약 : 모든 필드에 대한 매개변수를 가진 생성자를 자동으로 생성 

사용 예 : 

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor // 자동 생성된 생성자
public class User {

    private final Long userId;
    private final String userName;
    private final String email;

    // 추가 필드와 메소드 생략
}

<생성자 예시>
public User(Long userId, String userName, String email) {
    this.userId = userId;
    this.userName = userName;
    this.email = email;
}

<사용 예시>
public class Main {
    public static void main(String[] args) {
        User user = new User(1L, "John Doe", "john.doe@example.com");
        System.out.println(user.getUserName());
    }
}
반응형