관리 메뉴

LIFE & IT

REST 방식 1 본문

웹 프로그래밍/Spring Framework

REST 방식 1

프린이! 2020. 9. 23. 10:39

1. REST(Representational State Transfer)란?

 

 

- HTTP URI + HTTP Method이다.

- HTTP URI를 통해 제어할 자원(Resource)을 명시하고 HTTP Method(GET, POST, PUT, DELETE)를 통해

해당 자원(Resource)를 제어하는 명령을 내리는 방식의 아키텍쳐이다.

 

 

 

2. RESTful API란?

 

 

 

RESTful API는 HTTP와 URI기반으로 자원에 접근할 수 있도록 

제공하는 애플리케이션 개발 인터페이스(REST의 원리를 따르는 시스템은 RESTful이라고 지칭된다.)

 

 

 

3. 기존의 웹 접근방식과 RESTful API 방식과의 차이점

 

 

 

 종류

 방식

 기존게시판

 방식

 Restful API 지원하는 게시판

 긁읽기

 GET

 /list.do?no=100&name=java

 GET

 /bbs/java/100

 글등록

 POST

 /insert.do

 POST

 /bbs/java/100

 글삭제

 GET

 /delete.do?no=100&name=java

 DELETE

 /bbs/java/100

 글수정

 POST

 /update.do

 PUT

 /bbs/java/100

 

 

- 기존의 게시판은 GET, POST만 자원에 대한 CRUD처리하며 URI는 액션을 나타낸다.

- RESTful 게시판은 GET, POST, PUT, DELETE를 모두 사용하여 CRUD를 처리하며 URI는 제어하려는 자원을 나타낸다.

 

출처: shlee0882.tistory.com/208

 

REST, RESTful API개념, 기존 방식과의 차이점

1. REST(Representational State Transfer)란? - HTTP URI + HTTP Method이다. - HTTP URI를 통해 제어할 자원(Resource)을 명시하고 HTTP Method(GET, POST, PUT, DELETE)를 통해 해당 자원(Resource)를 제어하는..

shlee0882.tistory.com

◎ 기존 방식과 REST 방식의 차이

 

기존 방식은 Controller 에서 Model 에 데이터를 담아서 JSP 등과 같은 뷰(VIEW)로 전달하는 방식.

REST 방식은 메서드 리턴 타입을 사용자가 정의한 클래스 타입을 사용할 수 있고, 이를 JSON 이나 XML로 자동처리가 가능하다.

 

※ 기존 Contoller 에서는 @ResponseBody를 이용해 @RestController 와 동일한 결과를 만들 수 있었음

 

 

▷ 기존 Controller 방식

return 값으로 JSP 주소 값을 반환한다.

@PostMapping("/register") 
public String register(BoardVO board, RedirectAttributes rttr) {
		
	log.info("++++++++++++register : " + board);
		
	service.register(board);
		
	rttr.addFlashAttribute("result", board.getBno());
		
	return "redirect:/board/list"; 
 }

 

▷ REST Controller 방식

return 값으로 데이터 값을 반환한다.

package org.zerock.controller;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.log4j.Log4j;

@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
	
	@GetMapping(value = "/getTest", produces = "text/plain; charset=UTF-8")
	public String getText() {
		
		log.info("MIME TYPE : " + MediaType.TEXT_PLAIN_VALUE);
		
		return "안녕하세여"; 
		
		// 기존 Controller 는 return 값을 "redirect:/board/list" 와 같은 문자열로 반환했다.
		// REST 방식은 "안녕하세여" 같은 순수한 데이터가 반환
		
		
	}
}

 

JSON 처리를 위해서 jackson-databind 라이브러리를 pom.xml 에 추가해야한다.

Maven repository 홈페이지에서 jackson-databind 를 검색하면 관련 저장소 정보와 pom.xml 정보도 찾을 수 있다.

 

*jackson-databind : 브라우저 객체를 JSON 포멧의 문자로 변환 시켜 전송할 때 필요

- JSON은 따로 정리할 예정 2020.10.12

 

테스트 진행시 Java 인스턴스를 JSON 타입의 문자열로 변환해야 하는 경우도 있으므로 gson 라이브러리 추가

 

pom.xml 수정사항

	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
        ...
        
		<!-- Servlet 버전 변경 및 수정 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
        ...
             
       <!-- Lombok 
       https://mvnrepository.com/artifact/org.projectlombok/lombok -->
       
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.0</version>
			<scope>provided</scope>
		</dependency>

		<!-- JUNIT
        https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
        
    <!-- JSON
    https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.6</version>
		</dependency>

	<!-- gson
    https://mvnrepository.com/artifact/com.google.code.gson/gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.2</version>
		</dependency>
   
   
   ...
   			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>
			</plugin>

 

 

 

▷ Rest 방식 결과 화면

 

tomcat 실행 결과화면

 

☞ @GetMapping 에 사용된 produces 속성은 메소드가 생산하는 MIME 타입이다.

return 타입이 text 값이기 때문에 produces 는 text 속성의 MIME 타입을 가져야한다.