Post

06 JSP - MVC

06 JSP - MVC

1. MVC1&MVC2

1. MVC1

1. MVC 1 패턴 (정의)

  • 초기 JSP/서블릿 웹 구조에서 나온 패턴
  • JSP가 Controller와 View 역할을 동시에 수행하는 구조
  • 요청 처리, 비즈니스 로직 호출, 화면 출력까지 JSP 안에서 처리

2. 역할

구분ControllerModelView
목적요청 처리, 사용자 입력을 받고 비즈니스 로직 호출데이터와 비즈니스 로직 제공사용자에게 화면 출력
포함 내용JSP 안 스크립틀릿(<% %>)으로 요청 처리DTO, VO, Entity, Service 등HTML, JSP 화면 템플릿
역할 범위사용자 요청 파라미터 읽기, Model 호출, 결과 전달데이터 검증, 계산, 저장/조회, 비즈니스 로직 수행화면 구성, 데이터 표현
MVC1 특징JSP 안에서 View와 섞여 있음JSP가 직접 호출하거나 포함Controller와 섞여 있음
수정/연산입력 처리 및 로직 호출데이터 변경, 계산, 검증거의 없음, 표현만

3. note

  • MVC1 패턴 자체는 JSP 환경에서 자연스럽게 발생한 용어
  • 이유: JSP가 Controller와 View 역할을 동시에 수행했기 때문 다른 기술에서도 비슷한 구조는 존재
    • PHP, ASP 초기 버전에서는 한 파일에서 요청 처리, DB 호출, 화면 출력까지 한꺼번에 처리 → MVC1과 유사
    • 단, 역사적 배경이나 공식 명칭에서 “MVC1”이라는 표현은 JSP/서블릿 진영에서만 사용

2. MVC2

1. MVC 패턴 (정의)

  • ** 애플리케이션을 Model, View, Controller 세 부분으로 분리하여 각 컴포넌트의 역할을 명확히 하고, 관심사를 분리(Separation of Concerns)하는 소프트웨어 아키텍처 패턴 **
  • M(Model): 비즈니스 로직, 데이터 처리, DB 접근
  • V(View): 사용자에게 보여줄 화면
  • C(Controller): 요청을 받아서 처리 → 모델 호출 → 뷰에 전달

2. 역할

구분ControllerModelView
목적요청 처리, DTO 생성, Service 호출, 결과 전달데이터와 비즈니스 로직 수행사용자에게 화면 출력
포함 내용Servlet, DTO 전달, Service 호출DTO, VO, Entity, ServiceJSP, HTML, CSS 등 화면 구성
역할 범위HTTP 요청 처리, 파라미터 수집, Service 호출검증, 계산, 저장/조회, 도메인 상태 관리화면 출력, 데이터 표시
MVC2 특징View와 분리, 단일 책임비즈니스 로직 집중화면 표현만 집중
수정/연산입력 검증은 최소, Service 호출데이터/상태 수정 가능거의 없음, 표현만

3. 강점

강점설명예시/효과
역할 분리Model, View, Controller 각각 역할 명확화면 수정 시 로직 건드리지 않고 가능
유지보수 용이코드가 섞이지 않아 수정/확장 쉬움DB 로직 변경 → View 코드 영향 없음
재사용성Model과 Controller 로직 재사용 가능같은 Model 데이터를 여러 화면에서 사용 가능
테스트 용이Model과 Controller를 독립적으로 단위 테스트 가능화면 출력(View) 테스트 부담 최소화
규모 확장 용이기능 증가 시 역할별 책임 분리되어 관리 편리팀 단위 개발 시 작업 분리 가능, 스파게티 코드 방지

2. MVC1 -> MVC2

1. Controller 분리

  • MVC1: JSP가 Controller 역할까지 겸함 (요청 처리 + 화면 출력)
  • MVC2: Servlet 등 별도 Controller가 만들어져서 요청 처리 전담
  • JSP는 화면 출력(View)만 담당

2. Model 사용 위치 변경

  • MVC1: JSP에서 직접 Model(DTO/VO/Entity/Service)을 호출
  • MVC2: Controller 안에서 Model을 호출
  • Controller가 DTO/VO/Entity를 이용해 Service 호출 → 처리 결과를 JSP(View)에 전달

3. Note

  • Controller(Servlet)에서 DTO를 생성하고 Service 호출 → 결과 DTO를 JSP에 전달
  • JSP는 받은 DTO를 화면에 출력함.
  • 따라서 JSP 안에서는 비즈니스 로직, 검증, DB 접근 등은 거의 사라짐
  • 사용되는 내장 객체(request, session)도 데이터를 화면에 표시하거나 간단한 제어용으로만 제한

3. Servlet / JSP / MVC

1. Servlet / JSP / MVC

구분Servlet만 사용JSP 사용MVC + JSP
화면과 로직 혼합HTML + PrintWriter 코드 혼합HTML + Java 코드 혼합 가능HTML + EL/JSTL 정도만 사용
역할로직 + 화면 모두 서블릿에서 처리화면 + 로직 + DB 모두 처리 가능화면 출력만 담당, 로직은 Controller/Service/DAO
장점/특징빠른 개발 가능, 단 유지보수 어려움빠른 화면 구현 가능, JSP 문법 편리MVC 원칙 준수로 유지보수성 ↑, JSP 강점은 거의 사용 X

2. 변화

  • 서블릿 초기
    • Servlet 클래스 안에서 HTTP 요청 처리 + View(HTML) 생성을 모두 시도
    • 화면 출력이 복잡해지고, 코드가 길어짐 → 유지보수 어려움
  • JSP
    • HTML 화면을 쉽게 만들기 위해 JSP 도입
    • JSP 안에서 Java 코드(스크립틀릿) 작성 → 화면(View) + Controller 역할 혼합
    • DTO/VO 등 모델 객체를 JSP 안에서 직접 사용 → MVC1 구조 등장
  • MVC1
    • Controller와 View가 JSP 안에서 계속 겹침
    • 비즈니스 로직이 화면 코드에 섞여 유지보수, 재사용성 떨어짐
  • MVC2 등장
    • Controller(Servlet)를 별도 클래스 단위로 분리
    • Controller에서 DTO/VO를 만들어 Service 호출 → 처리 결과를 JSP(View)에 전달
    • JSP는 화면 출력만 담당
    • 최종 구조: Controller → Model → View, 역할이 명확하게 분리

3. 소스 코드 흐름

1. JSP + WAS (MVC 미적용, 레거시)

1
2
3
4
5
6
7
8
9
10
11
클라이언트 요청 → WAS 수신
    ↓
JSP 파일 직접 요청
    ↓
WAS가 JSP → 서블릿(.java)로 변환 (최초 요청 시)
    ↓
컴파일 → 서블릿 클래스(.class) 생성
    ↓
서블릿 실행 → HTML 생성
    ↓
WAS → 클라이언트 응답

2. JSP + WAS (MVC2 적용, 스프링 미사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
클라이언트 요청 → WAS 수신
    ↓
URL 매핑 확인 → Controller(Servlet) 호출
    ↓
Controller → Model(Service/DAO) 호출 (데이터 처리)
    ↓
Controller → JSP(View) 호출 (forward)
    ↓
WAS가 JSP 존재 여부 확인
        - 없으면 JSP → 서블릿 변환 + 컴파일
        - 있으면 기존 서블릿 클래스 실행
    ↓
JSP 실행 → HTML 생성
    ↓
WAS → 클라이언트 응답

3. JSP + WAS (MVC2 적용, 스프링 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
클라이언트 요청 → WAS 수신
    ↓
DispatcherServlet (Spring Front Controller) 최초 요청 수신
    ↓
DispatcherServlet → 알맞은 Controller 호출
    ↓
Controller → Model(Service/DAO) 호출 (데이터 처리)
    ↓
Controller → View 이름 반환
    ↓
DispatcherServlet → ViewResolver 통해 JSP(View) 호출
    ↓
JSP 존재 여부 확인 및 실행 (서블릿 클래스 재사용)
    ↓
HTML 생성 → DispatcherServlet → WAS → 클라이언트 응답
This post is licensed under CC BY 4.0 by the author.