+) 22. 08. 14. 02:22 추가
서블릿은 동적인 페이지를 만들기 위해 웹 서버에 붙이는 프로그램 중 하나이다.
우리가 개발을 할 때, HTTP 형태의 요청(GET /api/products HTTP/1.1…)을 직접 파싱하는 것과 HttpServletRequest의 메서드를 호출하는 것 중 어떤 게 더 정보를 얻기 편할까?
당연히 후자일 것이다.
서블릿이 요구하는 구현 규칙을 지키면서 서블릿을 정의하면, HTTP 요청 정보를 쉽게 사용할 수 있고, 처리 결과를 응답으로 쉽게 변환할 수 있다.
즉, 서블릿을 이용하여 웹 요청을 다루게 되면 개발자들은 비즈니스 로직에만 집중할 수 있게 된다.
→ 처리하고 싶은 요청 메서드에 해당하는 doXXX 메서드를 찾아 재정의 해주면 된다.
만약 요청 당 서블릿을 생성해서 정해준다면 굉장히 비효율적일 것이다.
관리적인 측면에서는 멀티스레딩을 다뤄야 한다는 어려움이 있으며, 개발적인 측면에서는 핸들러의 공통 로직이 매번 중복된다는 문제가 있다.
위 이미지처럼 카페에 메뉴마다 제조를 담당하는 직원이 하나씩 존재한다고 가정해 보자. 요청, 즉, 메뉴는 다 다를 수 있지만 주문을 받고 계산하고 포장하는 작업은 중복되는 걸 볼 수 있다.
이러한 공통 로직 문제를 해결하기 위해 전면에서 주문을 받고 계산하는, 포장하는 부분을 빼내 매니저로 두었다.
매니저는 앞에서 주문을 받고 계산하는 역할을 한다. 그리고 음료를 만드는 개별적인 부분은 각 종류마다 직원을 두어 제작 과정을 위임한다. 즉, 매니저는 손님의 요청을 앞단에서 처리할 수 있는 일을 전담한다.
이것이 Front Controller 패턴이다.
스프링 MVC도 Front Controller 패턴을 따른다. 모든 요청을 받는 전면 컨트롤러, 즉, 이러한 서블릿을 Dispatcher Servlet이라 부른다.
서블릿을 하나만 두고, 모든 요청을 다 받을 수 있도록 한다.
이전에 서블릿을 개별적으로 다루었을 땐 요청마다 서블릿을 정의하고, 요청을 수행할 때마다 매번 스레드를 생성했다.
그러나 이제는 하나의 서블릿만 정의하고 그 서블릿이 모든 요청을 수행할 수 있도록 하는 것이다.
Dispatcher Servlet이 web 요청을 처리하는 과정
위의 카페 예시에서, 만약 손님이 너무 많이 와 전면 매니저도 일이 밀리면 어떡할까?
그렇다면 이렇게 역할을 분리하는 게 좋을 것이다.
전면 매니저가 모든 요청을 처리하되, 계산만 담당하는 직원, 음료를 담당하는 직원, 음료 담당 직원을 호출하는 직원, 포장만 담당하는 직원을 따로 분리하는 것이다.
이걸 디스패처 서블릿으로 치환해 보면 다음과 같다.
디스패처 서블릿이 모든 요청을 다 받는다.
핸들러 매핑은 요청을 처리할 때 컨트롤러를 찾아서 반환한다.
핸들러 어댑터는 해당 컨트롤러의 메서드를 호출하여 처리 로직을 수행한다.
그리고 그 처리 결과를 ModelAndView 객체로 변환해서 디스패처 서블릿에 넘긴다.
다시 디스패처 서블릿은 뷰 리졸버를 이용해서 뷰를 찾거나 생성한다.
그렇게 얻은 뷰에 아까 모델로 들어왔던 데이터를 넣어 응답 결과 생성을 요청한다. 우리가 볼 수 있는 JSP나 Thymeleaf 같은 데이터를 담은 출력 파일로 응답을 하게 되는 것이다.
조금 복잡해 보이지만, 결국 개발자들이 신경써야 할 부분은 귀여운 동물들이 담당하는 XX 처리 핸들러 부분이다. 만약 스프링이 없었다면 Handler Mapping, Handler Adapter, View Resolver도 다 직접 처리해야 했을 것이다. 얘네들은 Dispatcher Servlet이 스프링 컨테이너로부터 주입을 받아 사용하고 동작한다.
그러니까 우리는 서블릿 설정 파일만 잘 작성해 주면 된다. 그 설정대로 생성된 객체가 스프링 컨테이너에서 관리되고, 필요한 부분에서 주입 받아 Dispatcher Servlet이 알아서 사용할 수 있게 되는 것이다.
결국 Dispatcher Servlet을 쓰는 이유는 우리가 개발할 때 집중해야 하는 부분, 즉, 요청 처리 로직들에만 신경쓸 수 있도록 하기 위함이다.
참고
스프링 MVC 구조를 다시 한 번 정리해 보면 위 이미지와 같다.
참고 자료
함께 보면 좋은 자료
우아한Tech, “[10분 테코톡] 🌻타미의 Servlet vs Spring”, https://youtu.be/2pBsXI01J6M
우아한Tech, “[10분 테코톡] 👩희봉의 웹서버 vs WAS”, https://youtu.be/NyhbNtOq0Bc
+) 22. 08. 13. 01:37 추가
3진법 뒤집기
class Solution {
public int solution(int n) {
int answer = 0;
int m = 0;
String s = "";
while (n / 3 > 0) {
m = n % 3;
s += m;
n = n / 3;
}
s += n;
answer = Integer.parseInt(s, 3);
return answer;
}
}
받은 점수는 4점... 뭔가 더 간결하게 할 수 있을 것 같은데;; 생각이 안 난다. 다른 사람 풀이 보니까 Stringbuilder 사용했던데... 이건 써본 적이 없어서 어케 쓰는지도 모르겄다. 추후 공부해봐야 할듯.