JDBC를 배울 때에도
Spring Data JDBC를 따로 배웠었는데
이 둘이 엄연히 다른것 처럼
JPA와 Spring Data JPA도
엄연히 다르다고 한다.
Spring Data JPA에 대해 알아보고
JPA와의 차이도 비교해 보고자 한다.
그래서 이게 뭐냐?
일단은 Spring Data JDBC와 유사하다는 것
각각은 Spring Data라는 추상화된 데이터 엑세스 접근 방식을
JDBC와 JPA로 구현한 것이며
사용 방식이 유사하다.
일반적인 Spring Data JDBC와 비교했을 때
가장 많이 바뀌는 부분이다.
Mapping Annotation이 유사하지만,
모듈 자체가 다르기 때문
바뀐 부분중 지원하는게 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
을 추천한다고 한다.
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
를 통한 쿼리 메서드에 표현 방식은
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
로 설정하여그리고 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);
...
}
구현까지 해보니 뭐..
Spring Data JDBC와 다를게 없었다
어디에 차이가 있는 걸까?
JPA에는 사용 가능한 Annotation이 많다.
(아직 다양한 Annotation을 사용할 경우가 없었기 때문에
다른 Annotation을 찾아보진 않았다.)
Lazy Loading
Spring Data JDBC와의 차이점을 알아보는 과정에서
알게되었는데
JPA는 JDBC 기반이라 JDBC가 먼저 만들어졌지만,
Spring Data JDBC는
Spring Data JPA보다 늦게 만들어졌다고 한다.
확실히 일반 JPA보다는
Spring Data JPA가 편하고,
Spring Data JDBC가 더 편하다.