카테고리 없음

RESTful 웹 서비스 구축

경진 2021. 5. 15. 23:48

RESTful 웹 서비스 구축

이 가이드는 Spring을 사용하여 "Hello, World"RESTful 웹 서비스를 만드는 과정을 안내합니다.

무엇을 만들 것인가

에서 HTTP GET 요청을 수락하는 서비스를 빌드합니다 http://localhost:8080/greeting.

다음 목록에 표시된대로 인사말의 JSON 표현으로 응답합니다.

{"id":1,"content":"Hello, World!"}

name다음 목록과 같이 쿼리 문자열 의 선택적 매개 변수를 사용하여 인사말을 사용자 지정할 수 있습니다 .

http://localhost:8080/greeting?name=User

name매개 변수 값은 기본값보다 우선 World다음 목록에서 볼 수 있듯이, 및 응답에 반영됩니다 :

{"id":1,"content":"Hello, User!"}

필요한 것

이 가이드를 완료하는 방법

대부분의 Spring 시작하기 가이드 와 마찬가지로 처음부터 시작하여 각 단계를 완료하거나 이미 익숙한 기본 설정 단계를 건너 뛸 수 있습니다. 어느 쪽이든 작업 코드로 끝납니다.

처음부터 시작 하려면 Starting with Spring Initialize 로 이동 하십시오 .

기본 사항  건너 뛰 려면 다음을 수행하십시오.

완료되면 의 코드와 비교하여 결과를 확인할 수 있습니다 gs-rest-service/complete.

Spring Initialize로 시작

Maven을 사용하는 경우 Spring Initializr  방문 하여 필요한 종속성 (Spring Web)이있는 새 프로젝트를 생성하십시오.

다음 목록은 pom.xmlMaven을 선택할 때 생성 되는 파일을 보여줍니다 .

<?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.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>rest-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>rest-service</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>

Gradle을 사용하는 경우 Spring Initializr  방문 하여 필요한 종속성 (Spring Web)이있는 새 프로젝트를 생성하십시오.

다음 목록은 build.gradleGradle을 선택할 때 생성 되는 파일을 보여줍니다 .

plugins {
	id 'org.springframework.boot' version '2.4.3'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

test {
	useJUnitPlatform()
}

수동 초기화 (선택 사항)

이전에 표시된 링크를 사용하지 않고 프로젝트를 수동으로 초기화하려면 다음 단계를 따르십시오.

  1. https://start.spring.io로 이동합니다 . 이 서비스는 애플리케이션에 필요한 모든 종속성을 가져와 대부분의 설정을 수행합니다.
  2. Gradle 또는 Maven과 사용하려는 언어를 선택합니다. 이 가이드에서는 사용자가 Java를 선택했다고 가정합니다.
  3. 종속성을 클릭 하고 Spring Web을 선택하십시오 .
  4. 생성을 클릭 합니다.
  5. 선택한 항목으로 구성된 웹 애플리케이션의 아카이브 인 결과 ZIP 파일을 다운로드하십시오.
  IDE에 Spring Initializr 통합이있는 경우 IDE에서이 프로세스를 완료 할 수 있습니다.

리소스 표현 클래스 생성

이제 프로젝트를 설정하고 시스템을 빌드 했으므로 웹 서비스를 만들 수 있습니다.

서비스 상호 작용에 대해 생각하여 프로세스를 시작하십시오.

서비스는 선택적으로 쿼리 문자열  매개 변수를 사용하여에 GET대한 요청을 처리 합니다 . 요청은 반환해야 인사말을 나타내는 몸에 JSON으로 응답을. 다음 출력과 유사해야합니다./greetingnameGET200 OK

{ "id": 1, "content": "Hello, World!" }

id필드는 인사에 대한 고유 식별자이며, content인사의 텍스트 표현입니다.

인사말 표현을 모델링하려면 리소스 표현 클래스를 만듭니다. 이렇게하려면 다음 목록 (from )에 표시된 대로 id및 content데이터에 대한 필드, 생성자 및 접근자가있는 일반 이전 Java 객체를 제공합니다 src/main/java/com/example/restservice/Greeting.java.

package com.example.restservice;

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은 기본적으로 웹 스타터에 포함되어 있습니다.

리소스 컨트롤러 만들기

RESTful 웹 서비스를 구축하는 Spring의 접근 방식에서 HTTP 요청은 컨트롤러에 의해 처리됩니다. 이러한 구성 요소는 @RestController주석 으로 식별되며 GreetingController다음 목록 (from src/main/java/com/example/restservice/GreetingController.java) 에 표시된은 클래스 의 새 인스턴스를 반환하여에 GET대한 요청을 처리 합니다 ./greetingGreeting

package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

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

이 컨트롤러는 간결하고 간단하지만 내부적으로 많은 일이 진행되고 있습니다. 우리는 그것을 단계적으로 분해합니다.

@GetMappingHTTP GET을 요청 주석 보장하지만이하는 /greeting에 매핑되는 greeting()방법.

  다른 HTTP 동사 (예 : @PostMappingPOST)에 대한 보조 주석이 있습니다 . 또한 @RequestMapping모두 파생 된 주석이 있으며 동의어 역할을 할 수 있습니다 (예 :) @RequestMapping(method=GET).

@RequestParam쿼리 문자열 매개 변수의 값을 메서드 name의 name매개 변수에 바인딩합니다 greeting(). 경우 name매개 변수는 요청 결석의 defaultValue의가 World사용됩니다.

메서드 본문의 구현은 greeting을 사용하여 지정된 및 형식의 다음 값을 기반으로  특성을 사용 하여 새 Greeting개체를 만들고 반환합니다 .idcontentcounternametemplate

기존 MVC 컨트롤러와 이전에 표시된 RESTful 웹 서비스 컨트롤러의 주요 차이점은 HTTP 응답 본문이 생성되는 방식입니다. 이 RESTful 웹 서비스 컨트롤러는 인사말 데이터를 HTML로 서버 측 렌더링을 수행하기 위해 뷰 기술에 의존하는 대신 Greeting객체를 채우고 반환 합니다. 객체 데이터는 HTTP 응답에 JSON으로 직접 기록됩니다.

이 코드는 @RestController모든 메소드가 뷰 대신 도메인 객체를 반환하는 컨트롤러로 클래스를 표시하는 Spring 주석을 사용 합니다. @Controller및 을 모두 포함하는 약어입니다 @ResponseBody.

Greeting객체는 JSON으로 변환해야합니다. Spring의 HTTP 메시지 변환기 지원 덕분에이 변환을 수동으로 수행 할 필요가 없습니다. Jackson 2 가 클래스 경로에 있기 때문에 Spring MappingJackson2HttpMessageConverter Greeting인스턴스를 JSON 으로 변환하도록 자동으로 선택됩니다 .

@SpringBootApplication 다음을 모두 추가하는 편리한 주석입니다.

  • @Configuration: 애플리케이션 컨텍스트에 대한 Bean 정의의 소스로 클래스에 태그를 지정합니다.
  • @EnableAutoConfiguration: Spring Boot에 클래스 경로 설정, 기타 Bean 및 다양한 속성 설정을 기반으로 Bean 추가를 시작하도록 지시합니다. 예를 spring-webmvc들어이 클래스 경로에있는 경우이 주석은 애플리케이션을 웹 애플리케이션으로 플래그 지정하고 DispatcherServlet.
  • @ComponentScan: Spring에 com/example패키지 에서 다른 구성 요소, 구성 및 서비스를 찾도록 지시 하여 컨트롤러를 찾을 수 있도록합니다.

 main()방법은 Spring Boot의 SpringApplication.run()방법을 사용하여 애플리케이션을 시작합니다. XML이 한 줄도 없다는 것을 알았습니까? web.xml파일 도 없습니다 . 이 웹 애플리케이션은 100 % 순수 Java이며 배관이나 인프라를 구성 할 필요가 없습니다.

실행 가능한 JAR 빌드

Gradle 또는 Maven을 사용하여 명령 줄에서 애플리케이션을 실행할 수 있습니다. 필요한 모든 종속성, 클래스 및 리소스를 포함하는 단일 실행 가능 JAR 파일을 빌드하고 실행할 수도 있습니다. 실행 가능한 jar를 빌드하면 개발 라이프 사이클 전반에 걸쳐 다양한 환경 등에서 애플리케이션으로 서비스를 쉽게 제공하고 버전을 지정하고 배포 할 수 있습니다.

Gradle을 사용하는 경우 ./gradlew bootRun. 또는 ./gradlew build다음과 같이을 사용하여 JAR 파일을 빌드 한 후 실행할 수 있습니다.

java -jar build / libs / gs-rest-service-0.1.0.jar

Maven을 사용하는 경우 ./mvnw spring-boot:run. 또는 ./mvnw clean package다음 과 같이 JAR 파일을 빌드 한 다음 JAR 파일 을 실행할 수 있습니다.

java -jar target / gs-rest-service-0.1.0.jar
  여기에 설명 된 단계는 실행 가능한 JAR을 생성합니다. 클래식 WAR 파일을 빌드 할 수도 있습니다 .

로깅 출력이 표시됩니다. 서비스는 몇 초 내에 가동 및 실행되어야합니다.

서비스 테스트

이제 서비스가 시작되었으므로을 방문 http://localhost:8080/greeting하십시오.

{"id":1,"content":"Hello, World!"}

name을 방문하여 쿼리 문자열 매개 변수를 제공합니다 http://localhost:8080/greeting?name=User. 의 값을 어떻게주의 content속성에서 변경 Hello, World!을 Hello, User!다음 목록에서 볼 수 있듯이 :

{"id":2,"content":"Hello, User!"}

이 변경은의 @RequestParam배치 GreetingController가 예상대로 작동하고 있음을 보여줍니다 . name매개 변수의 기본값을 받고있다 World하지만, 명시 적으로 쿼리 문자열을 재정의 할 수 있습니다.

id속성이에서 1로 어떻게 변경 되었는지도 확인하십시오 2. 이는 GreetingController여러 요청 에서 동일한 인스턴스 에 대해 작업 하고 있고 해당 counter필드가 예상대로 각 호출에서 증가하고 있음을 증명합니다 .

요약

축하합니다! 방금 Spring으로 RESTful 웹 서비스를 개발했습니다.