분류 전체보기
-
[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": ..
-
[CS] REST API란?Computer Science 2021. 11. 16. 00:26
REST란? REpresentational State Transfer 의 약자이며, 다음과 같이 구성되어 있다. - 자원(Resouce) : URI - 행위(Verb) : HTTP Method - 표현(Representaions) REST의 특징 1. Uniform Interface(유니폼 인터페이스) Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말한다. 2. Stateless(무상태성) REST는 무상태성 성격을 갖는다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않는다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 된다. 때문에 서비스의 자..
-
[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()); } 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 ..
-
[Spring]test폴더에 yml파일을 따로 두면 좋은 이유Spring 2021. 11. 10. 19:38
초기 프로젝트 설정은 test폴더에 resource폴더와 yml파일이 없다. 그래서 resource폴더와 yml파일을 복사해서 만들어줘야하는데, 이렇게 귀찮은 일을 하는데에는 이유가 있다. yml파일을 복사한 후 #spring: # datasource: # url: jdbc:h2:tcp://localhost/~/jpashop # username: sa # password: # driver-class-name: org.h2.Driver # # jpa: # hibernate: # ddl-auto: create # properties: # hibernate: ## show_sql : true # format_sql: true logging: level: org.hibernate.SQL: debug org.hi..