• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@PostConstruct와 영속성 컨텍스트

23.07.20 22:21 작성 조회수 319

0

안녕하세요 @PostConstruct를 배우고 활용해보던 중 궁금증이 생겨 질문을 작성합니다.

레포지토리는 JPARepository를 상속 받은 상태입니다! 테스트 데이터를 미리 집어 넣기위해 PostConstruct를 사용하였는데요. 궁금증에 더티체킹이 이루어지는지 알아보고 싶어 기존에 저장되어있던 test라는 user데이터를 가져와 이름을 바꾸어보았는데 select 쿼리만 나가고 update쿼리가 나오지 않았습니다. 영속성 컨텍스트에서 관리가 안되고있는 것 같은데 정확한 이유가 궁금합니다

@PostConstruct
@Transactional
public void test() {

    User test = userRepository.findByLoginId("test");
    test.setName("changeName");
}

 

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.07.21

안녕하세요. taehee1129님, 공식 서포터즈 y2gcoder입니다.

다음 링크(클릭)을 참고해보시기 바랍니다 :)

감사합니다.

te___ho님의 프로필

te___ho

질문자

2023.07.21

스프링 전체가 초기화 되어있지 않아서 빈의 AOP가 보장되지 않아서 그런 점 링크를 통해 이해했습니다. 질문 하나가 더 있는데 그렇다면 save는 왜 실행이 되는건지 궁금합니다! 데이터를 db에 저장하는 것은 가능해서 testdata를 @PostConstruct를 사용하여 강의에서도 넣었는데 save는 왜 insert 쿼리가 나가는 것인지 궁금합니다!

y2gcoder님의 프로필

y2gcoder

2023.07.21

save()가 되는 이유는 findByLoginId()를 통해 select 가 나가는 이유와 같습니다. JpaRepository를 상속받아 만든 EntityRepository 인터페이스는 애플리케이션 구동 시 EntityRepository의 구현체를 만듭니다. 그리고 해당 구현체의 각 메서드들에는 @Transactional을 자동으로 붙여주고 있습니다. 즉 repository의 각 메서드들은 트랜잭션 내에서 동작합니다. (해당 구현체의 느낌이 궁금하시면 SimpleJpaRepository 구현체를 한 번 살펴보시기 바랍니다. ) 그래서 save()와 findByLoginId() 모두 트랜잭션이 적용되어있기 때문에 작동합니다.

JPA의 더티체킹도 트랜잭션 + 영속성 컨텍스트 범위 내에서 동작합니다. 그런데 이해하신 것과 같이 @PostConstruct가 붙은 메서드에는 @Transactional을 붙여줘도 트랜잭션이 잘 걸리지 않습니다. 그래서 findByLoginId()만 작동하고, 더티체킹은 작동하지 않은 것입니다.

te___ho님의 프로필

te___ho

질문자

2023.07.21

postconstrcut가 붙은 메서드 안에서는 transaction 어노테이션 자체가 동작이 안된다생각해서 save도 안될것이라고 생각했습니다. jparepository에 구현되어있는 메서드에 달려있는 트랜잭션은 제대로 동작을 하는 것이군요 감사합니다!

y2gcoder님의 프로필

y2gcoder

2023.07.21

파이팅입니다!