-
[Spring] JPA Repository 커스텀하기 - Repository 분리, 쿼리 방식 다르게 등에 사용JAVA/Spring(Springboot) 2023. 4. 4. 10:58728x90
JPA Repository 한 파일에 메서드를 정의하게 되면 중요한 핵심 로직과 단순한 조회 로직 등
여러 메서드가 섞여서 저장되기 때문에 유지보수하기에 어려운 점이 있다.또한 한 Repository 안에서 Spring data jpa 를 사용할 수도 있고
기본 myBatis를 사용할 수도 있고, jdbc template를 사용할 수도 있다면 Repository 분리가 필요하게 된다.
Repository 는 하나로 사용하되, custom된 interface를 상속받으면 된다.Repository 최종 형태 코드로 살펴보자.
아래를 보면 MemberRepository 에 여러 메서드가 조회되어 있다.public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findUser(String username, int age); @Modifying(clearAutomatically = true) @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); }
여기서 조회하는 findUser 메서드를 분리시켜보자.
우선, MemberRepositoryCustom 인터페이스를 생성한다.
public interface MemberRepositoryCustom { List<Member> findUser(String username, int age); }
MemberRepositoryCustom을 구현하는 MemberRepositoryImpl을 생성하자.
반드시 클래스명은 XXXRepositoryImpl 이어야 Spring data jpa 에서 구현체로 인식할 수 있다.@RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { private final EntityManager EntityManager; @Override public List<Member> findUser(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age = :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } }
마지막으로 MemberRepository 인터페이스를 수정하자.
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom { @Modifying(clearAutomatically = true) @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); }
728x90728x90'JAVA > Spring(Springboot)' 카테고리의 다른 글
[Spring] QueryDsl 페이징 쿼리 사용법 (0) 2023.04.08 [SpringBootTest] AssertJ List의 원하는 컬럼만 가져와서 포함됐는지 안됐는지 확인하기 - extracting/containsExactly (0) 2023.04.05 [Spring] MessageResolver 의 메시지 코드 (0) 2023.02.25 [Spring] PRG(Post-Redirect-Get) 할 때 PathVariable, Url Encoding 신경쓰기 - RedirectAttribute (0) 2023.02.21