IT/Back-end

RESTful Web Service 구축하기! (feat. spring)-(2)

omaeng 2020. 3. 3. 16:52

2020/03/03 - [IT/Back-end] - RESTful Web Service 구축하기! (feat. spring)-(1) (이전)

 

 

RESTful Web Service 구축하기! (feat. spring)-(1)

이번 가이드는 Spring을 사용하여 "Hello, World"를 출력하는 RESTful 웹 서비스 구축 안내서입니다! 앞으로 구축하게 될 것들 우리는 앞으로 HTTP의 GET 메소드 요청을 수행하는 서비스를 만들 것입니다! http://..

omaeng.tistory.com

자 이제 프로젝트 및 설정을 준비완료 했습니다. 이제 웹 서비스를 구축할 준비가 되었습니다.

각 서비스가 어떻게 상호작용하는지 유념하시며 보시길 바랍니다!

 

 

Resource Representation class 만들기


서비스는 /greeting 요청으로 GET 메소드를 통해 다뤄질 예정입니다.

 

선택적으로 name 매개변수를 통해 쿼리문을 날릴 수 있습니다.

 

과정을 잘 따라오시면 아래와 같은 JSON 결과를 보실 수 있습니다!

 

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

 

id 필드는 greeting의 고유 식별자이며 내용은 greeting의 텍스트 표현입니다.

 

greeting 표현을 모델링하려면  resource representation class를 만들어야 합니다.

 

이제 다음 목록 (src / main / java / com / example / restservice / Greeting.java)에서 볼 수 있듯이 id 및 content 데이터에 대한 필드, 생성자 및 접근자가있는 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;
	}
}

 

위의 class는 Jackson JSON 라이브러리를 사용하여 Greeting 유형의 인스턴스를 JSON에 자동으로 변화합니다.

Jackson은 웹 스타터에 default로 포함되어 있습니다.

 

 

Resource Controller class 생성하기


 

RESTful 웹서비스 구축을 HTTP 요청 -> Controller 의 순서로 진행되게 spring에서 설계했습니다.

 

이러한 구성요소는 @RestController 어노테이션으로 식별됩니다.

 

아래에 표시된 GreetingController는 새 인스턴스를 반환하여 /greeting 의 대한 GET 요청을 처리합니다.

 

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

이 Controller는 간결하고 간단합니다. 하지만 Controller안에서는 많은 일이 일어납니다.

 

@GetMapping 어노테이션은 HTTP GET 요청을 /greeting에 greeting() 메소드에 연결되게 해줍니다.

@PostMapping은 POST를, @RequestMapping(method=GET)은 정의된 메소드의 이름을 비슷한 방식으로 연결시켜 줍니다.

@RequestParam은 요청 매개변수와 메소드의 매개변수를 묶어줍니다.

 

만약에 name 매개변수가 요청에 포함되어 있지 않다면, default 값으로 대체됩니다.

 

메소드 본문의 구현은 카운터의 다음 값을 기반으로 id 및 content 속성을 가진 새 Greeting 객체를 만들고 반환하며,

 

Greeting 템플릿을 사용하여 지정된 이름의 형식을 지정합니다.

 

앞에서 설명한 기존 MVC 컨트롤러와 RESTful 웹 서비스 컨트롤러의 주요 차이점은 HTTP 응답 본문이 생성되는 방식입니다.

 

RESTful 웹 서비스 컨트롤러는 Greeting 기술을 HTML로 서버 측 렌더링하는 데 뷰 기술을 사용하지 않고 Greeting 오브젝트를 채우고 리턴합니다.

 

객체 데이터는 JSON으로 HTTP 응답에 직접 작성됩니다.

 

위의 코드는 @RestController 어노테이션을 이용하여 클래스가 컨트롤러로 표시되어 모든 메소드가 뷰 대신에 도메인 오브젝트를 리턴합니다.

 

@RestConstroller는 @Controller와 @ResponseBody를 모두 포함하는 약어입니다.

 

Greeting 객체는 JSON으로 변환되어야합니다.

 

Spring의 HTTP 메시지 변환기의 지원 덕분에 변환을 수동으로 수행 할 필요는 없습니다. Jackson 2가 클래스 경로에 있으므로 Spring의 MappingJackson2HttpMessageConverter가 자동으로 선택되어 Greeting 인스턴스를 JSON으로 변환합니다.

 

@SpringBootApplication 은 아래와 같은 기능을 제공합니다.

  • @Configuration: 클래스를 application context의 Bean으로 정의해 준다.
  • @EnableAutoConfiguration: SpringBoot에게 다양한 속성 설정을 기반으로 Bean을 추가하도록 지시.
  • @ComponentScan: SpringBoot에게 서비스와 컨트롤러를 찾을수 있게 해줍니다.

 

서비스 테스트


 

자 이제 테스트를 진행해 보겠습니다!

 

http://localhost:8080/greeting

위의 주소로 접속을 시도하면

 

 

다음과 같이 응답을 볼 수 있다.


 

마치며... 

spring의 구동방식과 구조에 대해서 자세한 이해를 바탕으로 시작하는 것이 좋다고 생각합니다.

글을 쓰면서 이것 저것 흔들렸던 개념을 다시 잡는데 좋은 포스팅이었습니다.

실습을 따라하시며 이해되지 않는 문장이나 표현이 있으시다면 https://spring.io/guides/gs/rest-service/ 가이드를 바탕으로 따라한 포스팅이니 원문을 참조하시면 되겠습니다.