먼저 순환 참조의 정의에 대해 알아보자.
위키 백과에서의 순환 참조 정의는 다음과 같다.
- 참조하는 대상이 서로 물려 있어서 참조할 수 없게 되는 현상
위에서 설명한 순환 참조라는 것이 스프링에서도 일어날 수 있을까?
: 물론이다. 두 개 이상의 자바 클래스가 서로의 Bean을 주입 받을 때 순환 참조 문제가 발생할 수 있다.
클래스 A -> 클래스 B, 클래스 B -> 클래스 C, 클래스 C -> 클래스 A 순으로 참조할 경우,
클래스 A에 대한 Bean을 만들 때, 클래스 A는 클래스 B를 참조하므로, 클래스 B의 Bean을 먼저 생성하고,
클래스 B는 클래스 C를 참조하기에, 클래스 C의 Bean을 먼저 생성하고, 클래스 C의 Bean을 생성하기 전에,
클래스 C는 클래스 A를 생성하므로 먼저 클래스 A의 Bean을 생성해야 되는 문제가 발생하게 된다.
이러한 현상으로 인해 스프링 애플리케이션을 구동하는 시점에 예외가 발생한다.
이런 문제를 해결할려면 어떻게 해야 할까?
1. @Lazy 어노테이션 사용
- @Lazy 어노테이션을 사용하게 되면 처음 기동시 해당 클래스의 빈 생성이 안 된다.
- 나중에 해당 클래스가 사용될 경우, 의존성 주입을 받아 사용 가능하다.
2. 필드 주입 방식 사용
public class TestController {
@Autowired
private TestService testService;
}
3. Setter 주입 방식 사용
public class TestController {
private TestService testService;
@Autowired
public void setTestService(TestService testService) {
this.testService = testService;
}
}
위와 같은 방식을 통해 에러를 해결 할 수 있지만,
가장 중요한 것은 순환 참조가 발생하지 않도록 설계를 정 방향으로 하자!
설계의 중요성을 다시 한 번 깨닫게 된 거 같다..
'Backend > Spring' 카테고리의 다른 글
스프링에서 로그 찍는 법 (0) | 2023.04.30 |
---|---|
데이터 전송 어노테이션 - @PathVariable, @ResponseBody, @RequestParam (0) | 2022.12.01 |
트랜잭션 처리 (0) | 2022.11.26 |
스프링 XML 정리 - 컨테이너(applicationContext) (0) | 2022.11.14 |
스프링 어노테이션 정리 - AOP 구현, 시점 기반 (0) | 2022.11.13 |