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

승윤님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

OSIV와 성능 최적화

OSIV false 일때 영속성 관련해서 질문드립니다.

작성

·

341

0

안녕하세요 김영한 강사님,
 
OSIV를 false로 하면 트랜잭션 라이프사이클이랑 영속성 라이프 사이클이이 같이 끝맺음을 가지는거로 이해했습니다.
 
그렇다면 트랜잭션 안에서 엔티티를 save메소드로 저장 한다면 트랜잭션이 끝나고난뒤에 DB에 저장하기위해 인서트문이 날라가는게 아닌가요?
 
트랜잭션 메소드를 끝낸뒤 로그로 엔티티는 찍히는데 디비에는 저장이안되어있어서
 
findBy등으로 찾아오지못해 제가 정확히 이해를 못하는것인지, 아니면 잘못 사용하고있는것인지 궁금합니다.
 
트랜잭션안에서 save를 한뒤 정상적으로 끝난뒤에도 디비에는 존재하지 않는 이유는 무엇인가요?
 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. seungyun9393님

트랜잭션이 정상 적용되지 않는 것 같아요.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

승윤님의 프로필 이미지
승윤
질문자

선생님 해결했습니다. JPA에서 트랜잭션이 정상작동하지않던 원인이 제가 임의로 아래의 빈을 등록해서 그랬던거같습니다.

주석을하면 정상적으로 트랜잭션이 작동을 하는데, 그러면 영속성을 관리할때 JPA가 아래부분을 따로 참조하는게 있을까요?

@Bean(name = "sqlSession") 
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionTemplate) throws Exception 
{ return new SqlSessionTemplate(sqlSessionTemplate); } 

@Bean public DataSourceTransactionManager transactionManager()
{ DataSourceTransactionManager manager = new DataSourceTransactionManager(datasource()); return manager; }
김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. seungyun9393님

트랜잭션 관리자를 직접 등록하게 되면 JPA에서 트랜잭션 사용에 필요한 JpaTransactionManager가 자동으로 등록되지 않습니다.

감사합니다.

0

승윤님의 프로필 이미지
승윤
질문자

로그로 쿼리를 찍어봐도 save 호출하는 메소드는 select 밖에 안날라가고있더라구요.. 

뭐를 놓치고있는건가요?

 

import org.springframework.transaction.annotation.Transactional;
 
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class service {
...
 
@Transactional
    public Entity insert(String id) {
      DTO dto = new DTO();
      dto.setId(id);
      Entity entity = repository.save(Entity.create(dto));
 
log.debug("entity {}", entity); //여기서는 엔티티가 정상적으로 찍힙니다.
    return entity;
// 그렇다면 return이 되고난뒤에 트랜잭션이 종료되니 insert문이 나가야하는거 아닌가요?..
  }
 
}

save말고 saveAndFlush를 사용하면.. no transaction is in progress 라고 오류가나오는데.. 왜.. @Transactional 안 메소드에서 이런에러가 생기는지..

승윤님의 프로필 이미지

작성한 질문수

질문하기