`@Autowired`는 어디에 쓰는 게 좋을까?

백엔드&인프라 추종자·2025년 2월 21일

스프링 공부

목록 보기
5/35

@Autowired는 어디에 쓰는 게 좋을까?

@AutowiredSpring의 의존성 주입(DI, Dependency Injection)을 위한 어노테이션으로, Spring 컨테이너가 자동으로 빈(Bean)을 주입하도록 도와줍니다. 하지만 무조건 @Autowired를 사용하는 것이 아니라, 올바른 위치에서 사용해야 코드의 유지보수성과 테스트 용이성이 좋아집니다.


1️⃣ @Autowired를 사용할 수 있는 곳

Spring에서 @Autowired를 사용할 수 있는 대표적인 위치는 다음과 같습니다.

🔹 1. 필드 주입 (권장 X)

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

필드 주입의 단점

  • 테스트하기 어렵다: 필드를 final로 만들 수 없으므로, 단위 테스트 시 의존성을 직접 주입하기 어렵다.
  • 순환 참조(Circular Dependency) 문제 발생 가능: 여러 객체가 서로 의존할 경우, 순환 참조로 인해 애플리케이션이 실행되지 않을 수 있다.
  • Spring 컨테이너 없이 객체를 생성할 수 없다: 필드 주입 방식은 Spring이 관리하는 빈에서만 동작하며, 객체를 직접 생성하여 사용할 수 없다.

📌 필드 주입은 가능한 한 지양하고, 생성자 주입을 권장합니다.


🔹 2. 생성자 주입 (권장 ✅)

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired  // 생략 가능
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

생성자 주입의 장점

불변성 유지: final 키워드를 사용하여 의존성이 변경되지 않도록 할 수 있다.
테스트 용이: 단위 테스트 시 new UserService(mockUserRepository) 형태로 주입할 수 있다.
Spring 4.3+에서는 @Autowired 생략 가능: 생성자가 하나만 있는 경우, 자동으로 주입된다.
순환 참조 방지: 애플리케이션 실행 시 순환 참조가 발생하면 에러가 발생하여 즉시 확인 가능하다.

📌 Spring 공식 문서에서도 "생성자 주입을 기본으로 사용하라"고 권장합니다.


🔹 3. 세터(Setter) 주입 (특정 상황에서 사용)

@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

세터 주입의 특징

선택적 의존성: 필수적인 의존성이 아닐 경우 사용 가능
런타임 동안 변경 가능: 동적으로 다른 구현체를 주입해야 하는 경우 유용
불변성을 보장하지 못함: final을 사용할 수 없어, 객체가 변경될 가능성이 있음

📌 테스트 목적이나, 특정 상황(예: 조건부 주입)에서만 사용하고 기본적으로 생성자 주입을 사용하세요.


2️⃣ 어디에 @Autowired를 쓰는 게 가장 좋을까?

주입 방식사용 예장점단점권장 여부
필드 주입@Autowired private UserRepository userRepository;코드가 간결테스트 어려움, 순환 참조 위험❌ (비추천)
생성자 주입public UserService(UserRepository userRepository)불변성 유지, 테스트 쉬움코드 길어짐 (하지만 의미 있음)✅ (권장)
세터 주입@Autowired public void setUserRepository(...)선택적 주입 가능불변성 없음, 유지보수 어려움⚠ (특정 경우에만)

3️⃣ 결론: 생성자 주입을 기본으로 사용하자!

  • 필드 주입은 테스트가 어렵고 유지보수가 어려워 피하는 것이 좋다.
  • 세터 주입은 선택적 주입이 필요한 경우만 사용한다.
  • 생성자 주입을 기본으로 사용하면 코드의 가독성, 테스트 용이성, 유지보수성이 향상된다! 🚀
profile
AI 답변 글을 주로 올립니다.

0개의 댓글