스프링 부트 백엔드 개발 강좌, 블로그 화면 구성 예제, 엔티티에 생성, 수정 시간 추가하기

블로그 화면 구성 예제

스프링 부트를 활용한 블로그 웹 애플리케이션을 개발하는 것은 현대 웹 개발에서 매우 유용한 기술입니다. 이번 강좌에서는 스프링 부트를 이용하여 간단한 블로그 화면을 구성하는 방법을 다루고, 엔티티에 생성 및 수정 시간을 추가하는 방법에 대해서도 알아보겠습니다.

1. 스프링 부트란?

스프링 부트(Spring Boot)는 자바 기반의 스프링 프레임워크를 더욱 쉽게 사용할 수 있도록 도와주는 오픈소스 프레임워크입니다. 초기 설정과 구성을 최소화하여 개발자가 비즈니스 로직에 집중할 수 있게 하는 것이 특징입니다. 이 강좌에서는 스프링 부트를 사용하여 블로그 애플리케이션을 만들면서 다양한 기능을 구현해 볼 것입니다.

2. 프로젝트 설정

스프링 부트 프로젝트 설정을 위해 Spring Initializr를 사용합니다. 다음과 같은 설정을 통해 프로젝트를 생성할 수 있습니다.

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.5.x 또는 최신 버전
  • Group: com.example
  • Artifact: blog
  • Dependencies: Spring Web, Spring Data JPA, H2 Database, Lombok

생성된 프로젝트를 IDE에서 열어 작업을 시작합니다.

3. 블로그 엔티티 구성

블로그 애플리케이션의 핵심은 Post라는 엔티티입니다. 이 엔티티는 블로그 포스트를 대표하며, 기본적으로 제목, 내용, 작성 시간 및 수정 시간을 포함합니다.

package com.example.blog.entity;

import lombok.Getter;
import lombok.Setter;

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

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

    private String title;

    @Column(length = 10000)
    private String content;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;

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

    @PreUpdate
    public void onUpdate() {
        this.updatedAt = LocalDateTime.now();
    }
}

위의 코드는 Post 엔티티의 구조를 보여줍니다. @Entity 어노테이션으로 이 클래스가 JPA 엔티티임을 명시하고, @Id@GeneratedValue를 사용하여 기본 키를 생성합니다. 생성 및 수정 시간은 LocalDateTime을 사용하여 자동으로 관리합니다.

4. 데이터베이스 설정

이번 예제에서는 H2 데이터베이스를 사용하겠습니다. application.properties 파일에 다음과 같이 추가하여 H2 데이터베이스를 설정합니다.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=create

H2 콘솔을 활성화하면 브라우저에서 데이터베이스를 직접 확인할 수 있습니다.

5. Repository 인터페이스 만들기

데이터베이스와의 상호작용을 위한 Repository를 생성합니다. Spring Data JPA를 이용하면 인터페이스만 정의해도 기본적인 CRUD 기능이 제공됩니다.

package com.example.blog.repository;

import com.example.blog.entity.Post;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository {
}

6. 서비스 레이어 구현

서비스 레이어는 비즈니스 로직을 처리하는 곳입니다. PostService 클래스를 만들어 블로그 포스트의 CRUD 기능을 구현합니다.

package com.example.blog.service;

import com.example.blog.entity.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 {

    @Autowired
    private PostRepository postRepository;

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

    public Post findById(Long id) {
        return postRepository.findById(id).orElse(null);
    }

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

    public void delete(Long id) {
        postRepository.deleteById(id);
    }
}

7. 컨트롤러 구현

이제 사용자 요청을 처리할 PostController를 생성하겠습니다. 이 컨트롤러는 REST API를 정의하며 클라이언트와의 상호작용을 관리합니다.

package com.example.blog.controller;

import com.example.blog.entity.Post;
import com.example.blog.service.PostService;
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 {

    @Autowired
    private PostService postService;

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

    @GetMapping("/{id}")
    public ResponseEntity getPostById(@PathVariable Long id) {
        Post post = postService.findById(id);
        return post != null ? ResponseEntity.ok(post) : ResponseEntity.notFound().build();
    }

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

    @PutMapping("/{id}")
    public ResponseEntity updatePost(@PathVariable Long id, @RequestBody Post post) {
        post.setId(id);
        Post updatedPost = postService.save(post);
        return ResponseEntity.ok(updatedPost);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deletePost(@PathVariable Long id) {
        postService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

8. Spring Boot 애플리케이션 실행

모든 설정이 완료되면, BlogApplication 클래스를 실행하여 애플리케이션을 실행할 수 있습니다.

package com.example.blog;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BlogApplication {

    public static void main(String[] args) {
        SpringApplication.run(BlogApplication.class, args);
    }
}

9. 전체 흐름 요약

위의 모든 과정은 포스트를 생성, 수정, 삭제하는 RESTful API를 구현하는 단계입니다. 프론트엔드는 React나 Vue.js와 같은 최신 프레임워크를 사용하여 디자인할 수 있으며, 백엔드는 위 API를 통해 데이터와 상호작용합니다.

10. 기타 고려사항

블로그 애플리케이션을 개발할 때 다양한 기능을 고려해야 합니다. 예를 들어, 사용자 인증 및 권한 관리, 댓글 기능, 태그 시스템 등이 있습니다. 이러한 기능들은 추가적인 엔티티 및 서비스 클래스를 통해 구현할 수 있습니다.

마치며

스프링 부트를 활용한 블로그 애플리케이션 개발은 굉장히 유익한 경험이 될 것입니다. 이로 인해 스프링 프레임워크와 JPA, RESTful API에 대한 이해도를 높일 수 있습니다. 이번 강좌에서 다룬 내용을 바탕으로 스스로 프로젝트를 확장하고 발전시킬 수 있기를 바랍니다.

부록: 참고 자료