| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- @Transactional
- Routing Key
- Spring
- AWS
- mybatis
- docker
- dockerhub
- securitycontextholderfilter
- 스프링 부트
- redis
- JdbcTemplate
- @ComponentScan
- CORS
- JWT
- Web
- kafka
- JPQL
- 컨테이너
- 지연 로딩
- JPA
- 서블릿 컨테이너
- MSA
- DLQ
- Spring Data JPA
- 페이징
- Spring Container
- DI
- docker compose
- Dead Letter Queue
- 쿠버네티스
- Today
- Total
look-forest
스프링 DB 접근 기술(신) 본문
지난번에 JDBC와 JdbcTemplate 기반의 DB 접근 방법을 알아보았다.
하지만 현업에서는 JPA를 사용한다.
JPA를 사용하면 개발 생산성을 크게 높일 수 있기 때문이다.
JPA (Java Persistence API)
객체를 JPA에 집어넣으면,
기존(jdbc)의 반복 코드를 줄여주는 것은 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JDBC를 사용하면 쿼리 날리고 결과를 객체에 맵핑까지 했어야 했다.
그러나 JPA는 맵핑된 객체를 반환한다!
JPA는 표준 인터페이스, Hibernate는 구현체
JPA 실행 시 쿼리문 로그를 보면 알 수 있다.

JPA는 ORM 기술
Object Relational Mapping → 객체 중심의 설계로 패러다임을 전환
객체 중심으로 개발하니 생산성 향상, 유지보수 유리
엔티티를 맵핑해야 쓸 수 있다 → @Entity
entity: 실제 DB의 테이블과 1:1로 매핑되는 클래스
사용법
1. 의존성, JPA 설정을 추가한다

starter-data-jpa는 jdbc 관련 라이브러리를 포함한다

테이블은 이미 생성되어 있으므로 auto-ddl X.
create를 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성
2. JPA 엔티티 맵핑
애노테이션들을 가지고 DB 테이블과 매핑한다
JPA는 애노테이션을 보고 엔티티 클래스의 필드가 테이블의 속성과 어떻게 매핑되는지 파악한다

3. JPA repository 생성
JPA는 EntityManger를 기반으로 동작하므로 우선 EntityManger 객체를 받는다.
(라이브러리를 받고 properties 설정을 해두면 스프링부트가 알아서 생성해 준다)

- 기본 쿼리 or PK 기반 쿼리는 JPA가 자동으로 생성해준다!

맵핑된 객체를 반환!
- PK 기반이 아니면 JPQL을 작성해야 한다
JPQL: 테이블이 아닌 엔티티 대상 쿼리. 객체 자체를 select.

4. 주의: JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다
스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다.
만약 런타임 예외가 발생하면 롤백한다.

스프링 데이터 JPA
JPA를 쉽게 쓰도록 스프링이 감쌌다! (따라서 JPA를 먼저 공부해야 한다)
리포지토리에 구현 클래스 없이 인터페이스만으로 작동한다!!!
제공 기능
- 인터페이스를 통한 기본적인 CRUD 기능 제공
- findByName()처럼 메서드 명 만으로 조회 기능 제공
- 페이징 기능 자동 제공
어떻게..?
공통 메서드를 이미 정의해 놓았기 때문이다

사용법
1. JPA 설정과 같다
2. 스프링 데이터 JPA 리포지토리를 만든다
다른 리포지토리들과는 다르게, 클래스가 아닌 인터페이스로 만든다.
이 인터페이스는 JpaRepository와 사용할 Repository를 상속받는다.
그럼 spring data jpa가 구현체를 만들어서 빈으로 등록해준다!

CRUD, 단순 조회 등 공통 기능이 다 구현되어 있다.
공통 기능에 없는 건 메소드 명만으로 자동 생성한다
메서드 명명 규칙에 따라 JPQL 생성
findByNameAndEmail → select m from Member m where name = ? and email = ? ...
3. 스프링 설정 변경

실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl 라이브러리를 사용.
Querydsl을 사용하면 쿼리도 Java 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있다.
이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, JdbcTemplate를 사용.
참고 자료 & 이미지 출처
스프링 입문(김영한 님)
'Spring > Spring 웹 개발 큰 그림' 카테고리의 다른 글
| AOP (0) | 2021.05.02 |
|---|---|
| 스프링 DB 접근 기술(구) (0) | 2021.05.01 |
| 스프링 빈과 의존 관계 (0) | 2021.04.27 |
| Spring 웹 개발 기초 (0) | 2021.04.24 |
| 프로젝트 환경 설정 (0) | 2021.04.24 |