스프링 빈 주입시 생기는 문제들 -면접 예상 질문

반응형
SMALL

이렇게 대답하세요!

 

1. 순환 참조(Circular Dependency) 

 

더보기

빈 A가 빈 B를 주입받고, 다시 빈 B가 빈 A를 주입받는 상황이 생기면 순환 참조 문제가 발생할 수 있습니다. 이 경우 서로가 서로를 기다리게 되면서 빈이 생성되지 않고, 결국 애플리케이션 구동이 실패하게 되죠.

해결 방법으로는 먼저 의존성 구조를 재설계해서 순환 참조가 발생하지 않도록 하는 게 가장 좋고요. 필요한 경우 @Lazy를 사용해 빈 주입을 지연시켜 문제를 해결할 수도 있습니다.


2. 빈 중복 등록 및 선택 문제

 

더보기

같은 타입의 빈이 여러 개 등록되어 있을 때, 어떤 빈을 주입해야 할지 모호해지는 상황이 생깁니다. 이로 인해 주입된 빈이 의도와 다를 수 있고, 애플리케이션 실행 중 오류가 발생할 수도 있어요.

이 문제는 @Qualifier를 사용해 특정 빈을 지정해 주입하거나, 기본 빈을 설정하고 싶을 때는 @Primary를 설정해서 해결할 수 있습니다.


3. 빈 초기화 순서 문제

더보기

어떤 빈이 다른 빈에 의존하는데, 의존하는 빈이 먼저 초기화되지 않아서 NullPointerException 같은 오류가 발생할 때가 있습니다. 초기화 순서가 맞지 않으면 필요한 빈이 주입되기 전에 사용되면서 문제가 발생하죠.

이럴 때는 @DependsOn을 설정해 빈 간의 초기화 순서를 맞추거나, 주입을 꼭 늦춰도 되는 경우에는 @Lazy를 통해 지연 초기화를 할 수 있습니다.


4. 프로토타입 빈 주입 문제

더보기

싱글톤 빈에 프로토타입 빈을 주입할 때 자주 발생하는 문제입니다. 프로토타입 빈은 원래 매번 새로운 객체를 생성해 주입해야 하는데, 싱글톤 빈에 주입되면 처음 한 번만 생성되고 이후에는 계속 같은 인스턴스를 쓰게 되는 경우가 있어요.

이 문제는 ObjectProvider나 @Lookup을 통해 매번 새 인스턴스를 가져오도록 하여 해결할 수 있습니다.


5. 지연 로딩(Lazy Loading) 관련 문제

 

더보기

필드나 메서드를 지연 로딩(Lazy Loading)으로 설정했는데, 트랜잭션 범위를 벗어나게 되면 빈이 초기화되지 않고 LazyInitializationException이 발생하는 경우가 있습니다.

이를 해결하려면 트랜잭션 범위를 설정해 필요한 시점에 객체가 초기화되도록 하거나, 꼭 필요하지 않다면 지연 로딩 대신 즉시 로딩(Eager Loading)으로 설정하는 것도 방법입니다.


6. NullPointerException 발생 가능성

더보기

주입하려는 빈이 스프링 컨텍스트에 존재하지 않거나 잘못된 설정으로 초기화되지 않은 경우, NullPointerException이 발생할 수 있습니다.

해결 방법으로는 주입 대상 빈이 실제로 등록되어 있는지 확인하고, 선택적으로 주입할 필요가 있다면 @Autowired(required = false)나 Optional을 통해 NullPointerException을 방지할 수 있습니다.


7. 프록시 객체로 인한 문제

더보기

AOP나 지연 로딩 기능을 사용할 때 Spring은 프록시 객체를 사용하는데요. 이 프록시 객체는 원본 객체와는 조금 다른 방식으로 작동합니다. 따라서 타입 비교 시 예상과 다른 결과가 나올 수 있습니다.

이런 문제가 발생할 때는 AOP 설정을 점검해 불필요한 프록시 생성을 피하고, 프록시 객체와 호환되도록 설정을 조정할 수 있습니다.

반응형
LIST