[Spring] JPARepository ,메서드 쿼리(Method Query)

류재성's avatar
Mar 20, 2024
[Spring] JPARepository ,메서드 쿼리(Method Query)
 
💡
JPARepository는 Spring Data JPA에서 제공하는 인터페이스 중 하나로, 데이터 액세스 계층에서의 CRUD(Create, Read, Update, Delete) 작업을 추상화하여 제공한다. JPARepository를 사용함으로써 개발자는 보다 적은 양의 코드로 데이터베이스 연산을 수행할 수 있습니다.
 
 
notion image
 
 

1. JPARepository 만들기

 
package shop.mtcoding.blog.user; import org.springframework.data.jpa.repository.JpaRepository; public interface UserJPARepository extends JpaRepository<User,Integer> { // <오브젝트 타입, pk의 타입> }
 
package shop.mtcoding.blog.board; import org.springframework.data.jpa.repository.JpaRepository; public interface BoardJPARepository extends JpaRepository<Board,Integer> { }
 
💡
UserJPARepository를 인터페이스로 만들고 JpaRepository 를 상속한다. JpaRepository<오브젝트타입,pk타입> 을 넣어야 한다. UserJPARepository 를 사용하면 기본적인 CRUD 를 쿼리 없이 실행할 수 있다.
 

2. JUnit 테스트하기

 
@DataJpaTest public class userJPARepositoryTest { @Autowired private UserJPARepository userJPARepository ; @Test public void save_test(){ // given User user = User.builder() .username("happy").password("1234").email("happy@nate.com").build(); // when userJPARepository.save(user); // then }
 
notion image
 
@Test public void findAll_test(){ // given // when //sort 를 사용해 정렬하기 List<User> userList = userJPARepository.findAll(Sort.by(Sort.Direction.DESC,"id")); System.out.println(userList); // then }
 
notion image
 
 
@Test public void delete_test(){ // given int id = 1 ; // when boardJPARepository.deleteById(id); // then em.flush(); }
 
 
notion image
 
 
 

3. 메서드 쿼리

 

3.1 메서드 쿼리란?

💡
메서드 쿼리(Method Query)는 Spring Data JPA에서 제공하는 기능 중 하나로, 인터페이스에 정의된 메서드의 이름만으로 쿼리를 생성하는 방법이다. 이 기능을 통해 개발자는 복잡한 쿼리문을 직접 작성하지 않고도, 메서드의 이름을 통해 필요한 데이터 접근 로직을 구현할 수 있다. 메서드 쿼리의 가장 큰 장점은 코드의 가독성과 유지보수성을 높일 수 있다는 것이다.
 
notion image
 
💡
메서드명을 카멜표기법으로 작성하면 자동으로 쿼리를 만들어준다.
 
package shop.mtcoding.blog.user; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; public interface UserJPARepository extends JpaRepository<User,Integer> { // <오브젝트 타입, pk의 타입> User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); }
 
@Test public void findByUsernameAndPassword_test(){ // given String username = "ssar"; String password = "1234"; // when userJPARepository.findByUsernameAndPassword(username,password); // then }
notion image
 
💡
메서드명으로 username과 password 를 변수로 한 쿼리를 만들어준다.
 

3.2 쿼리가 만들어지지 않는 경우

 
package shop.mtcoding.blog.board; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface BoardJPARepository extends JpaRepository<Board,Integer> { @Query("select b from Board b join fetch b.user where b.id = :id") Board findByIdJoinUser(@Param("id") int id); }
 
💡
@Query 어노테이션을 활용해 메서드 쿼리로 만들어지지 않는 쿼리를 직접 작성할 수 있다.
 
@Test public void findByIdJoinUser_test(){ // given int id = 1; boardJPARepository.findByIdJoinUser(id); }
 
notion image
 
 
 
 
 
 
Share article

{CODE-RYU};