티스토리 뷰

728x90
반응형

개발 환경

java 21.0.4 2024-07-16 LTSJava(TM) SE Runtime Environment (build 21.0.4+8-LTS-274)

Java HotSpot(TM) 64-Bit Server VM (build 21.0.4+8-LTS-274, mixed mode, sharing)

 

Tomcatv 10.1

EclipseVersion: 2024-06 (4.32.0)Build id: 20240606-1231


REST(Representational State Transfer, 표현 상태 전이)은 

웹 기반 애플리케이션에서 사용되는 소프트웨어 아키텍처 스타일입니다. 

주로 웹 서비스를 설계할 때 활용되며, HTTP 프로토콜을 기반으로 클라이언트와 서버 간의 통신을 효율적으로 설계하는 데 도움을 줍니다.

REST의 주요 특징
1. 무상태성(Statelessness)

서버는 클라이언트의 이전 요청에 대한 정보를 저장하지 않으며, 각 요청은 독립적으로 처리됩니다.

모든 필요한 정보는 요청 자체에 포함되어 있어야 합니다.


2. 클라이언트-서버 구조(Client-Server Architecture)

클라이언트와 서버는 독립적으로 동작하며, 요청과 응답을 통해 데이터를 주고받습니다.


3. 리소스 기반(Resource-Based)

REST는 데이터(리소스)를 URI(Uniform Resource Identifier)로 식별하며,

이 리소스들은 JSON, XML 등 다양한 형식으로 표현되어 클라이언트와 서버 간에 전달됩니다.


4. 표준화된 인터페이스(Uniform Interface)

HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 클라이언트와 서버가 통신합니다.

예를 들어, `GET`은 데이터를 조회하고, `POST`는 새로운 데이터를 생성하는 데 사용됩니다.


5. 캐시 가능성(Cacheability)

클라이언트는 서버의 응답을 캐시할 수 있으며, 이를 통해 성능을 향상시킬 수 있습니다.


REST의 장점
- 확장성: 클라이언트와 서버 간의 의존성이 낮아 확장이 용이합니다.
- 일관성: 표준 HTTP 프로토콜을 사용해 다양한 환경에서 일관되게 동작합니다.
- 유연성: 다양한 데이터 형식을 사용할 수 있어 유연한 응용이 가능합니다.


pom.xml

<!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.1</version>
</dependency>

RestfulController.java

package com.rest.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.rest.model.MemberVO;

@RestController
@RequestMapping("/restful/*")
public class RestfulController {
	
	@GetMapping("/rest")
	public MemberVO rest() {
		MemberVO memberVO = new MemberVO();
		memberVO.setId("아이디");
		memberVO.setName("name");
		
		return memberVO;
	}
	
	@GetMapping("/restList")
	public List<MemberVO> restList() {
		List<MemberVO> memberList = new ArrayList<MemberVO>();
		
		memberList.add(new MemberVO().setId("new id").setName("new name"));
		memberList.add(new MemberVO().setId("new id454").setName("new name6767"));
		
		return memberList;
	}
	
	@GetMapping("/restMap")
	public Map<Integer, MemberVO> restMap() {
		Map<Integer, MemberVO> map = new HashMap<Integer, MemberVO>();
		
		map.put(1, new MemberVO().setId("new id22").setName("new name32323"));
		map.put(2, new MemberVO().setId("new id64656").setName("new name08980"));
		
		return map;
	}
	
	@GetMapping("/restPathVariable/{rowNumber}")
	public MemberVO restPathVariable(@PathVariable("rowNumber") int rowNumber) {
		Map<Integer, MemberVO> map = new HashMap<Integer, MemberVO>();
		
		map.put(1, new MemberVO().setId("new id111").setName("new name111"));
		map.put(2, new MemberVO().setId("new id222").setName("new name222"));
		
		return map.get(rowNumber);
	}
    
    @PostMapping("/restRequestBody")
        public void restRequestBody(@RequestBody MemberVO memberVO) {
        System.out.println(memberVO.toString());
    }

    @GetMapping("/restResponseEntity")
    public ResponseEntity<List<MemberVO>> responseEntity() {
        List<MemberVO> memberList = new ArrayList<MemberVO>();
        memberList.add(new MemberVO().setId("my id").setName("my name"));

        return new ResponseEntity<List<MemberVO>>(memberList, HttpStatus.INTERNAL_SERVER_ERROR);		
    }
    
}

호출

http://localhost:8080/restful/rest
// {"id":"아이디","name":"name"}

http://localhost:8080/restful/restList
// [{"id":"new id","name":"new name"},{"id":"new id454","name":"new name6767"}]

http://localhost:8080/restful/restMap
// {"1":{"id":"new id22","name":"new name32323"},"2":{"id":"new id64656","name":"new name08980"}}

http://localhost:8080/restful/restPathVariable/1
// {"id":"new id111","name":"new name111"}

NormalController.java

 

package com.rest.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/normal/*")
public class NormalController {
	
    @GetMapping("/requestBody")
    public String requestBody() {
    	return "requestBody";
    }
    
    @GetMapping("/responseBody")
    @ResponseBody
    public Map<String, Object> responseBody() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("id", "new id");
        map.put("name", "new Name");

        return map;
    }

}

requestBody.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
	function callRestful() {
		const data = { id:"some id", name:"정훈" };
		
		$.ajax({
			url : '/restful/restRequestBody', // AJAX 요청을 처리할 URL
			type : 'POST',
			contentType : "application/json",
			data : JSON.stringify(data),
			success : function() { },
			error : function(error) {
				console.log("Error: " + error);
			}
		});
	}
</script>

<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input type="button" value="데이터 전송" onclick="callRestful()" />
</body>
</html>

 

호출

http://localhost:8080/normal/requestBody
// some id, 정훈
728x90
반응형