JustDoEat
[어노테이션/스프링] @RestController, RESTful패턴 본문
정보대SW컨테스트를 하면서, @RestController를 처음 접해보게 되었는데 무엇인지 궁금해서 찾아보았다.
몽고DB가 JSON형태로 데이터를 넘겨주다 보니 거기에 알맞는게 RestController라고 하더라.
1. @RestController의 특징
1-1.
RestController 어노테이션을 사용하면 메서드의 반환값이 자동으로 JSON으로 변환되어 클라이언트로 전송된다.
let chat ={
sender: username, //여기에 ""잘못 붙혀서 코드가 실행이 안됫음.
roomNum: roomNum,
msg: msginput.value
//몽고디비에 내가 받아오는 데이터 형태랑 일치하게 변수를 선언해야함.
};
//fetch(url, options); fetch원형이고 url은 요청을 보낼 대상, options는 내가 무엇을 요청할껀지에 대한설명
fetch("/chat2",{
method:"post",//내가 지금 너한테 데이터를 보낼테니까 너는 데이터베이스에 데이터를 저장해
body:JSON.stringify(chat), //자바스크립트 객체를 서버에 직접 전달이 안되서 JSON형태 타입으로 변환하라는뜻
headers:{
"Content-Type":"application/json; charset=utf-8"
}
});
(채팅서비스 구현 JS파일 일부.)
@RestController
"
코드생략
"
@CrossOrigin//자바스크립트 요청 받는 어노테이션
@PostMapping("/chat2")
public Mono<Chat2> setMsg(@RequestBody Chat2 chat2){
chat2.setCreatedAt(LocalDateTime.now());
return chatRepository.save(chat2); //객체를 리턴하면 JSON으로 변환(MessageConverter가 함)
}
//리턴을 다시 JSON형태로 해줌
(채팅서비스 구현 컨트롤러 파일 중 일부)
1-2
리소스 중심(Resource-Centric):모든 자원(데이터 또는 서비스)은 고유한URI(Uniform Resource Identifier)를
가지 며, URI를 통해 해당 자원을 식별합니다.
const eventSource=new EventSource(`http://localhost:8080/chat2/roomNum/${roomNum}`);
(채팅서비스 JS파일 일부.)
1-3
RESTful 웹 서비스에서 자주 사용되는 형식 중 하나이며, 클라이언트와 서버 간의 데이터 교환에 효율적입니다.
→ 모르는 상태에서 유튜브 강의를 보고 코드를 짰는데 에게 RESTful 패턴이라고 한다. 그후 Restful이 무엇인지 궁금해졌다.
2. Restful 이란?
2-1.
Representational State Transfer(표현 상태 전이)라고 한다.
2-2.
RESTful은 Representational State Transfer(표현 상태 전이)의 약자로, 웹 개발에서 자주 사용되는 아키텍처 스타일 중 하나이다.
아래는 이렇게 짰던 코드가 RESTful방식이구나 하고 기록하는용.
package com.mysite.sbb.chattt;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.time.LocalDateTime;
import java.util.concurrent.Future;
@RequiredArgsConstructor
@RestController //데이터 리턴하는 서버가 되야함.
//@Controller
//@RequestMapping("/chattt")
public class Chat2Controller {
private final Chat2Repository chatRepository;
@Autowired
private AsyncTaskExecutor taskExecutor; // TaskExecutor를 주입받습니다.
@CrossOrigin
@GetMapping(value = "/sender/{sender}/receiver/{receiver}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@Async
public Future<Flux<Chat2>> getMsgAsync(@PathVariable String sender, @PathVariable String receiver) {
return new AsyncResult<>(chatRepository.mFindBySender(sender, receiver)
.subscribeOn(Schedulers.fromExecutor(taskExecutor)));
}
@CrossOrigin
@GetMapping(value = "/chat2/roomNum/{roomNum}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@Async
public Future<Flux<Chat2>> findByRoomNum(@PathVariable Integer roomNum) {
return new AsyncResult<>(chatRepository.mFindByRoomNum(roomNum)
.subscribeOn(Schedulers.boundedElastic()));
}
@CrossOrigin//자바스크립트 요청 받는 어노테이션
@PostMapping("/chat2")
public Mono<Chat2> setMsg(@RequestBody Chat2 chat2){
chat2.setCreatedAt(LocalDateTime.now());
//setCreatedAt은 주로 객체의 생성일을 설정하는데 사용되고, 간단한 예시는 this.setCreatedAt = LocalDateTime.now();
return chatRepository.save(chat2); //객체를 리턴하면 JSON으로 변환(MessageConverter가 함)
}
}
(채팅서비스의 컨트롤러)
결론:
RestController는 객체를 Json형태로 반환하는 기능에 최적화가 되어있고, 클라이언트와 서버와 데이터 교환에 최적화가 되어있다.
아직 javascrip도 재대로 배우지 않고 막 들이받으면서 하는거라 추후에 비슷한 내용을 한번 더 다룬다면 이해가 더 빨라질거같다.