Back End/Spring Data JPA
-
[Spring JPA] 트랜잭션 로깅하기, 테스트 실행환경 분리하기 (yml, properties)Back End/Spring Data JPA 2021. 12. 24. 21:01
JPA 학습에 있어서는 로그를 보는게 짱이다. 단, Log4j 에 대한 보안이슈가 있었으니 조심해서 사용하자 # 트랜잭션 로깅옵션 //[Properties] logging.level.ROOT=INFO logging.level.org.springframework.orm.jpa=DEBUG logging.level.org.springframework.transaction=DEBUG //[YML] logging: level: org.springframework.orm.jpa: DEBUG org.springframework.transaction: DEBUG # 테스트 환경 분리하기 (yml) // [YML] spring: config.activate.on-profile: default --- spring: con..
-
[Spring JPA] JPA에서 Lazy loading 은 도대체 어떻게 이루어지는 걸까?Back End/Spring Data JPA 2021. 12. 24. 20:51
이 글은 독자가 Lazy Loading이 무엇인지 대해 알고 있다고 가정하고 쓰여졌습니다. 가끔 분명 트랜잭션이 닫혔는데, lazy loading이 되는 당황스러운 일이 발생한다. 여태 이유를 몰랐는데 알게되어 포스팅하고자 한다. [알아두어야 할 사실] 1. getter 로 연관관계를 맺은 엔티티를 호출할때 쿼리문을 실행하여 불러온다. 2. 엔티티가 detach 되면 해당 엔티티는 lazy loading 을 할 수 없다. (= 트랜잭션이 끝나면 lazy loading 을 할 수 없다.) (이 방식이 효율적이고 권장되는 방식이기에 일반적으로 알려진 사실이지만, 사실과 다르다) [들어가기 전에] # 개념정리 [준영속 상태] - 영속상태의 엔티티가 detach 된 상태 (로딩 되지 않은 연관관계는 proxy ..
-
[Spring JPA] Spring Test 에서 Auditing 이 안될때 (@DataJpaTest)Back End/Spring Data JPA 2021. 12. 24. 19:19
[원인] @DataJpaTest 는 JpaTest에 필요한 최소한의 빈을 불러오는데, 거기에는 @Configuration 빈이 포함되어있지 않다. 따라서 @Configuration을 사용하여 따로 JpaConfig 파일을 만들었을 경우, 적용되지 않아 해당 문제가 발생한다. [해결방법] 1. @Import 로 해결 @DataJpaTest 가 붙은 곳에, 추가적으로 @Import(작성한 Config클래스명.class ) 를 추가 해준다. 2. @SpringBootApplication 이 붙은 곳에 @JpaAuditing 을 달아준다. 추천하지 않는 방법이다. Jpa에 관련된 Config, 보안에 관련된 Config 등 Config 들을 따로 각각 분리시키는 이유는 단위테스트에서 필요한 Context만 불러..
-
[Spring JPA] 왜 테스트코드와 실제 어플리케이션코드가 실행이 다르게 될까?Back End/Spring Data JPA 2021. 12. 24. 17:39
실제 API 호출코드는 아무 문제 없이 잘돌아가는데 똑같이 실행될거라 여겨진 테스트코드가 오류를 내뱉거나 쿼리가 예상과는 다르게 작동하는 것을 경험하신분들이라면 잘 찾아 오셨다 🥳🥳🥳 원인은 JUnit 과 Spring Test 에 대한 이해도 부족일 것이다. 모든 테스트 케이스를 다룰 수 없으니 하나만 예시를 들어보겠다. 따라서 해당 현상을 경험하신분이라면 JUnit + Spring Test 에 대해 공부하시는게 좋다. ( 테스트 환경을 실제환경과 동일한 구성을 하기 위해서는 노력이 많이 필요하다. ) 테스트환경 구축방법을 제대로 알지 못한채 테스트 코드를 설계하는 것은 지옥으로 가는 지름길이라는 것을 알아두자. (JPA 도 그렇다) ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 일단 여기까지 오신분들은 영속성이..
-
[Spring JPA] JPA의 사실과 오해 (feat. NHN Cloud)Back End/Spring Data JPA 2021. 12. 23. 14:34
JPA 를 쓰면 쓸수록, 너무 불편한게 많다. 검색으로 원하는 고급정보를 찾기도 어렵다. (정보가 다들 카더라 통신을 통해 대량으로 재생산 되고 있어 깊이가 없을 뿐더러 정확한 검색을 막고 있다.) (깊이 있는 정보는 어딘가에 묻혀있겠지 😢) 그리하여 알짜정보를 찾기 위해 검색의 무한루프에 빠져있던 중 카더라 통신에서 잘 보지 못한 새로운 정보를 알게되어 정리해두고자 한다. (중복된 정보 또한 다시 복습할 겸 정리한다.) * 해당 정보는 NHN Cloud 유튜브채널에서 획득하였습니다. (모든 저작권은 NHN에 있습니다.) 해당 포스팅과는 관련이 없지만 NHN에 관한 포스팅이 너무 재밌어서 공유해봅니다. 헤헿.. 형님과 아우의 대결, NHN VS 네이버!!! | 캐치 뉴스로 확인하는 생생한 취업트렌드 ww..
-
[Spring JPA] Setter를 사용하지 않는다.Back End/Spring Data JPA 2021. 11. 30. 22:18
# Setter 사용을 지양하는 이유 의도가 무엇인지 파악이 어렵다. (생성인지, 업데이트인지) 객체의 일관성을 유지하기 어렵다. (특정 메서드가 아닌 모든영역에서 접근이 가능하다) # Lombok.config 에서 특정 Annotation 제한하기 lombok.setter.flagUsage=error // @Setter 사용시 컴파일에러 lombok.data.flagUsage=error // @Data 사용시 컴파일에러 # 예시 코드 1. DTO package com.bookmarkmanager.bookmarkmanager.dto; import com.bookmarkmanager.bookmarkmanager.db.entity.User; import lombok.AccessLevel; import lom..
-
[Spring JPA] FetchType 이란? (EAGER, LAZY Fetch)Back End/Spring Data JPA 2021. 11. 2. 20:55
# FetchType 연관관계 어노테이션에 설정한다. # FetchType.EAGER 해당 연관관계 필드를 가진 엔티티가 조회될 때, 그 필드도 같이 조회 하여 영속성 컨텍스트에 추가한다. (query 가 추가됨) 예시로는 밑의 코드의 User 를 select 할 때, ShppingList 도 같이 조인되어 select 된다. @Entity @NoArgsConstructor @Data @ToString(callSuper =true) @EqualsAndHashCode(callSuper = true) public class User { @OneToMany(fetch=FetchType.EAGER) List shoppinglists; } # FetchType.LAZY 해당 연관관계 필드를 가진 엔티티가 조회 되..
-
[Spring JPA] Dirty Check 는 무엇이고, 그로 인한 성능적인 손해는 무엇일까?Back End/Spring Data JPA 2021. 11. 2. 20:10
# DirtyCheck JPA 영속성 관리자가 Session(트랜잭션) 이 종료되는 시점에 영속성과 DB 의 불일치를 자동으로 일치화 시켜주기 위해 checking 하는 것 대용량데이터를 읽고, 가지고 놀다가 DB에 반영안해야지 😏 하고 있다가 큰 코 다침... 그냥 읽기만하고 세션을 종료해도 dirtycheck를 하기 때문에 함수가 n번 호출되어 성능적인 손해가 발생 # 그럼 어떻게 해결하지...? @Transactional(readOnly=true) 로 지정 autoFlush의 flag가 false가 된다. (코드위치를 못찾겠음... ㅠㅠ)