티스토리 뷰


Spring Restful API 만들기.html

Spring - Restful API 만들기

※ STS를 활용하여 Step by Step 형태로 진행
※ 그림 출처들



목표

Restful api로 조회하면 결과 값을 JSON형태로 제공하는 형태

Return 값의 예

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


준비물


Spring Project 생성하기


교육 전용 콘텐츠 생성 마법사를 이용하여 구성하기

New > Import Spring Getting Started Content 메뉴를 선택

뒤를 이어 나오는 팝업 창에서 자신이 생성하기를 원하는 서비스 Template를 선택 가능하다.
예제를 수행하기 위해서 아래의 이미지와 같이 Consuming Rest를 선택하고, 빌딩 타입을 Maven, Template으로 코드를 제공하는 옵션인 initialcomplete체크 한다.


이후 Maven이 실행되면서, 필요한 패키지들을 다운 받아 설치하게 된다.
프로젝트는 두 개 생성되나, gs-consuming-rest-initial내에서 예제를 수행한다.


예제 진행

Model(Resource) 만들기

src/main/java/hello/Greeting.java를 생성하고, 내부 모델을 코딩한다.

package hello;

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


생성된 Resource를 운용할 Controller 만들기

HTTP로 접근하여 통신 시, 이를 제어하는 부분은 Controller에서 이뤄진다.
Controller Class를 만들면 어노테이션으로 @RestController를 붙여줘야 한다.


@RestController는 Spring 4.X 부터 사용 가능하다.


src/main/java/hello/GreetingController.java과 함께 GreetingController라는 Class를 생성하고, GET 요청을 /greeting로 받게 설정한다.

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
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();

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


@RequestMapping/greeting HTTP GET 요청을 greeting()로 맵핑 해준다.
차후 다른 HTTP 요청을 처리할 경우에는 @RequestMapping(method=GET)와 같은 방식으로 처리하면 된다.


@RequestParam는 Query String Parameter와 Binding되며, defaultValue를 통해 기본 값을 설정할 수 있다.


Response에 대해 걱정할 필요가 없는 것이, Spring에서 자동으로 JSON 변환을 제공한다.


Application 실행 부 만들기

src/main/java/hello/Application.java에 Java의 전통적인 Main()를 생성한다.

package hello;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}


@ComponentScan은 동일한 패키지(hello) 내에 @Component 어노테이션이 부여된 클래스를 찾고 등록한다. @RestController 또한 @Component 일종이기 때문에 GreetingController도 검색 대상이 된다.


한편, @EnableAutoConfiguration는 자동 설정 옵션으로, web.xml 없이 bean들을 자동 등록한다.


.jar로 빌드하기

note: 명령어를 통하여 빌드하는 방법이 대부분 내용이지만, 현재 STS로 진행 중이기에, STS에서 메이븐으로 빌드하는 방법을 알아본다.


메뉴에서 File > Run As > Maven build 를 선택한다.


출력된 팝업 창에서 Goals 부분에 clean package라 작성하고, Skip Test 항목을 체크 한다.
이후, Run 버튼을 눌러 컴파일을 실행하자.



컴파일이 완료되면, File > Run As > Spring Boot APP 을 선택하여 서버를 구동하자.
STS 내에 임베디드 톰켓이 따로 있어서 .jar로 컴파일된 Web app을 실행하게 된다.


http://localhost:8080/greeting?name=%ED%95%9C%EC%8A%B9%EC%97%B0


이와 같이 name parameter를 사용하면, 소스 상에서 query 정의된 value를 가져와 사용하게 된다.

note1: 아래와 같은 문제가 발생하여 컴파일이 진행되지 않을 경우


No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?


설정 부분의 installed JREs 에서 아래와 같이 변경한다.

JDK 항목이 없을 경우 Search를 통해 위치를 검색하여 적용하자.


note2: 샘플 실행 시, 서버가 구동이 되지 않을 경우


Web app으로 인식되지 않으면 STS는 톰켓을 사용하지 않는다. 문제는 샘플 코드에서 pom.xml 설정을 그대로 사용해 봤자, 서버가 구동되지 않는다. 아래의 의존성을 추가하자.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


신고
댓글
  • 프로필사진 wjapower@naver.com 궁금한 점이 있습니다.
    저런 식으로 작성한 REST-API 를 tomcat에 WAR파일로 배포하는 방법에 대해서 알 수 있을까요?
    2015.04.30 16:38 신고
  • 프로필사진 막장선생 잠깐 검색해 보왔는데, 아래의 링크를 확인하시면 될 듯 합니다.
    http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
    https://spring.io/guides/gs/convert-jar-to-war/
    2015.07.14 10:04 신고
  • 프로필사진 궁금해요 좋은 글 감사드립니다. 궁금한점이 있어서 글 남깁니다. 프로젝트가 2개 생성이 되는데요. 개발할때는 xxx-initial 프로젝트에서 수정하면 되고, 배포할 때는 xxx-complete 프로젝트로 배포를 하면 되는건가요? 프로젝트 2개 생성되는 이유를 모르겠습니다. ㅠㅠ 2016.08.01 17:38 신고
  • 프로필사진 막장선생 해당 예제는 Spring에서 제공하는 Template를 기반으로 구성되어 있고, 예제 구성간 import 할 때, 'Codeset' 메뉴에서 initial과 complete를 선택하게 되어있습니다. 둘 다 선택하니 두 개 나오는 겁니다...
    수정과 배포에는 전혀 관계 없습니다. 그냥 예제일 뿐이에요.
    2016.08.04 13:40 신고
댓글쓰기 폼