회사에서 공통 함수로 DB를 조회하여 시퀀스를 가져오는걸 만들려고 한다.
공통 함수의 경우 static 으로 선언하여 로직내에서 따로 선언 없이 가져오게 하였다.
public class commUtil {
private static Dao dao;
// 시퀀스를 조회하여 String으로 리턴
public static String sSequence() {
return dao.selectSequence();
}
}
위와 같이 사용하였을때 Spring Component scan 범위를 벗어나고 static 으로 선언함으로서 객체로 인정 받지 못해 실제로 실행하였을때 Nullpointerexception 으로 해당 메소드를 가져오지 못하게 된다.
이를 보완하고 static 으로 사용할수 있게 아래와 같이 사용하였다.
@Component
public class commUtil {
private static Dao staticDao;
@Autowired
private Dao dao;
@PostConstruct
private void init () {
staticDao = this.dao;
}
// 시퀀스를 조회하여 String으로 리턴
public static String sSequence() {
return staticDao.selectSequence();
}
}
@PostConstruct의 사용 이유
1. 생성자가 호출되었을 때, 빈은 초기화되지 않는다.(의존성 주입이 이루어지지 않았음) 이럴 때 @PostConstruct를 사용하면 의존성 주입이 끝나고 실행됨이 보장되므로 빈의 초기화에 대해서 걱정할 필요가 없다.
2. bean 의 생애주기에서 오직 한 번만 수행된다는 것을 보장한다. (어플리케이션이 실행될 때 한번만 실행됨) 따라서 bean이 여러 번 초기화되는 걸 방지할 수 있다.
참조 https://superbono-2020.tistory.com/186
@PostConstruct 의 사용 이유
@PostConstruct란? 종속성 주입이 완료된 후 실행되어야 하는 메서드에 사용된다. 이 어노테이션은 다른 리소스에서 호출되지 않아도 수행된다. @PostConstruct의 사용 이유 1) 생성자가 호출되었을 때,
superbono-2020.tistory.com
@PostConstruct 를 사용함으로 의존성 주입이 끝난 작업에서 해당 메소드를 콜하기전에 해당 빈값을 의존성을 주입하면서 staticDao에 객체로서 DAO를 utill 상에서 사용할수 있게 하였다.
@PostConstruct
private void init () {
staticDao = this.dao;
}
'WEB > Spring' 카테고리의 다른 글
Spring Boot로 MSA 개발하기 (5) | 2024.08.30 |
---|---|
스프링 IOC컨테이너 - DI, DL (0) | 2024.03.23 |
스프링에서 Service ServiceImpl 사용하는 이유 (0) | 2024.03.23 |
스프링 전역 예외처리 (0) | 2024.03.23 |
자바)Reflection 사용한 동적 메소드 호출 (0) | 2024.03.23 |