백엔드 관련

@PostConstruct 의존성 주입 완료 후 초기화 작업!!

jju_developer 2024. 6. 13. 21:37
728x90

안녕하세요~ jju_developer입니다.

 

오늘도 퇴근후 돌아왔습니다!

하루 하루 오늘도 열심히 살아봅시다

이번에는 스프링 부트 @PostConstruct 에 대해서 기록을 해보고자 합니다.

 

이번에 스프링 부트로 프로젝트를 하면서 @PostConstruct 를 써봤습니다.


자바로 구현하는 Spring에서 @PostConstruct 애노테이션은

InitializingBean 인터페이스의 afterPropertiesSet 메서드와 유사한 역할을 한다고 합니다.

 

우리가 기본적으로 클래스를 생성하고

해당 클래스에서 어떤 동작을 실행하도록 만들었습니다.

 

예를들면,

public class JJUConverter {


    private List<String> aaa ;
    private Map<Double, Double> aaaMap;

    public aaaConverter(){
        initMappings();
    }

    void initMappings() {
        initNormalMapping();
    }

    void initNormalMapping() {

 

그런데 이거를 이제 @RestController 컨트롤러에서 사용을 하고자 할때에는

 

우선 첫번째,

 

사용하고자 하는 메서드가 있는 클래스를 빈으로 등록을 해줘야합니다.

 

@Component 필수!!

@Component
public class JJUConverter {


    private List<String> aaa ;
    private Map<Double, Double> aaaMap;

    public aaaConverter(){
        initMappings();
    }

    void initMappings() {
        initNormalMapping();
    }

    void initNormalMapping() {

 

이렇게 컴포넌트로 쓸거다를 지정을 해줍니다.

 

그러면 이제 컨트롤러에서 JJUConverter를 

사용한다고 @Autowired 해준다음에

생성자를 만들어서 활용할 수 있죠!!

 

아래 예시를 참고해주세요~

@RestController
@RequestMapping("/sensors")
public class SensorController {


@Autowired
private JJUConverter jjuCal;

@PostConstruct
private void init() {
if(jjuCal == null) {
jjuCal  = new JJUConverter();
}
}

// 중략

@RequestMapping(value = "/{id}/temperature", method = RequestMethod.POST)
public String sensorsTemp(@PathVariable("duid") String encodeDuid, HttpServletRequest request) throws SQLException, IOException {
logger.debug(">>>>>>>>>>>>>>>>sensorsTemp Start");

init();	// 이부분이 생성자 초기화 & 생성 로직

double bodyTemp = skinCal.getCoreBodyTemperature(skinTemp);
// 체온 소수점 1자리까지 나오게 포멧 변경
String formattedString = String.format("%.1f", bodyTemp);
bodyTemp = Double.parseDouble(formattedString);

deviceInfo.setCommand("bodyTemp");
deviceInfo.setsVal(bodyTemp);
deviceInfo.setMeasureDt(timestamp);
deviceService.insertHealthData(deviceInfo);
log("연구소 오근주 : 계산된 로직의 체온값" + bodyTemp);

 

해당 코드는 최대한 중략 되어있어

로직의 JJUConverter를 어떻게 불러오고 사용할 수 있는지만 볼 수 있습니다.

 

위의 핵심 로직은!

컨트롤러에서 빈으로 등록한 JJUConverter  클래스의 것을 

사용할때에

 

@Autowired
private JJUConverter jjuCal;

@PostConstruct
private void init() {
if(jjuCal == null) {
jjuCal  = new JJUConverter();
}
}

 

일반 생성자:

객체가 생성될 때 호출되며, 아직 의존성이 주입되기 전입니다. 따라서 의존성 주입된 빈을 사용할 수 없습니다.

 

일반 생성자와는 다르게,

@PostConstruct 로 의존성 주입이 완료된 후 호출되므로,

주입된 빈을 안전하게 사용할 수 있다는 것입니다.

 

이는 특정 메서드를 빈의 초기화가 완료된 후에 호출되도록 지정합니다. 즉, 빈의 모든 의존성이 주입된 후에 실행할 초기화 작업을 정의할 수 있습니다.

 

 

[마무리 정리]
코드 호출 순서!
1. 생성자 호출
2. 의존성 주입 완료 (@Autowired || @RequiredArgsConstructor )
3. @PostConstruct


[스프링 빈 생명주기]
1. 스프링 컨테이너 생성
2. 스프링 빈 생성
3. 의존 관계 주입
4. 초기화 콜백
5. 사용
6. 소멸 콜백
7. 스프링 종료

 

감사합니다~!

728x90