Spring에서 서블릿을 등록하려면 아래와 같이 해야한다.
@WebServlet(name = "myServlet", urlPatterns = "/app2")
public class MyServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("-- In MyServlet --");
PrintWriter writer = resp.getWriter();
writer.println("dummy response from MyServlet");
}
}
GET /app2 로 들어오는 요청을 처리할 서블릿을 정의하는 코드다.
Java EE에서 Http 요청을 처리하기 위해서는 다음과 같이 작업해야 한다.
- HttpServlet 클래스를 상속받아 요청을 처리할 로직을 작성한다.
- 작성한 클래스를 서블릿컨테이너에 등록한다.
하지만 SpringMVC를 사용하다보면 서블릿을 등록할 일이 없다.
대신 다음과 같은 코드를 작성하게 된다.
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
이건 서블릿은 아니지만 서블릿 처럼 요청에 대한 핸들러 역할을 한다.
SpringMVC는 모든 요청을 하나의 서블릿, DispatcherServlet이 받는다.
DispatcherServlet이 받아서 우리가 정의한 컨트롤러 맵핑에 맞게 요청을 넘겨준다.
바햐흐로..
바야흐로 그 옛날엔 웹 페이지가 정적 컨텐츠로만 구성된 시절이 있었을 것이다. 요청에 매칭되는 파일을 찾아 응답을 내려주면 된다.
그러나 시간이 흐르면서 정적 컨텐츠만으론 충분하지 않음을 느꼈을 것이다. DB에 저장된 데이터을 읽어서 HTML 포함 시키고 싶다고 하면 어떻게 해야할까? 모든 데이터에 맞게 HTML을 미리 생성해 놓을 순 없는 노릇이다. 이러한 이유로 동적으로 HTML을 생성하고 싶은 요구가 생겼고 Java에서는 이를 서블릿과 서블릿컨테이너를 통해 이를 지원하게 된다.
간략히 프로세스를 설명하면 다음과 같다.
- 서블릿 클래스를 상속받아 요청에 대해 어떤 응답을 줄 지에 대한 코드를 작성한다.
- 컨테이너의 설정파일인 web.xml에 어떤 uri에 어떤 서블릿이 매칭되는지를 작성한다.
- 내 어플리케이션을 컨테이너에게 제출한다(Submit).
- 컨테이너가 실행되어 Request를 받으면...
- web.xml을 참고하여 Request를 처리할 서블릿 클래스를 찾는다.
- 찾은 클래스의 인스턴스를 생성한다.
- 그 인스턴스에 구현된 메소드를 호출하여 응답값을 돌려받는다.
즉 서블릿은 우리가 원하는 로직을 작성할 수 있는 클래스이고, 서블릿 인터페이스에 맞게 작성하여 컨테이너에 등록해두면, 컨테이너가 이를 가져다 사용하는 식이다.
사실 SrpingMVC를 주로 사용하는 입장에선 서블릿을 직접 작성할 케이스가 많지 않다.
참고자료
https://javaee.github.io/servlet-spec/downloads/servlet-4.0/servlet-4_0_FINAL.pdf
https://engkimbs.tistory.com/755
http://www.pearsonitcertification.com/articles/article.aspx?p=29786&seqNum=3
'개발 > Java' 카테고리의 다른 글
[Java] 불변(Immutable) 속성 (0) | 2020.02.04 |
---|---|
[Java] 자바 네티이브 인터페이스(JNI) (0) | 2020.02.01 |
[JVM] 런타임 데이터 영역(Run-time Data Area) (0) | 2020.02.01 |
[객체지향] 추상화, 캡슐화, 상속, 다형성 (1) | 2020.01.31 |
Java 8 람다표현식(Lamda expression)이란? (0) | 2020.01.11 |