본문 바로가기

좋아하는 것_매직IT/1.spring

26.Spring, REST(Representational State Transfer)에 대해서 알아보고 간단한 샘플 프로그램을 만들어보자.

반응형

REST에 대해서 알아보자.

우선, REST의 약자에 대해서 알아보자.

Representational

State

Transfer

위의 글자를 조합해서 REST 임.

REST 는 네트워크 상에서 클라이언트 / 서버 간의 통신 방식 중하나.

쉽게말하자면, 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미함.

즉, 자원(resource)의 표현(representation) 에 의한 상태 전달

자원: 해당 소프트웨어가 관리하는 모든 것

자원의 표현: 그 자원을 표현하기 위한 이름

그리고, JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적임.

REST 는 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달함.

REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일.

REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있음.

그리고, HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐

그리고, 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여함.

REST 는 기본적인 웹 아키텍처 스타일이고, 일련의 제약 조건을 지정함.

다시말해, 제약 조건을 지정함으로써,

해당 제약 조건을 통해서, 클라이언트가 유연한 방식으로 서버와 상호작용이 가능하게 만들어줌.

주요 제약 조건은 아래와 같음.

클라이언트 / 서버

클라이언트 와 서버가 존재 해야함.

즉, 클라이언트/서버 간 느슨한 결합과 독립적인 진화를 가능하게 함.

무상태

서비스지원함에 있어서 무상태여야 함.

추가적 요청은 일시적으로 저장되는 이전요청의 일부 데이터에 의존해서는 안됨.

다시말해서, 클라이언트의 context를 서버에 저장하지 않음

즉, 세션과 쿠키와 같은 context 정보를 신경쓰지 않아도 되므로 구현이 단순해지는 장점.

통일된 인터페이스

URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행함.

HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능함.

캐시 가능

서비스 응답에 대해서 캐시가 가능해야함.

즉, 각 응답은 캐시 가능여부를 표시해야 함.

웹 표준 HTTP 프로토콜을 그대로 사용

HTTP 프로토콜 표준에서 사용하는 Last-Modified or E-Tag를 이용하면 캐싱 구현 가능함.

캐시를 사용하면, 요청에 대한 응답시간이 빨라지고 REST 서버에 트랜잭션이 발생하지 않기 때문에 전체 응답시간, 성능, 서버의 자원 이용률을 향상시키는 것이 장점.

레이어 시스템

서비스 소비자가 서비스 공급자와 직접 연결되어서는 안됨.

즉, 요청을 캐시할 수 있기때문에 서비스 소비자가 중간 레이어에서 캐시된 응답을 가져올 수 있음.

리플리젠테이션을 통해서 자원 조작 지원

지원하는 자원은 여러가지 리프리젠테이션(representation)을 가질 수 있음.

즉, 해당 리프리젠테이션을 사용해서 메시지로 자원을 수정할 수 있음.

HATEOAS(Hypermedia As The Engine Of Application State)

RESTful 어플리케이션의 서비스 소비자는 단 하나의 고정 서비스 URL만을 알고 있어야함.

또한, 모든 후속 자원은 자원표현에 포함된 link 에서 발견할 수 있어야 함.

다시말해서, HATEOAS를 통해서 어플리케이션의 상태를 전이할 수 있는 메커니즘을 제공함.

즉, HTTP 응답에 들어갈 유저, 게시판 글, 이벤트 등과 같은 Resource와 다른 상태 혹은 리소스에 접근할 수 있는 링크 레퍼런스인 Links 제공을 통해서 가능함.

예시

 

참고페이지

https://spring.io/projects/spring-hateoas

 

그럼, REST관련 구성요소에 대해서 정리를 한번 해보자.

구성요소는 아래와 같이 3개로구분된다.

하나, 자원(Resource)

자원이란 URI 를 말한다.

둘, 행위(Verb)

행위란 HTTP 메소드를 말한다.

셋, 표현(Representation of Resource)

클라이언트가 자원의 상태(정보)에 대한 조작을 요청하면 서버는 이에 적절한 처리를 한 후 응답(Representation)을 전송함.

하나의 자원은 JSON/XML/TEXT/RSS 등 여러 형태의 표현으로 나타낼 수 있으며,

위에서 언급한거와 같이 보통은 JSON/XML 을 통해서 데이터를 주고 받음.

 

그럼, REST관련 CRUD에 대해서 구체적으로 알아보자.

첫째, HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시

둘째, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용함.

CRUD Operation에 대해서 알아보자.

Create : 생성(POST)

Read : 조회(GET)

Update : 수정(PUT)

Delete : 삭제(DELETE)

예를 들면 아래와 같음.

CRUD

HTTP 메소드

ROUTE

자원들의 목록 표시

GET

/members

자원하나의 내용을 표시

GET

/members/magic

자원을 생성

POST

/members

자원을 수정

PUT

/members/magic

자원을 삭제

DELETE

/members/magic

참고) 응답코드

1xx : 전송 프로토콜 수준의 정보 교환 상태코드

2xx : 클라이언트 요청이 성공적으로 수행되었음을 나타내는 상태코드

3xx : 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함을 알려주는 상태코드

ex) 리다이렉트

301 permanent redirect,

요청한 정보(사이트나 페이지)가 영구적으로 옮겼다는것

302 temporary redirect

현재 페이지나 사이트를 일시적으로만 옮겼다는것

4xx : 클라이언트의 잘못된 요청에 대한 상태코드

5xx : 서버쪽 오류로 인한 상태코드

 

그럼, REST 관련 GET 메소드 요청을 처리하는 간단한 샘플코드를 작성해보자.

샘플코드의 동작

클라이언트에서 /hello 와 /hello-with-object 요청 시

/hello 응답은

텍스트로 "Hello Thub World" 을 클라이언트로 응답함.

/hello-with-object 응답은

JSON 으로 " {"msg" : "Hello Thub World"} " 을 클라이언트로 응답함.

우선, Controller 를 작성해보자.

ThubDefController.java

설명

@RestController 어노테이션

아래 2개의 어노테이션의 조합을 말하고, REST 컨트롤러를 만드는데 사용함.

첫째, @ResponseBody

둘째, @Controller

@GetMapping 어노테이션

아래의 RequestMapping 과 동일함

@RequestMapping(method=RequestMethod.GET)

즉, 위의 컨트롤러는 아래의 처리를 한다.

/hello 와 /hello-with-object 에 대한 요청을 처리

/hello 처리

응답

텍스트응답.

/hello-with-object 처리

응답

JSON 응답.

추가적으로, ThubWelcomeBean 객체가 JSON 으로 변환되는 이유는 스프링 부트의 자동 설정의 마법(?) 임.

Jackson 이 어플리케이션의 클래스 패스에 존재한다면, JSON 컨버터에 대한 기본 객체의 인스턴스는 스프링 부트에 의해 자동설정됨.

그럼, POJO ThubWelcomeBean 클래스를 작성해보자.

ThubWelcomeBean.java

한번 그럼 샘플코드를 실행 후 정상 동작하는지 테스트를 해보자.

 

설명

8080(tcp) 포트로 어플리케이션이 정상 기동했음을 확인할 수 있음.

그럼 먼저 Postman 을 사용해서 "/hello" 로 요청을 해보자.

설명

정상적으로 요청에 대한 응답값으로 "Hello Thub World" 가 출력됨을 확인할 수 있음.

그럼, "/hello-with-object" 도 요청해 보자

설명

정상적으로 JSON 형식의 " {"msg" : "Hello Thub World"} " 가 응답값으로 출력됨을 확인할 수 있음.

결론

REST 는 네트워크 상에서 클라이언트 / 서버 간의 통신 방식 중하나.

쉽게말하자면, 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미함.

즉, 자원(resource)의 표현(representation) 에 의한 상태 전달

자원: 해당 소프트웨어가 관리하는 모든 것

자원의 표현: 그 자원을 표현하기 위한 이름

그리고, JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적임.

오늘도, REST 관련 지식에 대한 마술(?) 한가지 획득완료! 감사합니다. ^^


오늘의 명언 한마디

하버드 대학의 연구에 의하면, 성공한 사람, 훌륭한 사람과 그렇지 못한 사람의 차이는 시간전망(time perspective)에 있다고 한다.

시간전망은 현재의 행동과 의사결정이 미래에 끼칠 영향력을 얼마나 길게 내다보는가와 관련된 것이다.

시간 전망이 긴 사람은 현재 자신이 하고 있는 행동에 좀 더 신중을 기하고 순간의 감정과 충동에 반응하지 않기 때문에 감정이 안정적이고 기복이 없다.

허일무지음, "변화, 그 아름다운 선택" 중에서..


오늘의 영어 한마디

It is important to have good social skills.

중요하다. / 있는 것이/ 좋은 사교기술이

해설

"is important to~" 는 ~이 중요하다라는 의미

"have good social skills" 는 좋은 사교 기술을 말함.


오늘의 민법 한마디(for real estate)

제1편 총칙 / 제5장 법률행위 / 제3절 대리

제136조(단독행위와 무권대리)

단독행위에는 그 행위 당시에 상대방이 대리인이라 칭하는 자의 대리권없는 행위에 동의하거나 그 대리권을 다투지 아니한 때에 한하여 전6조의 규정을 준용한다.

대리권없는 자에 대하여 그 동의를 얻어 단독행위를 한 때에도 같다.


나의 목표 및 다짐을 항상 내곁에 두기.

목표

나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.

현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기

 

목표를 이루기 위한 실천방안

꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.

천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.

"천번 생각하는것보다 한번 행동하는 것이 더 중요하다."

기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)

천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.

300x250