SPRING-BOOT와 GRADLE로 RESTful 웹 서비스 시작

hajin·2023년 4월 10일
0

springboot&Gradle

목록 보기
1/1

공식 튜토리얼
이 가이드는 "Hello,World" 출력하는 RESTful 웹 서비스를 만드는 과정에 대한 가이드 입니다.

당신이 만들 것

이 튜토리얼을 통해 http://localhost:8080/greeting 에 접속할 시에 JSON형태로

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

의 형태의 리스트가 출력 됩니다.

또, url에 name 패러미터를 통해 쿼리 문자열을 입력해
http://localhost:8080/greeting?name=User 로 접속시

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

로 문자열이 출력 될 것입니다.

필요한 것

  • 15분 정도의 시간
  • 자신에게 맞는 IDE혹은 텍스트 편집기
  • JAVA17+
  • Gradle 7.5+ 혹은 Maven 3.5+
  • 해당 IDE를 사용시 프로젝트를 바로 만들 수 있습니다.
    - Spring Tool Suite (STS)
    • Intellij IDEA
    • VSCode

https://github.com/spring-guides/gs-rest-service.git해당 링크를 통해 프로젝트 생성 과정 스킵 가능

IDE나 위의 깃을 쓰지 않을 경우...
1. https://start.spring.io/에 접속하여 프로젝트 명과 자신에게 맞는 환경으로 설정합시다.
2. dependencies에서 Spring Web을 선택합시다.
3. 생성하고 zip으로 다운로드 하여 프로젝트 편집 시작!

이제 리소스 재출력 클래스를 만들어 보기

이제 gradle tasks를 통해 빌드를 합니다. 이제 웹 서비스를 만들 수 있습니다.
우리 한번 서비스가 어떻게 동작할 것인지를 생각해봅시다.
서비스는 /greeting으로의 requests의 GET를 다룰겁니다. 그리고 임의로 name 패러미터로 쿼리 문자열을 받습니다. 그리고 GET 요청에 대하 응답으로 200 ok 응답을 json을 담은 문서와 함께 출력해아합니다.

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

id 항목은 고유 식별자이며, content는 Greeting에 대한 텍스트 주요 표현법입니다.
이를 model화 하기 위해 resource representation class를 만들어 봅시다. 먼저 Java record class를 만들고 idcontent 데이터를 줍시다. src/main/java/{패키지 이름}/Greeting.java을 생성한 이후 해당 파일에

package com.example.restservice;

public record Greeting(long id, String content) { }

를 작성합니다.

리소스 컨트롤러(Resource Controller) 생성

RESTful 웹 서비스를 만들기 위한 Spring식 접근아래 HTTP 요청은 컨트롤러에 의해 관리됩니다. 이 컴포넌트들은 @ResController 어노테이션(annotaion)에 의해 구조가 정의되고, 목록(src/main/java/{패키지 이름}/GreetingController.java)에 표시된 GreetingController는 Greeting의 새 인스턴스를 반환하여 /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));
	}
}

이 컨트롤러는 단순간결 합니다. 그러나 실제로는 많은 작업들이 진행되고 있습니다. 하나씩 파헤쳐 봅시다.

...
@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
...

@GetMapping어노테이션은 /greeting으로 연결된 HTTP GET요청이 greeting() 메소드에 연결 되었는지 확인합니다.

GET이 아닌 POST등의 Request의 경우는 @POSTMapping이나 @RequestMapping(method=POST)등으로 사용

...
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {...}
...

@RequestParamd은 패러미터를 통해 받아온 name의값을 greeting 메소드의 name패러미터에 전달합니다. name패러미터가 없으면 이미 설정된 기본 값인 World로 전달 됩니다.

메소드 본문의 구현은 Greeing 템플릿을 사용해서 counter로 갱신된 다음 숫자 값과 , 받아온 문자열을 알맞게 포맷팅하여 나온 문자 값을 바탕으로 id와 content속성이 부여된 Greeting 객체를 리턴합니다.

기존 MVC컨트롤러와 예제와 같은 MVC컨트롤러간의 차이점은 HTTP응답 본 내용이 생성되는 방식입니다. 예제의 RESTful 웹 서비스 컨트롤러는 기존의 Greeting 응답 본문을 출력하기 위해 서버측에서 html렌더링을 수행하며 view기술에 의존하기 보단 Greeting 객체를 생성하고 리턴합니다. 이 객체 데이터는 JSON형태의 HTTP 응답으로 즉시 쓰여집니다.

이 예제는 모든 메소드를 뷰 대신 도메인 객체로 반환하는 컨트롤러이자 클래스인 @RestController 어노테이션을 사용합니다.

Greeting 객체는 반드시 JSON으로 변환되어야 합니다.
다행히 Jackson 2가 클래스path에 있어서 Spring의 MappingJackson2HttpMessageConverter가 자동적으로 Greeting 인스턴스를 Json으로 변환합니다. 그래서
Spring에서 http 메시지를 변화기를 지원해서 수동으로 코드를 더 짤 필요가 없습니다!
@SpringBootApplication은 아래의 내용을 모두 추가하는 편리한 어노테이션입니다.

  • @Configuration은 애플리케이션 context를 위한 bean에 대한 출처를 클래스로서 지정함을 수행합니다.

참고: java bean은 무엇인가?https://docs.oracle.com/javase/6/docs/api/java/beans/package-summary.html

  • @EnableAutoConfiguration은 Spring Boot에게 클래스 경로나 bean, 프로퍼티 설정을 알려줘 Spring Boot가 bean들을 추가하게 해줍니다. 예를 둘어 만약 spring-webmvcclasspath에 있을시 어노테이션은 어플리케이션을 웹 어플리케이션으로, key의 행동을 가리킵니다. (예: DIspatcherServlet)

  • @ComponentScan: 스프링에게 다른 구성요소 어노테이션이나 설정, 서비스들을 com/example에서 찾아 자동으로 등록하게 합니다.

main() 메소드는 스프링 부트의 SpringApplication.run() 메소드를 실행해 어플리케이션을 배포합니다. xml 한줄도 없었던거 눈치 채셨나요? web.xml 파일 하나도 없습니다. 이 웹 어플리케이션은 100% java이고 설정이나 구조 짜는데 씨름할 필요가 없는 예제입니다.

JAR 빌드 그리고 실행

이제 애플리케이션을 콘솔에서 Gradle이나 Maven으로 실행할 수 있습니다. 아니면 필요한 의존들이나 클래스나 자원들을 모두 담고 실행가능한 JAR 파일을 빌드할 수도 있습니다. 실행 가능한 JAR 파일을 빌드하면 개발 지원 시기까지, 다양한 환경에서 서비스를 애플리케이션 형태로 쉽게 제공하여 버전을 지정해 배포할 수 있습니다.

Gradle을 실행하면, ./gradlew bootRun을 통해 어플리케이션을 실행할 수 있습니다. 아니면./gradlew build를 써서 빌드 후 JAR파일을 java -jar build/libs/{압력한 프로젝트 이름}.jar로 실행해서 쓸 수 있습니다.

Maven을 쓸 경우, ./mvnw spring-boot:run으로 어플리케이션을 실행할 수 있습니다. 마찬가지로 JAR파일을 ./mvnw clean pacakge로 빌드후 JAR파일을 java -jar target/{압력한 프로젝트 이름}.jar으로 실행하면 됩니다.

서비스 테스트

이제 서비스가 시작되었습니다. 위와 같은 과정으로 실행한 이후, http://localhost:8080/greeting 를 들려 봅시다. 들렸다면

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

를 볼 수 있습니다. 이제 쿼리 문자열을 추가합시다.
http://localhost:8080/greeting?name=User로 방문시

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

가 나옵니다.

다르게 준 값으로 GreetingController@RequestParam의 활용이 예상대로 동작하고 있습니다. name패러미터는 World가 기본 값이지만 쿼리 문자열로 인해 값이 덮어 쓰여질 수 있습니다.

또, id 속성이 1에서 2로 변경된 걸 알 수 있습니다. 이것은 GreetingController를 여러번 요청 한 것으로 counter 필드의 값 상승이 부를 때마다 된 것임을 예상할 수 있습니다.

profile
restart

0개의 댓글