3.5.2 Spring Data JPA

yeonseong Jo·2023년 7월 3일
0

SEB_BE_45

목록 보기
37/47
post-thumbnail

JDBC를 배울 때에도
Spring Data JDBC를 따로 배웠었는데
이 둘이 엄연히 다른것 처럼
JPA와 Spring Data JPA도
엄연히 다르다고 한다.

Spring Data JPA에 대해 알아보고
JPA와의 차이도 비교해 보고자 한다.


Spring Data JPA

그래서 이게 뭐냐?
일단은 Spring Data JDBC와 유사하다는 것
각각은 Spring Data라는 추상화된 데이터 엑세스 접근 방식을
JDBC와 JPA로 구현한 것이며
사용 방식이 유사하다.

Entity

일반적인 Spring Data JDBC와 비교했을 때
가장 많이 바뀌는 부분이다.

Mapping Annotation이 유사하지만,
모듈 자체가 다르기 때문

Enumerated

바뀐 부분중 지원하는게 Enumerated이다.

...
@Entity
class Entity{
	...
    @Enumerated(value = EnumType.STRING)
    @Columm(nullable = false)
    private Status status;
    ...
    public enum Status{
    	STATUS1("a"),
        STATUS2("b");
        @Getter
        private String status;
        
        Status(String status){
        	this.status = status;
        }
    }
}

열거형 클래스를 요소로 받게 할 수 있는 annotation으로
주어진 Enum에서 선택한다는 느낌으로 이해하면 될것 같다.

EnumType의 경우 STRING외에도 INTEGER가 존재하는데,
INTEGER로 할 때 만약 enum에 요소를 중간에 추가한다면
DB에 추가된 요소로 인해 밀려난 숫자를
수동으로 바꿔줘야 하기 때문에
STRING을 추천한다고 한다.


Repository

Spring Data JDBC의 경우
CrudRepository를 상속하여
인터페이스를 만들었지만,

Spring Data Jpa는
JpaRepository를 사용한다.

public interface EntitryRepository extends JpaRepository<Entity, Long> {
	@Query(value = "SELECT e FROM Entity e WHERE e.Id = :Id")
    Optional<Entity> findByEntityId(long Id);
}

일단 기본적인 틀은
CrudRepository와 크게 다르지 않다.
generic에 entity클래스와
@Id annotation을 단 변수의 자료형을 넣어 상속받는다.

@Query

Query를 통한 쿼리 메서드에 표현 방식은
JDBC의 경우 native query문법을 따르지만,

JPA의 경우
여러개 있기 때문에 주의해야 할 거 같다.

@Query(value = "FROM Entity e WHERE e.Id = :Id")
@Query(value = "SELECT e FROM Entity e WHERE e.Id = :Id")
@Query(value = "SELECT * FROM ENTITY WHERE Id = :Id", nativeQuery = true)

기본적으로
DB의 table명을 쓰는것이 아니라 Entity class명을 사용한다.
모든 column을 가져올 때에는 첫번째 annotation과 같이
SELECT키워드 생략이 가능하다.

  • nativeQuery파라미터를 true로 설정하여
    native query 문법을 사용할 수 있다.

그리고 JDBC의 @Query와 JPA의 @Query
패키지가 다르기 때문에 주의해야한다.
(둘 다 사용할 일이 적을거 같아 크게 신경 안써도..)

그 외 Repository사용법은
CrudRepository사용법과 같다.

구현

서비스 클래스에서 repository를 주입 받아
기능별로 적절하게 사용하면 된다.

public class EntityService{
	private EntityRepository repository;
    public EntityService(EntityRepository repository) {
    	this.repository = repository;
    }
    
    public Entity create(Entity entity) {
    	return repository.save(entity);
    }
    public Entity update(Entity entity, long id){
    	Entity findEntity = repository.findById(id);
        ...
        return repository.save(findEntity);
   ...
}

vs Spring Data JDBC??

구현까지 해보니 뭐..
Spring Data JDBC와 다를게 없었다
어디에 차이가 있는 걸까?

  1. 연관관계 mapping annotation이 다르다고 한다.
  • JDBC의 경우 OtO, OtM, MtM 만 가능
    단방향 접근만 가능
  • JPA의 경우 MtO 등을 통해
    양방향 접근도 가능
  1. JPA에는 사용 가능한 Annotation이 많다.
    (아직 다양한 Annotation을 사용할 경우가 없었기 때문에
    다른 Annotation을 찾아보진 않았다.)

  2. Lazy Loading

  • JPA는 지연로딩으로 객체를 가져온다
  1. Dirty Checking
  • JPA에서 트랜잭션이 끝나는 시점에 객체에 변화가 있을 때
    자동으로 반영한다.

Spring Data JDBC와의 차이점을 알아보는 과정에서
알게되었는데
JPA는 JDBC 기반이라 JDBC가 먼저 만들어졌지만,
Spring Data JDBC는
Spring Data JPA보다 늦게 만들어졌다고 한다.
확실히 일반 JPA보다는
Spring Data JPA가 편하고,
Spring Data JDBC가 더 편하다.

profile
뒤(back)끝(end)있는 개발자

0개의 댓글