포스트

Spring에서 Autowired 필드가 null인 이유

소개

Spring 프레임워크에서 의존성 주입(Dependency Injection)을 쉽게 처리하기 위해 @Autowired 애노테이션을 사용합니다. 그런데 이 애노테이션을 사용하다 보면, 예상치 못한 문제로 null 값을 반환하는 경우가 있습니다. 이 글에서는 그 원인과 해결 방법에 대해 자세히 알아보겠습니다.

주요 원인: 컨테이너 밖에서 생성된 객체

Spring에서 @Autowired가 작동하지 않는 가장 흔한 이유는, 해당 객체가 Spring 컨테이너의 관리 밖에서 생성된 경우입니다. Spring은 @Component, @Service, @Repository 등의 애노테이션을 사용해 객체를 관리하므로, 이 애노테이션이 없는 클래스는 @Autowired가 적용되지 않습니다.

해결 방법 1: 애노테이션 추가

해당 클래스에 @Component 또는 관련 애노테이션을 추가하여 Spring이 관리할 수 있게 만들 수 있습니다. 예를 들어,

1
2
3
4
5
@Component
public class MyClass {
    @Autowired
    private MyService myService;
}

해결 방법 2: 스프링 컨텍스트에서 객체 얻기

만약 외부 라이브러리나 외부 코드에서 객체를 가져와야 한다면, 스프링 컨텍스트에서 명시적으로 객체를 얻어와야 합니다. ApplicationContext를 사용하면 가능합니다.

1
MyClass myClass = context.getBean(MyClass.class);

해결 방법 3: @PostConstruct 사용

객체가 생성된 후 초기화 작업을 수행해야 하는 경우 @PostConstruct 애노테이션을 사용할 수 있습니다. 이 애노테이션은 객체 생성 후에 실행되므로 null 문제를 해결할 수 있습니다.

1
2
3
4
@PostConstruct
public void init() {
    myService.doSomething();
}

정리

Spring에서 @Autowired 필드가 null인 경우 주로 객체가 Spring 컨테이너 밖에서 생성되어서 그렇습니다. 이 문제를 해결하기 위해 해당 클래스에 애노테이션을 추가하거나, 스프링 컨텍스트에서 객체를 명시적으로 가져오거나, @PostConstruct를 사용할 수 있습니다. 이러한 방법들로 대부분의 문제를 해결할 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.