inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

306

ssshhh

작성한 질문수 36

0

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

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

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

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

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

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

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

image.png

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

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

spring mvc jpa querydsl spring-data-mybatis spring-jpa

답변 1

1

인프런 AI 인턴

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

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

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

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

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

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

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

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

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

1

ssshhh

ai짱!!

0

ssshhh

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

image.png

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

0

ssshhh

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

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

0

ssshhh

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

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

RepositoryTest의 패키지 위치가 domain인 이유

0

29

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

29

1

update()에 사용하는 setter 질문드립니다.

0

47

1

SQL 중심적 개발의 문제점에 대한 질문

0

72

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

83

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

173

1

@repository 어노테이션

0

89

3

ItemService

0

58

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

54

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

178

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

77

1

@EventListener(ApplicationReadyEvent.class) 관련

0

88

1

트랜잭션 동기화 매니저와 데이터 소스

0

76

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

94

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

112

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

83

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

72

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

102

1

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

0

98

2