Repository files navigation 인프런 스프링 부트와 JPA 실무 완전 정복 로드맵 공부 💪
자바 ORM 표준 JPA 프로그래밍 - 기본편
Section2 JPA 시작하기
H2DB 설정, DB 방언(dialect), EntityManagerFactory, EntityManager
Section3 영속성 - 내부 동작 방식
영속성 컨텍스트 상태(영속, 준영속), 영속성 컨텍스트 기능, 1차 캐시, 스냅샷, 플러시
Section4 엔티티 매핑
Section5 연관관계 매핑 기초
@OneToMany, @ManyToOne, @JoinColumn, mappedBy, 관계의 주인, 객체 모델링과 테이블 모델링 패러다임 일치, 단방향, 양방향
Section6 다양한 연관관계 매핑
Section7 고급매핑
@Inheritance, 3가지 전략: JOINED, SINGLE_TABLE, TABLE_PER_CLASS, @DiscriminatorColumn, @DiscriminatorValue
@MappedSuperclass, 매핑 정보 상속, 베이스 엔티티
Section8 프록시와 연관관계 관리
프록시, 프록시 초기화 과정, 프록시 관련 편의 메서드, 즉시 로딩(EAGER), 지연 로딩(LAZY)
영속성 전이(CASCADE), 고아 객체(orphanRemoval = true)
Section9 값 타입
임베디드 타입: @Embeddable, @Embedded, @AttributeOverride, @AttributeOverrides
값 타입 & 불변 객체: 부작용(side effect)
값 타입의 비교: 동일성 & 동등성(equals(), hashcode())
값 타입 컬렉션: @ElementCollection, @CollectionTable, 값 타입 컬렉션의 제약사항
Section10 JPQL 기본 문법
TypeQuery, Query, 파라미터 바인딩(이름 기준, 위치 기준)
프로젝션(엔티티, 임베디드, 스칼라 타입), 여러 값 조회(Query 타입, Object[] 타입, new 명령어)
페이징 API - setFirstResult(), setMaxResults
조인, 서브 쿼리, JPQL 타입 표현
조건식 - CASE, 기본 함수, 사용자 정의 함수
Section11 JPQL 중급 문법
경로 표현식: 상태 필드, 연관 필드, 단일 값 연관 경로, 컬렉션 연관 경로
페치 조인: 페치 조인 특징 & 한계, @BatchSize(), N+1 문제, 컬렉션 패치 조인과 페이징 문제
다형성 쿼리(TYPE(), TREAT()), 엔티티 직접 사용(엔티티 식별자(pk))
네임드 쿼리: @NamedQuery, createNamedQuery()
벌크 연산: executeUpdate(), 벌크 연산 주의점(영속성 컨텍스트), Dirty Checking vs 벌크 연산
스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Section1 프로젝트 환경 설정
라이브러리 체크, View 환경 설정(타임리프), spring-boot-devtools - 서버 재시작❌ View 파일 변경
H2 데이터베이스 설치
JPA 설정 & DB 설정 - Yaml, Build.gradle
Section2 도메인 분석, 설계
요구사항 분석, 도메인 모델과 테이블 설계, 엔티티 클래스 개발
엔티티 설계시 주의점(연관관계 편의 메서드, @Setter, Cascade, 즉시로딩(EAGER), 컬렉션 필드 초기화)
Section3 애플리케이션 구현 준비
Section4 회원 도메인 개발
회원 리포지토리, 회원 서비스 개발
회원 기능 테스트
Section5 상품 도메인 개발
상품 엔티티(비즈니스 로직 추가): 재고 추가, 재고 감소
상품 (리포지토리, 서비스) 개발
Section6 주문 도메인 개발
주문, 주문 상품(엔티티, 리포지토리, 서비스) 개발
연관관계 편의 메서드 + 정적 펙토리 메서드(객체 생성 feat 생성자, @Builder)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
주문 기능 테스트
동적 쿼리(순수 JPQL, JPA 표준 스펙 - Criteria)
Section7 웹 계층 개발
타임리프 레이아웃 아키텍처 Include-style layouts vs Hierarchical-style layouts
bootstrap(JS, CSS) 적용
도메인 기능 구현
⭐️ 변경 감지 vs 병합(merge)
스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Section1 API 개발 기본
DTO 사용으로 엔티티와 프레젠테이션 계층을 분리
response : 스트림 연산 & 제네릭 활용
회원 등록, 수정, 조회 API 개발
CQS 패턴 - Command - Query - Separation
Section2 API 개발 고급 - 준비
Section3 API 개발 고급 - 지연 로딩과 조회 성능 최적화
엔티티를 직접 노출(V1): N+1 문제, 화면 계층과 엔티티 강한 결합 문제, 양방향 연관관계 무한 순환 문제(@JsonIgnore), Json 프록시 객체 변환 문제(Hibernate5JakartaModule)
엔티티를 DTO로 변환(V2): N+1 문제
엔티티를 DTO로 변환 + 패치 조인 활용(V3): N+1 문제 해결
JPA에서 DTO로 바로 조회(V4): N+1 문제 해결 + V3 보다 성능 개선, 재사용성이 떨어지는 문제, 트레이드 오프 & 권장하는 스타일
Section4 API 개발 고급 - 컬렉션 조회 최적화
엔티티를 직접 노출(V1)
엔티티를 DTO로 변환(V2)
엔티티를 DTO로 변환 + 패치 조인 활용(V3): N+1 문제 해결
엔티티를 DTO로 변환 + 패치 조인 활용(V3-1): N+1 문제 해결 + 페이징 문제 해결: @BatchSize, hibernate.default_batch_fetch_size
JPA에서 DTO로 바로 조회(V4): N+1 문제
JPA에서 DTO로 바로 조회(V5): 컬렉션 조회 최적화 IN 절을 활용해서 메모리에 미리 조회해서 최적화
JPA에서 DTO로 바로 조회(V6): JOIN 결과를 그대로 조회 후 애플리케이션에서 원하는 모양으로 직접 변환
stream 연산 : (groupingBy, mapping), toMap() + 병합합수
Section5 API 개발 고급 - 실무 필수 최적화
OSIV - Open Session In View, 성능 최적화
Section1 프로젝트 환경설정
쿼리 파라미터 로그 남기기(외부 라이브러리), application.yaml 설정, 라이브러리 체크
Section2 예제 도메인 모델
JPA 복습(연관관계 편의 메서드, 지연 로딩, 롬복)
Section3 공동 인터페이스 기능
JPA 리포지토리 VS Spring Data Jpa 리포지토리, 공통 인터페이스 설정 & 적용, 공통 인터페이스 기능 분석
Section4 쿼리 메소드 기능
메소드 이름으로 쿼리 생성
JPA NamedQuery
@Query, DTO 조회하기
파라미터 바인딩, 반환타입
순수 JPA 페이징과 정렬, 스프링 데이터 JPA 페이징과 정렬
벌크성 수정 쿼리 - @Modifying(clearAutomatically = true)
페치 조인 & @EntityGraph
JPA Hint & Lock
Section5 확장 기능
사용자 정의 리포지토리
Auditing - @PrePersist, @PreUpdate, @EnableJpaAuditing, @EntityListeners(AuditingEntityListener.class), AuditorAware,
@CreatedBy, @LastModifiedBy, @CreatedDate, @LastModifiedDate
도메인 클래스 컨버터 - HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩
페이징과 정렬 - Pageable, PageableRequest, @PageableDefault
Section6 스프링 데이터 JPA 분석
SimpleJpaRepository 분석, save() 메서드 로직 merge() vs persist(), Persistable 인터페이스 활용하기
Section7 나머지 기능들
Query By Example - Probe, ExampleMatcher, Example
Projections - 인터페이스 기반 & 클래스 기반 , 동적 Projections, 중첩 구조 처리와 최적화
네이티브 쿼리 - 네이티브 쿼리 & DTO 반환 Projections 활용
Section1 프로젝트 환경설정
Section2 예제 도메인 모델
Section3 기본 문법
Q-Type 활용 - static import
결과 조회 - fetch(), fetchOne(), fetchFirst(), fetchResults(), fetchCount()
정렬 - desc(), asc(), nullsFirst(), nullsLast()
페이징 - offset(), limit(), fetchResults()
조인 - 기본 조인, on절 활용, 페치 조인(fetchJoint())
서브 쿼리 - JPAExpressions, Case 문 - CaseBuilder, 상수 - Expressions.constant, 문자 더하기 - concat(), stringValue()
Section4 중급 문법
프로젝션 결과 반환 - 기본 반환, 2개 이상(tuple) 반환, DTO 조회(Projections.(xxx)), 별칭(ExpressionUtils.as), @QueryProjection
동적 쿼리 - BooleanBuilder, where 다중 파라미터, BooleanExpression
수정, 삭제 벌크 연산
SQL function & querydsl 내장 function
Section5 순수 JPA와 Querydsl
순수 JPA 리포지토리 & Querydsl - JPAQueryFactory 동시성 문제와 스프링
동적 쿼리와 성능 최적화 조회 - BooleanBuilder & where 절 파라미터 사용
조회 API 컨트롤러 개발 - profile
Section6 실무 활용 - 스프링 데이터 JPA와 Querydsl
순수 JPA 리포지토리 ➡️ 스프링 데이터 JPA 리포지토리 변환 - 사용자 정의 리포지토리 for Querydsl
Querydsl 페이징 fetchResults() PageImpl, 카운트 쿼리 분리 fetchCount(), 카운트 쿼리 분리 최적화 PageableExecutionUtils
Section7 스프링 데이터 JPA가 제공하는 Querydsl 기능
You can’t perform that action at this time.