Spring
-
[Spring] Spring Data Jpa 메소드 이름으로 쿼리 생성하기Spring 2021. 12. 22. 15:39
스프링 데이터 jpa는 메소드 이름을 선언해주면 이름을 분석해 jpql 쿼리를 실행시켜준다. 순수 jpa 레포지토리로 구현한 함수가 이런 형태라면 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } 스프링 데이터 jpa는 public interface MemberRepository extends JpaRepository..
-
[Spring] JPA 중복 컬럼 에러Spring 2021. 12. 9. 17:05
엔티티 설계 중 이해안되는 에러가 떴다. 대충 해석하자면 키매핑을 잘못했다는 뜻이였다. 기존의 내 설계는 이런식으로 진행했었다. 처음에 내가 @JoinColumn를 이해했을 때는 매핑할 외래키를 테이블과 엮어 이름을 설정해야 한다고 이해했어서 이런식으로 설정햇었다. 그래서 오류를 구글링 해보니 @JoinColumn에 대한 오해가 있었다라는걸 알게 됬다. @JoinColumn은 필드의 엔티티를 추적해서 그 엔티티의 PK를 매핑해주는 기능이였었다. name설정에 매핑하는 엔티티명과 변수명이 꼭 들어가야할 필요가 없는것이였다. 오히려 name은 내 엔티티에서 외래키 컬럼명을 만들어주는 개념이였다. 그래서 이렇게 이름을 따로 설정해주니 별문제 없이 돌아가는 것을 확인했다.
-
[Spring] 영속성 컨텍스트Spring 2021. 11. 29. 19:46
영속성 컨텍스트 - JPA를 이해하는데 가장 중요한 언어 - "엔티티를 영구 저장하는 환경"이라는 뜻 - EntityManager.persist(entity) 엔티티 매니저, 영속성 컨텍스트? - 영속성 컨텍스트는 논리적인 개념 - 눈에 보이지 않는다. - 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 J2EE, 스프링 프레임워크 같은 컨테이너 환경 엔티티 매니저와 영속성 컨텍스트가 N:1 엔티티의 생명주기 - 비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 영속 (managed) 영속성 컨텍스트에 관리되는 상태 - 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제 (removed) 삭제된 상태 영속성 컨텍스트의 이점 - 1차 캐시 - ..
-
[Spring] OSIV와 성능 최적화Spring 2021. 11. 25. 18:35
Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다.) OSIV ON - spring.jpa.open-in-view : true 기본값 이 기본값을 뿌리면서 애플리케이션 시작 시점에 warning 로그를 남기는 것은 이유가 있다. OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그래서 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다. 이것 자체가 큰 장점이다. 그런데 이 ..
-
[Spring] 컬렉션 조회 최적화Spring 2021. 11. 25. 14:20
컬렉션인 일대다 관계는 *대일 관계보다 최적화 방법이 조금 더 까다롭다. 이는 데이터가 뻥튀기 되기 때문인데, 때문에 좀더 디테일한 방법으로 최적화 해야한다. 1. 엔티티를 DTO로 변환 - 페이징과 한계 돌파 페이징과 한계돌파 - 컬렉션을 페치 조인하면 페이징이 불가능하다. - 컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가한다. - 일다대에서 일(1)을 기준으로 페이징을 하는 것이 목적이다. 그런데 데이터는 다(N)를 기준으로 row가 생성된다. - Order를 기준으로 페이징 하고 싶은데, 다(N)인 OrderItem을 조인하면 OrderItem이 기준이 되어버린다. - (더 디테일한 내용은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 페치 조인 한계에 있답..
-
[Spring] 쿼리 N+1 상황을 해결하는 방법Spring 2021. 11. 23. 01:59
엔티티를 DTO로 변환하여 셀렉을 하는 경우 N+1번 쿼리가 발생하는 상황이 종종온다. order엔티티에 member엔티티와 delivery엔티티가 존재할 때, order테이블을 조회하면, - order 조회 1번(order 조회 결과 수 N이 된다.) - order -> member (지연 로딩 조회 N번) - order -> delivery (지연 로딩 조회 N번) 총 2N+1번 쿼리가 발생을 한다. 이는 성능상에 큰 문제를 야기할 수 있고, 성능최적화를 해야만 한다. 이 상황을 해결하기 위한 2가지 방법이 있다. 엔티티를 DTO로 변환 - 페치 조인 최적화 Controller @GetMapping("/api/v3/simple-orders") public List ordersV3() { List or..
-
[Spring] API를 보낼 때 엔티티 리스트 통째로 보내면 안되는 이유Spring 2021. 11. 19. 16:09
@GetMapping("/api/v1/members") public List membersV1() { return memberService.findMembers(); } 다음은 엔티티를 리스트로 담아 리턴을 하는 경우다. postman으로 결과값을 보면 [ { "id": 1, "name": "new-hello", "address": null, "orders": [] }, { "id": 2, "name": "member1", "address": { "city": "서울", "street": "test", "zipcode": "" }, "orders": [] }, { "id": 3, "name": "퉁그리", "address": { "city": "부산", "street": "ㅇㄹㅇ", "zipcode": ..
-
[Spring] 변경 감지와 병합Spring 2021. 11. 14. 20:06
준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티 (ex : 디비를 통해 가져온 객체가 아닌, 임의로 만들어낸 엔티티) 준영속 엔티티를 수정하는 2가지 방법 - 변경 감지 기능 사용 - 병합 사용 변경 감지 기능 사용 @Transactional public void updateItem(Long itemId, Book param) { Item findItem = itemRepository.findOne(itemId); findItem.setName(param.getName()); findItem.setPrice(param.getPrice()); findItem.setStockQuantity(param.getStockQuantity()); } 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 ..