3.2 RestController 사용하기


@SpringBootApplication Annotation

@SpringBootApplication은 해당 클래스가 스프링 부트의 어플리케이션이라는 것을 나타낸다.

Spring MVC에는 component-scan 기능이 있다. 설정 파일 등을 준비하지 않아도 어노테이션만 정의해두면, 프로그램에서 사용하는 컴포넌트 전체를 자동으로 적용해서 사용할 수 있도록 해주는 기능이다.


컨트롤러 클래스 준비하기

HelloController.java
@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Hello Spring-boot world";
    }
}

@RestController에 대해

HelloController도 특별한 클래스를 상속하거나 구현하는 것이 아닌, 아주 단순한 클래스이다.
단지 전용 Annotation이 정의되어 있을 뿐이다. 이 클래스가 갖고 있는 것은 @RestController라는 Annotation이다.

RestController는 'REST'를 위한 전용 컨트롤러다.

여기서 잠깐! REST란??

REST는 REpresentative State Transfer의 약자로 분산 시스템을 위한 아키텍처다.
네트워크를 경유해서 외부 서버에 접속하거나 필요한 정보를 불러오기 위한 구조라고 생각할 수 있다. 
그리고 이 REST 개념을 바탕으로 설계된 시스템을 'RESTFul'이라고 표현한다.

REST의 경우, 클라이언트가 특정 URL에 접속하면 웹페이지를 그리는 것이 아니라 특정 정보 또는 특정 처리 결과를 텍스트 형태로 반환한다.

이런 RESTFul한 웹 서비스를 구축하기 위해 사용하는 것이 RestController이다.

RestController는 웹 어플리케이션의 일반적인 페이지(HTML 코드를 전송하는 페이지)에 비해 구조가 간단하다.

대부분은 HTML을 사용하지 않고 단순한 텍스트로 정보를 전송하므로 HTML기반의 웹 페이지보다 사용 방법도 간단하다.

@RequestMapping에 대해

@RequestMapping(주소)

서버의 URL과 특정 처리를 연동(매핑)시키는 구조이다.

메서드마다 '이것은 OO이라는 주소용 처리'라고 연동해 놓고, 서버로 요청이 온 경우 해당 주소에 할당되어 있는 메소드가 자동으로 실행되는 것이다.

매개변수 전달

값을 서버로 보내고 그것을 이용해서 어떤 결과를 반환하는 프로그램을 만들려면,

requestHandler가 매개변수를 받을 수 있는 구조를 준비해야 한다.

/**[코드 3=7]**/

@RestController
public class HelloController {

    @RequestMapping("/{num}")
    public String indexParam(@PathVariable int num) {
        int result = 0;
        for (int i = 1; i <= num; i++) {
            result += num;
        }
        return "total :" + result;
    }
}

매개변수와 @PathVariable

코드 3-7은 '매개변수'라는 기능을 사용하고 있다. 이것은 URL의 query String 부분에 지정한 값을 추출해서 사용하는 기능이다.

Annotation을 보면 @RequestMapping( "/{num}" }이라고 되어 있는데, 이 때 {num} 부분이 매개변수이다.
이것은 "/"라는 주소 뒤에 있는 특정값을 num이라는 변수로 받으라는 의미이다.

아래 indexParam메소드를 보면, int num이라는 매개변수가 추가되고 @PathVariable라는 어노테이션이 붙어있다.

실제 http://localhost:8080/100이라는 주소를 입력하면, "/100"이라는 경로의 100이 {num} 매개변수의 값이 된다.
이 값은 indexParam 메소드의 인수 num에 전달되고, 받은 변수를 계산해서 결과를 반환한다.

정수가 아닌 데이터 타입도 가능하다.

  • /12.342 처럼 입력했다면 정수로 DownCasting하여 실행한 결과 'total:78'이 출력될 것이다.

다른 데이터 타입을 매개변수로 받고 싶으면,

  • indexParam(@PathVariable String text) 와 같이 변경하면 된다.

객체를 JSON으로 출력하기

REST 서비스는 '텍스트를 출력'하는 단순한 기능을 갖고 있지만, 실제로는 단순 텍스트가 아닌 '정보'를 가져오기 위해 사용하는 경우가 많다. 자바에서는 복잡한 정보를 다룰 때, 클래스를 정의해서 인스턴스의 형태로 정보를 주고받는 것이 일반적이다.

RestController도 방식은 같다. RestController 클래스는 String을 반환값으로 지정하고 있지만, 이것을 클래스로 변경할 수도 있다
이 경우, return하는 인스턴스의 내용을 JSON 형식으로 변환해서 텍스트로 출력하게 된다.

여기서 잠깐!! JSON이란?

JSON은 'Javascript Object Notion'의 약자로 주로 자바스크립트의 객체를 주고받을 때 사용하는 데이터 형이다.
RestController는 자바의 인스턴스를 JSON 형식의 텍스트로 변환해서 출력한다.
것은 스프링 부트 측에서 자동으로 처리하므로, 프로그래머가 직접 JSON형태로 변환할 필요는 없다. 
단순히 인스턴스를 반환하기만 하면 된다.

DataObject 출력하기

직접 적용한 예제는 아래와 같다.

@RestController
public class HelloController {

    String[] names = { "kim", "lee", "park" };
    String[] mails = { "[email protected]", "[email protected]", "[email protected]" };

    @RequestMapping("/{id}")
    public DataObject indexDataObject(@PathVariable int id) {
        return new DataObject(id, names[id], mails[id]);
    }

    class DataObject {
        private int id;
        private String name;
        private String value;

        public DataObject(int id, String name, String value) {
            this.id = id;
            this.name = name;
            this.value = value;
        }
    }
}

[출력결과]

{"id":1,"name":"lee","value":"[email protected]"}

@RequestMapping("/{id}")라는 형태로 URL 경로로부터 id 값을 전달하게 되어 있다.
이것은 @PathVariable int id라는 인수 형태로 전달된다.

여기서는 메소드의 반환값이 DataObject라는 것을 사용하고 있다. 이렇게 반환된 DataObject는 다음과 같은 형태의 위의 출력결과와 같은 형태의 텍스트로 변환되어 출력된다.

이것이 JSON 형식의 텍스트이다. 실제로 사용할 때는 이 텍스트를 객체로 변환하고, 객체에서 값을 꺼내서 자유롭게 처리하면 된다.

results matching ""

    No results matching ""