[7] CRUD 게시판 프로젝트 - Spring Boot MyBatis 추가 및 API 구현

2023. 7. 16. 14:06Github 프로젝트/게시판프로젝트

728x90
반응형
SMALL

Github 저장소 :https://github.com/BerkleyLim/project_board

 

GitHub - BerkleyLim/project_board: Spring Boot + React CRUD형 게시판 만들기 프로젝트 안내서

Spring Boot + React CRUD형 게시판 만들기 프로젝트 안내서. Contribute to BerkleyLim/project_board development by creating an account on GitHub.

github.com

 

개발 환경은

Front : React 기반

Back-End : Spring Boot 기반

DB : My-SQL 기반

 

 

지난 시간까지 SQL문 구현과 Spring Boot 환경 설정까지 진행하였습니다.

이번 시간에는 SQL문을 Spring Boot에 API를 만들어 보도록 하겠습니다.

 

 

1. 먼저 response 값으로 사용할 java 파일 구현해봅니다.

 

entity/Board.java

이 파일은 Response Entity에 필요한 데이터 값으로 사용하는 파일 중 하나입니다.

여러가지 방법 또한 있겠지만, 이 파일을 생성한 이유는 Board Entity용 파일을 사용하므로 Mybatis의 SQL문 값을 반환하는 용도로 쓸 수 있습니다.

package com.example.board_back.entity;

import com.fasterxml.jackson.annotation.JsonInclude;

import lombok.Data;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Board {
  Long bno;
  String title;
  String contents;
}

 

 

 

2. SQL문을 MyBatis에 집어 넣기

지난 시간에는 select 문으로 Spring Boot 연동 되어있는지의 대해서 확인 작업을 진행해 왔습니다.

MyBatis의 대한 내용은 MyBatis의 공홈을 들어가서 참조하시고, 이어서 insert, update, delete가 포함된 간단한 CRUD를 집어 넣어보겠습니다. 

select 문에서는 resultType="Board" 라는 것은 앞전에 생성한 Board.java의 값을 그대로 반환 시킨다는 것을 의미합니다.

 

resource/mapper/BoardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "//mybatis.org/DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.board_back.mapper.BoardMapper">
  
  <!-- id : Mapper 인터페이스에 사용할 메소드명 -->
  <!-- resultType : Response Parameter에 반환할 변수 값의 대한 내용 -->
  <!-- parameterType : Request Parameter에 들어갈 변수 값을 저장된 내용 -->

  <!-- 전체 파라미터 조회 관련 게시글 -->
  <select id="selectList" resultType="Board">
    select * from board
  </select>

  
  <!-- mybatis에서 param1, param2 를 이용하여 삽입이 가능합니다. -->
  <!-- 이는 mapper에서 첫번째 파라미터가 title이고, 두번째 파라미터는 contents입니다. -->
  <!-- 생성 sql문  -->
  <insert id="insertBoard">
    <!-- insert into scroll_board (title, contents) value (#{title}, #{contents}) -->
    insert into board (title, contents) value (#{param1}, #{param2})
  </insert>

  <!-- 현재 내용 수정 sql문 -->
  <update id="updateBoard" parameterType="Board">
      update board set
      title=#{title} ,
      contents=#{contents} 
    where bno = #{bno}
  </update>

  <!-- 현재 내용을 삭제하는 sql문 -->
  <delete id="deleteBoard">
    delete from board where bno=#{bno}
  </delete>

</mapper>

 

3. xml 파일을 Mapper 인터페이스에 연동하기

xml에서 id 값과 parameter 값이 필요한 토대로 업데이트를 진행해보겠습니다.

package com.example.board_back.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import com.example.board_back.entity.Board;

@Repository
@Mapper
public interface BoardMapper {
  /**
   * 각 메소드 이름은 BoardMapper.xml에서 지정한 메소드 별로 반드시 지어줘야 합니다.
   */

  // 전체 파라미터 조회 관련 게시글
  List<Board> selectList();

  // 생성 sql문
  Integer insertBoard(String title, String contents);

  // 현재 내용 수정 sql문
  Integer updateBoard(Board board);

  // 현재 내용을 삭제하는 sql문
  Integer deleteBoard(Long bno);
}

 

 

4. Service에서 Mapper 메소드를 연동하기

Service에서는 각각 Mapper에서 SQL문을 활용한 메소드를 연동하는 역할을 수행합니다

주로, 서비스 로직이라고 불리는데, Controller에서 작업을 진행해주는 것도 좋지만 입출력과 응답처리 해주는 용도로 사용해주고, 로직 자체는 실제 기능을 어떤식으로 제공하는지에 대해서만 집중하기 위해 Service에서만 처리하는 것으로 활용하시면 됩니다.

이것은 간단히 유지보수 하기 위해 구분 짓는 것으로 추정됩니다. (이보다 더 잘 아는 선배 개발자님들께 피드백을 받습니다.)

현재는 간단한 CRUD 게시판을 구현하므로 Mapper의 대한 결과 값만 처리하는 것으로 합니다.

package com.example.board_back.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.board_back.entity.Board;
import com.example.board_back.mapper.BoardMapper;

@Service
public class BoardService {
  @Autowired
  BoardMapper boardMapper;

  /**
   * 각 Mapper별의 응답값을 불려오고, 앞으로의 로직을 짤 때는 Controller단이 아닌
   * Service 단에서 별도의 로직과 알고리즘을 구현 하는 형태로 진행합니다.
   */

  // 전체 조회 로직
  public List<Board> selectList() {
    return boardMapper.selectList();
  }

  // 게시물 삽입 로직
  public Integer insertBoard(String title, String contents) {
    return boardMapper.insertBoard(title, contents);
  }

  // 게시물 수정 로직
  public Integer updateBoard(Board board) {
    return boardMapper.updateBoard(board);
  }

  // 게시물 삭제 로직
  public Integer deleteBoard(Long bno) {
    return boardMapper.deleteBoard(bno);
  }
}

 

 

5. Controller에서 해당 API를 받아오기

앞써 말씀했듯이, Controller에서는 입출력 및 응답만 관련된 로직으로 구성합니다.

API란 Application Programming Interface의 줄인 말이고, Spring 에서는 URI를 통해 MVC 패턴을 처리합니다.

Controller에서 URI의 따라 해당 기능을 제어하는 형태로 쓰이고 있으며,

본 프로젝트는 React + Spring Boot 기반으로 만들어진 게시판이기 때문에

현재는 View 부분은 React에서만 처리하고, Spring Boot는 Model과 Controller에서 처리합니다.

Controller를 통해 각각의 API를 추가하도록 하겠습니다.

package com.example.board_back.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.board_back.entity.Board;
import com.example.board_back.service.BoardService;

// 컨트롤러 단
// 현재는 Default API는 
// "/api/board"
@RestController
@RequestMapping("/api/board")
public class BoardController {
  @Autowired
  BoardService boardService;

  // API : /api/board/select/list
  // 전체 조회를 이용한 API 기능
  @GetMapping("/select/list")
  public List<Board> selectList() {
    return boardService.selectList();
  }

  // API : /api/board/insert/board
  // 게시판 삽입을 이용한 API 기능
  @PostMapping("/insert/board")
  public Integer insertBoard(@RequestBody Board board) {
    System.out.println(board.toString());
    return boardService.insertBoard(board.getTitle(), board.getContents());
  }

  // API : /api/board/update/board
  // 게시판 수정을 이용한 API 기능
  @PostMapping("/update/board")
  public Integer updateBoard(@RequestBody Board board) {
    System.out.println("수정");
    System.out.println(board.toString());
    return boardService.updateBoard(board);
  }

  // API : /api/board/delete/board
  // 게시판 삭제를 이용한 API 기능
  @PostMapping("/delete/board")
  public Integer deleteBoard(@RequestBody Board board) {
    return boardService.deleteBoard(board.getBno());
  }
}

 

 

6. POSTMAN 을 이용한 API 테스트

 

현재 

Get 방식으로 Select문만 구현했고,

Post 방식으로 Update, Delete, Create로 구현하였습니다.

 

5번에서 얻은 API 명을 이용하여 Postman으로 이용합니다.

 

1) Create 

- API 명 : api/board/insert/board

- Method : POST

- request body 

{
    "title":"게시물생성",
    "contents":"게시물내용생성"
}

 

 

2)  Select

- API 명 : api/board/select/list

- METHOD : GET

 

3) Update 

- API 명 : api/board/update/board

- Method : POST

- request body 

{
    "bno": 2,
    "title":"게시물수정",
    "contents":"게시물내용수정"
}

 

 

4) delete 

- API 명 : api/board/delete/board

- Method : POST

- request body 

{
    "bno": 2
}

 

 

 

아래와 같이 Spring Boot 구현까지 완료를 하였을 경우, 게시판 관련 API 준비 완료 하였습니다.

다음 시간에는 Front에서 Spring Boot에서 구현한 API를 직접 연동하도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST