Joy's Devlog

Joy's Devlog

  • 분류 전체보기 (112)
    • 전공 (33)
      • 네트워크 (14)
      • 운영체제 (12)
      • 컴파일러 (7)
      • 인공지능 (0)
      • 데이터마이닝 (0)
    • BOOKS (44)
      • SQL 전문가 가이드 (30)
      • 이펙티브 자바 (6)
      • Real MySQL 8.0 (8)
    • LECTURES (34)
      • 스프링 핵심 원리 기본편 (9)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 (8)
      • 실전! 스프링 부트와 JPA 활용 (11)
      • 실전! 스프링 데이터 JPA (6)
    • EXPERIENCES (1)
      • ChatGPT 질문 답변 (1)
      • 우리FISA (0)
  • 홈
  • 공지사항
  • 태그
  • 아카이브
  • 방명록
  • GITHUB
RSS 피드
로그인
로그아웃 글쓰기 관리

Joy's Devlog

컨텐츠 검색

태그

Spring 운영체제 DB 버퍼 캐시 RealMySQL gap lock 정적 유틸리티 클래스 컴파일러 익스텐트 맵 sqld 동반 클래스 네트워크 쿼리 수행 과정 Effective Java HTTP 스토어드 프로그램 Java JPA 데이터통신 더티페이지 MySQL

최근글

공지사항

아카이브

JPA(17)

  • 나머지 기능들

    Specifications(명세) JPA Criteria 복잡 QueryDSL 사용하자 Query By Example 장점 동적 쿼리를 편리하게 처리 도메인 객체를 그대로 사용 데이터 저장소를 RDB에서 NoSQL로 변경해도 코드 변경이 없게 추상화되어 있음 스프링 데이터 JPA JpaRepository 인터페이스에 이미 포함 단점 조인은 가능하지만 내부 조인만 가능 외부 조인은 안됨 중첩 제약조건 안됨 매칭 조건이 매우 단순 QueryDSL Projections

    2023.09.29
  • 스프링 데이터 JPA 분석

    스프링 데이터 JPA 구현체 분석 SimpleJpaRepository 에 @Transactional이 걸려 있음 → 스프링 데이터 JPA를 사용하면 트랜잭션이 없어도 데이터 등록, 변경이 가능 @Transactional(readOnly = true) 를 사용하면 flush를 생략해서 약간의 성능 향상 가능 save()는 새로운 엔티티면 persist 아니면 merge 새로운 엔티티를 구별하는 방법 기본 전략 식별자가 객체일 때 null로 판단 식별자가 자바 기본 타입일 때 0으로 판단 Persistable 인터페이스를 구현해서 판단 로직 변경 가능 @GenerateValue를 사용하지 않고 id를 직접 할당할 경우 이미 식별자 값이 있는 상태로 save()를 호출함 → merge()가 호출됨 merge(..

    2023.09.29
  • 확장 기능

    사용자 정의 리포지토리 구현 스프링 데이터 JPA가 생성하는 메서드를 사용하지 않고 직접 구현하고 싶다면 JPA 직접 사용 스프링 JDBC Template MyBatis 데이터 커넥션 Querydsl 사용자 정의 인터페이스를 만들고 그 인터페이스의 구현 클래스를 만든 후 respository에 사용자 정의 인터페이스를 상속시킴 사용자 정의 구현 클래스는 리포지토리 인터페이스 이름 + Impl 으로 만들어야 함 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록해줌 다른 이름으로 변경하고 싶으면 @EnableJpaRepositories(basePackages = "study.datajpa.repository", repositoryImplementationPostfix = "Impl") 실무에서는 주로 Qu..

    2023.09.29
  • 쿼리 메소드 기능

    메소드 이름으로 쿼리 생성 Spring Data JPA - Reference Documentation Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del docs.spring.io 조회(SELECT) : find…By, query…By, get…By 개수 조회(COUNT) : count…By → long..

    2023.09.29
  • 공통 인터페이스 기능

    공통 인터페이스 설정 javaConfig 설정 @Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {} 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식) 만약 위치가 달라지면 @EnableJpaRepositories 필요 스프링 데이터 JPA가 구현 클래스 대신 생성 org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상 @Repository 애노테이션 생략 가능 공통 인터페이스 분석 공통 인터페이스 구성 주요 메서드 save(S) : 새로운 엔티티는 저장..

    2023.09.29
  • 프로젝트 환경 설정 / 예제 도메인 모델

    프로젝트 환경 설정 build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter..

    2023.09.29
  • 실무 필수 최적화

    OSIV와 성능 최적화 Open Session in View : 하이버네이트 Open EntityManager In View : JPA 관례상 OSIV라함 OSIV ON spring.jpa.open-in-view : true -> 기본값 애플리케이션 시작 시점에 warn 로그 남김 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지 OSIV 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있음 ..

    2023.09.29
  • 컬렉션 조회 최적화

    주문 조회 V1 : 엔티티 직접 노출 https://github.com/dpdms529/JpaShop/commit/3971dc6b9dc468984b367f0e171eba544a1f778f 주문 조회 V2 : 엔티티를 DTO로 변환 https://github.com/dpdms529/JpaShop/commit/105d4ee3a72114529e7eb4e048f9e746e5d335c8 지연 로딩으로 너무 많은 SQL 실행 주문 조회 V3 : 엔티티를 DTO로 변환 - 페치 조인 최적화 https://github.com/dpdms529/JpaShop/commit/203db80c6a987b83bcfc739a19dc0a0dddda80b1 fetch join으로 SQL이 1번만 실행됨 일대다 조인으로 다를 기준으로 r..

    2023.09.29
  • 지연 로딩과 조회 성능 최적화

    간단한 주문 조회 V1 : 엔티티를 직접 노출 https://github.com/dpdms529/JpaShop/commit/dd799b8549ce171d4103b883109271c2f0c286cd 양방향 연관 관계로 설정한 클래스 한 쪽을 @JsonIgnore로 가져오지 않도록 한다. 설정하지 않으면 서로 호출하기 때문에 무한 루프에 빠져 오류 발생 지연 로딩 설정을 한 경우 하이버네이트가 실제 객체 대신에 ByteBuddyInterceptor를 사용하여 프록시 객체를 넣어둠 Jackson 라이브러리가 json 결과를 만드는데 초기화되지 않은 프록시 객체가 들어있으면 오류 발생 Hibernate5JakartaModule 등록 기본적으로 초기화 된 프록시 객체만 노출하고, 초기화되지 않은 프록시 객체는 n..

    2023.09.29
  • API 개발 기본 / 고급 준비

    회원 등록 API https://github.com/dpdms529/JpaShop/commit/dfc282fdb5e15dd7154eeffb12b220fcec01e36a V1 엔티티를 RequestBody에 직접 매핑 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가됨 엔티티에 API 검증을 위한 로직이 들어감 실무에서는 한 엔티티에 대한 API가 다양하게 만들어지는데, 각각의 API를 위한 모든 요청 요구사항을 한 엔티티에 담기 어려움 엔티티가 변경되면 API 스펙이 변함 V2 엔티티 대신에 DTO를 RequestBody에 매핑 엔티티와 프레젠테이션 계층을 위한 로직을 분리 가능 엔티티와 API 스펙을 명확하게 분리 가능 엔티티가 변해도 API 스펙이 변하지 않음 회원 수정 API https://gi..

    2023.09.29
  • 웹 계층 개발

    홈 화면과 레이아웃 홈 컨트롤러 등록 https://github.com/dpdms529/JpaShop/commit/2985a45fd6b7719d8416f7ca39468668edd59e84 타임리프 템플릿 등록 https://github.com/dpdms529/JpaShop/commit/e01ed9675cab4c6a09084d73c06cd5eb0054071c view 리소스 등록 https://github.com/dpdms529/JpaShop/commit/e5271eb4cdc915607e02bc485249a73ad699a7aa 회원 등록 https://github.com/dpdms529/JpaShop/commit/c596319f7b0cdcccdec9982ccc78e3b77490d699 회원 목록 조회 ht..

    2023.09.29
  • 주문 도메인 개발

    주문, 주문상품 엔티티 개발 https://github.com/dpdms529/JpaShop/commit/57cc7ffe1ee4745241d91a67cf4b1c2c36e3e561 주문 리포지토리 개발 https://github.com/dpdms529/JpaShop/commit/2d572de97e15b3427e6c0e2002b897938bf7ab8c 주문 서비스 개발 https://github.com/dpdms529/JpaShop/commit/3b84471c7c6c9aa83aeab480cc4ebd66c04b9e39 주문 기능 테스트 https://github.com/dpdms529/JpaShop/commit/81a8eabd836176c1df669823df0be69dbd5aef61 주문 검색 기능 개발 검색..

    2023.09.29
이전
1 2
다음
GITHUB
© 2018 TISTORY. All rights reserved.

티스토리툴바