Spring boot Repository

김정훈·2024년 7월 24일

Spring

목록 보기
20/24
post-thumbnail

Repository

DAO 클래스 대체

데이터베이스 접근을 간편하게 할 수 있도록 여러 CRUD 메서드를 기본적으로 제공하는 기능을 갖고 있습니다. JpaRepository를 사용하면 별도의 구현 없이 간단히 데이터베이스 조작을 할 수 있습니다.

1. JpaRepository

인터페이스 : 상속, (CrudRepository의 하위 인터페이스)
JpaRepository은 제네릭타입이기 때문에 기본자료형은 받지 못한다.

public interface MemberMemberRepository extends JpaRepository<Member, Long> {
    
}

참고)

find로 시작하는 메서드 : 영속 상태
get로 시작하는 메서드 : 비영속 상태 - 상태변화 감지 ❌

2. JpaRepository에서 지원하는 메서드

S save(S entity) : persist(...) : 영속성 상태로 추가
S saveAndFlush(S entity) : persist() + flush()
List<S> saveAll(Collection<S> ...)
List<S> saveAllAndFlush(....)

void delete(T entity) : remove(...)
count()
Iterable findAll()
S findOne(..)
S findById(기본키)
flush() : 상태 변화 감지 -> DB 에 반영

쿼리 메서드

find 할때 내가 원하는 데이터를 찾기위해 사용

Pageable

페이징 기초 정보

public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findByEmailContaining(String keyowrd, Pageable pageable);
}
	@Test
    void test3(){
        Pageable pageable = PageRequest.of(1, 3);
        Page<Member> data = memberRepository.findByEmailContaining("ser",pageable);

        List<Member> items = data.getContent();
        long total = data.getTotalElements();
        System.out.printf("총 갯수 : %d\n", total);
        items.forEach(System.out::println);

    }


@Query 애노테이션

JPQL(Java Persistence Query Language)

  • 엔티티 기준의 SQL, 조회 결과 영속성 상태
KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname... where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname... where x.lastname = ?1 or x.firstname = ?2
Is, EqualfindByFirstname
findByFirstnameIs
findByFirstnameEquals
... where x.firstname = ?1
BetweenfindByStartDateBetween... where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan... where x.age < ?1
LessThanEqualfindByAgeLessThanEqual... where x.age <= ?1
GreaterThanfindByAgeGreaterThan... where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual... where x.age >= ?1
AfterfindByStartDateAfter... where x.startDate > ?1
BeforefindByStartDateBefore... where x.startDate < ?1
isNull, Null
isNonNull
findByAge(is)Null... where x.age is null
NotNullfindByAge(Is)NonNull... where x.age not null
LikefindByFirstnameLike... where x.firstname like ?1
NotLikefindByFirstnameNotLike... where x.fistname not like ?1
StartingWithfindByFirstnameStartingWith... where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith... where x.firstname like ?1 (parameter bound prepended %)
ContainingfindByFirstnameContaining... where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc... where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot... where x.lastname <> ?1
InfindByAgeIn(Collection\<Age> ages)... where x.age in ?1
NotInfindByAgeNotIn(Collection\<Age> ages)... where x.age not in ?1
TruefindByActiveTrue()... where x.active = true
FalsefindByActiveFalse()... where x.active = false
IgnoreCasefindByFirstnameIgnoreCase... where UPPER(x.firstname) = UPPER(?1)

MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long> {
    //Member findMemberByEmail(String email);
    //Optional<Member> findByEmail(String eamil); //null값 처리를 위해 Optional사용 가능 
    Member findByEmail(String eamil);
}
@SpringBootTest
@TestPropertySource(properties = "spring.profiles.active=test")
public class Ex06 {

    @Autowired
    private MemberRepository memberRepository;

    @BeforeEach
    void init() {
        List<Member> members = IntStream.rangeClosed(1, 10).mapToObj(i -> Member.builder()
                .email("user" + i + "@test.org")
                .password("123456768")
                .userName("사용자" + i)
                .authority(Authority.USER)
                .build()).toList();
        memberRepository.saveAllAndFlush(members);
    }

    @Test
    void test1(){
        Member member = memberRepository.findByEmail("user2@test.org");
        System.out.println(member);
    }
}


public interface MemberRepository extends JpaRepository<Member, Long> {
    //Member findMemberByEmail(String email);
    //Optional<Member> findByEmail(String eamil); //null값 처리를 위해 Optional사용 가능
    List<Member> findByEmailContainingAndUserNameContainingOrderByCreatedAtDesc(String eamil, String username);
}
	@Test
    void test2(){
        List<Member> members = memberRepository.findByEmailContainingAndUserNameContainingOrderByCreatedAtDesc("ser", "용");
        members.forEach(System.out::println);
    }
profile
안녕하세요!

0개의 댓글