자바 스프링 게시판 프로젝트 생성기(2): 기본 구조

·2025년 5월 19일
0

📘 Spring Boot 주요 구성요소 정리

🧩 1. Entity (엔티티)

  • 데이터베이스의 테이블과 1:1로 매핑되는 클래스입니다.
  • 실제로 저장되는 데이터의 구조를 정의합니다.
  • JPA 어노테이션(@Entity, @Id, @GeneratedValue 등)을 통해 테이블과 컬럼을 설정합니다.
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;
    private String author;
    private LocalDateTime createdAt;

    @PrePersist
    public void setCreatedAt() {
        this.createdAt = LocalDateTime.now();
    }
}

🗃️ 2. Repository (레포지토리)

  • 데이터베이스에 접근하는 계층입니다.
  • JPA가 제공하는 JpaRepository를 상속받아 사용하며, 기본적인 CRUD(Create, Read, Update, Delete) 기능을 자동으로 제공합니다.
  • 복잡한 쿼리가 필요한 경우에는 메서드를 직접 정의하거나 @Query 어노테이션으로 JPQL을 사용할 수 있습니다.
package com.example.demo.repository;

import com.example.demo.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
}

🧠 3. Service (서비스)

  • 비즈니스 로직을 처리하는 계층입니다.
  • Controller로부터 요청을 받아 필요한 작업을 수행한 뒤, 결과를 다시 Controller로 전달합니다.
  • 트랜잭션 처리, 데이터 가공, 유효성 검사 등 핵심 로직이 이 계층에 포함됩니다.
import com.example.demo.domain.Board;
import com.example.demo.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;

    public List<Board> getAllBoards() {
        return boardRepository.findAll();
    }

    public Optional<Board> getBoardById(Long id) {
        return boardRepository.findById(id);
    }

    public Board createBoard(Board board) {
        return boardRepository.save(board);
    }

    public Board updateBoard(Long id, Board updatedBoard) {
        return boardRepository.findById(id)
                .map(board -> {
                    board.setTitle(updatedBoard.getTitle());
                    board.setContent(updatedBoard.getContent());
                    return boardRepository.save(board);
                })
                .orElseThrow(() -> new IllegalArgumentException("Board not found with id: " + id));
    }

    public void deleteBoard(Long id) {
        boardRepository.deleteById(id);
    }
}

🌐 4. Controller (컨트롤러)

  • 클라이언트로부터의 HTTP 요청을 받아 처리하는 계층입니다.
  • URL과 HTTP 메서드(GET, POST, PUT, DELETE 등)를 기반으로 Service를 호출하고, 응답을 반환합니다.
  • 사용자와의 인터페이스 역할을 담당하며, 주로 @RestController, @RequestMapping, @GetMapping 등의 어노테이션을 사용합니다.
import com.example.demo.domain.Board;
import com.example.demo.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequiredArgsConstructor
@RequestMapping("/boards")
public class BoardController {
    private final BoardService boardService;

    @GetMapping
    public List<Board> getBoardList() {
        return boardService.getAllBoards();
    }

    @GetMapping("/{id}")
    public Optional<Board> getBoard(@PathVariable Long id) {
        return boardService.getBoardById(id);
    }

    @PostMapping
    public Board createBoard(@RequestBody Board board) {
        return boardService.createBoard(board);
    }

    @PutMapping("/{id}")
    public Board updateBoard(@PathVariable Long id, @RequestBody Board updatedBoard) {
        return boardService.updateBoard(id, updatedBoard);
    }

    @DeleteMapping("/{id}")
    public void deleteBoard(@PathVariable Long id) {
        boardService.deleteBoard(id);
    }
}
profile
싸산

0개의 댓글