블로그 제작 예제: 서비스 메서드 코드 작성하기
본 강좌는 스프링 부트를 활용하여 간단한 블로그를 제작하는 방법에 대해 다룹니다. 우리는 블로그 게시물 CRUD(Create, Read, Update, Delete) 기능을 구현할 것입니다. 본 강좌에서는 스프링 부트의 기본 설정부터 시작하여 서비스 메서드 코드 작성까지 단계별로 진행할 것입니다.
1. 스프링 부트 소개
스프링 부트는 스프링 프레임워크의 설정을 간소화하고, 독립적인 애플리케이션을 쉽게 만들 수 있도록 도와주는 프레임워크입니다. 스프링 부트는 다양한 스타터 의존성을 제공하며, 빠른 개발과 배포를 지원합니다. 이 강좌에서는 스프링 부트를 사용하여 RESTful API를 만들고, CRUD 기능을 구현할 것입니다.
2. 개발 환경 설정
스프링 부트 애플리케이션을 개발하기 위해서는 Java Development Kit (JDK)와 통합 개발 환경(IDE)이 필요합니다. IntelliJ IDEA나 Eclipse를 추천하며, JDK 11 이상의 버전이 필요합니다.
https://spring.io/projects/spring-boot
2.1. 프로젝트 생성
스프링 부트 프로젝트를 생성하기 위해 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 (또는 MySQL)
2.2. 프로젝트 구조
스프링 부트 프로젝트가 생성되면 아래와 같은 기본 구조를 가집니다:
blog
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── blog
│ │ │ ├── BlogApplication.java
│ │ │ ├── controller
│ │ │ ├── model
│ │ │ └── repository
│ │ └── resources
│ │ ├── application.properties
│ │ └── static
│ └── test
└── pom.xml
3. 블로그 모델 클래스 작성
블로그 게시물을 표현할 수 있는 모델 클래스를 작성합니다. 아래는 게시물(Post) 모델 클래스의 예제입니다:
package com.example.blog.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Column;
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false, length = 1000)
private String content;
// 생성자, getter, setter 생략
}
4. 리포지토리 인터페이스 작성
데이터베이스와의 상호작용을 위해 리포지토리 클래스를 작성합니다. 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<Post, Long> {
}
5. 서비스 클래스 작성
비즈니스 로직을 처리할 서비스 클래스를 작성합니다. 서비스 클래스에서는 CRUD 기능을 위한 메서드를 구현합니다:
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;
import java.util.Optional;
@Service
public class PostService {
@Autowired
private PostRepository postRepository;
// 게시물 목록 조회
public List<Post> findAll() {
return postRepository.findAll();
}
// 게시물 추가
public Post save(Post post) {
return postRepository.save(post);
}
// 게시물 조회
public Optional<Post> findById(Long id) {
return postRepository.findById(id);
}
// 게시물 수정
public Post update(Long id, Post postDetails) {
Post post = postRepository.findById(id).orElseThrow(() -> new RuntimeException("게시물을 찾을 수 없습니다."));
post.setTitle(postDetails.getTitle());
post.setContent(postDetails.getContent());
return postRepository.save(post);
}
// 게시물 삭제
public void delete(Long id) {
postRepository.deleteById(id);
}
}
6. 컨트롤러 클래스 작성
클라이언트의 요청을 처리하기 위한 REST 컨트롤러 클래스를 작성합니다. 이 클래스는 HTTP 요청을 받아 적절한 서비스 메서드를 호출합니다:
package com.example.blog.controller;
import com.example.blog.model.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<Post> getAllPosts() {
return postService.findAll();
}
// 게시물 추가
@PostMapping
public Post createPost(@RequestBody Post post) {
return postService.save(post);
}
// 게시물 조회
@GetMapping("/{id}")
public ResponseEntity<Post> getPostById(@PathVariable Long id) {
return postService.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
// 게시물 수정
@PutMapping("/{id}")
public ResponseEntity<Post> updatePost(@PathVariable Long id, @RequestBody Post postDetails) {
try {
Post updatedPost = postService.update(id, postDetails);
return ResponseEntity.ok(updatedPost);
} catch (RuntimeException e) {
return ResponseEntity.notFound().build();
}
}
// 게시물 삭제
@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePost(@PathVariable Long id) {
postService.delete(id);
return ResponseEntity.noContent().build();
}
}
7. 애플리케이션 설정
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=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
8. 애플리케이션 실행
모든 설정이 완료되면 애플리케이션을 실행할 수 있습니다. IDE를 사용하여 BlogApplication.java
클래스를 실행하거나 터미널에서 아래의 명령어를 사용할 수 있습니다:
mvn spring-boot:run
9. Postman을 통한 API 테스트
애플리케이션이 정상적으로 실행되면 Postman을 사용하여 API를 테스트할 수 있습니다. 아래는 여러 가지 HTTP 요청을 사용하는 방법입니다:
- GET /api/posts – 모든 게시물 조회
- POST /api/posts – 게시물 추가
- GET /api/posts/{id} – 특정 게시물 조회
- PUT /api/posts/{id} – 게시물 수정
- DELETE /api/posts/{id} – 게시물 삭제
결론
이번 강좌에서는 스프링 부트를 사용하여 블로그 애플리케이션의 백엔드를 구현하는 방법에 대해 설명하였습니다. CRUD 기능을 제공하는 서비스 및 REST API를 구축하여 사용자가 블로그 게시물을 관리할 수 있도록 하였습니다. 이 강좌를 통해 스프링 부트의 기초를 이해하고, 실제 애플리케이션 개발에 활용할 수 있는 기초를 다지기를 바랍니다.