본문 바로가기

Spring Boot/Spring Boot

51 : JPA로 CRUD 기능 구현 (SpringbootApi)

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의 컬럼을 찾게된다