MyBatis - mapper로 쿼리를 가지고 오는 방법 말고 jap를 사용하여 쿼리를 실행해보자.
이전까지 만들어왔던 SpringbootApi에 작성한다.
BoardJpa
boardjap 디렉토리 안에 board디렉토리 처럼 controller , model , service 구조로 디렉토리를 생성한다.
그리고 아래와 같이 파일을 생성해보자
- controller.BoardJapController
- service.BoardJpaService
- dto.BoardDTO
- model.Board
- model.BoardRepository (인터페이스)
model.Board
[중요] JPA로 데이터를 가져오려면 (테이블과 매핑하려면) 테이블 정의한 객체 Board를 생성하고
@ Entity 어노테이션을 사용해야한다
(아래는 Board.java에 들어간 어노테이션의 설명)
52 : @Entity, @Builder 어노테이션
@Entity @Entity가 붙은 클래스는 JPA가 관리하는 클래스로, 해당 클래스를 엔티티라고 한다 JPA를 사용해서 테이블과 매핑할 클래스는 반드시 @Entity 를 붙여야 한다 [주의사항] 기본 생성자 필수이다.
dwc04112.tistory.com
이때 @Column 어노테이션은 별다른 옵션을 설정하지 않는다면 생략이 가능하다.
여기서 int가 아니라 Integer를 쓴 이유는 BoardRepository인터페이스가 상속받는 CrudRepository
여기에 들어가는 제네릭에 참조형을 쓸 수 없어서이다.
위 사진 아래로 board테이블의 컬럼이 정의된다. (생략)
model.BoardRepository
CrudRepository : CRUD 기능을 제공하는 리파지토리 인터페이스이다.
CRUD란? Create, Read, Update, Delete의 앞 글자를 딴 약자. 웹 애플케이션을 개발하기 위해서
기본적으로 생성, 수정, 삭제, 읽기와 같은 기본 기능이 필요하다.
어떻게 사용할까?
find에 접두어를 계속 붙여 어떤 쿼리를 받아올지 작성한다.
위 사진에서는 SELECT * FROM Board 쿼리의 기능을 하는 findAll과
SELECT * from Board WHERE id = #{id} 쿼리의 기능을 하는 findBoardById 이 정의되어있다.
controller.BoardJapController
package kr.ac.daegu.springbootapi.boardjpa.controller;
import kr.ac.daegu.springbootapi.board.model.BoardDTO;
import kr.ac.daegu.springbootapi.boardjpa.model.Board;
import kr.ac.daegu.springbootapi.boardjpa.service.BoardJpaService;
import kr.ac.daegu.springbootapi.common.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value = "/boardjpa")
public class BoardJpaController {
public final BoardJpaService boardJpaService;
@GetMapping(value = "/")
public ApiResponse<BoardDTO> getBoardList(){
List<Board> list = boardJpaService.getBoardList();
return new ApiResponse(true, list);
}
Controller부분에서 board와 달라진 점은
매핑값이 /boardjpa 로 바뀐 것과 boardService에서 boardJpaService로 바뀐 점이다.
controller.BoardJapService
import kr.ac.daegu.springbootapi.board.model.BoardDTO;
import kr.ac.daegu.springbootapi.boardjpa.model.Board;
import kr.ac.daegu.springbootapi.boardjpa.model.BoardRepository;
import kr.ac.daegu.springbootapi.common.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@Service
@Slf4j
public class BoardJpaService {
public final BoardRepository boardRepository;
public List<Board> getBoardList() {
String isDelN = "N";
return boardRepository.findByIsDelEquals(isDelN);
}
boardDAO를 사용하지 않고 추가된 boardRepository가 final 형으로 선언 된 것을 볼 수 있다.
application.profiles
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
위 코드를 추가한다.
- DBMS의 컬럼 이름을 모두 DDL로 정의한 컬럼 이름값 그대로 알아듣도록 한다.
- ex) board 테이블의 commentCount 가 camelCase로 지정되어 있으므로
- JPA Entity 역할하는 Board.java의 멤버인 private Integer commentCount에서도 camelCase로 설정되어 알아듣도록.
- 위 설정을 하지않으면 JPA 기본 컬럼 매핑 설정인 snake_case로 변환되어서 DBMS의 컬럼을 찾게된다
'Spring Boot > Spring Boot' 카테고리의 다른 글
55 : JPA+Pageable 페이징처리 (Springboot + JPA) (0) | 2021.10.26 |
---|---|
53 : JPA로 삭제와 리스트 출력 review (Springboot + JPA) (0) | 2021.10.26 |
50 : /test - sequence diagram (0) | 2021.10.19 |
49 : /authenticate - Sequence Diagram (Springboot) (0) | 2021.10.14 |
45 : Springboot(글 수정 기능) (0) | 2021.10.10 |