반응형

목차

  1. 배경지식
  2. 설계하기
  3. 스프링 부트 MVC 패턴으로 REST API 만들기
  4. 스프링 부트 데이터 레스트로 REST API 만들기

1. 배경지식

- REST 소개

REST는 웹과 같은 분산 하이퍼미디어 시스템에서 사용하는 통신 네트워크 아키텍처로, 네트워크 아키텍처의 원리 모음입니다.

웹은 전송 방식으로 HTTP를, 식별 방법으로 URI를 사용합니다. HTTP는 웹에서 GET, POST, PUT, DELETE 등의 메서드를 사용하여 정보를 주고 받는 프로토콜입니다. REST는 HTTP와 URI의 단순하고 간결한 장점을 계승한 네트워크 아키텍처입니다. 따라사 다양한 요구사항에 대응하여 때로는 서버와 클라이언트가 서로 통신하는 리소스에 대해 복잡한 방식으로 상호작용할 수 있습니다. REST는 다음과 같은 목적으로 만들어졌습니다.

  • 구성요소 상호작용의 규모 확장성
  • 인터페이스의 범용성
  • 구성요소의 독립적인 배포
  • 중간적 구성요소를 이용한 응답 지연 감소, 보안 강화, 레거시 시스템 인캡슐레이션

REST API 추천 영상 - 그런 REST API로 괜찮은가

- RESTful 제약조건

REST의 구현 원칙을 제대로 지키면서 REST 아키텍처를 만드는 것을 RESTful이라고 합니다.

RESTful 제약조건

 

클라이언트 - 서버(client-server)

 - 이 제약 조건의 기본 원칙은 관심사의 명확한 분리입니다. 관심사의 명확한 분리가 선행되면 서버의 구성요소가 단순화되고 확장성이 향상되어 여러 플랫폼을 지원할 수 있습니다.

 

무상태성(stateless)

- 서버에 클라이언트의 상태 정보를 저장하지 않는 것을 말합니다. 단순히 들어오는 요청만 처리하여 구현을 단순화합니다. 단, 클라이언트의 모든 요청은 서버가 요청을 알아듣는 데 필요한 모든 정보를 담고 있어야 합니다..

 

캐시 가능(cacheable)

- 클라이언트의 응답을 캐시할 수 있어야 합니다. 앞에서 HTTP의 장점을 그대로 계승한 아키텍처가 REST라고 했습니다. 따라서 HTTP의 캐시 기능도 적용할 수 있습니다.

 

계층화 시스템(layered system)

- 서버는 중개 서버(게이트웨이, 프록시)나 로드 밸런싱, 공유 캐시 등의 기능을 사용하여 확장성 있는 시스템을 구성할 수 있습니다.

 

코드 온 디맨드(code on demand)

- 클라이언트는 서버에서 자바 애플릿, 자바스크립트 실행 코드를 전송받아 기능을 일시적으로 확장할 수 있습니다. 이 제약 조건은 선택 가능합니다.

 

인터페이스 일관성(uniform interface)

- URI(통합 자원 식별자)로 지정된 리소스에 균일하게 통일된 인터페이스를 제공합니다. 아키텍처를 단순하게 분리하여 독립적으로 만들 수 있습니다.

 

인터페이스 일관성은 세부 원칙을 갖고 있습니다. 인터페이스 일관성이 잘 지켜졌는지에 따라 REST를 제대로 사용했는지 판단할 수 있습니다. 인터페이스 일관성에는 다음 4가지 프로퍼티가 존재합니다.

 

1. 자원 식별(identification of resources)

2. 메시지를 통한 리소스 조작(manipulation of resources through representations)

3. 자기 서술적 메시지(self-descriptive messages)

4. 애플리케이션 상태에 대한 엔진으로서의 하이퍼미디어(HATEOAS - hypermedia as the engine of application state)

 

ps -인터페이스 일관성(uniform interface)에서 제약조건 3.4번이 지켜지기가 힘들다..

- REST API 설계하기

REST API는 다음과 같이 구성해야 합니다.

자원(resource) : URI

행위(verb) : HTTP 메서드

표현(representations) : 리소스에 대한 표현(HTTP Message Body)

 

URI 설계

- 명사를 사용해야 하며 동사를 피해야 합니다.

예) http://localhost:8080/api/read/books -> 이처럼 동사를 표현할 때는 HTTP 메서드인 GET, POST, PUT, DELETE 등으로 다음과 같이 대체해야 합니다.

- GET http://localhost:8080/api/books

모든 경우에 완벽하게 호환되지는 않습니다. 앞의 URI 설계에 대한 원칙은 어디까지나 불필요한 동사를 URI에 포함하는 것을 지양해야 한다는 것이지 완전히 배제시킨다는 것은 아닙니다.

 

복수형을 사용하라

URI에서는 명사에 단수형보다는 복수형을 사용해야 합니다. /book도 물론 명사고 사용 가능하지만 /books로 리소스를 표현하면 컬렉션으로 명확하게 표현할 수 있어 확장성 측면에서 더 좋습니다.

{

  books : [

         {

              book : ...

         },

         {

              book : ...

         },

         {

              book : ...

         }

  ] 

}

 

 

그리고 컬렉션으로 URI를 사용할 경우 컬렉션을 한번 더 감싼 중첩(nested) 형식으로 사용하는 것이 좋습니다.

만약 중첩하지 않고 바로 컬렉션을 반환하면 추후 수정할 때나 확장할 때 번거롭게 됩니다.

 

{

   -embedded : [

         {

              books : ...

         },

         {

              stores : ...

         },

  ]

}

행위 설계

Resource GET(read) POST(create) PUT(update) DELETE(delete)
/books book 목록 보기 해당 book 추가 - -
/books/1 ID가 1인 book 보기 - ID가 1인 book 수정 ID가 1인 book 삭제

 

2. 설계하기

2.1 MVC 패턴을 확용하는 방법

클라이언트 > 컨트롤러 > 서비스 > 리포지토리 > DB

 

2.2 스프링 부트 데이터 레스트를 활용하는 방법

클라이언트 > REST 리포지토리 > DB

- 컨트롤러와 서비스 단계가 없습니다. 필요하다면 생성하여 사용할 수도 있습니다. 스프링 부트 데이터 레스트는 REST URL 요청을 리포지토리 내부의 CRUD 메서드와 매핑하여 처리합니다.

 

3. 스프링 부트 MVC 패턴으로 REST API 구현하기

소스코드

- github.com/kgc0120/first_time_springboot2/tree/master/Spring-Boot-Community-Rest-master

 

kgc0120/first_time_springboot2

Contribute to kgc0120/first_time_springboot2 development by creating an account on GitHub.

github.com

 

CORS 허용 및 시큐리티 설정

WEB 프로젝트 localhost:8080과 REST API 프로젝트의 localhost:8081은 호스트는 동일할지라도 포트가 상이하기 때문에 Ajax 요청은 모두 실패하게 됩니다. 즉 출처는 자원 + 도메인 + 포트 번호("http://localhost:8080")로 결합된 문자열입니다. 이 조합에서 한 글자라도 다르면 다른 출처로 판단됩니다. 이러한 교차 출처 http 요청을 가능하게 해주는 매커니즘을 교차 출처 자원 공유(CORS)라고 합니다.  CORS는 서로 다른 도메인의 접근을 허용하는 권한을 부여합니다.

 

스프링 시큐리티를 이용해 쉽게 CORS를 설정할 수 있습니다.

다음은 모든 출처에 대해 허용하도록 설정하는 코드입니다.

 

@EnableWebSecurity - 웹용 시큐리티를 활성화하는 어노테이션입니다.

1. @CorsConfiguration 객체를 생성하여 CORS에서 Origin, Method, Header 별로 허용할 값을 설정할 수 있습니다.

2. 특정 경로에 대해 CorsConfiguration 객체에서 설정한 값을 CorsConfigurationSource 인터페이스를 구현한 UrlBasedCorsConfigurationSource에 적용시킵니다. 

3. .and().cors().configurationSource(source) - CorsConfigurationSource 인터페이스의 구현체를 파라미터로 받는 configurationSource가 있습니다. 여기에 설정한 UrlBasedCorsConfigurationSource 객체를 넣어주면 설정한 내용이 시큐리티 설정에 추가됩니다. 

 

글이 많이 길어질 것 같아서 다음 장에서 4.스프링 부트 데이터 레스트로 REST API 만들기 이어가도록 하겠습니다.

728x90
반응형

'Spring' 카테고리의 다른 글

스프링 부트 배치 - 기본  (2) 2021.05.19
스프링 부트 데이터 레스트로 REST API 만들기  (0) 2021.05.05
스프링 부트 시큐리티 + OAuth2  (0) 2021.04.20
스프링 부트 웹  (0) 2021.04.11
스프링 부트 테스트  (0) 2021.04.09

+ Recent posts