[Spring Boot] JPA를 사용한 CRUD 구현

수빈·2024년 11월 28일

SpringBoot

목록 보기
2/4

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

전 포스팅에서 Spring Initializr로 프로젝트 생성한 내용에 몇가지가 추가되어야 하므로 프로젝트를 새로 생성해주겠다.



1. 프로젝트 초기 설정

1-1. Spring Initializr로 프로젝트 생성

  1. Spring Initializr에 접속
  2. 아래와 같이 설정:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 3.x.x (최신 안정 버전)
    • Dependencies:
      • Spring Web
      • Spring Data JPA
      • MySQL Driver
      • Spring Boot DevTools
      • Lombok (Optional, 코드 단순화)
  3. 프로젝트를 다운로드하고 압축을 해제한 후 IDE에서 파일을 열어준다. (나는 vsCode를 사용할 것이다..!)

1-2. MySQL 데이터베이스 준비

  1. MySQL 설치 및 실행
    MySQL이 설치되어 있지 않다면 MySQL 공식 사이트에서 설치.

  2. 데이터베이스 생성
    MySQL CLI나 GUI 도구(예: MySQL Workbench)를 사용하여 게시판 데이터를 저장할 데이터베이스를 생성해준다.

    CREATE DATABASE springboot_board CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

1-3. 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가 테이블을 자동으로 생성 및 업데이트하도록 설정.



2. 게시판 CRUD 기능 구현

2-1. Entity 클래스 작성

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 컬럼 속성 지정.

2-2. Repository 인터페이스 작성

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 작업을 쉽게 처리할 수 있도록 기본 메서드를 제공합니다.

2-3. Service 클래스 작성

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

2-4. Controller 작성

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


3. 코드 테스트

3-1. 데이터베이스 확인

프로젝트를 실행하면 JPA가 자동으로 데이터베이스에 테이블을 생성해준다. MySQL에서 springboot_board 데이터베이스를 확인하면 아래와 같이 테이블이 생성된 것을 확인 할 수 있다.

SHOW TABLES;

게시판 테이블이 생성되었는지 확인:

DESCRIBE board;

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


3-2. Postman으로 CRUD 테스트

나는 Postman을 통해 기능을 테스트 해보았다.

  1. GET 요청 (전체 게시글 조회)

    • URL: GET http://localhost:8080/api/boards
    • 빈 리스트가 반환된다: []
  2. POST 요청 (게시글 생성)

    • URL: POST http://localhost:8080/api/boards
    • 요청 Body(JSON):
      {
        "title": "첫 번째 게시글",
        "content": "게시글 내용입니다.",
        "author": "작성자1"
      }
    • 응답:
      {
        "id": 1,
        "title": "첫 번째 게시글",
        "content": "게시글 내용입니다.",
        "author": "작성자1"
      }
  1. GET 요청 (게시글 상세 조회)
    • URL: GET http://localhost:8080/api/boards/1
    • 응답:
      {
        "id": 1,
        "title": "첫 번째 게시글",
        "content": "게시글 내용입니다.",
        "author": "작성자1"
      }
  1. PUT 요청 (게시글 수정)
    • URL: PUT http://localhost:8080/api/boards/1
    • 요청 Body(JSON):
      {
        "title": "수정된 게시글",
        "content": "수정된 내용입니다.",
        "author": "작성자1"
      }
  1. DELETE 요청 (게시글 삭제)
    • URL: DELETE http://localhost:8080/api/boards/1


마무리

아래의 기능들을 사용하여 간단한 게시판 CRUD 기능을 구현해보았다.

  • Spring Boot와 MySQL 연결 설정.
  • JPA를 사용한 데이터 저장 및 처리.
  • RESTful API를 활용한 CRUD 구현.
profile
Development History

0개의 댓글