MySQL DATETIME과 TIMESTAMP
MySQL DATETIME과 TIMESTAMP가 값을 저장하는 방식과 세션 타임존에 따른 변환, 2038년 범위 한계를 예제로 비교하고 어떤 타입을 고를지 기준을 정리합니다.
MySQL DATETIME과 TIMESTAMP가 값을 저장하는 방식과 세션 타임존에 따른 변환, 2038년 범위 한계를 예제로 비교하고 어떤 타입을 고를지 기준을 정리합니다.
재고 차감 동시성 테스트로 문제를 재현하고, JPA @Version 기반 낙관적 락의 동작 원리와 사용 시점, 주의할 점을 예제 흐름도와 함께 정리합니다.
도메인 주도 개발 시작하기 4장을 정리하며, 밸류 타입을 JPA로 매핑하는 방법과 애그리거트를 완전한 상태로 조회·저장하기 위한 로딩 전략·영속성 전파·식별자 생성 방식을 다룹니다.
한 애그리거트를 여러 스레드가 동시에 수정할 때 생기는 일관성 문제를 선점 잠금, 비선점 잠금, 오프라인 선점 잠금으로 막는 방법을 JPA 구현 예시와 흐름도로 정리합니다.
일급컬렉션에 Cascade를 적용했을 때 자식 엔티티 Id가 null로 저장되는 문제와, 이미 저장된 부모를 save하면 merge가 호출된다는 점을 짚으며 CascadeType.MERGE로 해결한 방법을 정리합니다.
배치에서 Quartz로 실행할 때만 FetchType.LAZY 객체를 불러오지 못하고 LazyInitializationException이 발생한 원인과 해결 방법을 정리합니다.
Querydsl 학습을 위해 스프링 부트 프로젝트를 생성하고, Q타입을 만드는 Gradle 설정과 동작 확인 테스트, H2 데이터베이스와 쿼리 로그 설정을 정리합니다.
Querydsl 실습에 사용할 Member, Team 엔티티를 설계하고 양방향 연관관계와 연관관계의 주인, 롬복 설정, 순수 JPA로 데이터를 확인하는 테스트를 정리합니다.
JPQL과 비교하며 Querydsl의 기본 문법인 Q타입 활용, 검색 조건, 결과 조회, 정렬, 페이징, 집합, 조인, 서브쿼리, Case 문, 상수와 문자 더하기를 정리합니다.
Querydsl에서 튜플과 DTO로 결과를 받는 프로젝션 방법, BooleanBuilder와 Where 다중 파라미터를 사용한 동적 쿼리, 수정·삭제 벌크 연산과 SQL function 호출 방법을 정리합니다.
순수 JPA 리포지토리에 Querydsl을 함께 사용하는 방법과, BooleanBuilder와 Where절 파라미터로 작성한 동적 쿼리 DTO 조회, 프로파일을 나눈 샘플 데이터로 조회 API를 만드는 과정을 정리합니다.
스프링 데이터 JPA 리포지토리에 Querydsl을 결합하는 사용자 정의 리포지토리 구성과, 내용 쿼리와 count 쿼리를 나눈 페이징 처리, Pageable의 Sort를 OrderSpecifier로 바꾸는 방법을 정리합니다.
스프링 데이터 JPA 실습 프로젝트의 Gradle 설정과 스타터 라이브러리 구성, H2 데이터베이스 연동, 순수 JPA 리포지토리와 스프링 데이터 JPA 리포지토리로 기본 동작을 확인하는 과정을 정리합니다.
실습에 사용할 Member, Team 엔티티와 양방향 연관관계, 연관관계 편의 메소드를 정의하고, 순수 JPA로 저장·조회와 지연 로딩 동작을 확인합니다.
순수 JPA로 기본 CRUD 리포지토리를 만들어 본 뒤, 스프링 데이터 JPA의 공통 인터페이스 JpaRepository로 대체하고, 스프링 데이터 JPA가 구현 클래스를 만들어 주입하는 방식과 주요 메서드를 정리합니다.
메소드 이름으로 쿼리를 생성하는 방법부터 @Query, 파라미터 바인딩, 반환 타입, 페이징과 정렬, 벌크성 수정 쿼리, @EntityGraph까지 스프링 데이터 JPA의 쿼리 메소드 기능을 정리합니다.
사용자 정의 리포지토리 구현, Auditing으로 등록일·수정일·등록자·수정자 관리, 도메인 클래스 컨버터, 스프링 MVC에서 Pageable로 받는 페이징과 정렬 등 스프링 데이터 JPA의 확장 기능을 정리합니다.
스프링 데이터 JPA 공통 인터페이스 구현체인 SimpleJpaRepository의 @Repository·@Transactional 적용 방식과, save() 메서드가 isNew로 persist와 merge를 나누는 기준, Persistable로 판단 로직을 바꾸는 방법을 정리합니다.
JPA 프로젝트에 필요한 라이브러리와 persistence.xml 설정, Persistence에서 EntityManager까지 이어지는 구동 방식, 트랜잭션 안에서 회원을 저장하는 기본 동작과 JPQL 사용법을 정리합니다.
엔티티의 생명주기와 영속성 컨텍스트가 제공하는 1차 캐시, 동일성 보장, 쓰기 지연, 변경 감지, 그리고 플러시가 호출되는 시점과 플러시 모드, 준영속 상태를 예제로 정리합니다.
@Entity, @Table, @Column 등 엔티티와 테이블을 매핑하는 어노테이션과 스키마 자동 생성 옵션, IDENTITY·SEQUENCE·TABLE 기본 키 생성 전략과 SEQUENCE 최적화를 정리합니다.
테이블의 외래 키와 객체의 참조가 어떻게 다른지 회원·팀 예제로 비교하고, 단방향·양방향 매핑과 외래 키를 관리하는 연관관계의 주인을 정하는 기준을 정리합니다.
다대일·일대다·일대일 연관관계를 단방향과 양방향으로 매핑하는 방법과, 외래 키 위치에 따라 달라지는 각 방식의 장단점을 정리합니다.
객체의 상속 구조를 테이블로 옮기는 조인·단일 테이블·구현 클래스마다 테이블 전략의 테이블 구조와 장단점을 비교하고, 공통 매핑 정보를 모으는 @MappedSuperclass의 쓰임을 정리합니다.
em.find()와 em.getReference()의 차이, 프록시 객체가 영속성 컨텍스트를 통해 초기화되는 과정, 프록시를 사용할 때 주의할 점과 확인 방법을 예제로 정리합니다.
FetchType.LAZY와 FetchType.EAGER로 연관된 Team을 조회하는 시점이 어떻게 달라지는지 프록시 관점에서 정리하고, 즉시 로딩이 일으키는 N+1 문제와 실무에서 지연 로딩을 쓰는 이유를 짚습니다.
CASCADE 옵션으로 부모와 자식 엔티티를 함께 영속화하는 방법과 사용하는 경우, orphanRemoval로 고아 객체를 제거하는 원리, 두 옵션을 함께 써서 자식의 생명주기를 관리하는 방법을 정리합니다.
JPA의 엔티티 타입과 값 타입의 차이, 기본값 타입의 특징, 임베디드 타입을 정의하고 테이블에 매핑하는 방법, @AttributeOverride로 컬럼명을 재정의하는 방법을 정리합니다.
임베디드 값 타입을 여러 엔티티가 공유할 때 생기는 부작용과 불변 객체 설계, 값 타입 컬렉션의 제약과 이를 일대다 엔티티로 대체하는 방법을 정리합니다.
JPQL의 기본 문법과 TypedQuery, 파라미터 바인딩, 프로젝션, 페이징, 조인, 서브쿼리, CASE 식 등 자주 쓰는 문법을 정리합니다.
JPQL 경로 표현식에서 명시적 조인과 묵시적 조인의 차이를 정리하고, 페치 조인의 동작 방식과 일반 조인과의 차이, DISTINCT·페이징 관련 한계를 설명합니다.
회원 등록·수정·조회 API를 예제로, 엔티티를 요청·응답에 그대로 쓰지 않고 별도의 DTO로 API 스펙과 엔티티를 분리하는 방법과 수정 API에서 커맨드와 쿼리를 나누는 방법을 정리합니다.
주문과 회원·배송처럼 xToOne 관계를 조회하는 API를 엔티티 직접 노출, DTO 변환, 페치 조인, DTO 직접 조회 순서로 바꿔 가며 지연 로딩이 만드는 N+1 문제와 쿼리 수 변화를 정리합니다.
일대다 컬렉션을 포함한 주문 조회 API를 엔티티 노출부터 페치 조인, 배치 사이즈, DTO 직접 조회, 플랫 데이터까지 단계별로 최적화하는 방법을 정리합니다.
OSIV를 켰을 때와 껐을 때 영속성 컨텍스트와 데이터베이스 커넥션이 유지되는 범위와 트레이드오프를 살펴보고, Command와 Query를 분리해 복잡성을 관리하는 방법을 정리합니다.
JPA 영속성 컨텍스트의 캐싱·더티 체킹·쓰기 지연 동작 원리와 플러시 발생 시점을 정리하고, 배치 처리와 플러시 모드를 활용한 성능 최적화 방법을 소개합니다.
JPA·Hibernate 기반 데이터 액세스 계층의 성능을 응답 시간과 처리량으로 측정하는 기준과, SQL 로깅·스키마 관리·커넥션 관리와 모니터링·Hibernate 통계·Enum 매핑에서 챙길 점을 정리합니다.
JPA의 ID 생성 전략(IDENTITY, SEQUENCE, UUID)과 대규모 배치 처리, OneToMany·OneToOne·ManyToMany 연관관계 매핑에서 성능을 고려해 선택하는 기준을 정리합니다.
JPA의 상속 매핑 전략인 SINGLE_TABLE, JOINED, TABLE_PER_CLASS와 @MappedSuperclass를 테이블 구조와 성능 관점에서 비교하고, 실무에서 전략을 고르는 기준과 최적화 방법을 정리합니다.
JPA 라이브러리와 설정을 추가하고 Member 엔티티 매핑과 EntityManager 기반 리포지토리를 구현한 뒤, SpringConfig의 빈 설정만 바꿔 JDBC 구현체를 JPA로 교체하는 과정을 정리합니다.