의존성 주입 Annotation 정리

Jeonghyeon Park·2025년 3월 19일

SKALA

목록 보기
5/13

1. 개념 정리

Spring에서 의존성 주입(DI, Dependency Injection)을 할 때, Lombok의 어노테이션(@RequiredArgsConstructor, @AllArgsConstructor, @NoArgsConstructor)과 @Autowired를 비교해볼 수 있다.

@RequiredArgsConstructor

  • final 또는 @NonNull이 붙은 필드만을 매개변수로 받는 생성자를 자동으로 생성한다.
  • Spring에서는 생성자가 하나만 있으면 자동으로 @Autowired가 적용되므로, 명시적으로 @Autowired를 사용할 필요가 없다.
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
}

@AllArgsConstructor

  • 모든 필드를 매개변수로 받는 생성자를 자동으로 생성한다.
  • final이 아닌 필드까지 포함되므로, 빈의 변경 가능성을 증가시킬 수 있다.
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@AllArgsConstructor
public class UserService {
    private UserRepository userRepository;
}

@NoArgsConstructor

  • 매개변수가 없는 기본 생성자를 자동으로 생성한다.
  • 객체를 빈으로 등록하거나 직렬화할 때 필요할 수 있다.
  • final 필드가 존재하면 컴파일 에러가 발생할 수 있다.
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@NoArgsConstructor
public class UserService {
    private UserRepository userRepository;
}

@Autowired

  • Spring에서 의존성 주입을 수행하는 어노테이션이다.
  • 필드 주입, 생성자 주입, 세터 주입 등에 사용할 수 있다.
  • 생성자 주입 방식에서는 @Autowired를 생략할 수 있다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

2. 핵심 내용

@RequiredArgsConstructor vs @Autowired

@RequiredArgsConstructor를 사용하면 @Autowired 없이도 생성자 주입을 자동으로 수행할 수 있다. 이는 다음과 같은 장점을 가진다.

코드 간결성 → 생성자를 직접 작성할 필요가 없다.
불변성 보장final 필드를 사용하여 안정성을 높인다.
테스트 용이성 → 필드 주입(@Autowired)보다 테스트 코드 작성이 쉬움.
Spring 프레임워크에 덜 의존적 → 순수 Java 코드로도 실행 가능하다.

@AllArgsConstructor와 @NoArgsConstructor의 활용

@AllArgsConstructor는 모든 필드에 대한 생성자를 생성하여 객체 생성이 용이하지만, 변경 가능성을 증가시킨다. @NoArgsConstructor는 기본 생성자가 필요할 때 사용하며, JPA Entity에서 사용될 수 있다.

필드 주입 vs 생성자 주입

  • 필드 주입 (@Autowired) 문제점
  1. 테스트가 어렵다 (Mocking 시 Reflection 필요)
  2. 불변성을 보장하지 못한다.
  3. Spring 프레임워크에 강한 의존성이 생긴다.
  • 생성자 주입 (Lombok + @RequiredArgsConstructor)
  1. 테스트가 쉽고 안정적이다.
  2. 필수 의존성만 설정 가능하여 불변성이 보장된다.
  3. Spring 없이도 사용할 수 있어 유지보수가 용이하다.

3. 요약

@RequiredArgsConstructor를 사용하면 코드가 간결해지고, 불변성을 유지할 수 있으며, 생성자 주입을 통한 의존성 관리가 용이하다. Spring 기반 개발에서는 @Autowired 필드 주입보다 @RequiredArgsConstructor 생성자 주입 방식이 권장된다.

profile
안녕하세요

0개의 댓글