W5D2 - SpringBootPart3

Onni·2021년 9월 12일
0

TIL

목록 보기
12/21

Spring MVC2

1. WebApplicationContext

  1. config를 RootConfig와 ServletConfig로 나눈다
  • RootConfig : dataSource, JdbcTemplate 등 애플리케이션 전체에서 쓰이는 Context
  • ServletConfig :addResourceRewolver, ViewResolvers등 서블릿에서 쓰는 컨테이너
  1. setLoadonStartupr 값에 따라 달라짐
    setLoadonStartup(1) : test-servlet까지 나옴
    setLoadonStartup(-1): root 에 대해서만 나옴 ,로드가 안돼다가 요청이 오면 그때 test-servlet까지 나옴

2. REST(ful) API

2-1 Rest 참고링크

  • REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시
    스템을 위한 소프트웨어 아키텍처의 한 형식
  • 웹상에서 리소스를 전달하기 위해 만들어짐
  • 엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음.
  • '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법
  • 간단한 의미로는, 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은
    별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스 말함
  • REST API = REST 아키텍쳐 스타일을 따르는 API

2-2 REST 아키텍쳐 스타일

  • 클라이언트-서버
    - 사용자 인터페이스에 대한 관심을 데이터 저장에 대한 관심으로부터 분리함으로써 클
    라이언트의 이식성과 서버의 규모확정성을 개선한다.
  • 스테이트리스
    - 클라이언트 서버의 통신에 상태가 없습니다. 모든 요청에는 필요한 모든 정보를 담고
    있어 가시성이 좋고 요청 실패시 복원이 쉽기 때문에 신뢰성이 좋습니다. 상태를 저장
    할 필요가 없어 규모확장성이 개선됩니다.
  • 캐시
    - 캐시가 가능해야 합니다. HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜
    표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다
  • 균일한 인터페이스
    - URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키
    텍처 스타일을 말합니다.
  • 계층화된 시스템
    - REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가
    해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체
    를 사용할 수 있게 합니다

2-3 Richardson Maturity Model

  • Level 0:
    - Soap기반의 프로토콜

    • 외부에 잇는 리소스를 호출
    • 단하나의 end poing만 존재
    • 하나의 커맨드를 받기 위한 urI가 하나만 있고 거기에 요청을 xml로 정의
    • 서버는 xml을 보고 무슨 메서드를 호출할 것인지, 무슨 기능을 요구하는지 등에 대한 것을 알고 그것에 대한 요청을 xml에게 줌 -> 하나의 urI에 xml로 왔다갔다함
  • Level 1:
    - 리소스에 대한 개념 추가

    • 리소스 단위로 여러개의 엔드포인트
      (ex 고객은 kdt.com에 customers , 주문은 kdt.com/orders , A라는 고객은 customers/A ) 지금까지 우리는 리소스 중심으로 설계
  • Level 2:
    - representation data(리소스를 어떻게 표현되어져야하는지를 분리)

    • 하나의 정보가 다양한 방식으로 표출 될 수 있다는 것을 의미
    • Representations : 어떠한 리소스의 특정 시점의 상태를 반영하고 있는 정보이고 representation data와 representation metadata로 구성

      하나의 정보가 Content-Language에 따라 다양한 방식으로 표현(hello, 안녕하세요)
      - HTTP 메서드(get, post, delete등) 도입
    • 이전에는 post를 사용했다면 지금은 resource에 접근하는 용도에 맞게 적절한 메서드사용
      ex) get : 리소스에 접근 , post : 추가 , delete : 제거
  • Level 3:
    - HATEOAS

    • 리소스를 받을때 리소스의 연결성을 고려
      - 리소스가 리턴 할때 할수 있는 행위 , 컨트롤들을 제공받을수 있음

스프링에서는 restApi를 ㄱ배라 하기위해 기본적으로 annotaiton이 추가
전달받은 요청 메세지를 우리가 원하는 형태로 변환 가능 : @RequestBody, @ResponseBody

RestController : ResponseBody Controller가 추가된거
ResponseBody 단위로
모든 메서드의 ResponseBody 다 적용
RequestBody: 파라미터단위 ResponseBody: 메서드나 클래스 단위
HTTP 메세지 컨버터 : 우리가 반환하는 것을 HTTP 메세지로 변환

2-4 RestController

  • dependency 추가
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
    </dependency>

    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.17</version>
    </dependency>
  • 기존에 있던 findCustomers를 ViesCustomersPage로 바꾸고 새로운 findCustomers 추가

실행결과
http://localhost:8080/api/v1/customers로 들어가면 다음과 같이 json형태의 데이터를 불 수 있다.

  • json 형태를 xml로 바꾸고 싶다면 ?


2-5 Http Client 도구

  • json형태와 xml형태를 원하는대로 가지고 올수는 없을까?
    리퀘스트 보낼때 accept하는 컨텐츠 타입을 지정해줘야함
    content-type은 보내고자 하는 컨텐츠 타입을 지정
    accept: 받고자 하는 컨텐츠 타입을 지정

CustomerController에서 리퀘스트에서 다음과 같이 json형태로 가져오라고 요청을 보내지만 xml로 지정되어있기 때문에 오류가 남

다시 ServeletConfig 부분을 json과 함께 쓸 수 있도록 변환

변환후 요청했을때 json형태로 요청 받은 것을 확인 할수 있음

이와 같은 방법으로 보내고자 하는 타입과 받고자 하는 타입을 다르게 지정 가능

profile
꿈꿈

0개의 댓글