구현을 하다보면 몇몇 bean에서 Spring 기동시 초기화가 되어야 하는 경우가 있는데 이에 대한 내용을 공유하고자 합니다.
- 생성자에서 초기화 메서드 호출
- @PostConstruct annotation 사용
생성자에서 초기화 메서드 호출
@Component
public class beanClass {
public beanClass() {
init();
}
private init() {
// init logic
}
}
위 예제 코드와 같이 생성자에 초기화 메서드를 호출하도록 하여 bean을 생성할 때 초기화 로직이 동작하도록 하는 방법이 있으나, 이는 DI를 이용하여 추가한 객체에 대한 로직이 init() 메서드에 포함이 되어있다면 에러가 발생하게 된다.
@Component
public class BeanClass {
@Autowired
private DiClass diClass;
public BeanClass() {
init();
}
private init() {
// init logic
diClass.setLogic(...); // DI로 입력 받는 클래스에 set으로 초기화를 하는 로직
}
}
바로 위와 같은 상황에서 에러가 발생하게 되는데, 이유는 생성되는 시점(생성자 호출 시점)에서는 아직 DI가 진행되지 않았기 때문에 해당 객체 참조시 null로 나오게 되기 때문이다.
따라서 위와 같은 상황에서는 아래와 같이 @PostConstruct annotation을 사용한 방법으로 해결할 수 있다.
@PostConstruct annotation 사용
@Component
public class BeanClass {
@Autowired
private DiClass diClass;
@PostConstruct
private init() {
// init logic
diClass.setLogic(...); // DI로 입력 받는 클래스에 set으로 초기화를 하는 로직
}
}
생성자에서 init() 메서드를 호출하는게 아니라 init() 메서드에 @PostConstruct 어노테이션을 사용하여 초기화를 하는 방법
@PostConstruct 어노테이션을 추가한 메서드는 해당 bean이 생성된 이후에 1회 호출하게 된다.
따라서 이미 해당 bean이 생성되어 초기화가 끝났기 때문에 DI도 끝난 상태이며, 그로인해 DI된 객체를 참조하여 초기화 작업을 수행하더라도 에러가 발생하지 않게된다. => 정상적으로 초기화 성공
이 2가지 방법 외에도 몇가지 방법이 더 있는 것 같지만.. 일단 직접 사용한 방법은 위 2가지 방법이므로 해당 글은 여기서 마무리 합니다.
'Develop > Java' 카테고리의 다른 글
Spring MVC 간단 정리 (0) | 2023.02.14 |
---|---|
Java - File read 2가지 방법 (0) | 2022.11.29 |
JPA Fetch Type (1) | 2022.09.09 |
Collection framwork (0) | 2022.07.26 |
제네릭(Generic)이란? (0) | 2022.07.25 |