Spring/강의

[📕 기초 Spring] 3-2. MVC 패턴의 발전

가지코딩 2025. 5. 3. 17:23

📕 목차

  1. MVC 패턴의 문제점
  2. 프론트 컨트롤러 패턴
  3. 어댑터 패턴
  4. 전체 요약 및 발전 흐름

1. MVC 패턴의 문제점

MVC 패턴을 적용하면 View는 오직 Model을 참조하여 화면을 그리는 역할만 담당한다.

 

그러나 Controller는 여전히 다양한 문제를 안고 있다.

 

 

Controller에서 발생하는 문제점

  • View 이동 코드가 중복됨
    • 모든 컨트롤러에서 dispatcher.forward()를 직접 호출해야 한다.
  • View 경로를 하드코딩해야 함
    • 경로를 문자열로 직접 입력해야 하고, 파일명이 바뀌면 모든 코드 수정이 필요하다.
  • 확장자에 유연하지 않음
    • JSP에 고정되어 있어 다른 템플릿 엔진으로 바꾸기 어렵다.
  • 응답 객체(HttpServletResponse)를 잘 안 씀
    • 대부분 JSP에서 처리되므로 활용도가 낮고, 테스트도 어렵다.
  • 공통 기능을 매번 직접 호출해야 함
    • 로깅, 인증 같은 공통 기능을 컨트롤러마다 반복해야 하고, 실수로 빼먹을 수도 있다.
  • 컨트롤러의 책임이 무거워짐
    • 공통 로직이 늘어날수록 코드가 복잡해지고 유지보수가 어려워진다.

 

 

 

공통 기능을 하나의 메서드로 만들어 놓고 각 컨트롤러에서 호출하면 되는 것 아닌가? 라는 생각이 들 수 있다.

이 방식의 문제점

  • 모든 컨트롤러마다 중복 호출이 필요하다.
  • 호출 누락 가능성이 존재한다.
  • 공통 메서드가 많아지면 Controller 내부가 복잡해진다.

→   이런 문제를 해결하기 위해 프론트 컨트롤러 패턴이 등장하였다.


2. 프론트 컨트롤러 패턴

프론트 컨트롤러 패턴

  • 모든 요청을 단일 진입점인 하나의 Servlet(프론트 컨트롤러)이 받아 공통 처리를 수행하고, 이후 해당 요청을 담당할 컨트롤러로 위임하는 구조

 

 

프론트 컨트롤러 패턴 역할

  • 모든 요청을 한 곳에서 받는다
    • 웹 요청의 입구는 하나로 통일된다.
  • 공통 작업을 한 곳에서 처리한다
    • 인증, 로깅 등 중복되는 코드를 한 번만 작성하면 된다.
  • 요청에 맞는 컨트롤러로 연결해준다
    • 실제 업무 처리는 적절한 컨트롤러에게 위임된다.
  • 컨트롤러는 서블릿을 몰라도 된다
    • 비즈니스 로직만 신경 쓰면되므로 코드가 깔끔해진다.

 

모든 컨트롤러가 동일한 응답 형태를 반환해야 하는가? 라는 의문이 생긴다.

  • 프론트 컨트롤러가 공통 로직을 처리하려면 각 컨트롤러의 반환 타입이 동일해야 한다.
  • 하지만 실제로는 컨트롤러마다 처리 방식, 반환 타입이 다를 수밖에 없다.
  • 따라서 응답 형태를 강제로 통일하려 하면 확장성과 유지보수성이 떨어진다.
  • 공통 로직에서 각 컨트롤러의 반환값을 일일이 처리하면 오히려 공통 로직이 복잡해진다.

→  이런 문제를 해결하기 위해 어댑터 패턴이 도입되었다.


3. 어댑터 패턴

어댑터 패턴

  • 다양한 형태의 컨트롤러를 유연하게 처리하기 위해 어댑터 패턴을 도입한다.
  • 컨트롤러는 인터페이스를 따르고, 공통 로직과 컨트롤러 사이에 어댑터가 위치하여 서로를 연결해준다.

 

* 어댑터

  • 전기나 기계를 서로 맞지 않는 인터페이스끼리 연결할 수 있게 해주는 중간 변환 장치

 

어댑터 패턴 구조

  • 컨트롤러(Handler)는 비즈니스 로직을 수행하고 결과를 반환한다.
  • 어댑터는 컨트롤러와 프론트 컨트롤러 사이를 중계하여 형식을 맞춘다.
  • 프론트 컨트롤러는 어댑터를 통해 공통된 방식으로 요청을 위임한다.

 

어댑터 패턴의 장점

  • 각자의 역할이 명확하게 분리된다. (프론트 컨트롤러 / 어댑터 / 핸들러)
  • 새로운 형태의 컨트롤러가 추가되더라도, 어댑터만 구현하면 공통 로직은 변경하지 않아도 된다.
  • 확장성과 유지보수성이 매우 좋아진다.

4. 전체 요약 및 발전 흐름

  1. Servlet 사용
    • 비지니스 로직을 처리하는 코드와 화면을 그리는 View 코드가 함께 존재하는 문제
  2. JSP 사용
    • View 에 해당하는 코드를 분리하였지만, 여전히 비지니스 로직을 JSP에 포함하는 문제
  3. MVC 패턴 사용
    • 공통 로직을 처리하는것에 코드가 중복되는 문제
  4. 프론트 컨트롤러 패턴 사용
    • 공통 로직을 하나의 입구에서 처리하기 위해서 프론트 컨트롤러 패턴 적용
    • 각각의 핸들러 호출 후 응답을 프론트 컨트롤러에 맞게 변형시켜야 하는 문제
  5. Spring MVC 사용
    • 프론트 컨트롤러 패턴, 어댑터 패턴이 모두 적용된 현재
    • 우리가 사용하는 Spring을 이용한 Web Application 개발 방식에 사용됨
    • Spring은 MVC 패턴에 프론트 컨트롤러 패턴, 어댑터 패턴이 적용되어 있다.