본문 바로가기

개발 이론/JPA9

왜 swagger에서는 괜찮은데 테스트코드에서 LazyInitializationException이 터지는가? 코드짜다가 swagger로 테스트를 했을때는 괜찮아서 pr을 올렸느데 팀원중 한분이 이거 Lazy예외 안터지냐고 물어보셨다. 그러면서 트랜젝션 어노텡션 붙여야하지 않아요? 하셔서 엥..? 나는 swagger에서 됬는데 싶었다.그래서 일단 swagger테스트해봤는데 되었다고 말씀드렸다. 근데 내가 테스트코드를 까먹고 안한것이다..ㅎㅎ그래서 테스트코드를 짰는데 엥?? LazyInitializationException 바로 터지쥬...? 그래서 트랜젝션을 해당 서비스 코드에 붙였더니 테스트코드가 잘 통과했다.왜?? swagger에서는 잘되었는데 테스트코드에서는 예외가 터진건지,,, 급 궁금해짐,, 일단 트랜젝션 로그를 보자  일단 처음에는 LazyInitializationException자체가 트랜젝션과 관계.. 2024. 6. 7.
Delete와 Insert의 트랜잭션 문제 일중에 S3이미지를 삭제 + 데이터 삭제 후에 다시 S3이미지 넣고 데이터 삽입하는 로직이 있었다. 즉, 수정하는 로직.근데 S3이미지까지는 잘 삭제가 되는데 데이터가 삭제가 안되고 삽입만 되는 것이다... 그래서 보자마자,, 아 트랜젝션 같은데,,, 싹 냄새가,,, 그래서 집에 와서 한번 테스트해보았다. 코드 게시물과  댓글 엔티티가 존재한다. 여기서 정말 말도안되지만.... 게시글이 수정할때 댓글도 같이 수정되어 댓글이 모두 삭제후 -> 새롭게 Insert한다고 가정한다. @Entityclass Post( var content: String,) : BaseEntity() { @OneToMany(mappedBy = "post", cascade = [CascadeType.ALL]) val.. 2024. 6. 2.
JpaRepository를 상속하지 않는다. 회사 코드를 보다가 Repository 코드를 보았는데 신기했다.JpaRepository를 상속하지 않고,PagingAndSortingRepository을 구현한 인터페이스? 그리고 QuerydlsPredicateExecutor를 사용했다.보고 왜일까?? 의문이 들어 회사에서 아직 업무가 없을때라서 한번 찾아보았다. 불필요한 메서드들 JpaRepository를 사용하여 자동완성?? 기능같은걸 사용하다보면정말 다양한 메서드를 자동으로 제공한다.즉 사용하지 않는 메서드들이 너무 많다. 내가 프로젝트했을 경우도 위 이미지에서 사용하지 않은게 아마 2/3?? 일때도 있다. 이외에도 테스트할때도 fake 객체를 만들어서 한다고 한들 repository 인터페이스의 메서드들을 모두 오버라이딩해야한다.즉 불필요한 부.. 2024. 5. 12.
영속성 컨텍스트와 트랜젝션 이 부분이 계속 헷갈려서 약 1주간 방황하다..역시 jpa 김영한님의 책을 보고 어느정도 정리되었다. Entity Manager 엔티티 매니저는 엔티티를 저장, 수정, 삭제, 조회하는 등 엔티티와 관련딘 모든 일을 처리한다. 즉 가상의 데이터 베이스라고 생각하면 된다. 다만 엔티티 매니저는 여러 스레드가 동시에 접그하면 동시성 문제가 발생하므로 스레드간의 절대 공유해서는 안된다. 궁금증 ) 엔티티 매니저의 경우 가상의 데이터베이스라고 했는데 그럼 실제 데이터베이스의 연결을 지속하는가?? 아니다. 필요한 시점에서 커넥션을 얻는다. 즉 보통 트랜젝션을 시작할때 커넥션을 획득한다 영속성 컨텍스트 엔티티를 영구 저장하는 환경이다. 엔티티 매니저를 생성할때 하나의 영속성 컨텍스트가 만들어진다. 엔티티 매니저가 자.. 2023. 12. 29.
[JPA]@Formula 이게 무엇이고..? 다른분의 코드를 보다가 @Formula라는 어노테이션을 보았다. 그분 코드를 보니 약간 좋아요수를 불러오는 것같던데 근데 엥?? 엔티티에 @Formula가 있길래 이게 뭐야...? 라는 느낌에 찾아보았다 @Formula 하이버네이트 사이트에 들어가서 보면 이렇게 적혀져 있다 @Formula allows mapping any database computed value as a virtual read-only column. The @Formula annotation takes a native SQL clause which may affect database portability. @Formula is a Hibernate-specific mapping construct and not covered by Ja.. 2023. 11. 12.
[JPA] 프록시에 대하여 JPA에 대해 공부하다보면 프록시라는 단어를 알게된다. 이전의 나는 그냥 가짜 객체다 정도까지만 알고 있었다. 이번에는 조금더 자세히 알아보기로 한다 JPA를 공부하면 연관관계 로딩 방식중 지연로딩이라는 것을 알게된다. 연관된 엔티티를 실제로 사용하기 전까지 조회하지 않는 것이 지연로딩이다. 이렇게 지연하면 즉시 로딩 방식에 비해 최초 로딩 시간이 빠르고 메모리 소모가 적다. 그런데 어째든 해당 연관 필드에 null이 들어가는 건 좀 그러니 뭘 채워야하는데 그게 바로 가짜 엔티티 프록시 객체이다. 프록시 객체는 엔티티 객체의 상속이다 프록시 객체가 엔티티 객체를 대체하지만 초기화후에는 엔티티처럼 작동해야한다. 때문에 엔티티 객체를 상속해서 만들어진다. 이때문에 JPA에서 엔티티 객체의 기본 생성자 접근제.. 2023. 11. 12.
728x90