JpaRepository는 인터페이스이다. 새 인터페이스를 사용하기 위해서는 새 인터페이스를 작성하고 JpaRepository를 확장(extend)해야 한다.
TodoRepository 인터페이스
package com.example.springTest.persistence;
import com.example.springTest.model.TodoEntity;
import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.JpaRepository;
@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
}
TodoRepository 인터페이스는 JpaRepository를 확장 해야 한다. 이때 JpaRepository<T,ID>는 Genetic Type을 받는 것을 주의하자.
우리는 TodoEnitity의 기본 키인 id의 타입인 String를 넣어 줬다.
TodoService에서 TodoRepository사용하기
package com.example.springTest.service;
import com.example.springTest.model.TodoEntity;
import com.example.springTest.persistence.TodoRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class TodoService {
@Autowired
private TodoRepository repository;
public String testService(){
TodoEntity entity = TodoEntity.builder().title("My first todo item").build();
repository.save(entity);
TodoEntity saveEntity = repository.findById(entity.getId()).get();
return saveEntity.getTitle();
}
}
TodoRepository는 JpaRepository를 상속한다. JpaRepository는 기본적인 데이타베베이스 오퍼레이션 인터페이스 save, findById, findAll등을 제공한다.
그렇다면 기본적인 쿼리가 아닌 쿼리는 어떻게 할까?
TodoRepository에서 이후에 사용할 findBUserId를 구현해보겠다.
package com.example.springTest.persistence;
import com.example.springTest.model.TodoEntity;
import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
List<TodoEntity> findByUserId(String userId);
}
이 메서드를 작성하면 스프링 데이터 JPA가 메서드 이름을 파싱해서 SELECT * FROM Todo userId = '{userId}'와 같은 쿼리를 작성해 실행한다. 메서드 이름은 쿼리, 매개변수는 쿼리의 Whrer문에 들어갈 값을 의미한다. 더 복잡한 쿼리는 @Query 어노테이션을 이용해 지정할 수 있다.