대분류 2에서 서블릿과 JSP의 역할을 정리했다.
- 서블릿: 요청을 읽고 로직을 처리하는 쪽
- JSP: 화면(HTML)을 만들고 출력하는 쪽
문제는 실제로 개발을 시작하면 “JSP만으로도 다 할 수 있지 않나?”라는 유혹이 생긴다는 점이다.
JSP는 `${param.xxx}`로 파라미터도 읽을 수 있고, 화면도 만들 수 있다.
하지만 JSP 단독으로 로직까지 처리하려고 하면 구조적으로 문제가 생긴다.
이 문제 때문에 결국 “Controller(서블릿)”가 필요해지고, MVC 구조로 넘어가게 된다.
JSP는 GET/POST 접근을 자동으로 제한해주지 않는다
예를 들어 `calcResult.jsp`가 “폼 제출(POST)로만” 와야 하는 페이지라고 해보자.
폼에서는 이렇게 전송한다.
- method="post"
그래서 개발자는 자연스럽게 이렇게 생각한다.
- “이 페이지는 POST로만 들어온다”
하지만 현실은 다르다.
사용자는 주소창에 이렇게 직접 입력할 수 있다.
- `/calcResult.jsp?num1=10&num2=20`
이건 GET 요청이다.
그런데 JSP에서는 `${param.num1}`이 그대로 읽힌다.
왜냐하면 param은 GET 쿼리 스트링이든 POST form 데이터든
둘 다 “요청 파라미터”로 취급해서 읽기 때문이다.
즉 JSP 자체는 “반드시 POST로만 들어와야 한다”를 자동으로 막아주지 않는다.
JSP 경로가 노출되면, 화면과 로직이 URL에 그대로 드러난다
JSP 파일은 파일 경로를 기반으로 접근할 수 있다.
- `/todo/register.jsp`
- `/todo/list.jsp`
이 구조에서 사용자는 JSP 파일 URL만 알면 직접 접근한다.
문제는 이렇게 되면 화면이 곧 URL이 되고,
URL 구조가 화면 파일 구조에 종속된다.
즉 “화면 파일이 바뀌면 URL이 바뀌는 문제”가 생긴다.
유지보수가 어려워진다: 화면이 바뀌면 외부에 영향이 간다
예를 들어 입력 화면이 `input.jsp`였다가 `input2.jsp`로 바뀌었다고 하자.
- 기존 사용자는 input.jsp 주소를 알고 있고
- 즐겨찾기나 링크로 공유했을 수 있다
그런데 파일명이 바뀌면 URL도 바뀐다.
결국 과거 주소를 아는 사람들에게는 “페이지가 사라진 것”처럼 보인다.
즉 JSP 파일 중심 설계는 “내부 구현 변경”이 “외부 URL 변경”으로 번지기 쉽다.
JSP에 로직이 섞이기 시작하면 코드가 급격히 망가진다
JSP가 강한 부분은 화면 구성이다.
하지만 데이터를 가공하고 검증하고 예외 처리하는 로직은 JSP에 어울리지 않는다.
JSP에서 로직을 처리하려 하면 이런 현상이 생긴다.
- 화면(HTML) + 데이터 처리 로직 + 조건/반복 + DB 호출
- 모든 것이 한 파일에 섞인다
- 읽기 어렵고 테스트하기 어렵다
- 실수하기 쉬워진다
즉 “유지보수 불가능한 파일”이 된다.
결론: 역할 분리가 필요해진다
그래서 JSP를 실무에서 쓰더라도
보통은 다음 원칙으로 제한해서 사용한다.
- JSP는 파라미터 처리/비즈니스 로직을 하지 않는다
- JSP는 입력 화면 또는 결과 화면을 출력하는 역할만 한다
- 브라우저는 JSP 경로가 아니라 Controller 경로로만 접근한다
즉, 브라우저 요청은 먼저 Controller(서블릿)로 들어가고
Controller가 데이터를 준비해서 JSP로 넘긴다.
이게 MVC이다
이 구조를 이름 붙이면 MVC이다.
- Controller: 요청을 받아 처리하고 흐름을 제어한다(서블릿)
- View: 화면을 출력한다(JSP)
- Model: 화면에 필요한 데이터(Controller가 준비해서 전달하는 값들)
즉 MVC는 “역할 분리”를 위한 구조이다.
정리
- JSP는 GET/POST 접근 제한을 자동으로 보장하지 않는다
- JSP 파일 URL이 직접 노출되면 URL이 구현에 종속된다
- 로직이 JSP에 섞이면 유지보수가 급격히 어려워진다
- 그래서 Controller(서블릿)로 처리 로직을 분리하고, JSP는 View로 제한한다
- 이 역할 분리가 MVC 구조이다
'Web > Web Basics' 카테고리의 다른 글
| [MVC와 웹 흐름 제어] 4. redirect(sendRedirect) (0) | 2026.03.29 |
|---|---|
| [MVC와 웹 흐름 제어] 3. RequestDispatcher와 forward (0) | 2026.03.29 |
| [서블릿과 JSP] 8. 톰캣(서블릿 컨테이너)은 실제로 무슨 일을 하는가 (0) | 2026.03.29 |
| [서블릿과 JSP] 7. JSTL은 왜 필요하고, <c:forEach>는 무엇인가 (0) | 2026.03.29 |
| [서블릿과 JSP] 6. 서블릿이 만든 데이터를 JSP가 읽는 방식 (0) | 2026.03.29 |