안녕하세요~ 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. 스프링 종료
감사합니다~!

'백엔드 관련' 카테고리의 다른 글
[java] GOOGLE OTP란? 구글 인증 서비스 도입 방법 (One-Time Password) (66) | 2024.07.16 |
---|---|
JSONObject["data"] is not a string 스프링부트 자바 오류 (2) | 2024.06.14 |
가장 간단한 텍스트 mp3 파일로 만드는 방법 (feat. 파파고) (1) | 2024.06.13 |
스프링 maven 설정 오류 (2) | 2024.06.11 |
[MyBatis] xml 오류 Invalid bound statement (not found) (0) | 2024.05.21 |