인프런 커뮤니티 질문&답변

김상형님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 AOP 주의 사항 - 초기화 시점

@PostConstruct와 @Transactional 빈 생명주기와 함께 순서를 정리해보고 싶습니다

작성

·

154

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
비슷한 질문과 답변을 많이 봤는데 한번 정리한 것을 확인 받고 싶습니다. 너무 많이 질문 받아 번거로우시겠지만 확인해주시면 감사합니다

스프링 빈의 이벤트 라이프사이클은 다음과 같았습니다

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 사용 -> 소멸전 콜백 -> 스프링 종료

김영한님이 답변에서 정리해주신 말씀은 다음과 같습니다
@PostConstruct는 해당 빈 자체만 생성되었다고 가정하고 호출된다. 해당 빈에 관련된 AOP등을 포함한, 전체 스프링 애플리케이션 컨텍스트가 초기화 된 것을 의미하지는 않습니다. 트랜잭션을 처리하는 AOP등은 스프링의 후 처리기(post processer)가 완전히 동작을 끝내서, 스프링 애플리케이션 컨텍스트의 초기화가 완료되어야 적용된다.

이를 종합해서 일어나는 순서를 더 세분화 하면 다음과 같다고 생각합니다.

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 스프링의 후처리기 적용(트랜잭션 AOP 등 프록시 객체 생성) -> 후 처리가 완료된 후 빈 등록 -> 스프링 애플리케이션 컨텍스트의 초기화가 완료 되어 어플리케이션 실행-> 사용 -> 소멸전 콜백 -> 스프링 종료

image.png

예제 코드에서 위처럼 hello 클래스 로그를 찍어보면 프록시 객체라고 나오는 이유는 해당 메서드가 실행되는 시점이 사용 시점에 해당하기 때문이다

전체적인 내용이 맞을까요?

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

김상형님께서 질문해주신 스프링 빈의 라이프사이클과 관련된 내용 정리하신 부분에 대해 아래와 같이 답변드립니다:

  1. 스프링 빈의 라이프사이클 단계는 대부분 정확히 이해하고 계십니다. 다만, 몇 가지 정확한 명칭과 설명을 덧붙이겠습니다.

    • 스프링 컨테이너 생성
    • 스프링 빈 생성
    • 의존관계 주입
    • 초기화 콜백(@PostConstruct)
    • 빈 후처리기(Post Processor)가 동작해 프록시 객체 등 생성
    • 프록시 객체 등의 후처리 완료 후 빈 등록
    • 스프링 애플리케이션 컨텍스트 초기화 완료 및 어플리케이션 실행
    • 사용
    • 소멸 전 콜백(@PreDestroy)
    • 스프링 종료
  2. 프록시 객체 생성 시점에 대한 설명도 맞습니다.

@PostConstruct 시점에서는 프록시 객체나 트랜잭션 AOP와 같은 후처리기가 아직 동작하지 않았기 때문에, 프록시가 적용되지 않은 상태로 초기화 콜백이 실행됩니다. 이후 스프링의 후처리기가 동작하여 프록시 객체가 생성됩니다.

  1. 예제 코드에서 프록시 객체 로그가 찍히는 이유에 대한 설명도 적절합니다.

예제 코드에 대해 언급하신 부분도 맞습니다. hello 객체가 프록시 객체라고 로그가 찍히는 이유는 해당 메서드가 실제 빈을 사용할 때 프록시가 이미 적용되었기 때문입니다.

관련하여 좀 더 상세한 기존 답변과 질문들을 참고하시려면, 아래 링크들을 참조해 주세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김상형님의 프로필 이미지
김상형
질문자

ai짱!!

김상형님의 프로필 이미지
김상형
질문자

빈 후 처리기 라는 것이 궁금해서 찾아봤는데

image.png

이렇게 두가지로 나눠 지더라구요
그렇다면 aop는 postProcessAfterInitialization에 해당한다고 할 수 있겠네요?!

김상형님의 프로필 이미지
김상형
질문자

https://stackoverflow.com/questions/69214185/spring-proxy-beanpostprocessor-or-aop

이 글을 보면 aop가 BeanPostProcessor를 사용하여 프록시 객체를 만드는 것이 아닌 것 같은데 궁금합니다..ㅠ

김상형님의 프로필 이미지
김상형
질문자

공부해본 결과@Transactional을 사용하면 만들어지는 프록시 객체(CGLIB형태) 가 사용하는 것은 AnnotationAwareAspectJAutoProxyCreator 인데, AnnotationAwareAspectJAutoProxyCreator 는 결국 BeanPostProcessor의 구현체이기 때문에 aop가 BeanPostProcessor를 사용하여 프록시 객체를 사용하는 것은 옳다고 볼 수 있다고 생각되는데 맞을까요

이럴 때는 고급편을 먼저 수강했어야 했나 싶기도 하네요 ㅎㅎ;