이번 포스팅에서는 Spring Boot 프로젝트에 MySQL을 연결하고, JPA를 활용하여 간단한 게시판 CRUD 기능을 구현하는 과정에 대해서 작성을 한다. 마지막으로 작성한 코드를 테스트하는 방법까지 알아보도록 하겠다.
전 포스팅에서 Spring Initializr로 프로젝트 생성한 내용에 몇가지가 추가되어야 하므로 프로젝트를 새로 생성해주겠다.

MySQL 설치 및 실행
MySQL이 설치되어 있지 않다면 MySQL 공식 사이트에서 설치.
데이터베이스 생성
MySQL CLI나 GUI 도구(예: MySQL Workbench)를 사용하여 게시판 데이터를 저장할 데이터베이스를 생성해준다.
CREATE DATABASE springboot_board CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
application.properties 설정Spring Boot 프로젝트의 src/main/resources/application.properties 파일에 데이터베이스 연결 정보를 입력해준다.
# MySQL 연결 설정
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_board
spring.datasource.username=your_mysql_username
spring.datasource.password=your_mysql_password
# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update: JPA가 테이블을 자동으로 생성 및 업데이트하도록 설정.
src/main/java/com/example/board/entity/Board.java 파일을 생성하고 아래와 같이 작성해준다:
package com.example.board.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String content;
@Column(nullable = false)
private String author;
}
@Entity: JPA 엔티티 클래스임을 나타냅니다.@Id: 기본 키.@GeneratedValue: 기본 키의 자동 증가 설정.@Column: DB 컬럼 속성 지정.src/main/java/com/example/board/repository/BoardRepository.java 파일을 생성하고 아래와 같이 작성해준다:
package com.example.board.repository;
import com.example.board.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BoardRepository extends JpaRepository<Board, Long> {
}
JpaRepository: CRUD 작업을 쉽게 처리할 수 있도록 기본 메서드를 제공합니다.src/main/java/com/example/board/service/BoardService.java 파일을 생성하고 아래와 같이 작성해준다:
package com.example.board.service;
import com.example.board.entity.Board;
import com.example.board.repository.BoardRepository;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BoardService {
private final BoardRepository boardRepository;
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
public List<Board> getAllBoards() {
return boardRepository.findAll();
}
public Board getBoardById(Long id) {
return boardRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("게시글이 존재하지 않습니다."));
}
public Board createBoard(Board board) {
return boardRepository.save(board);
}
public Board updateBoard(Long id, Board updatedBoard) {
Board existingBoard = getBoardById(id);
existingBoard.setTitle(updatedBoard.getTitle());
existingBoard.setContent(updatedBoard.getContent());
existingBoard.setAuthor(updatedBoard.getAuthor());
return boardRepository.save(existingBoard);
}
public void deleteBoard(Long id) {
boardRepository.deleteById(id);
}
}
src/main/java/com/example/board/controller/BoardController.java 파일을 생성하고 아래와 같이 작성합니다:
package com.example.board.controller;
import com.example.board.entity.Board;
import com.example.board.service.BoardService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/boards")
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@GetMapping
public List<Board> getAllBoards() {
return boardService.getAllBoards();
}
@GetMapping("/{id}")
public ResponseEntity<Board> getBoardById(@PathVariable Long id) {
return ResponseEntity.ok(boardService.getBoardById(id));
}
@PostMapping
public ResponseEntity<Board> createBoard(@RequestBody Board board) {
return ResponseEntity.ok(boardService.createBoard(board));
}
@PutMapping("/{id}")
public ResponseEntity<Board> updateBoard(@PathVariable Long id, @RequestBody Board updatedBoard) {
return ResponseEntity.ok(boardService.updateBoard(id, updatedBoard));
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBoard(@PathVariable Long id) {
boardService.deleteBoard(id);
return ResponseEntity.noContent().build();
}
}
프로젝트를 실행하면 JPA가 자동으로 데이터베이스에 테이블을 생성해준다. MySQL에서 springboot_board 데이터베이스를 확인하면 아래와 같이 테이블이 생성된 것을 확인 할 수 있다.
SHOW TABLES;
게시판 테이블이 생성되었는지 확인:
DESCRIBE board;

나는 vsCode에서 데이터베이스 확장팩을 설치하여 아래와 같이 확인을 하였다.

나는 Postman을 통해 기능을 테스트 해보았다.
GET 요청 (전체 게시글 조회)
GET http://localhost:8080/api/boards[]
POST 요청 (게시글 생성)
POST http://localhost:8080/api/boards{
"title": "첫 번째 게시글",
"content": "게시글 내용입니다.",
"author": "작성자1"
}{
"id": 1,
"title": "첫 번째 게시글",
"content": "게시글 내용입니다.",
"author": "작성자1"
}
GET http://localhost:8080/api/boards/1{
"id": 1,
"title": "첫 번째 게시글",
"content": "게시글 내용입니다.",
"author": "작성자1"
}
PUT http://localhost:8080/api/boards/1{
"title": "수정된 게시글",
"content": "수정된 내용입니다.",
"author": "작성자1"
}
DELETE http://localhost:8080/api/boards/1
아래의 기능들을 사용하여 간단한 게시판 CRUD 기능을 구현해보았다.