WEB/JPA 20

실전! Spring Data JPA 4,5 (스프링 데이터 JPA 분석, 나머지 기능들)

@Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation 실제 구현체가 들어있는 클래스이다. @Repository 1. Component Scan 의 대상이 되어 Spring Container 에 올라감 2. JDBC, JPA Exception 이 터질때 이것들을 Spring Exception 으로 바꿔서줌 Spring data jpa 에서의 save는 @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityIn..

WEB/JPA 2021.04.14

실전! Spring Data JPA 1,2(공통 인터페이스 기능, 쿼리 메소드 기능)

public interface MemberRepository extends JpaRepository { } 이렇게 해놓으면 Spring Data JPA가 프록시 객체를 만들어서 필요한 곳에 위 인터페이스 구현체를 집어 넣어준다. @Repository 생략해도 괜찮다. 기본적으로 Spring Data가 공통적으로 제공되는 기술과 특화된 기술을 제공해주는 파트가 나뉘어져있다. 쿼리 메소드 기능 public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age); } public List findByUsernameAndAgeGreaterThan(String use..

WEB/JPA 2021.04.12

실전! 스프링부트와 JPA와 활용2 (OSIV와 성능 최적화)

spring.jpa.open-in-view = true가 default다. 트랜잭션이 끝나도 api 단에서 lazy loading 때문에 프록시를 초기화하는 경우가있기에 db connection 을 계속 가지고 있다. application에서 응답이 나갈떄까지 끝까지 살아 있다. 지연로딩이 가능했던 이유이다. 하지만 커넥션을 너무 오래 들고 있기 때문에 실시간 트래픽이 중요한 앱에서는 커넥션이 모자라 장애로 이어 질 수 있다. 영속성컨텍스트 view rendering이 끝나는 시점에 끝난다. 즉 view rending 도중에도 영속성 컨텍스트에서 도움을 받을 수 있다. OSIV Off db connection을 짧은 기간 동안 만 유지하는 것이다. 커넥션 리소스를 낭비하지 않게 될 수 있다. 모든 laz..

WEB/JPA 2021.04.06

실전! 스프링부트와 JPA와 활용2 (컬렉션 조회 최적화)

컬렉션 조회 최적화 컬렉션같은 x to many의 경우 데이터가뻥튀기 되어서 돌아온다. public List findAllWithItem() { return em.createQuery( "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class) .getResultList(); } @GetMapping("/api/v3/orders") public Result ordersV3() { List orders = orderRepository.findAllWithItem(); List re..

WEB/JPA 2021.04.06

실전! 스프링 부트와 JPA 활용2 (API 개발기본 , 지연로딩과 조회 성능 최적화)

@PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberRequest { private String name; } REST API spec에 맞는 DTO를 따로 만들어 사용해야한다. Entity를 그대로 사용하게되면 유지보수도 힘들고 a..

WEB/JPA 2021.04.03

김영한 (ORM 표준 JPA 프로그래밍 11) 객체지향 쿼리 언어 소개2 - 중급문법

경로 표현식 용어 정리 상태필드 = 단순히 값을 저장하기위한 필드 예) m.username 경로탐색의 끝, 더 이상 탐색하지않는다. 명시적 조인 = join 키워드 직접사용 select m from Member m join m.team t 묵시적 조인 = 경로 표현식에 의해 묵시적으로 SQL 조인 발생 (내부 조인만 가능) select m.team from Member m 연관 필드 = 연관관계를 위한필드 단일 값 연관 필드 @ManyToOne , @OneToOne 대상이 엔티티다 예) m.team String query = "select m.team From Member m"; List resultList = em.createQuery(query, Team.class) .getResultList(); ..

WEB/JPA 2021.03.20