Spring

MVC / 서블릿, JSP, MVC 패턴

Dear-J 2025. 4. 2. 00:40

회원 관리 웹 애플리케이션 요구사항

회원 정보 : 이름 username, 나이 age

기능 요구사항 : 회원 저장, 회원 목록 조회

 

id는 Member를 회원 저장소에 저장하면 회원 저장소가 할당

 

회원 저장소는 싱글톤 패턴 적용

>> 객체를 단 하나만 생성해서 공유해야 하므로 생성자를 private 접근자로 막아둠

 

회원을 저장하고, 목록을 조회하는 테스트 작성

 

서블릿으로 만들기

회원등록 HTML Form

MemberFormServlet은 단순히 회원 정보를 입력할 수 있는 HTML Form을 만들어 응답

>> 자바 코드로 HTML을 제공해야 해서 어려운 작업

 

회원 저장 

MemberSaveServlet

>> 파라미터를 조회해서 Member 객체를 만듦

>> Member 객체를 MemberRepository를 통해 저장

>> Member 객체를 사용해 결과 화면용 HTML을 동적으로 만들어 응답

 

회원 목록

MemberListServlet

>> memberRepository.findAll()을 통해 모든 회원 조회

>> 회원 목록 HTML을 for 루프를 통해 회원 수 만큼 동적으로 생성하고 응답

 

템플릿 엔진으로

서블릿 덕에 동적으로 원하는 HTML을 만들 수 있음

>> 매우 복잡, 비효율

 

오히려 HTML 문서에 동적으로 변경해야하는 부분만 자바 코드를 넣을 수 있다면 더 편리

>> 템플릿 엔진이 나온 이유

>> HTML 문서에서 필요한 곳만 코드를 적용해서 동적 변경 가능

>> JSP, Thymeleaf, Freemarker, Velocity

 

JSP로 만들기

회원 등록 폼 JSP

첫 줄은 JSP 문서라는 뜻

 

첫 줄을 제외하고는 HTML과 똑같음

JSP는 서버 내부에서 서블릿으로 변환됨

>> 만들었던 MemberFormServlet과 거의 비슷한 모습으로 변환됨

 

회원 저장 JSP

자바의 import 문과 같다

<% ~~ %>

이 부분에는 자바 코드를 입력 가능

<%= ~~ %>

이 부분에는 자바 코드를 출력 가능

 

회원 저장 서블릿 코드와 같음

>> 다른 점은, HTML을 중심으로 하고 자바 코드를 부분 입력

 

회원 목록 JSP

회원 리포지토리를 먼저 조회하고

>> 결과 List를 사용해 중간에 <tr><td> HTML 태그를 반복 출력

 

서블릿과 JSP의 한계

서블릿으로 개발할 때

>> 뷰(View) 화면을 위한 HTML 만드는 작업이 자바 코드에 섞여 복잡

JSP 사용

>> 동적으로 변경이 필요한 부분에만 자바 코드 적용, HTML 작업 깔끔

 

하지만

 

JAVA 코드, 데이터를 조회하는 리포지토리 등 다양한 코드가 모두 JSP에 노출

>> JSP가 너무 많은 역할

>> 유지 보수 문제

 

MVC 패턴

Controller : HTTP 요청을 받아 파라미터 검증, 비즈니스 로직 실행

>> 뷰에 전달할 결과 데이터를 조회해서 모델에 담음

 

Model : 뷰에 출력할 데이터 담음

 

View : 모델에 담겨있는 데이터를 사용해 화면을 그리는 일에 집중, HTML 생성

 

 

일반적으로 비즈니스 로직은 Service라는 계층을 별도로 만들어 처리

>>  Controller는 비즈니스 로직이 있는 서비스를 호출하는 역할

 

MVC 패턴 적용

Controller : 서블릿

View : JSP

Model : HttpServletRequest 객체

>> request는 내부에 데이터 저장소 가짐

>> request.setAtrribute(), request.getAttribute() 사용하면 데이터 보관 및 조회 가능

 

회원 등록 폼 - 컨트롤러

/WEB-INF : 이 경로안에 JSP가 있으면 외부에서 직접 호출 불가

>> 항상 컨트롤러를 통해 호출

 

dispatcher.forward() : 다른 서블릿이나 JSP로 이동하는 기능, 서버 내부에서 다시 호출 발생

>> redirect 아님, 클라이언트가 전혀 인지 x

 

회원 등록 폼 - 뷰

form의 action을 보면 절대 경로(/)가 아닌 상대 경로

>> 폼 전송시 현재 URL이 속한 계층 결로 + save 호출

 

회원 저장 - 컨트롤러

HttpServletRequest를 Model로 사용

>> setAttribute() 사용해서 request 객체에 데이터를 보관해서 뷰에 전달 가능

 

회원 저장 - 뷰

<%= request.getAttribute("member")%>로 모델에 저장한 member 객체 꺼낼 수 있지만 복잡

 

JSP ${} 문법 제공

>> request의 attribute에 담긴 데이터 편리하게 조회

 

MVC 덕에 컨트롤러 로직과 뷰 로직을 확실히 분리

>> 향후 화면에 수정이 발생 시 뷰 로직만 변경

 

MVC 패턴 한계

포워드 중복 : View로 이동하는 코드가 항상 중복 호출

ViewPath 중복 : JSP가 아닌 Thymeleaf 같은 다른 뷰로 변경하면 전체 코드 다 변경해야 함

>> 공통 처리 어려움 : 기능이 복잡해질 수록 컨트롤러에서 공통으로 처리해야 하는 부분 점점 증가

 

이 문제 해결하려면

>> 컨트롤러 호출 전에 먼저 공통 기능 처리(수문장 역할)

 

Front Controller!!

'Spring' 카테고리의 다른 글

MVC / 구조 이해  (0) 2025.04.04
MVC / 프레임워크 만들기  (0) 2025.04.02
MVC / 서블릿  (0) 2025.04.01
MVC / 웹 애플리케이션 이해  (0) 2025.03.31
Spring / 빈 스코프  (0) 2025.03.29