Spring Data 프레임워크

김정훈·2024년 7월 10일

Spring

목록 보기
7/24

Spring Data JDBC

  • 쿼리 메서드 제공
  • CrudRepository 인터페이스를 상속 받은 인터페이스 Repository

쿼리메서드

쿼리 메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있습니다.
.
쿼리메서드를 이용할 때 가장 많이 사용하는 문법으로 find를 사용합니다. 엔티티의 이름은 생략이 가능하며, By 뒤에는 검색할 때 사용할 변수의 이름을 적어줍니다.

쿼리메서드 설명

1. 의존성

implementation 'org.springframework.data:spring-data-jdbc:3.3.1'

2. docs

Spring Data JDBC docs

3. DBConfig

@Configuration
@EnableTransactionManagement
@MapperScan("org.choongang")
@EnableJdbcRepositories("org.choongang")
public class DBConfig extends AbstractJdbcConfiguration {

    @Bean
    public NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource){
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

4. Member

CrudRepository는 제네릭으로 되어있기 때문에 기본키가 되는 값은 반드시 java.lang변수로 설정해야한다.

@Data
@Builder
@NoArgsConstructor @AllArgsConstructor
public class Member {
    @Id //기본키 설정
    private Long seq;
    private String email;
    private String password;
    private String userName;
    private LocalDateTime regDt;
}

5. MemberRepository 인터페이스

키값조회가 아닌 다른값으로 조회를 위해 쿼리메서드를 선언할 수 있다.

public interface MemberRepository extends CrudRepository<Member, Long> {
    Member findByEmail(String email);
    List<Member> findByUserNameContaining(String keyword);
    List<Member> findByUserNameContainingAndEmailContainingOrderByRegDtDesc(String ke1, String key2);
}

6. Test

@SpringJUnitWebConfig
@ContextConfiguration(classes = MvcConfig.class)
public class MemberRepositoryTest {

    @Autowired
    private MemberRepository repository;

    @Test
    void test1(){
        List<Member> members = (List<Member>) repository.findAll();
        members.forEach(System.out::println);
    }

    @Test
    void test2(){
        Member member = Member.builder()
                .seq(1L)
                .email("user01@test.org")
                .password("12345678")
                .userName("사용자06(수정)")
                .build();

        repository.save(member);
    }

    @Test
    void test3(){
        Member member = repository.findById(1L).orElse(null);
        System.out.println(member);

        repository.delete(member);
    }

    @Test
    void test4(){
        Member member = repository.findByEmail("user02@test.org");
        System.out.println(member);
    }

    @Test
    void test5(){
        List<Member> members =repository.findByUserNameContaining("용자");
        members.forEach(System.out::println);
    }

    @Test
    void test6(){
        List<Member>  members = repository.findByUserNameContainingAndEmailContainingOrderByRegDtDesc("용자","user");
        members.forEach(System.out::println);
    }
}

@Query

public interface MemberRepository extends CrudRepository<Member, Long> {
    @Query("SELECT * FROM MEMBER WHERE USER_NAME LIKE :param1 AND EMAIL LIKE :param2 ORDER BY REG_DT DESC")
    List<Member> getMembers(@Param("param1") String key1, @Param("param2") String key2);
}
@SpringJUnitWebConfig
@ContextConfiguration(classes = MvcConfig.class)
public class MemberRepositoryTest {

    @Autowired
    private MemberRepository repository;

    @Test
    void test7(){
        List<Member> members = repository.getMembers("%용자%", "%user%");
        members.forEach(System.out::println);
    }
}

@Table, @Column

  • @Table : 테이블명을 변경, 클래스명과 테이블명이 일치하지않을경우 사용.
  • @Column :
@Data
@Builder
@NoArgsConstructor @AllArgsConstructor
@Table
public class Member {
    @Id //기본키 설정
    @Column("ID")
    private Long seq;
    private String email;
    private String password;
    private String userName;
    private LocalDateTime regDt;
}

페이징

Pageable 인터페이스
PageRequest 구현 클래스
Page 자료형

public interface MemberRepository extends CrudRepository<Member, Long> {
    Member findByEmail(String email);
    Page<Member> findByUserNameContaining(String keyword, Pageable pageable);
}
@Test
void test8(){
	Pageable pageable = PageRequest.of(0,3);
	Page<Member> data = repository.findByUserNameContaining("용자", pageable);

	List<Member> members = data.getContent();
	long total = data.getTotalElements(); //조회된 전체 레코드 개수
	int pages = data.getNumber();

	members.forEach(System.out::println);
	System.out.println(total + "    " + pages);
}

ORDER BY

@Test
void test8(){
    //Pageable pageable = PageRequest.of(0,3);
    Pageable pageable = PageRequest.of(0, 3, Sort.by(desc("regDt"),asc("email")));
    Page<Member> data = repository.findByUserNameContaining("용자", pageable);

    List<Member> members = data.getContent();
    long total = data.getTotalElements(); //조회된 전체 레코드 개수
    int pages = data.getNumber();

    members.forEach(System.out::println);
    System.out.println(total + "    " + pages);
}
profile
안녕하세요!

0개의 댓글