이번 강의에서는 Spring Data JPA에서 Derived Query Methods를 사용하여 커스텀 조건을 기반으로 데이터를 조회하는 방법과, Spring JDBC에서 Spring Data JPA로 애플리케이션을 마이그레이션하는 과정을 다룹니다.
기본적으로 CrudRepository는 데이터베이스에서 기본 키 또는 모든 레코드를 조회하는 메서드만 제공합니다. 하지만 커스텀 WHERE 조건을 기반으로 데이터를 조회하는 기능이 필요할 때는 Derived Query Methods를 사용해야 합니다.
Derived Query Methods는 메서드 이름을 기반으로 SQL 쿼리를 생성하는 기능입니다. 개발자가 직접 SQL 문을 작성할 필요 없이, 메서드 이름만으로 Spring Data JPA가 자동으로 적절한 SQL 쿼리를 생성합니다.
findByLastName(), findByEmail(), findByEmailAndLastName() 등커스텀 조건을 기반으로 데이터를 조회하려면 Repository 인터페이스에 새로운 추상 메서드를 정의해야 합니다.
public interface ContactRepository extends CrudRepository<Contact, Integer> {
List<Contact> findByStatus(String status);
}
findByStatus()는 status 필드를 기반으로 데이터를 조회합니다. findByStatus() 메서드를 ContactService 클래스에서 호출하여 데이터를 조회합니다.
public List<Contact> findOpenMessages() {
return contactRepository.findByStatus("OPEN");
}
Spring Boot 애플리케이션에서 JPA 기능을 활성화하기 위해 두 가지 중요한 설정을 추가해야 합니다.
@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.easybytes.easyschool.repository")
@EntityScan(basePackages = "com.easybytes.easyschool.model")
public class EasySchoolApplication {
public static void main(String[] args) {
SpringApplication.run(EasySchoolApplication.class, args);
}
}
@EnableJpaRepositories: 리포지토리 인터페이스가 위치한 패키지를 스캔하여 JPA 리포지토리를 활성화합니다.@EntityScan: 엔티티 클래스가 위치한 패키지를 스캔하여 JPA 엔티티를 인식합니다.이전 Spring JDBC 구현에서 사용된 RowMapper 클래스는 더 이상 필요하지 않습니다. Spring Data JPA는 엔티티 클래스의 설정을 기반으로 데이터베이스에서 가져온 데이터를 자동으로 매핑하기 때문에, RowMapper 클래스는 제거합니다.
@Entity, @Table, @Column 등의 JPA 애노테이션이 이를 대신합니다.@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
List<Contact> findByStatus(String status);
}
CrudRepository 인터페이스를 확장하여 커스텀 쿼리 메서드를 추가합니다.findByStatus() 메서드는 status 필드 값을 기반으로 데이터를 조회합니다.@Service
public class ContactService {
@Autowired
private ContactRepository contactRepository;
public List<Contact> findOpenMessages() {
return contactRepository.findByStatus("OPEN");
}
public boolean saveMessageDetails(Contact contact) {
boolean isSaved = false;
Contact savedContact = contactRepository.save(contact);
if (savedContact != null && savedContact.getContactId() > 0) {
isSaved = true;
}
return isSaved;
}
}
OPEN인 메시지들을 조회합니다.@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.easybytes.easyschool.repository")
@EntityScan(basePackages = "com.easybytes.easyschool.model")
public class EasySchoolApplication {
public static void main(String[] args) {
SpringApplication.run(EasySchoolApplication.class, args);
}
}
이번 강의에서는 Spring Data JPA의 Derived Query Methods 기능을 사용하여 커스텀 쿼리 메서드를 생성하고, 애플리케이션을 Spring JDBC에서 Spring Data JPA로 마이그레이션하는 방법을 배웠습니다. 이를 통해 SQL 쿼리를 작성하지 않고도 복잡한 데이터베이스 작업을 손쉽게 처리할 수 있게 되었습니다.