Spring(IntelliJ + Boot) - Spring Data JPA

songmin jeon·2024년 3월 22일
0
  • com.example.springboot 에 service 패키지 만들기

    • BookService 생성
  • 레파지토리 연결 =>

@Autowired
private BookRepository repository;

  • TestController 서비스 등록

@Autowired
private BookService bookService;

  • 또는 (생성자로 주입받는 방법)

  • TestController 코드 작성
    @GetMapping("/list")
    public String list(Model model){
        List<Book> list = bookService.list();
        model.addAttribute("list", list);
        return "list"; // list.html
    }

  • application.yml 에 들어가서 코드 다음과 같이 변경
    • 타임리프 세팅
      - cache: false = 캐쉬를 매번 새로운 것으로 가져오겠다.
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    cache: false

  • templates 폴더에서 index.html 복사해서 복붙 이름은 list로 변경
<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org" lang="en">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <td>번호</td>
        <td>제목</td>
        <td>가격</td>
        <td>저자</td>
    </tr>
    <tr th:each= "book : ${list}">
        <td th:text="${book.id}">번호</td>
        <td><a th:href="@{/detail/{id}(id=${book.id})}" th:text="${book.title}">제목</a></td>
        <td th:text="${book.price}">가격</td>
        <td th:text="${book.name}">저자</td>
    </tr>
</table>
</body>
</html>


상세보기 페이지 만들어주기

  • BookService 에서 코드 작성
    • orElse(null) : 있으면 값이 넘어가고 없으면 null이 넘어감
    public Book detail(Long id){
        Optional<Book> optional = repository.findById(id);
        return optional.orElse(null);
    }

  • TestController에 코드 작성
    @GetMapping("/detail/{id}")
    public String detail(@PathVariable Long id, Model model){
        Book book = bookService.detail(id);
        model.addAttribute("book", book);
        return "detail"; // detail.html
    }
  • list.html 복붙 하여 detail.html 수정하여 생성
<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org" lang="en">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <td>번호</td>
        <td th:text="${book.id}">번호</td>
    </tr>
    <tr>
        <td>제목</td>
        <td th:text="${book.title}">제목</td>
    </tr>
    <tr>
        <td>가격</td>
        <td th:text="${book.price}">가격</td>
    </tr>
    <tr>
        <td>저자</td>
        <td th:text="${book.name}">저자</td>
    </tr>
</table>
</body>
</html>

Spring Data JPA

  1. 정해진(제공해준) 메서드 사용 (JpaRepository)
  2. 쿼리메서드 사용(find+By+멤버변수) -> 여러조합(?)
  • JPQL : SQL과 유사한 쿼리 언어입니다
  1. JPQL(Java Persistence Query Language) : Entity 기반
  2. JPQL(Java Persistence Query Language) : SQL기반
  3. Querydsl을 사용하는 방법

JPQL

  • JPQL 이란?
  • (Java Persistence Query Language) 의 약자
  • 사용자 정의 SQL (SQL과 유사한 쿼리 언어 입니다.)
    • @Query() 어노테이션 사용

실습 : 가격이 10000원 이상인 책을 검색

  • BookRepository 에서
package com.example.springboot.repository;

import com.example.springboot.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

public interface BookRepository extends JpaRepository<Book,Long> {

    // 1. 정해진 메소드 사용(JpaRepository)
    // findAll() --> select * from Book
    // save() --> insert into 가 된다. 기존에 데이터가 없으면 insert
    // save() --> Update 기능도 한다. 구분은 기존에 데이터가 있으면 update
    // findById(id) --> select * from Book where id = #{id}
    // deleteById(id) --> delete from Book where id = #{id}


    // 2. 쿼리 메소드 사용
    // (find + By + 맴버변수 의 조합으로 생성) -> 여러 조합방식이 있음
    // 책 제목에 해당하는 책 정보 1개를 가지고 오기 -> 해당 메소드를 만들어줘야함
    // --> public Optional<Book> findByTitle(String title);
    public Optional<Book> findByPrice(int price); // select * from Book where price = price


    // 3. JPQL(Java Persistence Query Language) : Entity 기반
    // 사용자정의 SQL과 유사한 쿼리 언어 입니다.

    //SELECT * FROM Book WHERE price <= 10000
    //@Query("SELECT b FROM Book b WHERE b.price >= :price") // Entity 기반
    //public List<Book> getByPrice(@Param("price") int price); // 가격이 10000원 이상인 책을 검색

    @Query("SELECT b FROM Book b WHERE b.price >= :price And b.page >= :page") // Entity 기반
    public List<Book> getByPriceAndPage(@Param("price") int price, @Param("page") int page); // 가격이 10000원 이상인 책을 검색

    
    // 4. JPQL(Java Persistence Query Language) : SQL 기반
    @Query(value = "SELECT * FROM Book WHERE price >= ?1", nativeQuery = true) // nativeQuery = true : 순수 sql로 쓰겠다는 의미
    public List<Book> getByPrice(int price);

}
profile
제가 한 번 해보겠습니다.

0개의 댓글