본문 바로가기

Java/JPA

(21)
H2 Database 사용법 최초 생성 주소를 아래와 같이 생성(파일생성)jdbc:h2:~/ 최초 생성 이후 접속 시 접근 주소jdbc:h2:tcp://localhost/~/
SpringDataJPA - EntityGraph, fetch join 간단하게 하기 fetch join을 SpringDataJPA에서는 @EntityGraph 어노테이션을 통해 간단하게 할 수 있다. // 한방쿼리로 들고 오는 fetch join@Query("select m from Member m left join fetch m.team")List findMemberFetchJoin();위의 fetch join 메서드를 EntityGraph를 사용하면 아래와 같이 바꿀 수 있다. EntityGraph를 이용하면 메서드 이름으로 쿼리 생성 + 패치조인처럼 쓸 수 있음@Override@EntityGraph(attributePaths = {"team"})List findAll();jpql 대신 @EntityGraph 어노테이션을 사용한다. attributePaths에 fetch join할 ..
SpringDataJPA - 벌크성 수정 쿼리 Dirty Checking으로 여러 건 수정시 건마다 쿼리 발생함.쿼리 한 번으로 쫙 다 수정하는 건 JPA에서는 벌크성 수정쿼리라고 함벌크성 수정 쿼리를 이용하면 한 번의 쿼리로 대량의 데이터를 수정할 수 있다. @Modifying 어노테이션 사용Repository 수정 메서드에 @Modifying 을 붙여준다(안붙이면 에러 발생)// 회원의 나이를 변경하는 벌크성 쿼리// age 이상인 경우 1살 추가@Modifying //Modifying이 있어야 JPA의 executeUpdate 호출함@Query("update Member m set m.age = m.age + 1 where m.age >= :age")int bulkAgePlus(@Param("age") int age);  test 코드 예제)@..
SpringDataJPA - 페이징을 쉽게 하는 법 Page 객체Repository 인터페이스에 Page 메서드 이름(Pageable 변수이름)을 작성한다.public interface MemberRepository extends JpaRepository { // 페이징 Page findByAge(int age, Pageable pageable); SpringDataJPA로 페이징 처리를 하면 페이징 계산을 할 필요가 없다. 이미 구현되어있다,. 메서드 호출 시 Pageable 구현체(PageRequest)를 매개변수로 넣어준다.*Page 인덱스가 1이 아니라 0부터 시작함. 유의 아래는 test 코드이다.int age = 10;// SPRING DATA JPA는 page index가 1이 아니라 0부터 시작한다 (PageRequest = Pa..
SpringDataJPA - 메서드 및 유연한 반환타입 SpringDataJPA 주요 메서드save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다. delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출 findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출 getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출 findAll(…) : 모든 엔티티를 조회한다. 정렬( Sort )이나 페이징( Pageable ) 조건을 파라미터로 제공할 수 있다.참고: JpaRepository 는 대부분의 공통 메서드를 제공한다.쿼리메소드 기능쿼리 메소드 기능 3가지- 메소드 이름으로 쿼리 생성(간단한 쿼..
JPA실전 2 - OSIV와 성능 Open Session In View: 하이버네이트, Open EntityManager In View: JPA (관례상 OSIV라 한다.) spring.jpa.open-in-view : true 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트 와 데이터베이스 커넥션을 유지한다. 이를 통해 지연로딩이 가능하지만, 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 이것은 결국 장애로 이어진다 spring.jpa.open-in-view: false OSIV 종료 open-in-view: false 로 해야 커넥션풀이 마르지 않음. OSIV를 끄면 커넥션..
JPA 실전2편 - 주문조회 API 쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다. 4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 주문+배송정보+회원을 조회하는 API 양방향 연관관계가 걸린 곳은 꼭! 한 곳을 @JsonIgnore 처리해야한다. 안그러면 양쪽을 서로 호출하면서 무한루프발생. 엔티티를 API응답으로 노출하는것보다는 DTO로 변환해서 반환하는 것이 더 좋다. (실무에서는 List로 바로 반환하지말고 result객체로 한 번 더 감싸주자) 간단한 주문조회를 하는 컨트롤러 메서드..
JPA 실전2편 - 회원 관련 API 회원등록 API 요청 값으로 엔티티 대신에 DTO를 RequestBody에 매핑한다. @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 //api용 DTO, 이렇게하면 api스펙 까지 않아도 뭐가 넘어오는지 알 수 있음.절대 엔티티로 바로 사용하지 마시오 static class..