▸Spring MVC/기본 문법

스프링 Restful 서비스(API)_API 구현(JSON) [2/3]

코데방 2020. 3. 20.
728x90
- Develop OS : Windows10 Ent, 64bit
- WEB/WAS Server : Tomcat v9.0
- DBMS : MySQL 5.7.29 for Linux (Docker)
- Language : JAVA 1.8 (JDK 1.8)
- Framwork : Spring 3.1.1 Release
- Build Tool : Maven 3.6.3
- ORM : Mybatis 3.2.8

 

Restful 서비스(API)에 대한 간단한 기본 개념은 이전글을 참고하시면 됩니다.

 

[Spring MVC/- 기본 문법] - 스프링 Restful 서비스(API)_기본 개념 [1/3]

 

진짜 Restful한 서비스에 대한 의견은 아직도 분분한 것 같고, 누군가는 이건 전혀 Restful한 서비스 구현이 아니라고 할 수도 있겠지만.. 아주 기본적인 개념만 적용해 구현하는 방식을 정리보겠습니다.

 

이번글은 JSON 전달 방식을 이용한 구현입니다. XML을 사용한 Restful 서비스 구현은 다음글을 참조하시면 됩니다.

 

2020/03/21 - [Spring MVC/- 기본 문법] - 스프링 Restful 서비스(API)_API 구현(XML) [3/3]

 

 


 

 

[ Jackson 라이브러리 다운 ]

  • 'JSON ↔ 자바객체' 변환에 가장 많이 사용되는 라이브러리

JSON이나 XML은 범용적으로 사용되는 데이터 교환 형식이기 때문에 거의 모든 언어에서 이를 다룰 수 있는 라이브러리를 제공하고 있습니다. 자바에서 가장 많이 사용되는 JSON 라이브러리는 'Jackson' 입니다. 

 

특히 스프링 3.0 이후부터는 Jackson 라이브러리를 추가해두기만 하면 별도의 설정 없이도 자동으로 찾아서 실행해준다는 장점도 있습니다. 

 

Maven Rapository에서 "jackson mapper"로 검색하면 버전별 정보가 나옵니다. 전 가장 최신 버전으로 설치하도록 하겠습니다. pom.xml에서 의존 설정을 해줍니다.

<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

 

 


 

 

[ 크롬 Postman 설치 ]

 

필수 사항은 아니지만 REST API를 편하게 테스트할 수 있도록 해주는 크롬의 확장 프로그램입니다. 어차피 Restful 서비스에서는 View를 만들지 않고 데이터 응답만 처리하므로 굳이 View를 따로 만들어서 테스트를 할 이유가 없습니다. Postman을 사용하면 제대로된 데이터가 넘어오는지 바로 확인할 수 있기 때문에 효율적인 테스트가 가능합니다.

 

구글에서 "Postman"으로 검색하면 나옵니다. 설치한 뒤 실행해서 구글 계정으로 로그인해주면 됩니다. 로그인하고나면 윈도우용 버전을 다운받거나 프로젝트를 하나 생성하라고 나오는데 그냥 우측 상단 x를 눌러 무시하면 됩니다.

 

구글 포스트맨 링크

 

 

 

 

 


 

 

[ Restful 컨트롤러 작성 ]

 

Restful 서비스라고 별게 있는건 아니라 기본은 똑같습니다. JSON 데이터 형식를 변환하는 과정만 좀 추가된다고 보면 됩니다. 이 과정마저도 Jackson 라이브러리만 Pom.xml에 의존설정 해두면 스프링에서 알아서 다 해줍니다.

 

Spring MVC에서는 클라이언트에서 전송한 XML이나 JSON 데이터를 자바 객체로 변환해서 컨트롤러로 넘겨주는 기능을 제공합니다. 어노테이션으로 적용할 수 있기 때문에 매우 간단합니다. 

 

  • @RequestBody : 클라이언트가 요청한 XML/JSON을 자바 객체로 변환해서 전달 받을 수 있음
  • @ResponseBody : 자바 객체를 XML/JSON으로 변환해서 응답 객체의 Body에 실어 전송할 수 있음

클라이언트에게 JSON 객체를 받아야 할 경우는 @RequestBody, 자바 객체를 클라이언트에게 JSON으로 전달해야할 경우에는 @ResponseBody 어노테이션을 붙여주면됩니다. @ResponseBody를 사용한 경우 View가 아닌 자바 객체를 리턴해주면 됩니다.

 

위의 두 어노테이션이 붙은 컨트롤러의 처리기 메소드는 서블릿이 가진 어노테이션 핸들러에 의해 JSON을 처리하는 Jackson의 클래스를 이용해 처리됩니다. 원래 스프링 3.0 이전에는 어노테이션 핸들러와 아래 클래스를 DI해주는 작업이 필요했지만 3.0 이후부터는 자동으로 돼서 별도 설정이 필요없어졌습니다.

 

HTTP Header의 Content-Type에서 "application/json"이라는 값이 있다면 스프링의 Jackson 메세지 컨버터 클래스에게 객체 변환 작업을 시키게 됩니다. 만약 JSON이 아닌 다른 형식이라면 해당 형식을 처리할 수 있는 컨버터 클래스에게 작업을 분배하게 됩니다. 스프링에는 JSON 외에도 여러 타입에 대한 기본 컨버터 클래스들이 존재하는데, 이 글에서는 다루지 않도록 하겠습니다. 기본으로 제공되는 컨버터 클래스가 아니라면 직접 지정해줄 수도 있습니다.

 

 

 


 

 

* ResponseBody 사용 예시

 

처리기 메소드에 간단한 객체 하나를 MAP으로 만들어서 리턴시킵니다.

package com.hsweb.springweb;

import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/board")
public class HomeController {

	@RequestMapping(value = "/list/{id}", method=RequestMethod.GET)
	@ResponseBody() // JSON
	public Map<String, String> home(@PathVariable String id) {
	
		Map<String, String> list = new HashMap<>();
		
		list.put("id", id);
		list.put("pw", "codevang123");
		list.put("location", "SEOUL");
		
		return list;
	}
}

 

 

 

실행시킨 뒤 Postman에서 URI를 통해 접속해보면 JSON 형식으로 데이터가 리턴된 것을 확인할 수 있습니다.

 

 

 

 

만약 직접 만든 VO 객체를 전달한다면 해당 클래스에는 getter 메소드가 필수적으로 존재해야 합니다. getter 없는 VO 객체는 없을테니 크게 신경쓸 일은 없을 것 같습니다. 

 

 

 


 

 

 

* RequestBody 사용 예시

 

@ModelAttribute 어노테이션과 비슷한 방법으로 사용됩니다. 파라미터 변수 앞에 @RequestBody 어노테이션을 붙여주면 스프링(및 Jackson)에서 해당 객체에다가 알아서 넣어줍니다. 만약 직접 만든 VO 객체를 사용한다면 역시 setter 메소드가 필수적으로 존재해야 합니다. 당연히 JSON의 변수명과 객체의 필드명도 동일해야 합니다. 

 

아래 코드와 같은 형식으로 작성하면 됩니다. 받은 JSON 데이터를 확인해보고 내용을 바꿔서 다시 보내주는 코드입니다.

 

package com.hsweb.springweb;

import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/board")
public class HomeController {

	@RequestMapping(value = "/list", method = RequestMethod.POST)
	@ResponseBody
	public Map<String, String> home(@RequestBody Map<String, String> list) {

		// 내용이 잘 들어왔는지 테스트
		String id = list.get("id");
		String pw = list.get("pw");
		System.out.println(id + " : " + pw);
		
		// 내용 변경해서 리턴
		list.replace("id", id + "response");
		list.replace("pw", pw + "response");
		
		return list;
	}
}

 

 

 

테스트를 위해 Postman에 내용을 입력합니다. 먼저 header의 Content-Type으로 JSON과 인코딩 타입을 명시해줍니다. Body 부분에는 JSON 형식으로 데이터를 지정합니다.

 

 

 

 

 

URL을 입력해서 서비스를 호출해보면, 정상적으로 데이터를 주고 받는 것을 확인할 수 있습니다.

 

 

 

728x90

댓글

💲 추천 글