Spring-Boot
-
4. 확장 기능Spring-Boot/실전! 스프링 데이터 JPA 2023. 2. 23. 17:35
1. 사용자 정의 리포지토리 구현 - 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 - 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? ㆍJPA 직접 사용 (`EntityManager`) ㆍ스프링 JDBC Template 사용 ㆍMyBatis 사용 ㆍ데이터베이스 커넥션 직접 사용 등등.. ㆍQueryDsl 사용 public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { public interface MemberRepositoryCustom { List findMemberCust..
-
3. 쿼리 메소드 기능Spring-Boot/실전! 스프링 데이터 JPA 2023. 2. 22. 08:01
1. 메소드 이름으로 쿼리 생성 - 스프링 데이터 JPA가 제공하는 마법 같은 기능 * 쿼리 메소드 기능 3가지 * - 메소드 이름으로 쿼리 생성 - 메소드 이름으로 JPA NamedQuery 호출 - `@Query` 어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의 스프링데이터JPA public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username,int age); } - 스프링 데이터 JPA는 메소드 이름을 분석해서 JPQL을 생성하고 실행 *쿼리 메소드 필터 조건* - 스프링 데이터 JPA 공식 문서 참고 ( https://docs.spring.io/spri..
-
2. 공통 인터페이스 기능Spring-Boot/실전! 스프링 데이터 JPA 2023. 2. 17. 08:39
1. 순수 JPA 기반 리포지토리 만들기 * 참조 : JPA에서 수정은 변경감지 기능을 사용하면 된다. - 트랜잭션 안에서 엔티티를 조회한 다음에 데이터를 변경하면, 트랜잭션 종료 시점에 변경 감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다. 2. 공통 인터페이스 설정 * JavaConfig 설정 - 스프링 부트 사용시 생략 가능 * @Configuration @EnableJpaRepositories(basePakges = "jpabook.jpashop.repository") public class AppConfig {} - 스프링 부트 사용시 `@SpringBootApplication` 위치를 지정 ( 해당 패키지와 하위 패키지 인식) - 만약 위치가 달라진다면 `@Enab..
-
1. 프로젝트 환경 설정 & 2. 예제 도메인 모델과 동작 확인Spring-Boot/실전! 스프링 데이터 JPA 2023. 2. 15. 11:30
1. 프로젝트 생성 2. 라이브러리 살펴보기 * gradle 의존관계 보기 * ./gradlew dependencies --configuration compileClasspath * 스프링 부트 라이브러리 살펴보기 * - spring-boot-starter-web ㆍspring-boot-starter-tomcat : 톰캣(웹서버) ㆍspring-webmvc : 스프링 웹 MVC - spring-boot-starter-data-jpa ㆍspring-boot-starter-aop ㆍspring-boot-starter-jdbc º HikariCP 커넥션 풀 (부트 2.0 기본) ㆍhibernate + JPA : 하이버네이트 + JPA ㆍspring-data-jpa : 스프링 데이터 JPA - spring-bo..
-
5. API 개발 고급 - 실무 필수 최적화 & 6. 다음으로Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 15. 10:28
1. OSIV와 성능 최적화 - Open Session In View : 하이버네이트 - Open EntityManager In View : JPA ㆍ(관례상 OSIV라 한다) OSIV ON - spring.jpa.open-in-view : true 기본값 - 이 기본값을 뿌리면서 애플리케이션 시작 시점에 warn 로그를 남기는 것은 이유가 있다. - OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. - 그래서 지금까지 View Template 이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. - 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본저긍로 데이터베이스 커넥션을 유..
-
4. API 개발 고급 - 컬렉션 조회 최적화Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 13. 18:05
- 앞의 예제에서는 toOne(OneToOne, ManyToOne) 관계만 있었다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고, 최적화하는 방법을 알아보자. 1. 주문 조회 V1 : 엔티티 직접 노출 @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); orderItems.stream().forEach(..
-
3. API 개발 고급 - 지연 로딩과 조회 성능 최적화Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 13. 15:06
1. 간단한 주문 조회 V1 : 엔티티를 직접 노출 @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; // 무한루프 - 양방향 연관관계 발생 } 1. 무한루프 발생 ㆍ양방향 연관관계일 경우 한쪽을 @JsonIgnore을 해야한다. 2. bytebuddy.ByteBuddyInterceptor 에러 발생 ㆍLAZY 지연로딩은 디비에서 값을 가져오는게 아니라 Proxy 객체를 가져온다. @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access ..