Spring Boot/JPA(Java Persistence API) 5

N + 1 문제 해결

JPA에서 연관관계가 LAZY(지연 로딩)일 때 자주 발생예시: Team과 Member 관계 (1:N)List teams = em.createQuery("select t from Team t", Team.class) .getResultList();for (Team team : teams) { System.out.println(team.getMembers().size());}실행 쿼리select * from team → 팀 목록(N개)각 팀의 getMembers() 접근할 때마다:select * from member where team_id=? → 팀마다 N번 실행최종적으로 1 + N번의 쿼리 발생 = N+1 문제 N+1 문제 해결 방법1. Fetch Join (가..

영속성 컨텍스트

멘토님께서https://medium.com/@ali75mnf/quick-journey-into-persistence-understanding-jpa-entity-lifecycle-d4333985a25d Quick Journey into Persistence: Understanding JPA Entity LifecycleJava Persistence API (JPA) simplifies the interaction between Java objects and relational databases by defining a clear and structured…medium.com 위 그림이 중요하다고 해주셨다엔티티의 4가지 상태1. New(=Transient 비영속)new로 막 생성한 순수 자바 객체영속성 컨..

쿼리 방법(JPQL/Criteria)

JPA 쿼리 방법1. JPQL (Java Persistence Query Language)SQL과 비슷하지만, 테이블이 아니라 엔티티 객체를 대상으로 함DB 방언(dialect)에 맞게 SQL로 변환되어 실행됨엔티티 이름과 엔티티 필드를 기준으로 작성예시// 모든 Account 조회List accounts = em.createQuery("SELECT a FROM Account a", Account.class) .getResultList();// 특정 owner 조회Account account = em.createQuery("SELECT a FROM Account a WHERE a.owner = :owner", Account.class) .setParameter("owner",..

매핑 규칙(어노테이션)

1. 엔티티 기본 매핑@Entity클래스가 JPA 엔티티임을 표시기본 생성자 필수 (public 또는 protected)@Table(name = "table_name")매핑할 DB 테이블 이름 지정 (기본값은 클래스명과 동일)@Entity@Table(name = "accounts")public class Account { ... }2. 기본 키 매핑@IdPK 컬럼 지정@GeneratedValuePK 생성 전략IDENTITY : DB auto_increment 사용 (MySQL, MariaDB)SEQUENCE : DB 시퀀스 사용 (Oracle)TABLE : 키 생성용 테이블 사용AUTO : DB dialect에 따라 자동 선택@Id@GeneratedValue(strategy = GenerationType..

EntityManager API

→ JPA 스펙이 제공하는 핵심 인터페이스 먼저 익히기1. persist(Object entity)엔티티를 영속성 컨텍스트에 저장 → DB에는 즉시 INSERT 안 하고 트랜잭션 커밋 시 반영Member member = new Member("jaeyoon", 20);em.persist(member); // 영속 상태 진입2. find(Class entityClass, Object primaryKey)PK(기본키)로 엔티티 조회1차 캐시에 있으면 캐시에서 반환, 없으면 DB SELECT 실행 후 캐시에 넣고 반환Member member = em.find(Member.class, 1L);3. remove(Object entity)엔티티를 삭제 예약 상태로 바꿈트랜잭션 커밋 시 DELETE SQL 실행Memb..