스프링 부트 백엔드 개발 강좌, 블로그 제작 예제, 프로젝트 준비하기

본 강좌는 스프링 부트를 이용하여 간단한 블로그를 제작하는 과정을 안내합니다. 스프링 부트는 자바 언어로 개발된 프레임워크로, 쉽고 빠르게 웹 애플리케이션을 구축할 수 있도록 돕습니다. 이 강좌에서는 프로젝트 준비, 데이터베이스 설정, RESTful API 구현, 인증 및 인가, 클라이언트와의 연동 등을 단계별로 다룰 것입니다. 이 글을 통해 스프링 부트의 기초부터 고급 주제까지 폭넓게 배울 수 있습니다.

1. 프로젝트 준비하기

1.1 스프링 부트 소개

스프링 부트는 스프링 프레임워크의 프로젝트 중 하나로, 복잡한 설정 없이 빠르게 애플리케이션을 개발할 수 있게 해줍니다. 스프링 부트의 주요 장점은 다음과 같습니다:

  • 변경 관련 복잡성 감소
  • 자동 설정 기능을 통한 생산성 증대
  • 마이크로서비스 아키텍처에 적합
  • 내장 WAS(웹 애플리케이션 서버) 사용

1.2 개발 환경 설정

프로젝트를 시작하기 전에 개발 환경을 설정해야 합니다. 다음과 같은 도구를 설치하세요:

  • Java Development Kit (JDK) – Java 11 이상 권장
  • IDE – IntelliJ IDEA, Eclipse 또는 Spring Tool Suite
  • Gradle 또는 Maven – 의존성 관리를 위한 빌드 도구
  • 데이터베이스 – MySQL, PostgreSQL 등

1.3 스프링 부트 프로젝트 생성

스프링 부트 프로젝트를 생성하기 위해 Spring Initializr를 사용할 수 있습니다. 아래의 설정을 사용하여 생성합니다:

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.5.x (혹은 최신 버전)
  • Group: com.example
  • Artifact: blog
  • Dependencies: Spring Web, Spring Data JPA, MySQL Driver, Spring Security

생성한 프로젝트를 IDE에서 열면, 기본적인 디렉토리 구조가 생성된 것을 확인할 수 있습니다.

2. 데이터베이스 설정

2.1 MySQL 설치

MySQL을 설치하고 데이터베이스를 생성합니다. 다음 명령어로 데이터베이스를 생성해봅시다:

CREATE DATABASE blogdb;

2.2 application.properties 설정

src/main/resources/application.properties 파일을 열고 데이터베이스 연결 정보를 설정합니다:

spring.datasource.url=jdbc:mysql://localhost:3306/blogdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

2.3 JPA 엔티티 생성

다음으로, 블로그의 데이터를 저장할 엔티티 클래스를 생성합니다. 예를 들어, Post 엔티티를 아래와 같이 작성합니다:

package com.example.blog.model;

import javax.persistence.*;

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

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String content;

    // Getters and Setters
}

3. RESTful API 구현

3.1 컨트롤러 클래스 정의

블로그 포스트를 관리할 API를 만들기 위해 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 {

    @Autowired
    private PostRepository postRepository;

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

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

    @GetMapping("/{id}")
    public ResponseEntity getPostById(@PathVariable Long id) {
        Post post = postRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id));
        return ResponseEntity.ok(post);
    }

    @PutMapping("/{id}")
    public ResponseEntity updatePost(@PathVariable Long id, @RequestBody Post postDetails) {
        Post post = postRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id));
        
        post.setTitle(postDetails.getTitle());
        post.setContent(postDetails.getContent());
        Post updatedPost = postRepository.save(post);
        return ResponseEntity.ok(updatedPost);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deletePost(@PathVariable Long id) {
        Post post = postRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id));
        
        postRepository.delete(post);
        return ResponseEntity.noContent().build();
    }
}

3.2 리포지토리 생성

Spring Data JPA를 사용하여 데이터베이스에 접근할 리포지토리를 생성합니다:

package com.example.blog.repository;

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

public interface PostRepository extends JpaRepository {
}

4. 인증 및 인가

4.1 Spring Security 설정

블로그 애플리케이션에 기본적인 인증 기능을 추가하기 위해 Spring Security를 설정합니다. WebSecurityConfig 클래스를 생성하고 아래와 같이 설정합니다:

package com.example.blog.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/api/posts/**").authenticated()
            .and()
            .httpBasic();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

5. 클라이언트와의 연동

백엔드 API와 클라이언트 애플리케이션을 연동하여 블로그 애플리케이션을 완성합니다. React, Vue, Angular 등 다양한 프론트엔드 프레임워크를 사용하여 API와 데이터를 주고받을 수 있습니다. 다음은 Axios를 이용하여 프론트엔드에서 백엔드 API를 호출하는 예입니다:

import axios from 'axios';

const API_URL = 'http://localhost:8080/api/posts';

export const fetchPosts = async () => {
    const response = await axios.get(API_URL, {
        auth: {
            username: 'user',
            password: 'password'
        }
    });
    return response.data;
};

// 다른 CRUD 함수 구현

6. 결론

이 강좌에서는 스프링 부트를 사용하여 기본적인 블로그 애플리케이션을 제작하는 과정을 살펴보았습니다. 프로젝트 준비부터 데이터베이스 설정, RESTful API 구현, 인증 및 인가, 클라이언트와의 연동까지 다양한 주제를 다루었습니다. 다양한 기술을 활용하여 자신만의 블로그를 만들 수 있도록 경험을 쌓기를 바랍니다.

추가적으로, 스프링 부트와 관련된 다양한 자료와 커뮤니티를 활용하여 더 많은 지식을 얻고 실력을 쌓는 것을 추천합니다. 이 강좌가 스프링 부트 개발의 첫 걸음이 되길 바랍니다!