본문 바로가기

Back-End/Spring

RESTful 웹서비스 만들기

# 시작하기 전에


REST라 하면 서버-클라이언트 통신 방식정도로만 이해하고, RESTful한 웹 API라고 하면 정확히 이해할 수가 없었다. 웹 2.0으로 들어오면서 REST의 역할과 RESTful한 웹 API가 무엇인지 Spring을 통해 알아보았다.



# 만들어 볼 예제


HTTP GET request를 받아 JSON으로 response하는 서비스를 만들 것이다.


  • http://localhost:8080/greeting

  • {"id":1,"content":"Hello, World!"}



1) POJO 생성




2)  Resource Controller 생성


 Spring의 RESTful 웹서비스에서는, 컨트롤러가 HTTP 요청을 처리한다. 이 컴포넌트들은 @RestController annotation에 의해 쉽게 식별되고, /greeting으로 들어오는 GET 요청을 받으면 Greeting 클래스를 리턴한다.


  • @RequestMapping annotation : (method=GET)과 같이 HTTP 동작을 구체화 할 수도 있음
  • @RequestParam : query string은 필수 인자가 아니기 때문에(required=false), 기본값은 (defaultValue="world") 

기존의 MVC 컨트롤러와 위에서 사용하는 RESTful 웹서비스 컨트롤러의 차이는 HTTP response가 만들어 지는 방법이다.

 RESTful 웹서비스 컨트롤러는 HTTP response에 JSON으로 보낸다.

- Greeting을 JSON으로 변화하는건 누가하는데? Spring이 Jackson JSON 라이브러리를 사용하여 변환해줌 ( 변환 시점은 공부 필요 )


  MVC 컨트롤러는 view를 만들어 http response에 보내줌



3) Application을 실행


 이 서비스는 기존의 WAR 파일로 만들어서 deploy 할 수 도 있지만, standalone application으로


 만들었다. JAR 파일을 통해 실행하고, 실행 시점에 Spring에 포함된 Tomcat 서블릿 컨테이너를 


 사용할 수 있다.




  • @ComponentScan : Spring이 반복적으로 hello package @Component annotation이 표시된 자식들의 class를 검색하게 해줌. 여기서는 @RestController로 표시된 GreetingController를 찾아서 등록해줌.



 결 과



그래서 RESTful한 웹 API가 뭔데?

 

 REST( Representational state transfer - 구체적인 형상을 나타내는 상태 전송 ) 은 소프트웨어 


아키택처의 스타일이다.


 이 용어를 소개한 사람은 HTTP의 주요 저자 중 한명인 로이 필딩이다.


 Web의 프로토콜과 기술을 이용하여 만든 것


 RESTful은 결국 이러한 아키텍쳐로 구현한 Web Service를 뜻한다.



# RESTful하지 않으면 어떻게 되는데?

 

SOAP랑 비교 



# REST API 디자인 가이드 - 1) URL에 동사보다는 명사를 사용

 

 메서드( GET, POST, DELETE, PUT ) 가 동사의 역할을 하기 때문에 URL에는 명사를 사용한다.

- GET /user/happyer16
- POST /user/happyer16


 서버 쪽에서 구분하는 부분은 위쪽 예제 @RequestMapping에 옵션을 주면 되고,


 클라이언트 쪽에서는 RESTAPI의 get(),post() 함수 호출하면 HTTP에 동사가 담겨서 넘어가겠지.


 ( 내부 구현체는 어떻게 되어 있을까 ? )



# REST API 디자인 가이드 - 2) HTTP 응답 상태 코드


 잘 설계된 REST API는 URI만 잘 설계된 것이 아니라 그 리소스에 대한 응답을 잘 지어내는 것까


지 포함된다.


 위의 예제에서 무조건 Greeting을 반환하는데, name이 4글자 이상이여 하는 경우 클라이언트의 


요청이 부적절하다고 응답 해줘야 한다. 


밑의 예제는 node.js를 이용한 예젠 password를 체크하여 response 해주는 부분을 확인한다.