스프링 부트 백엔드 개발 강좌, 블로그 제작 예제, 컨트롤러 메서드 코드 작성하기

안녕하세요! 이번 강좌에서는 스프링 부트를 사용하여 블로그를 제작하는 방법을 배우고, 특히 컨트롤러 메서드 작성에 대해 깊이 있게 살펴보겠습니다. 스프링 부트는 자바 기반의 프레임워크로, 웹 애플리케이션을 쉽게 개발할 수 있도록 도와줍니다. 이 강좌에서는 기본적인 블로그 기능을 구현하며 RESTful API를 구축하는 것을 목표로 합니다.

1. 스프링 부트 소개

스프링 부트는 스프링 프레임워크의 확장판으로, 스프링 애플리케이션을 더 간편하게 설정하고 실행할 수 있게 해줍니다. 주요 목적은 복잡한 스프링 설정을 줄이고 빠르게 애플리케이션을 시작할 수 있도록 지원하는 것입니다.

1.1. 스프링 부트의 장점

  • 빠른 시작: 내장된 서버 제공으로 짧은 시간 내에 애플리케이션 실행 가능
  • 자동 설정: 다양한 라이브러리와 프레임워크를 자동으로 설정해 줌
  • 유연한 설정: 설정 파일을 통해 애플리케이션의 설정을 간편하게 관리 가능

2. 개발 환경 설정

블로그 프로젝트를 시작하기 전에 필요한 개발 환경을 설정해 보겠습니다. 아래는 스프링 부트를 위해 설치해야 하는 필수 요소들입니다.

  • Java Development Kit (JDK): JDK 8 이상을 설치합니다.
  • IDE: IntelliJ IDEA, Eclipse 또는 VSCode와 같은 IDE 설치
  • Build Tool: Maven 또는 Gradle을 사용하여 의존성 관리

2.1. 새로운 스프링 부트 프로젝트 생성하기

Spring Initializr를 사용하여 새로운 스프링 부트 프로젝트를 생성할 수 있습니다. 다음 단계를 따르세요:

  1. 웹사이트 접속: Spring Initializr에 접속합니다.
  2. 프로젝트 메타데이터 입력: Group, Artifact, Name을 입력하고, Dependencies에서 Web, JPA, H2 Database를 선택합니다.
  3. 프로젝트 생성: Generate 버튼을 클릭하여 프로젝트를 다운로드하고, IDE에서 엽니다.

3. 블로그 모델 설계

블로그의 기본적인 데이터 모델을 설계해 보겠습니다. 우리 블로그는 다음과 같은 Entity 클래스를 가질 것입니다.

3.1. Post Entity

package com.example.blog.model;

import lombok.Data;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Data
@Table(name = "posts")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

위 코드는 블로그 포스트를 나타내는 Post 클래스를 설명합니다. JPA를 사용하여 데이터베이스와 연결하며, Lombok의 @Data 어노테이션을 통해 getter, setter, toString 메서드를 자동으로 생성합니다.

3.2. Repository 생성

데이터베이스와의 상호작용을 위한 Repository 인터페이스를 생성해야 합니다. 스프링 데이터 JPA를 사용하여 쉽게 구현할 수 있습니다.

package com.example.blog.repository;

import com.example.blog.model.Post;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PostRepository extends JpaRepository {
}

4. 컨트롤러 구현하기

이제 블로그 포스트를 관리하기 위한 RESTful API를 제공하는 컨트롤러를 구현해 보겠습니다. 컨트롤러는 웹 요청을 처리하고 서비스 계층과 데이터베이스와의 연결을 관리하는 역할을 합니다.

4.1. PostController 클래스 작성하기

package com.example.blog.controller;

import com.example.blog.model.Post;
import com.example.blog.repository.PostRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/posts")
public class PostController {
    private final PostRepository postRepository;

    @Autowired
    public PostController(PostRepository postRepository) {
        this.postRepository = postRepository;
    }

    @GetMapping
    public List getAllPosts() {
        return postRepository.findAll();
    }

    @PostMapping
    public Post createPost(@RequestBody Post post) {
        return postRepository.save(post);
    }
}

위 코드는 블로그 포스트를 생성하고 조회하는 두 개의 엔드포인트를 정의합니다. @GetMapping은 모든 포스트를 조회하며, @PostMapping은 새로운 포스트를 생성합니다.

4.2. 요청 및 응답 처리

클라이언트에서 보내는 요청을 처리하고, 적절한 응답을 생성하는 것이 중요합니다. HTTP 상태 코드와 함께 응답을 반환하여 클라이언트에게 요청 처리 결과를 알릴 수 있습니다.

 @PostMapping
    public ResponseEntity createPost(@RequestBody Post post) {
        Post createdPost = postRepository.save(post);
        return ResponseEntity.status(HttpStatus.CREATED).body(createdPost);
    }

5. 서비스 계층 추가하기

비즈니스 로직을 담당하는 서비스 계층을 추가하여 코드의 분리를 개선할 수 있습니다. 서비스 계층을 통해 데이터베이스와의 상호작용 로직을 분리하면 테스트와 유지보수가 더 용이해집니다.

5.1. PostService 클래스 구현

package com.example.blog.service;

import com.example.blog.model.Post;
import com.example.blog.repository.PostRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PostService {
    private final PostRepository postRepository;

    @Autowired
    public PostService(PostRepository postRepository) {
        this.postRepository = postRepository;
    }

    public List getAllPosts() {
        return postRepository.findAll();
    }

    public Post createPost(Post post) {
        return postRepository.save(post);
    }
}

5.2. 컨트롤러에서 서비스 계층 사용하기

컨트롤러에서 서비스 계층을 호출하여 로직을 수행하도록 변경합니다.

 @Autowired
    private PostService postService;

    @GetMapping
    public List getAllPosts() {
        return postService.getAllPosts();
    }

    @PostMapping
    public Post createPost(@RequestBody Post post) {
        return postService.createPost(post);
    }

6. 예외 처리

API에서 발생할 수 있는 다양한 예외를 처리하기 위한 방법도 알아보겠습니다. 예외 처리기를 구현하여 일관된 응답을 할 수 있도록 만들어 봅시다.

6.1. GlobalExceptionHandler 클래스 작성하기

package com.example.blog.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }
}

7. API 테스트하기

마지막으로, Postman 또는 cURL을 사용하여 API를 테스트할 수 있습니다. 아래는 Postman을 사용한 예시입니다.

7.1. 모든 포스트 조회

GET http://localhost:8080/api/posts

7.2. 새로운 포스트 생성

POST http://localhost:8080/api/posts에 JSON 형식의 데이터 전송

{
        "title": "첫 번째 블로그 포스트",
        "content": "안녕하세요, 이것은 첫 번째 블로그 포스트입니다."
    }

8. 마무리 및 향후 개선 방향

여기까지 스프링 부트를 활용한 블로그 백엔드 개발을 위한 기본적인 내용을 살펴보았습니다. 컨트롤러 메서드의 작성, 예외 처리 및 서비스 계층 추가 등의 내용을 포함하여 RESTful API를 만드는 데 필요한 기본적인 요소를 이해했을 것입니다.

향후에는 인증 및 인가, 파일 업로드, 댓글 기능 추가, 테스트 코드 작성 등을 통해 블로그 기능을 확장해 나갈 수 있습니다. 이 강좌를 통해 기초를 다졌다면, 좀 더 복잡한 프로젝트에도 도전해 보세요! 여러분의 개발 여정을 응원합니다.

참고 자료