Skip to content

06) helloSpringDataJpa

choi jae ho edited this page Jun 2, 2021 · 13 revisions

๐Ÿ“‹ Spring Data JPA

1. Creating DAO

๋ฌธ์ œ

  • ๋‹ค๋ฅธ entity ๋ฅผ ๋งŒ๋“ค๋•Œ ์œ ์‚ฌํ•œ ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต.
  • DAO ํŒจํ„ด์ด ๊ฐ™๋‹ค๋Š” ์ .
  • ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต image
  • entity type , primary key๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋‹ค๋ฅธ entity ๋„ ๋‹ค๋ฅผ ๊ฒƒ์ด ์—†๋‹ค.

2. Spring Data JPA

์žฅ์ 

  • ํ‹€์— ๋ฐ•ํ˜€์žˆ๋Š” DAO code๋ฅผ ์ตœ์†Œํ™”,
  • DAO๋ฅผ ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค

์ œ๊ณต๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

image

  • Spring DATA JPA ๋Š” repository interfaces ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    1. CrudRepository
    1. PagingAndSortingRepository
    1. JpaRepository

4. Query Method

  • id๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ์กฐํšŒํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด์„œ ์กฐํšŒํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • Spring Data JPA ๋Š” CRUD operations๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • method names์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

ex)

  • User findByEmail(String email), ์ด๋ฉ”์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์ ์œผ๋กœ SQL ์ž๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค๋Š”์ .
  • User findByEmailAndPassword(String email, String password) ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  • return ํƒ€์ž…์ด ํ•˜๋‚˜ ์ด์ƒ์ด๋ฉด, List or Page

image

  • find By + ๋ณ€์ˆ˜์ด๋ฆ„ ์œผ๋กœ ๋„ฃ์–ด ์ฃผ๋ฉด ์ž๋™์ƒ์„ฑ๋œ๋‹ค.

์ฐธ์กฐ

image

  • ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ, ๊ฒ€์ƒ‰ํ• ๋•Œ ์ฐธ์กฐ

JPA vs Spring Data JPA

image

์˜ˆ์‹œ

1) ๋‹ค์ˆ˜๊ฐœ์˜ ์กฐ๊ฑด ๊ธฐ์ˆ , ๊ฒŒ์‹œํŒ์—์„œ title ํ˜น์€ content์—์„œ ํŠน์ • ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ

public interface BoardRepository extends JpaRepositoty<Board, Long> {

    List<Board> findByTitleContainingOrContentContaining(String title, String content);
}
@SpringBootTest
public class QueryMethodTest {

    @Autowired
    private BoardRepository repo;

    @Test
    public void testFindByTitleContainingOrContentContaining() {

       List<Board> boardList = repo.findByTitleContainingOrContentContaining(โ€œ17โ€, โ€œ17โ€);

       for(Board board: boardList) {  System.out.println(โ€œ๏ƒ โ€ + board.toString() )}; 
    }
}

2) Pagination, ๊ฒŒ์‹œํŒ์—์„œ title๋ณ€์ˆ˜์— โ€œํ•œ์„ฑ๋Œ€โ€ ๋ผ๋Š” ๊ฒ€์ƒ‰์–ด๊ฐ€ ํฌํ•จ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์กฐํšŒ

public interface BoardRepository  extends JpaRepositoty<Board, Long> {

    List<Board> findByTitleContaining(String searchKeyword, Pageable paging);
}
@Test
public void testFindByTitleContaining() {
    
      Pageable paging = PageRequest.of(0, 5);
      List<Board> boardList= repo.findByTitleContaining(โ€œํ•œ์„ฑ๋Œ€โ€, paging);

      for(Board board: boardList) {
	System.out.println(โ€œ->โ€ + board.toString() );
      }
}

3) Pagination and Sort, ๊ฒŒ์‹œํŒ์—์„œ title๋ณ€์ˆ˜์— โ€œํ•œ์„ฑ๋Œ€โ€์ด๋ผ๋Š” ๊ฒ€์ƒ‰์–ด๊ฐ€ ํฌํ•จ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๊ฒ€์ƒ‰ โ€œseqโ€ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‚ด๋ฆผ ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ

public interface BoardRepository extends JpaRepositoty<Board, Long> {

    List<Board> findByTitleContaining(String searchKeyword, Pageable paging);
}
@Test
public void testFindByTitleContaining( ) {

     Pageable paging = PageRequest.of(0,5, Sort.Direction.DESC, โ€œseqโ€);
     List<Board> boardList= repo.findByTitleContaining(โ€œํ•œ์„ฑ๋Œ€โ€, paging);

    for(Board board: boardList) {
	System.out.println(โ€œ->โ€ + board.toString() );
}

5) Return Type: List -> Page , Page ๊ฐ์ฒด๋Š” ํŽ˜์ด์ง• ์ฒ˜๋ฆฌํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์ œ๊ณต

public interface BoardRepository  extends CrudRepositoty<Board, Long> {

    Page<Board> findByTitleContaining(String searchKeyword, Pageable paging);
}
@Test
public void testFindByTitleContaining() {

      Pageable paging = PageRequest.of(0,5, Sort.Direction.DESC, โ€œseqโ€);
      Page<Board> pageInfo= repo.findByTitleContaining(โ€œํ•œ์„ฑ๋Œ€โ€, paging);

      System.out.println(โ€œPage size: โ€    + pageInfo.getSize() );
      System.out.println(โ€œTotal Pages: โ€ + pageInfo.getTotalPages() );
      System.out.println(โ€œTotal Count: โ€ + pageInfo.getTotalElements() );

      List<Board> boardList=pageInfo.getContent();

      for(Board board: boardList) {
	     System.out.println(โ€œ->โ€ + board.toString() );
      }
}

5. @Query Annotation

  • method ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฑฐ๋‚˜, ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
@Query("select u from User u where u.email=?1 and u.password=?2 and u.enabled=true") 
User findByEmailAndPassword(String email, String password); 

@Query : JPQL

1) Positional parameter binding

public interface BoardRepository extends JpaRepositoty<Board, Long> {
    //entity์™€ ํ•„๋“œ๋„ค์ž„ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์‹ ๊ฒฝ์“ด๋‹ค.
    @Query(โ€œSELECT b From Board b โ€œ
                + โ€œWHERE b.title like %?1% ORDER BY b.seq DESCโ€)
    List<Board> queryAnnotationTest1(String searchKeyword);
}
@Test
Public void QueryAnnotationTest() {

     List<Board> boardList=repo.queryAnnotationTest1(โ€œํ•œ์„ฑ๋Œ€โ€);

     for(Board board: boardList) {
	System.out.println(โ€œ->โ€ + board.toString() );
     }
}

2) Named Parameter binding

//์ด๋ฆ„์„ ๊ธฐ๋ฐ˜ํ•ด์„œ ๋„ฃ๋Š”๋‹ค.
public interface BoardRepository extends CrudRepositoty<Board, Long> {

    @Query(โ€œSELECT b From Board b WHERE b.title like %:searchKeyWord% โ€œ
         + โ€œORDER BY b.seq DESCโ€)
    List<Board> queryAnnotationTest1(@Param(โ€œsearchKeywordโ€)String searchKeyword);
}

@Query : native

public interface BoardRepository extends JpaRepositoty<Board, Long> {

    @Query(value=โ€œselect seq, title from board โ€œ
                + โ€œwhere title like โ€˜%โ€™ || ?1 โ€˜%โ€™ โ€œ
 	   + โ€œorder by seq decโ€, nativeQuery=true);

    List<Object[]> queryAnnotationTest2(String searchKeyword);
}
Clone this wiki locally