웹 개발/🍃 SpringBoot

Springboot | 생성자관련 어노테이션

이재원 2025. 3. 13. 19:15

생성자관련 어노테이션

  • @NoArgsConstructor:
    • 생성자에 아무런 매개변수도 없는 기본 생성자를 생성합니다.
    • 주로 프레임워크(예: JPA)가 기본 생성자를 필요로 할 때 사용됩니다.
  • @AllArgsConstructor:
    • 클래스의 모든 필드를 매개변수로 받는 생성자를 생성합니다.
    • 모든 필드를 한 번에 초기화할 수 있으며, 불필요한 필드까지 포함됩니다.
  • @RequiredArgsConstructor:
    • final 필드와 @NonNull로 표시된 필드(초기값이 없는 경우)만 매개변수로 받는 생성자를 생성합니다.
    • 주로 의존성 주입(특히 생성자 주입) 시, 필요한 필드만 초기화하기 위해 사용합니다.

1. @NoArgsConstructor 예시

파라미터 없는 기본 생성자를 생성합니다.

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

@NoArgsConstructor
@Getter
@Setter
public class NoArgsExample {
    private int id;
    private String name;
}

// 사용 예시
NoArgsExample example = new NoArgsExample(); // 기본 생성자 호출
example.setId(1);
example.setName("NoArgs");

2. @AllArgsConstructor 예시

모든 필드를 매개변수로 받는 생성자를 생성합니다.

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@AllArgsConstructor
@Getter
@Setter
public class AllArgsExample {
    private int id;
    private String name;
}

// 사용 예시
AllArgsExample example = new AllArgsExample(1, "AllArgs");

3. @RequiredArgsConstructor 예시

final 필드와 @NonNull로 표시된 필드만 매개변수로 받는 생성자를 생성합니다.

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.NonNull;

@RequiredArgsConstructor
@Getter
public class RequiredArgsExample {
    private final int id;         // final 필드 → 생성자에 포함됨
    @NonNull
    private String name;          // @NonNull → 생성자에 포함됨
    private String description;   // 일반 필드 → 생성자에 포함되지 않음
}

// 사용 예시
// 아래 생성자는 RequiredArgsExample(int id, String name) 형태로 생성됨
RequiredArgsExample example = new RequiredArgsExample(1, "RequiredArgs");
// 이후 필요한 경우 setter 등을 통해 description을 설정할 수 있습니다.

서비스에서의 예시 (생성자 주입)

서비스 계층에서는 보통 필드주입(@autowired) 대신 생성자 주입을 사용 합니다.

보통 서비스에서는 의존성 주입을 위해 final 필드를 사용하고, @RequiredArgsConstructor를 활용합니다

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

@Service
@RequiredArgsConstructor
public class MyService {
    // final 필드에 대해 Lombok이 생성자를 자동으로 만들어줍니다.
    private final MyRepository repository;
    
    public void doServiceLogic() {
        // 서비스 로직 구현
    }
}

 

생성자 주입의 장점

불변성 보장 : 의존성을 final 필드로 선언하여 객체 생성 후 변경이 불가능해집니다.

명시적 의존성 : 생성자를 통해 어떤 의존성이 필요한지 한눈에 파악할 수 있습니다.

테스트 용이성 : 생성자를 통한 의존성 주입은 단위 테스트 시 모의 객체(mock)를 주입하기 쉽습니다.

Lombok과의 결합 : Lombok의 @RequiredArgsConstructor를 사용하면 보일러플레이트 코드를 줄이고, 생성자 주입을 간결하게 구현할 수 있습니다.

반응형