Spring Boot

Rest API

0304호 2023. 2. 16.

기존의 @Controller 어노테이션은 returb에 Model을 담아서 뷰에 전송했다.

RestAPI는 서버간 통신을 위한 Controller이다.

 

@RestController는 returb에 처리하는 데이터를 조금 다른식으로 처리함.

객체를 반환할수 있고 받을수도 있다

 

REST API를 이용하면 서버간 통신 or 클라이언트 서버통신이 가능함

How? JSON형식을 사용함.(XML도 가능함)


스프링 메시지 컨버터

HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어 들이거나(@RequestBody), 응답 본문에 메시지를 작성할 때(@ResponseBody) 사용 하여 요청 브라우저로 응답을 바꾸는 장치이다.

 

뷰 템플릿으로 HTML으로 응답하는 게 아니라, 화면에서 처리할 JSON or 문자열 or xml형태로 응답하는 기능이다.

스프링부트는 이런 메시지컨버터에 특화 되어있다.

 

HTTP 요청 데이터 읽기 HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용

 

HTTP 응답 데이터 생성 컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환

 

 

@RequestBody => Json으로 받은 데이터를 Java객체로 자동 맵핑해줌


https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind


@RestController기본 어노테이션

 

 

@RestController의 전송방식

전송방식은 URL주소에 다음과 같은 형식으로 표기하는 것을 규칙으로 하지만 JSON형식으로 주고받도록 처리한다

 

REST API의 데이터형식 제어

소비자(consumers) vs 제공자(produces)

1. consumers – 보내는 데이터는 반드시 이 타입으로 보내라!

2. Produces – 제공하는 데이터는 이 타입으로 줄게!

예시

consumes = "application/json" produces = "application/json"

 


get 방식의 처리

controller

	//get형식에서 값을 받는 방법1 - 쿼리스트링 ?키=값
	//ex ) http://localhost:8383/getKey?id=aaaa&name=park
	@GetMapping("/getKey")
	public String getKey(@RequestParam("id") String id,
						@RequestParam("name") String name) {
		
		System.out.println(id);
		System.out.println(name);
		
		return "성공";
	}
	
	//get형식에서 값을 받는 방법2 - 쿼리파람 URL/키/키
	//http://localhost:8383/getPath/desc/aaa123
	@GetMapping("/getPath/{sort}/{apiKey}")
	public String getPath(@PathVariable("sort") String sort,
						  @PathVariable("apiKey") String key) {
		
		System.out.println(sort);
		System.out.println(key);
		
		return "성공";
	}

 

post 형식의 처리

//값을 받는방법1 - post형식은 VO로 맵핑
	//JSON형식의 데이터를 자바의 객체로 맵핑 -> @RequestBody
	//{"userNum":1,"name": "bbb","id": "aaa"}
	@PostMapping("/getJson")
	public String getJson(@RequestBody SimpleVO vo) {
		
		System.out.println(vo.toString());
		
		return "성공"; 
	}
	
	//값을 받는방법2 - Map으로 맵핑
	//{"userNum":1,"name": "bbb","id": "aaa"}
	@PostMapping("/getMap")
	public String getMap(@RequestBody Map<String, Object> map) {
		
		System.out.println(map.toString());
		
		return "성공";
	}
	
	//consumer를 통한 데이터 제한
	//consumer는 특정타입의 데이터를 받도록 처리하는 옵션( 기본값 json )
	//클라이언트에는 Content-type을 이용해서 보내는 데이터에 대한 타입을 명시 ( 반드시 필수 )
	@PostMapping(value = "/getResult", consumes = "text/plain")
	public String getResult(@RequestBody String data) {
		
		System.out.println(data);
		
		return "성공";
	}

consumer를 통한 데이터 제한

	//응답문서의 형태를 직접선언 - ResponseEntity
	@PostMapping("/createRes")
	public ResponseEntity createRes(){
		
		//데이터
		SimpleVO vo = new SimpleVO(111, "aaa", "bbb");
		
		//헤더정보
		HttpHeaders header = new HttpHeaders();
		header.add("Authrization", "token...");
		
		//상태코드 (성공 or 실패)
		HttpStatus status = HttpStatus.ACCEPTED;

		//<>제네릭은 데이터타입을 따라갑니다.
		ResponseEntity<SimpleVO> entity = new ResponseEntity<>(vo, header, status);
		
		return entity;
	}

데이터를 직접 명시해서 보낼 수 있는??

 


리액트에 스프링연결 ( 리액트에 데이터 요청하기 )

 

- 리액트

import axios from "axios";

const App = () => {
    
    const data = {userNum:1,name: "bbb",id: "aaa"};

    const handleClick = async () => {
        
       const result = await axios.post("http://localhost:8383/getJson", data)
        
       console.log(result);
    }
    
    
    return (
        <>
            <input type="button" onClick={handleClick} value="데이터요청하기"></input>
        </>
    )
}

export default App;

-스프링 controller

	//cors - 기본적으로 서버가 다르면 요청을 거절한다. (특정 서버에 대하여 사용)
	
	//CORS에러 해결방법1 - @CrossOrigin()
	@CrossOrigin("http://localhost:3000")
	@PostMapping("/getJson")
	public String getJson(@RequestBody SimpleVO vo) {
		
		System.out.println(vo.toString());
		
		return "성공"; 
	}

react서버 3000번

'Spring Boot' 카테고리의 다른 글

Upload in Spring Boot  (2) 2023.02.21
Spring Boot DB (MyBatis)  (0) 2023.02.14
Spring Boot Valiadation  (0) 2023.02.14
Thymeleaf in Spring Boot  (0) 2023.02.13
Spring Boot Lombok으로 Builder패턴 만들기  (0) 2023.02.13

댓글