전체 글 267

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..

Connection Pooling

Connection Pooling이 없을 때의 DB 연결 방법 1. TCP 연결애플리케이션이 “DB 서버야, 연결해줘” 하고 요청DB 서버가 “좋다” 하고 응답네트워크에서 SYN → SYN/ACK → ACK 왕복2. TLS/SSL 핸드셰이크암호화 연결을 쓸 경우 서로 열쇠 교환해서 보안 통로 확보3. 인증클라이언트가 아이디/비밀번호를 보냄DB서버는 “비번, 권한 전부 체크 후 들어와”하고 허락4. 세션 초기화DB 서버가 새로운 “세션(대화방)”을 만들어줌기본 설정들을 관리사용할 DB문자셋/ 시간대autocommit 모드, isolation level 등5. 준비 완료첫 쿼리를 실행할 수 있음6. 커넥션 닫기Connection.close() 호출 → TCP 연결도 종료서버는 “이 세션 끝!” 하고 정리네트..

Isolation Level

격리 수준은 동시에 여러 트랜잭션이 실행될 때, 서로의 데이터를 어떻게 볼 수 있는지를 결정여러 트랜잭션이 동시에 같은 데이터를 읽거나 쓸 때 충돌이 생긴다 → DBMS는 이를 해결하기 위해 4단계의 격리 수준을 제공격리 수준이 높아질수록 데이터 정합성 ↑, 동시 처리 성능 ↓1. READ UNCOMMITTED아직 커밋되지 않은 데이터(Dirty Data)도 읽을 수 있음발생 가능한 문제A 트랜잭션이 바꾼 값을 B가 읽었는데 A가 롤백하면 B가 잘못된 데이터를 본 셈거의 안 씀 (정합성이 너무 약함) 2. READ COMMITTED (가장 많이 씀)커밋된 데이터만 읽음발생 가능한 문제Non-repeatable Read : 같은 데이터를 두 번 읽었는데, 그 사이에 다른 트랜잭션이 커밋해버리면 값이 달라짐..

Propagation

propagation은 트랜잭션 전파(Propagation) 옵션이다.스프링의 @Transactional은 이미 진행 중인 트랜잭션이 있을 때, 새로 호출된 메서드가 그 트랜잭션에 어떻게 참여할지를 결정 1. REQUIRED(기본값)이미 트랜잭션이 있으면 → 거기에 합류없으면 → 새 트랜잭션 시작대부분의 경우 기본값으로 충분예: 서비스에서 레포지토리를 여러 번 호출해도 하나의 트랜잭션으로 묶임@Transactional(propagation = Propagation.REQUIRED) 사용 상황일반적인 서비스/DAO 호출 대부분예: 계좌 이체 서비스 → 출금 메서드, 입금 메서드 모두 같은 트랜잭션으로 묶여야 함@Transactional // REQUIRED 기본값public void transfer(....

트랜잭션 범위 (Class, Method)

1. 클래스 레벨 @Transactional@Service@Transactional(readOnly = true) // 클래스 레벨public class AccountService { public List list() { } public void findById(Long id) { } @Transactional // 메서드 레벨 public void transfer() { }}특징클래스 레벨에 붙이면 → 해당 클래스의 모든 public 메서드에 트랜잭션이 적용됨클래스 레벨에 설정된 속성 (readOnly = true)이 기본값이 됨메서드 별도로 @Transactional을 붙이면 그 메서드에는 메서드 설정이 우선 적용된다.위 코드에서는list() → readOnly = ..

정의(ACID)

트랜잭션이 반드시 지켜야하는 4가지 특성Atomicity(원자성)트랜잭션의 모든 작업이 전부 수행되거나(All), 전혀 수행되지 않아야 함(None)중간에 일부만 반영된 상태가 있으면 안 됨예: 계좌 이체A → B 송금할 때 A 계좌에서 돈이 빠지고 B 계좌에 입금이 동시에 완료되어야 함A에서만 돈이 빠지고 B에 입금 안 되면 원자성이 깨짐 → 롤백 필요Consistency(일관성)트랜잭션이 수행된 후에도 DB의 무결성 제약 조건이 항상 만족되어야 함즉, 데이터베이스는 유효한 상태에서 또 다른 유효한 상태로만 변해야 함예: 은행 계좌 시스템전체 계좌 잔액 합계가 트랜잭션 전후로 동일해야 함한쪽 계좌에서 빠진 만큼 다른 쪽에 반드시 더해져야 함Isolation (고립성, 격리성)동시에 실행되는 트랜잭션들이..