[03]스프링부트 퀵스타트 - 스프링부트 프로젝트 생성


지난 포스트에서는 메이븐 프로젝트를 활용하여 라이브러리 프로젝트를 생성하고 테스트 하는 코드를 작성해 보았습니다. 이번 포스트에서는 스프링 부트 프로젝트를 생성하는 방법에 대해서 살펴 보겠습니다.

이 포스트의 목표

  • 스프링 부트 프로젝트 생성
  • 스프링 부트 실행
  • 간단하게 프로젝트 기능 구현

이 포스트를 시작하기 전에

이 포스트는 다음의 부분에 대한 설명을 하지 않습니다.

  • Java 설치
  • maven 설치
  • spring cli 설치

프로젝트 생성

spring init --dependencies=web,data-jpa,h2 --groupId="co.storyg.blog" --artifactId="api" api 

Output :

Using service at https://start.spring.io
Project extracted to './api'

pom.xml lombok 의존성 추가

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

패키지 구조 설명

  • co.storyg.blog.api.domain.post
    포스트 도메인을 위한 도메인 패키지
  • co.storyg.blog.api.domain.post.controller
    포스트 도메인에서 사용하는 컨트롤러
  • co.storyg.blog.api.domain.post.entity
    포스트 도메인에서 사용하는 엔티티
  • co.storyg.blog.api.domain.post.repository
    포스트 도메인에서 사용하는 레파지토리
  • co.storyg.blog.api.domain.post.service
    포스트 도메인에서 사용하는 서비스

엔티티 작성

package co.storyg.blog.api.domain.post.entity;

import java.util.Collection;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import lombok.Data;

/**
 * Post
 */
@Entity
@Data
public class Post {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Integer id;
  private String title;
  private String content;
  private String author;

  @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
  @JoinColumn(name="post_id")
  private Collection<Comment> comments;

}
package co.storyg.blog.api.domain.post.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.Data;

/**
 * Comment
 */
@Entity
@Data
public class Comment {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Integer id;

  private String content;
  private String user;
}

레파지토리 작성

package co.storyg.blog.api.domain.post.repository;

import org.springframework.data.repository.CrudRepository;

import co.storyg.blog.api.domain.post.entity.Post;


/**
 * CrudPostRepository
 */
public interface CrudPostRepository extends CrudRepository<Post, Integer> {}

컨트롤러 작성

package co.storyg.blog.api.domain.post.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import co.storyg.blog.api.domain.post.entity.Post;
import co.storyg.blog.api.domain.post.repository.CrudPostRepository;
import co.storyg.post.common.PostDescribe;

@Controller 
@RequestMapping(path="/posts")
public class MainController {
  @Autowired
  private CrudPostRepository postRepository;

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

  @GetMapping()
  public @ResponseBody Iterable<Post> getAllPost() {
    PostDescribe describe = new PostDescribe();
    String str = describe.byAuthor("author", "alpa2Code");
    System.out.println(str);
    return postRepository.findAll();
  }

  
}

실행

./mvnw spring-boot:run

요청하기

포스트 생성

포스트 생성 요청은 다음과 같이 합니다.

curl -X POST \
  http://localhost:8080/posts/ \
  -H 'Content-Type: application/json' \
  -d '{
	"title":"블로그를 시작하며",
	"content":"블로그는 어렵습니다...",
	"author":"스토리지",
	"comments":[
		{
			"content":"좋은 글 감사합니다.",
			"user":"지나가던 행인"
		},
		{
			"content":"잘 읽고 갑니다.",
			"user":"방문자1"
		}
	]
}'

포스트 생성 요청은 정상처리되면 다음과 같은 값이 리턴 됩니다.

{
  "id": 1,
  "title": "블로그를 시작하며",
  "content": "블로그는 어렵습니다...",
  "author": "스토리지",
  "comments": [{
    "id": 2,
    "content": "좋은 글 감사합니다.",
    "user": "지나가던 행인"
  }, {
    "id": 3,
    "content": "잘 읽고 갑니다.",
    "user": "방문자1"
  }]
}

리스트 요청

포스트 리스트 요청은 다음과 같이 합니다.

curl -X GET \
  http://localhost:8080/posts \
  -H 'Content-Type: application/json'

포스트 리스트 요청은 정상처리되면 다음과 같은 값이 리턴 됩니다.

[{
  "id": 1,
  "title": "블로그를 시작하며",
  "content": "블로그는 어렵습니다...",
  "author": "스토리지",
  "comments": [{
    "id": 2,
    "content": "좋은 글 감사합니다.",
    "user": "지나가던 행인"
  }, {
    "id": 3,
    "content": "잘 읽고 갑니다.",
    "user": "방문자1"
  }]
}]