티스토리 뷰

 

간혹 개발 중에 JpaRepository가 아닌 사용자가 직접 구현한 쿼리들.. 순수 JPA 또는 mybatis, 데이터베이스 직접 커넥션 등을 사용하고 싶을 때가 있다.

 

하나의 레퍼지토리로 엮어 사용하면 되는데 

1. 인터페이스를 먼저 만들고

2. 상속받아 구현체를 만든 뒤에

3. JPA레퍼지토리를 상속받은 레퍼지토리에 상속시키면 된다.

 

1.

package study.datajpa.repository;

import study.datajpa.entity.Member;

import java.util.List;

public interface MemberRepositoryCustom {

    List<Member> findMemberCustom();
}

 

2.

package study.datajpa.repository;

import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import study.datajpa.entity.Member;

import java.util.List;

@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom{

    private final EntityManager em;

    @Override
    public List<Member> findMemberCustom() {
        return em.createQuery("select m from Member m", Member.class).getResultList();
    }
}

 

3.

....

import org.hibernate.boot.model.source.spi.AttributePath;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.*;
import org.springframework.data.repository.query.Param;
import study.datajpa.dto.MemberDto;
import study.datajpa.entity.Member;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.jar.Attributes;

public interface MemberRepository extends JpaRepository<Member,Long>,MemberRepositoryCustom {

    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
    
    ....

 

자바에서 작동하는 것이 아니다. 순수 JPA안에서 작동한다.

 

김영한 개발자님은 QueryDSL을 사용할 때에 사용한다고 한다.

 

꼭 지켜야 하는 것은 2번은 꼭 ~~~Impl을 붙여서 사용해야 한다.

(예: MemberRepository가 JPARepository를 상속받았다면, 꼭 custom 인터페이스의 구현체는 MemberRepositoryImpl이 되어야한다.)

 

이름을 변경하고 싶으면 바꿀 수도 있다.

(하지만 변경하지 않고 관례를 따르는 것이 좋다.  유지보수 시에 좋기 때문에)

 

JpaRepository로 완전히 해결되지 않을 때에 사용하면 된다. 느낌이 올 것이다. 항상 필요한 것은 아니다.

 

1. 도구를 안다고 무조건 사용해야 하는 것은 아니다.

2. 김영한 개발자님은 화면에 맞출 경우에는 아예 레퍼지토리를 따로 만들어서 사용한다. 꼭 저것에 맞출 것은 아니다.

3. 사용자 정의 인터페이스는 결국에는 JpaRepository를 키우는 것이지 분리가 아니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함