Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

스프링 DB 접근 기술(신) 본문

Spring/Spring 웹 개발 큰 그림

스프링 DB 접근 기술(신)

studyHub 2021. 5. 1. 17:16

지난번에 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 설정을 추가한다

build.gralde에 의존성 추가

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

 

application.properties에 설정 추가

테이블은 이미 생성되어 있으므로 auto-ddl X.

create를 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성

 

2. JPA 엔티티 맵핑

애노테이션들을 가지고 DB 테이블과 매핑한다

JPA는 애노테이션을 보고 엔티티 클래스의 필드가 테이블의 속성과 어떻게 매핑되는지 파악한다

필드와 속성 이름이 같다면 @Column 생략 가능

 

3. JPA repository 생성

JPA EntityManger 기반으로 동작하므로 우선 EntityManger 객체를 받는다.

(라이브러리를 받고 properties 설정을 해두면 스프링부트가 알아서 생성해 준다)

EntityManager는 dataSource 등도 포함

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

INSERT, SELECT => persist, find

 맵핑된 객체를 반환!

 

- PK 기반이 아니면 JPQL을 작성해야 한다

JPQL: 테이블이 아닌 엔티티 대상 쿼리. 객체 자체를 select

JPQL → sql 로 번역됨

 

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. 스프링 설정 변경

repository를 자동으로 구현해서 빈으로 등록하므로, entityManger 주입받고 repositroy 빈으로 등록하고 할 필요x

 

실무에서는 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