[Spring/SpringBoot] RESTful 웹 서비스 구축하기

2020. 12. 26. 19:58Backend/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버전으로 설정하여 아래와 같이 프로젝트 설정을 하였습니다.

spring boot는 jdk8 이상부터 지원

ADD DEPENDENCIES를 눌러 Spring Web을 추가해줍시다. (중요)

설정 후 GENERATE를 클릭해 프로젝트를 생성합니다.

생성된 프로젝트가 demo.zip으로 다운 됩니다. (아래)

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));
    }
}

위의 코드를 살펴보자면, 아래와 같습니다.

 

  1. @GetMapping("/greeting") : /greeting을 path로한 GET HTTP 요청 매핑하여 greeting() 실행
  2. @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

 

반응형