📕 목차
1. MVC 패턴의 문제점
MVC 패턴을 적용하면 View는 오직 Model을 참조하여 화면을 그리는 역할만 담당한다.
그러나 Controller는 여전히 다양한 문제를 안고 있다.
Controller에서 발생하는 문제점
- View 이동 코드가 중복됨
- 모든 컨트롤러에서 dispatcher.forward()를 직접 호출해야 한다.
- View 경로를 하드코딩해야 함
- 경로를 문자열로 직접 입력해야 하고, 파일명이 바뀌면 모든 코드 수정이 필요하다.
- 확장자에 유연하지 않음
- JSP에 고정되어 있어 다른 템플릿 엔진으로 바꾸기 어렵다.
- 응답 객체(HttpServletResponse)를 잘 안 씀
- 대부분 JSP에서 처리되므로 활용도가 낮고, 테스트도 어렵다.
- 공통 기능을 매번 직접 호출해야 함
- 로깅, 인증 같은 공통 기능을 컨트롤러마다 반복해야 하고, 실수로 빼먹을 수도 있다.
- 컨트롤러의 책임이 무거워짐
- 공통 로직이 늘어날수록 코드가 복잡해지고 유지보수가 어려워진다.
공통 기능을 하나의 메서드로 만들어 놓고 각 컨트롤러에서 호출하면 되는 것 아닌가? 라는 생각이 들 수 있다.
이 방식의 문제점
- 모든 컨트롤러마다 중복 호출이 필요하다.
- 호출 누락 가능성이 존재한다.
- 공통 메서드가 많아지면 Controller 내부가 복잡해진다.
→ 이런 문제를 해결하기 위해 프론트 컨트롤러 패턴이 등장하였다.
2. 프론트 컨트롤러 패턴
프론트 컨트롤러 패턴
- 모든 요청을 단일 진입점인 하나의 Servlet(프론트 컨트롤러)이 받아 공통 처리를 수행하고, 이후 해당 요청을 담당할 컨트롤러로 위임하는 구조
프론트 컨트롤러 패턴 역할
- 모든 요청을 한 곳에서 받는다
- 웹 요청의 입구는 하나로 통일된다.
- 공통 작업을 한 곳에서 처리한다
- 인증, 로깅 등 중복되는 코드를 한 번만 작성하면 된다.
- 요청에 맞는 컨트롤러로 연결해준다
- 실제 업무 처리는 적절한 컨트롤러에게 위임된다.
- 컨트롤러는 서블릿을 몰라도 된다
- 비즈니스 로직만 신경 쓰면되므로 코드가 깔끔해진다.
모든 컨트롤러가 동일한 응답 형태를 반환해야 하는가? 라는 의문이 생긴다.
- 프론트 컨트롤러가 공통 로직을 처리하려면 각 컨트롤러의 반환 타입이 동일해야 한다.
- 하지만 실제로는 컨트롤러마다 처리 방식, 반환 타입이 다를 수밖에 없다.
- 따라서 응답 형태를 강제로 통일하려 하면 확장성과 유지보수성이 떨어진다.
- 공통 로직에서 각 컨트롤러의 반환값을 일일이 처리하면 오히려 공통 로직이 복잡해진다.
→ 이런 문제를 해결하기 위해 어댑터 패턴이 도입되었다.
3. 어댑터 패턴
어댑터 패턴
- 다양한 형태의 컨트롤러를 유연하게 처리하기 위해 어댑터 패턴을 도입한다.
- 컨트롤러는 인터페이스를 따르고, 공통 로직과 컨트롤러 사이에 어댑터가 위치하여 서로를 연결해준다.
* 어댑터
- 전기나 기계를 서로 맞지 않는 인터페이스끼리 연결할 수 있게 해주는 중간 변환 장치
어댑터 패턴 구조
- 컨트롤러(Handler)는 비즈니스 로직을 수행하고 결과를 반환한다.
- 어댑터는 컨트롤러와 프론트 컨트롤러 사이를 중계하여 형식을 맞춘다.
- 프론트 컨트롤러는 어댑터를 통해 공통된 방식으로 요청을 위임한다.
어댑터 패턴의 장점
- 각자의 역할이 명확하게 분리된다. (프론트 컨트롤러 / 어댑터 / 핸들러)
- 새로운 형태의 컨트롤러가 추가되더라도, 어댑터만 구현하면 공통 로직은 변경하지 않아도 된다.
- 확장성과 유지보수성이 매우 좋아진다.
4. 전체 요약 및 발전 흐름
- Servlet 사용
- 비지니스 로직을 처리하는 코드와 화면을 그리는 View 코드가 함께 존재하는 문제
- JSP 사용
- View 에 해당하는 코드를 분리하였지만, 여전히 비지니스 로직을 JSP에 포함하는 문제
- MVC 패턴 사용
- 공통 로직을 처리하는것에 코드가 중복되는 문제
- 프론트 컨트롤러 패턴 사용
- 공통 로직을 하나의 입구에서 처리하기 위해서 프론트 컨트롤러 패턴 적용
- 각각의 핸들러 호출 후 응답을 프론트 컨트롤러에 맞게 변형시켜야 하는 문제
- Spring MVC 사용
- 프론트 컨트롤러 패턴, 어댑터 패턴이 모두 적용된 현재
- 우리가 사용하는 Spring을 이용한 Web Application 개발 방식에 사용됨
- Spring은 MVC 패턴에 프론트 컨트롤러 패턴, 어댑터 패턴이 적용되어 있다.
'Spring > 강의' 카테고리의 다른 글
[📕 기초 Spring] 4-1. 스프링 주요 어노테이션(Annotation) (1) | 2025.05.03 |
---|---|
[📕 기초 Spring] 3-3. Spring MVC (0) | 2025.05.03 |
[📕 기초 Spring] 3-1. MVC 패턴의 도입 (0) | 2025.05.03 |
[📕 기초 Spring] 2-5. Java 웹 기술의 역사 (0) | 2025.05.03 |
[📕 기초 Spring] 2-4. 빌드 관리 도구 (0) | 2025.05.03 |