본문 바로가기

JPA12

(JPA) JPA @Id GenerationType.AUTO, IDENTITY 차이 JPA @Id @GeneratedValue(strategy = GenerationType.AUTO) @GeneratedValue(strategy = GenerationType.IDENTITY) 차이 테스트용 Entity @Data @Entity @Table(name = "ex_entity") public class ExEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) // or GenerationType.IDENTITY private Integer id; @Column(name = "name") private String name; } 테스트 코드 /** * Developer : ryan kim * Date .. 2020. 7. 25.
(Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom (하) (Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom https://lion-king.tistory.com/70 { try { service.count(token); // 테스트 될 메소드 } catch(Exception e) { e.printStackTrace(); } latch.countDown(); }); } latch.await(); AccessCount countRes = accessCountRepository .findByToken(token); assertNotNull(countRes); int resCount = countRes.getAccessCnt(); assertEquals(numberOfThreads, resCount); } 다중 쓰레드.. 2020. 7. 7.
(Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom (Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom "객체관계형 매핑 프레임워크를 사용하면 뜻하지않게 데이터베이스가 제공하는 원자적 연산을 사용하는 대신 불안전한 read-modify-write 주기를 실행하는 코드를 작성하기 쉽다." 오류 로그를 보던 중 동시에 같은 파라메터로 온 request들을 처리하다가 발생한 오류를 보았습니다. Duplicate entry for unique key 오류가 발생한 api는 특정업체 상품에 접근한 횟수를 카운트하는 기능을 하였고, 업체마다 토큰을 지정하여 해당 토큰이 파라메터로 들어오는 구조였습니다. 업무시간 외에 여러 방법으로 테스트한 기록을 작성합니다. 예시코드: @Transactional public void .. 2020. 7. 3.
(JPA) 엔티티매니져 플러시(EntityManager flush)란? 엔티티매니져 플러시(EntityManager flush) : 플러시(flush())는 영속성 컨텍스트의 변경 내용을 DB에 반영한다. 이렇게 꼭 외워두자. 구체적으로는 아래와 같이 동작한다. 1. 변경 감지 동작 : 영속성 컨텍스트에 의해 관리되는 엔티티를 스냅샷과 비교하여 수정이 일어난 엔티티에 대한 update 쿼리문을 쓰기 지연 SQL 저장소에 저장한다. 2. 쿼리 실행 : 쓰지 지연 SQL 저장소의 쿼리를 DB에 전송하여 실행한다. flush() 가 실행되는 경우는 3가지가 있다 1. entitiyManager.flush() 직접 호출 : 테스트 등의 경우를 제외하고 거의 사용하지 않음 2. 트랜잭션 커밋 시점에 자동으로 호출 : DB 변경 내용을 SQL로 전달하지 않고 (flush()를 실행하지.. 2020. 4. 20.
(JPA) 프록시, 지연로딩, 즉시로딩 (Proxy / Lazy Loading / Eager Loading) JPA 프록시 지연로딩 즉시로딩 Proxy / Lazy Loading / Eager Loading 지연로딩 (Lazy Loading) JPA 지연로딩은 프록시 객체의 메소드를 사용하는 시점에 데이터베이스에 쿼리문을 수행하여 엔티티를 조회하는 방식으로 동작한다. 지연로딩을 사용함으로써 연관관계이지만, 사용하지 않는 객체를 조회하는 쿼리문을 실행하지 않도록 하여 성능을 향상 시킬 수 있다. public class User { @GeneratedValue @Id @Column(unique = true, nullable = false) private Integer id; private String name; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LA.. 2020. 4. 17.
(Spring/JPA) Spring transaction logging / jpa entity manager logging Spring transaction logging jpa entity manager logging logging: level: org: hibernate: SQL: debug type: descriptor: sql: BasicBinder: debug springframework: transaction: DEBUG orm: jpa: DEBUG application.yml 파일에 설정 설정전 ↓ 보이는 transaction 관련 로깅은 springframework.test 에서 제공하는 로깅. 설정후 ↓ transaction 생성/ 종료/ 참여 여부 및 전파 유형, 고립레벨 로깅 EntityManger 생성 / 종료 로깅 생성되는 쿼리 로깅 2020. 3. 11.
(JPA) JPA 성능개선이란? 성능개선 적용기 (fetch join/BatchSize) JPA 성능개선 적용기 fetch join BatchSize 이전글: jpa 성능개선 목록 ↓ https://lion-king.tistory.com/entry/JPA-Performance-Improvement-list 마이페이지 개편 중 구매내역 api를 호출해보니 응답속도가 매우 느린 이슈가 있었습니다. (서비스 메소드만 테스트 하였는데도 1분이상..) 테스트 계정이어서 구매내역이 많은 탓도 있었겠지만 개선이 필요할 것 같아 실행되는 쿼리를 확인해보니 엄청난 수의 select 문이 실행되는 것을 확인할 수 있었습니다. 업무시간 외에 이것저것 테스트를 하였고 fetch join과 BatchSize를 사용해서 성능개선 되는 과정을 기록에 남깁니다. (개선 전 77초 -> 개선 후 2초) 기존 Entity .. 2020. 3. 9.
(JPA) JPA 성능개선이란? 성능개선 목록 (N+1문제/read-only/Non-Transactional..) JPA 성능개선 목록 1. N+1 문제 개선 JPA 사용시 성능상 가장 조심해야하는 것이 N+1 문제이다. N+1 문제는 연관관계 설정이 되어있는 Entity 조회시 연관된 다른 Entity를 가져오기 위해 조회한 수 만큼 다시 SQL문이 수행되는 문제를 뜻한다. 예시) : select 문이 여러번 사용되는 것이 보이시나요? 위 쿼리는 한 Entity를 조회했는데 연관된 Entity들을 가져오려고 생성되는 쿼리들 입니다. 성능이 많이 느렸습니다 - 해결방법 a. (fetch = FetchType.EAGER) :FetchType을 EAGER 로 변경 (즉시 로딩 전략) : Entity 조회시점에 Mapping된 Entity를 join 문으로 함께 가져온다 b. JPQL fetch join 사용 (JPQL의.. 2020. 3. 7.
Spring JPA의 사실과 오해 - NHN FORWARD >> 1. 연관관계 매핑 entity 매핑 , 연간관계 매핑 연관관계 매핑 - 보통 데이터 베이스의 FK로 관계를 엔티티의 객체참조로 옮기는 것 2. 매핑타입 @OnetoMany ... 보통 단방향 매핑으로 처리가 가능하다 하지만 onetoMany 관계에서 영속전이를 사용하여 저장할때 update쿼리가 뒤에 더 붙게됨 2.1 양방향 - 단방향 연관관계의 주인쪽 -> @MapsId("test") 반대쪽 -> mappedby 2.2 Fetch 전략 ToOne -> 기본 EAGER ToMany -> 기본 LAZY 2.3 N+1 문제 3. Spring Data JPA Repository - spring data repsitory - spring data jpa repository : 위 에서 paging, 메소드생성.. 2019. 11. 27.