데브코스 W6D3

코끼릭·2022년 4월 20일
0

TIL

목록 보기
22/36

WebApplicationContext

웹어플리케이션의 컨텍스트는 비즈니스 레이어와 데이터 액세스 레이어와 다르게 프레젠테이션의 레이어는 서블릿을 통해 동작하기 때문에 서블릿에 대한 컨텍스트가 요구된다. 웹 서블릿의 경우 다양한 서블릿의 사용이 가능하기 때문에 확장성을 위해서 루트 어플리케이션 컨텍스트를 둔 상태에서 하위 컨텍스트로 서블릿 어플리케이션 컨텍스트가 있는 루트-자식 구조를 가지고 있다.

설정 파일의 경우 web.xml에 루트 컨텍스트와 서블릿 컨텍스트(디스패처 서블릿)를 지정하고 서블릿 컨텍스트는 루트 컨텍스트에 등록된 빈을 사용해서 부모 컨텍스트에 있는 서비스나 DAO를 사용할 수 있다.

>>web.xml

Root WebApplicationContext
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/conf/root-context.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Servlet WebApplicationContext
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servler-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

REST(ful) API

네트워크를 통해 정보를 주고받는 HTTP API에서 나아가 자원을 정의하고 자원에 대한 주소를 지정하는 방식과 같은 네트워크 아키텍처 원리의 모음을 지칭하고 다음과 같은 규칙을 만족하는 경우 RESTful API라고 부른다.

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

HATEOAS

Hypermedia as the Engine of Application State를 의미해서 RESTful API를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하기 위해 클라이언트가 서버로부터 어떠한 요청을 할 때, 요청에 필요한 URI를 응답에 포함시켜 반환 하는 REST API 아키텍처를 의미한다.

{  
  "links": [{
    "href": "https://api-m.paypal.com/v1/payments/sale/36C38912MN9658832",
    "rel": "self",
    "method": "GET"
  }, {
    "href": "https://api-m.paypal.com/v1/payments/sale/36C38912MN9658832/refund",
    "rel": "refund",
    "method": "POST"
  }, {
    "href": "https://api-m.paypal.com/v1/payments/payment/PAY-5YK922393D847794YKER7MUI",
    "rel": "parent_payment",
    "method": "GET"
  }]
}

HATEOAS element

href: 이전 request와 연관된 자원 요청을 위한 url 정보
rel: 사용자의 이전 request와의 관계
method: 요청할 때 사용해야 하는 HTTP 메소드

@RestController

Restful 웹서비스의 컨트롤러로 @Controller와의 차이점은 HTTP response body가 생성되는 방식으로 컨트롤러는 view 이름을 반환하고 view로 클라이언트에게 응답하는 반면에 REST controller는 json 형태로 클라이언트에게 반환한다.

@RestController 
@RequestMapping("/user")
public class TestController { 	
	@Autowired
    private final UserService userService; 					
    
    @GetMapping(value = "/users") 
	public User findUser(@RequestParam("userName")String userName) { 
    	return userService.findUser(user); 
    } 
}

Http Client 도구

실제 클라이언트의 요청을 API 서버가 어떻게 응답할 수 있는지 보기 위한 도구이다. IntelliJ HTTP Client Plugin 또는 포스트맨을 주로 사용한다.


WebApplicationContext
RestController

profile
ㅇㅅㅇ

0개의 댓글