본문 바로가기
Spring boot

Springboot (Jpa를 사용하여 Crud기능 구현)

by z00h 2021. 10. 26.

 

기존의 mybatis로 쿼리를 작성하여 테이블을 불러오는 방식을

Jpa로 바꾸어 Board를 불러와 보았다.

 

 

 

우선 boardjpa 만들고 마찬가지로 controller,model,service 디렉토리 또한 만든다.

 

 

 

 

사실 loginByToken을 구현할때 member에서도 jpa를 사용하기도 하였다.

(member객체 : db테이블에서 선언하는 데이터타입)

 

 

 

 

 

BoardJpaController.java에서

경로를 boardjpa로 바꾸어 준다.

 

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;
import java.util.Optional;

@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);
    }

 

 

 

 

 

 

 

 

Board.java

테이블의 컬럼들을 선언한 객체이다.

@Entity 어노테이션을 사용하여 이 클래스를 jpa가 관리하도록 만들어 준다. (반드시 써야함)

integer : id값이 어떤 값인지 (참조형), int는 사용할 수 없음.

package kr.ac.daegu.springbootapi.boardjpa.model;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalTime;

@Entity
@Getter
@Setter
@Table(name = "board")
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "author")
    private String author;
    @Column(name = "subject")
    private String subject;
    @Column(name = "content")
    private String content;

    @Column(name = "writeDate")
    private LocalDate writeDate;
    @Column(name = "writeTime")
    private LocalTime writeTime;
    @Column(name = "readCount")
    private Integer readCount;
    @Column(name = "commentCount")
    private Integer commentCount;
    @Column(name = "password")
    private String password;
    @Column(name = "replyRootId")
    private Integer replyRootId;
    @Column(name = "depth")
    private Integer depth;
    @Column(name = "orderNum")
    private Integer orderNum;
    @Column(name = "isDel")
    private String isDel;

    public Board(Integer id,
                 String author,
                 String subject,
                 String content,
                 LocalDate writeDate,
                 LocalTime writeTime,
                 Integer readCount,
                 Integer commentCount,
                 String password,
                 Integer replyRootId,
                 Integer depth,
                 Integer orderNum,
                 String isDel) {
        this.id = id;
        this.author = author;
        this.subject = subject;
        this.content = content;
        this.writeDate = writeDate;
        this.writeTime = writeTime;
        this.readCount = readCount;
        this.commentCount = commentCount;
        this.password = password;
        this.replyRootId = replyRootId;
        this.depth = depth;
        this.orderNum = orderNum;
        this.isDel = isDel;
    }
}

 

 

 

 

 

 

 

 

 

BoardRepository

 

BoardRepository.java

crud기능을 제공해주는 인터페이스를 불러온다.

 

 

 

 

 

 

 

 

 

BoardService.java

 

BoardService.java

 

 

 

 

 

 

Service까지 입력후 실행을 시켰더니 에러가 발생하였다.

 

 

 

 

 

 

 

에러의 원인은 컬럼이름의 case형식이 달라 인식하지 못하는 것으로 나타났다.

 commentCount, writeTime, writeDate와 같이 지정된 것을 camelcase라고 하는데

jpa를 사용하게 되면 snakecase는 인식하지만 camelcase는 받아들이지 못하기때문에 발생한 문제이다.

 

 

 

 

 

application.profiles

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

application.profiles에 다음 코드를 추가하면 에러가 해결이 된다!