Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 이진탐색
- 인프런
- CS스터디
- oh-my-zsh
- mysql 표
- 티스토리챌린지
- 스터디2기
- 인프런워밍업클럽
- 분할정복 방법
- mycli
- mysql 표 출력
- cs
- 터미널
- VI
- 순차탐색
- Pager
- 오블완
- 데이크스트라
- 욕심쟁이 방법
- spring boot
- Less
- 맥
- zsh theme
- 알고리즘
- 동적 프로그래밍 방법
- 오일러 경로
- table status
- zsh
- 네트워킹데이
- MySQL
Archives
- Today
- Total
Develop
34일차_Spring-JPA(영속성 컨텍스트, Entity 연관관계 매핑, N+1문제, CRUD), Spring-data(JPA 설정 및 사용, QueryDSL 사용준비) 본문
백엔드/KDT_Programmers
34일차_Spring-JPA(영속성 컨텍스트, Entity 연관관계 매핑, N+1문제, CRUD), Spring-data(JPA 설정 및 사용, QueryDSL 사용준비)
230801 2025. 4. 21. 02:51안녕하세요 .ᐟ
오늘은 4/18(금), 데브코스 34일차 (7주 5일차) 입니다.
오늘은 스프링 JPA와 영속성컨텍스트, Entity, 연관관계매핑과 N+1 문제, Spring DATA에서 JPA를 사용하기위한 준비를 학습했습니다.
Spring JPA : 개념
- ORM(Object relation mapping) : OOP 객체와 관계형 데이터베이스의 데이터를 연결하는 기술
- JPA : 자바 진영의 ORM 표준 인터페이스
JPA를 왜 사용하는가?
- SQL 중심 개발 -> 객체 중심 개발로 전환
- 쿼리를 작성하지않으므로 생산성 향상, 유지보수성 향상
- 캐시레이어가 추가되어 성능을 최적화할 여지가 높음
- 어떤 데이터베이스를 사용하든 동일한 방식으로 사용가능
영속성 컨텍스트 (PersistenceContext)
- Entity를 영구히 저장하는 환경으로, EntityManager 를 사용해 관리할 Entity를 보관하고 관리
Entity 상태
- 비영속 상태
- Entity 를 처음 만들었을 때 상태 (EntityManager가 관리하고 있지 않음)
- 영속 상태
- EntityManager 가 관리하는 Entity (1차 캐시, dirty-check 등의 관리)
- 준영속 상태
- EntityManager 에 의해 관리되고 있었으나, 관리 대상이 아니게 된 상태
Entity 연관관계 매핑 (단방향 & 양방향)
- 양방향 매핑
- 서로참조하고 있기 때문에 어디서든 참조 가능
- 연관관계의 주인이 누군지 모르기 때문에 지정해줘야 외래키가 잡힘
- @JoinColumn : 연관관계의 주인쪽에 설정
- mappedBy : 주인이 아닌쪽에 설정
- cascade 옵션 : 연관 엔티티도 함께 저장/삭제 가능
- 서로참조하고 있기 때문에 어디서든 참조 가능
- 단방향 매핑
- 참조용 필드가 있는 객체에서만 다른 객체 참조 가능
- mappedBy 필요 없음
- 한쪽만 연관관계 가짐 (구현 간단, 조회 제한 있음)
N + 1 문제
- N개의 Entity를 조회할 때 해당 Entity와 연관관계인 Entity를 식별자로 조회하여 쿼리가 N+1개 생성되는 문제
- 해결 방법
- @Query + fetch join
- findAllWithFetchJoin()
- @EntityGraph
- findAllWithEntityGraph()
- @NamedEntityGraph
- 미리 정의된 그래프 사용: findAllWithNamedEntityGraph()
- @Query + fetch join
JPA CRUD
1. 전역에 EntityManagerFactory 생성
2. 지역에 EntityManager 생성
3. 트랜잭션 관리객체 생성 및 트랜잭션 시작
4. 영속성 컨텍스트에 Entity 등록
5. Entity 식별자를 사용해 Entity를 가져옴 (Entity 변경 시 더티체크 후 커밋시점에 DB에 반영)
6. 데이터베이스에서 Entity 삭제
7. 트랜잭션 커밋 (쿼리 생성)
8. 영속성 컨텍스트 종료
Spring Data : JPA 설정 및 사용
- Spring Data : JPA 를 더 쉽고 편하게 다루기 위한 모듈
- JPA 를 한단계 더 추상화 시킨 Repository 인터페이스를 제공함
- Repository 인터페이스 규칙대로 메소드 선언 시, Spring 이 메소드 이름에 적합한 쿼리를 작성하는 구현체를 만들어 Bean 으로 등록해줌
- JpaRepository 상속
- 기본 메서드 제공: findById(), findAll(), count(), existsById() 등
- 메서드 이름만으로 자동 쿼리 생성 (And, Or, Like, In, OrderBy 등 조합 가능)
- application.properties 설정
spring.sql.init.mode=always # SQL 초기화 전략
spring.jpa.hibernate.ddl-auto=update # DDL 동작 설정 (create, update, none 등)
- QueryDSL 사용 이유 & 준비
- http://querydsl.com/
- JPA 메서드 이름이 길어질 때 가독성 ↓
- QueryDSL은 타입 안정성 + 자유도 높은 조건 조립 가능
- 의존성 추가 (pom.xml)
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
오늘도 고생하셨습니다 .ᐟ
'백엔드 > KDT_Programmers' 카테고리의 다른 글
| 36일차_공공데이터 (Open API) + Spring Cloud (OpenFeign) 연동 실습 (0) | 2025.04.29 |
|---|---|
| 35일차_SpringBoot: QueryDSL 적용, Boilerplate 마이그레이션, Thymeleaf 전환 (0) | 2025.04.22 |
| 33일차_Spring Boot, Thymeleaf, JPA, JPQL (0) | 2025.04.21 |
| 32일차_Spring-security 인증/인가 실습 (0) | 2025.04.17 |
| 31일차_ Spring-MyBatis 실습정리 : 회원가입, 로그인, CORS, 파일처리, Mock 테스트, 보안 설정 (0) | 2025.04.16 |