♪ 학습 내용
프론트 컨트롤러란 ? / 프론트 컨트롤러 도입
* 프론트 컨트롤러
이전 학습에서 공통처리로 인한 MVC 패턴의 한계를 알아보았다.
기존에는 클라이언트가 직접 컨트롤러(서블릿)를 호출하므로 각 컨트롤러 마다 공통 로직이 필요했다(중복).
하지만 프론트 컨트롤러를 도입한다면 ?
프론트 컨트롤러를 도입함으로써 입구는 하나가 되었고, 모든 클라이언트의 요청은 프론트 컨트롤러만을 호출한다.
그리고 프론터 컨트롤러는 고객의 요청을 받고 이에 매핑되는 컨트롤러를 호출해준다.
궁극적으로는 프론트 컨트롤러에 공통 처리를 몰아서, 공통 처리하기 좋아졌다.
클라이언트의 요청을 받는 프론트 클라이언트는 서블릿이다.
그렇다면 나머지 컨트롤러는?
서블릿이 아니지만, 서블릿과 유사한 구조를 지닌 인터페이스로 구현한다.
(인터페이스를 사용하는 이유는 다형성을 이용해 일관된 코드 작성을 위해)
어떤 요청이든간에 프론트 컨트롤러가 우선 받고, 요청 URL을 URL 매핑 정보에서 조회,
매핑되는 컨트롤러 반환,
해당 컨트롤러의 로직 호출,
뷰 포워드,
응답.
* 회원관리 애플리케이션에 프론트 컨트롤러 도입
service가 process로 이름이 바뀐 것 외에는 기존 서블릿 컨트롤러와 유사한 구조를 지닌다.
위의 인터페이스를 구현했으므로 마찬가지로 서블릿 컨트롤러와 매우 유사한 구조를 지녔다.
@WebServlet(urlPatterns="/front-controller/v1/*")
* 부분에 어떤 경로가 들어오던 이 컨트롤러 매핑.
덕분에 해당하는 모든 요청은 프론트 컨트롤러를 거쳐가게 된다.
private Map<String, ControllerV1> controllerMap = new HashMap<>();
매핑 정보가 담겨있는 Map이다.
key : URL / value : 컨트롤러(인스턴스 객체)
프론트 컨트롤러를 제외한 컨트롤러는 모두 인터페이스로 구현했으므로 다형성에 의해 인터페이스 타입 사용 가능
프론트 컨트롤러의 생성자( = 서블릿 처음 생성 시 무조건 )에서 매핑 정보를 담아둔다.
controllerMap.put("/front-controller/v1/members/new-form", new MemberFormControllerV1());
앞의 URL 요청이 들어오면, 뒤의 객체를 반환하게 끔.
String requestURI = request.getRequestURI();
ControllerV1 controller = controllerMap.get(requestURI);
요청 URL을 requestURI에 담고, 이를 매핑 정보 조회 ---> 이에 매핑되는 컨트롤러 객체 controller를 얻는다.
마찬가지로 인터페이스를 구현했으므로 어떤 컨트롤러가 매핑되든간에 ControllerV1으로 코드 일관
controller.process(request, response);
해당 컨트롤러의 로직 호출 !!
다형성에 의해 오버라이드 된 process
여기까지 해서 기존 애플리케이션 구조에 처음으로 프론트 컨트롤러를 도입해보았다.
이로 인해 나머지 컨트롤러는 서블릿일 필요가 없어졌다(@WebServlet 등 코드 작성 x)
물론 현재까지는 프론트 컨트롤러 때문에 코드가 더 복잡해졌지만.
구조적으로 개선할 때에는 큰 틀부터 마치고, 그 뒤에 디테일을 잡아야한다.
아직 forward 같은 코드 중복도 남아있기도 하고 디테일을 잡지 않았기 때문에 어쩔 수 없다.
앞으로 조금씩 바꿔나가다보면, 정말 간소화 된 MVC 패턴을 발견할 것이고.
곧 스프링 MVC와 유사 --> 스프링 MVC를 사용하는 이유
♪ 다음 학습 내용
View 처리( forward ) 분리 , Model 추가
'Dev > Spring' 카테고리의 다른 글
[Spring MVC 1] MVC 프레임워크 만들기 (3) (0) | 2023.01.28 |
---|---|
[Spring MVC 1] MVC 프레임워크 만들기 (2) (0) | 2023.01.27 |
[Spring MVC 1] 서블릿/JSP/MVC (2) (0) | 2023.01.24 |
[Spring MVC 1] 서블릿/JSP/MVC (1) (0) | 2023.01.22 |
[Spring MVC 1] 서블릿 (4) (0) | 2023.01.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!