# 시작하기 전에
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 컨트롤러는 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 해주는 부분을 확인한다.
'Back-End > Spring' 카테고리의 다른 글
스프링 5에서 Reactive Programming 하기 (1) (0) | 2018.11.26 |
---|---|
Spring IoC(제어의역전),DI(의존성주입)란? (0) | 2018.09.18 |
POJO(plain old java object)란? (0) | 2018.09.16 |
Spring Boot와 Docker를 이용한 개발환경 구축하기 (0) | 2018.09.02 |
Spring Boot 2.0 - 스프링 부트 기본 로깅 (0) | 2018.07.22 |