본문 바로가기
[ Developer ]/Spring Framework

[Spring] 스프링 JPA ORM

by 김현섭. 2016. 6. 15.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Spring Data JPA
JPA(Java Persistence API)
  • 관계형 데이터베이스에 접근하기 위한 표준 ORM 기술을 제공 EJB에서 제공 되었던 엔티티 빈(Entity Bean)을 대체하는 기술
  • 장점
    • 객체지향적으로 데이터 관리 비즈니스 로직에 집중할 수 있으며 객체지향 개발이 가능
    • 테이블 생성 변경 관리가 쉽다
    • 로직을 쿼리에 지중하기 보다 객체 자체에 집중할 수 있다
    • 빠른 개발이 가능
  • 단점
    • 어렵다
    • 잘 이해하고 사용하지 않으면 데이터 손실 발생
    • 성능상 문제가 있을 수 있다

Spring Data
  • 오픈 소스 프로젝트이며 Spring 관련 어플리케이션에 새로운 데이터 접근 기술을 쉽게 사용하도록 도와주는 역할
  • 단순한 통합 처리
    • CRUD + 쿼리
    • 동일한 인터페이스
    • 페이징 처리
    • 메소드 이름으로 쿼리 생성
    • 스프링 MVC에서 ID 값만 넘겨도 도메인 클래스로 바인딩

Spring Data JPA (ORM 기술)
  • 순수한 JDBC
    • Connection Statement ResultSet을 이용한 JDBC
  • Spring JDBC Template
    • 보다 간단한 Spring의 MyBatis 방식
  • Spring + JPA
    • ORM 프레임워크가 단순한 CRUD 쿼리를 작성해주기 때문에 쿼리를 짤 필요가 없다
  • Spring Data JPA
    • 실제로 작성하지 않고 JpaRepository 인터페이스를 상속한다면 이미 정의가 되어 있다
    • 그러나 인터페이스에 구현 클래스가 없다 -> 자동 생성이 되기 때문에

Spring Data JPA 기능
  • 메소드 이름으로 쿼리 생성
  • 메소드 이름으로 NamedQuery 호출
  • @ Modify
  • Specfication (DDD)
    • VO 객체를 넘기면 쿼리가 생성되고 쿼리를 이용함

Spring Data 장점
  • 코딩량이 현저히 줄어든다
  • 도메인 클래스를 중요하게 다룸
  • 비즈니스 로직 이해하기 쉬움
    • 기존 쿼리는 다양한 테이블을 조인하기 때문에 가독성이 좋지 않음
    • MyBatis는 쿼리를 열어보지 않으면 로직을 이해하기 쉽지 않다
    • Spring Data는 쿼리를 열 필요없이 메소드 명만 보면 쿼리를 알 수 있다
  • 많은 테스트 케이스 작성 가능
  • 너무 복잡할 땐 SQL 사용
  • 비즈니스 로직에 집중

Spring Data 주의
  • DB, JDBC, Hibernate, JPA를 알아야 하기 때문에 학습하기가 어렵다
  • Insert 하나를 실행하기 위해선 다양한 지식이 필요하기 때문에 어렵다
  • JPA(하이버네이트)를 모르면 사용하기 어렵다
  • 데이터베이스 설계에 많은 공부가 필요함
  • 대부분의 문제는 JPA를 모르고 사용하기 때문

JPA 기본 로딩 전략
  • N:1 기본값 즉시 로딩
    • 사용하지 않는 값들 까지 즉시 로딩하기 때문에 지연로딩 전략 설정
    • 최적화 필요시 Fetch Join 설정

JPA 이해
  • 영속성 컨텍스트 이해
  • 자동 변경 감지 (VO 객체에 값을 Set 시키면 변경 감지한다)
    • 트랜잭션 커밋시 자동 DB Update
  • 연관관계 매핑중에 mappedBy 이해
  • JPQL 한계 인식

Template Callback Pattern (익명 클래스)
  • 스프링에서 전략 패턴의 기본 구조로 익명 내부 클래스를 활용한 방식
  • 전략 패턴의 컨텍스트를 템플릿이라 부르고 익명 내부 클래스로 만들어지는 오브젝트를 콜백이라고 부름
  • 템블릿
    • 어떤 목적을 위해 미리 만들어둔 모양이 있는 틀
  • 콜백
    • 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트