2020. 12. 26. 19:58ㆍBackend/Spring(Spring Boot)
해당 글은 공식문서-Building a RESTful Web Service를 참고하여 작성되었습니다.
간단하게 SpringBoot를 사용해 프로젝트를 생성하고, RESTful 웹 서비스를 만드는 법에 대해 알아봅니다.
어떤 서비스를 만들게 되나요?
http://localhost:8080/greeting?name=User
위와 같이 name 쿼리 설정이 가능한 GET 웹 서비스(API)를 만들어 볼 것입니다.
그에 대한 응답은 다음과 같습니다.
// defalut
{"id":1,"content":"Hello, World!"}
// name 쿼리로 user 설정 시
{"id":1,"content":"Hello, User!"}
환경설정
작업 환경 참고를 위해 나열한 것이며, 각 환경에 맞는 설정 부탁 드립니다.
- IDE : IntelliJ IDEA CE(or STS 추천)
- JDK 1.8
- Maven 3.6.3 (or Gradle 4+)
프로젝트 생성
원글에는 바로 학습을 진행할 수 있도록 git을 제공해주었으나, 저는 직접 생성하였습니다.
1. Spring Initializr을 이용한 프로젝트 설정
모든 Spring Project는 Spring Initializr를 사용해서 프로젝트를 셋팅합니다.
간단한 설정 값 입력, 선택만으로 프로젝트 생성이 가능합니다.
-
dependencies 편리하게 추가 설정 가능
-
스캐폴딩 작업까지 완료됨
-
jar 파일로 묶어 제공
제가 사용한 무료버전 IntelliJ IDEA Community 에서는 spring plugin을 제공하지 않아 아래 방법으로 설정하였으나,
유료 버전에서는 프로젝트 > 생성에서 기본적으로 제공하는 Spring Initializr으로 생성 가능합니다.
저는 아래와 같이 자바 버전 확인 후, 1.8버전으로 설정하여 아래와 같이 프로젝트 설정을 하였습니다.
ADD DEPENDENCIES를 눌러 Spring Web을 추가해줍시다. (중요)
설정 후 GENERATE를 클릭해 프로젝트를 생성합니다.
2. 프로젝트 열기
IntelliJ > File > New > Project from Existing Sources... 클릭 후
Spring Initializr로 생성한 프로젝트를 선택해줍니다.
그리고 Maven을 선택 후 Finish를 눌러 마무리합니다. (원하시는 것 선택하시면 됩니다.)
3. pom.xml 살펴보기
Spring Initializr에서 셋팅한 값이 모두 pom.xml에 적용되어 있기 때문에 따로 할건 없으나, 아래와 같이 나왔는지 확인해봅시다.
(버전 설정 잘 했는지, spring web 종속성 추가 되었는지 등...)
👇전체 코드 확인은 더보기를 눌러 확인 가능
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
그리고 나서 습관적으로 maven clean - install을 해주었습니다.
그럼 아래와 같이 plugins과 dependencies 설정이 완료됩니다.
웹서비스 만들기
자, 프로젝트 설정이 끝났으니 바로 개발 시작해봅시다. 😎
1. 모델 생성
우리의 목표는 아래 response를 응답하는 것이었습니다.
// defalut
{"id":1,"content":"Hello, World!"}
// name 쿼리로 user 설정 시
{"id":1,"content":"Hello, User!"}
- id : 식별 값으로, 요청 시 자동 증가
- content : "Hello, {{ name }}!" 텍스트 반환 (default : Hello, wolrd!)
따라서, 아래와 같이 Greeting class를 간단히 작성해줍시다. id, content 로직은 controller에서 처리해줄 예정입니다.
package com.example.demo;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
이 애플리케이션은 Jackson JSON 라이브러리를 사용하여 Greeting 인스턴스를 자동으로 JSON으로 마샬링합니다. Jackson은 기본적으로 웹 스타터에 포함되어 있습니다.
* 마샬링 : 객체의 메모리 표현을 저장공간 또는 전송에 적합한 데이터 포맷으로 변환하는 과정
2. 리소스 컨트롤러 생성
Sprnig RESTful 웹 서비스의 HTTP 요청은 컨트롤러에 의해 처리됩니다.
스프링은 annotaions을 사용해 각 구성요소를 식별하므로,
우리는 GreetingController Class를 생성하고 앞에 @RestController를 붙여 컨트롤러임을 알립시다.
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicLong;
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
위의 코드를 살펴보자면, 아래와 같습니다.
- @GetMapping("/greeting") : /greeting을 path로한 GET HTTP 요청 매핑하여 greeting() 실행
- @RequestParam(value = "name", defaultValue = "World") String name
- 쿼리 파라미터 명 : name
- 미설정 시 default 값 : World
- 설정된 query를 String name 변수에 바인딩. (메소드 내부에서 접근, 활용)
3. 웹 서비스 시작점
프로젝트 초기 생성시 존재하는 DemoApplication을 그대로 가져가도 됩니다.
@SpringBootApplication을 선언하여 스프링부트의 시작점임을 표시하였습니다.
java의 진입점 main()에서 SpringApplication.run메소드를 사용하여 해당 애플리케이션을 시작합니다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
웹 서비스 호출
애플리케이션 실행
우선, 애플리케이션을 실행합니다.
원문에 나온 것 처럼 mvwn을 사용해 jar를 빌드하고 실행해도 좋지만, 편리한 IDE를 활용해서 구동하고 있습니다.
우선, 스프링부트의 애플리케이션의 시작점으로 저희는 DemoApplication을 지정하였기 때문에,
해당 파일(DemoApplication) > 오른쪽 클릭 > Run DemoApplication.main()으로 애플리케이션을 동작 시키면 됩니다.
웹 서비스 호출
저는 POST MAN을 사용해 호출하였는데, 그냥 웹 주소에 쳐서 테스트하셔도 됩니다.
아래와 같은 Request 호출 시, 지정된 query가 없어 default 값인 World가 적용되어 나오는 것을 확인할 수 있습니다.
http://localhost:8080/greeting
아래와 같이 query를 입력할 경우, name에 입력한 값이 적용되는 것을 확인할 수 있습니다.
http://localhost:8080/greeting?name=2021