웹어플리케이션의 컨텍스트는 비즈니스 레이어와 데이터 액세스 레이어와 다르게 프레젠테이션의 레이어는 서블릿을 통해 동작하기 때문에 서블릿에 대한 컨텍스트가 요구된다. 웹 서블릿의 경우 다양한 서블릿의 사용이 가능하기 때문에 확장성을 위해서 루트 어플리케이션 컨텍스트를 둔 상태에서 하위 컨텍스트로 서블릿 어플리케이션 컨텍스트가 있는 루트-자식 구조를 가지고 있다.
설정 파일의 경우 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>
네트워크를 통해 정보를 주고받는 HTTP API에서 나아가 자원을 정의하고 자원에 대한 주소를 지정하는 방식과 같은 네트워크 아키텍처 원리의 모음을 지칭하고 다음과 같은 규칙을 만족하는 경우 RESTful API라고 부른다.
client-server
stateless
cache
uniform interface
layered system
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"
}]
}
href
: 이전 request와 연관된 자원 요청을 위한 url 정보
rel
: 사용자의 이전 request와의 관계
method
: 요청할 때 사용해야 하는 HTTP 메소드
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);
}
}
실제 클라이언트의 요청을 API 서버가 어떻게 응답할 수 있는지 보기 위한 도구이다. IntelliJ HTTP Client Plugin 또는 포스트맨을 주로 사용한다.