회원 관리 웹 애플리케이션 요구사항
회원 정보 : 이름 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 |