https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편- 백엔드 웹 개발 핵심 기술 김영한님 수업을 듣고 정리한 글입니다.
서블릿 -> JSP -> MVC 패턴을 적용하며 발전 방향을 알아보는 방식으로 공부한다.
회원 관리 웹 애플리케이션 요구사항
회원 정보 : 이름 username, 나이 age
기능 요구사항 : 회원 저장, 회원 목록 조회
핵심 로직 - 도메인, 저장소 만들기
회원 도메인 모델
회원 저장소
memberRepository를 다른 패키지에 추가해야하지만, 저장할 내용이 적으므로 같은 패키지에 저장한다.
스프링을 사용하면 굳이 싱글톤으로 만들 필요가 없다.
command+shift+t: 테스트 만들기
테스트 코드
서블릿으로 회원 관리 웹 애플리케이션 만들기
서블릿 - 회원 등록 폼
http://localhost:8080/servlet/members/new-form 들어가면
저장하면 /servlet/members/save로 데이터 보낸다.
서블릿 - 회원 저장
http://localhost:8080/servlet/members/new-form 접속시
http://localhost:8080/servlet/members/save 로 리다이렉트 되면서
잘 띄워지는 것을 볼 수 있다.
서블릿 - 회원 목록
http://localhost:8080/servlet/members 접속시에 저장한 값들이 잘 뜬다.
서블릿 정리
서블릿은 요청, 응답을 다루기에는 편하지만 HTML을 만드는 것이 비효율적이다.
지금처럼 java 코드 안에 html코드를 넣는 것보다,
html 안에 동적으로 변화해야하는 부분만 java 코드를 넣을 수 있는 템플릿 엔진을 사용하면 더욱 편하다.
템플릿 엔진 : JSP, Thymeleaf, Freemarker, Velocity
우선 JSP로 진행해보자!(현재는 사용을 안하는 추세, 대신 Thymeleaf 사용)
JSP로 회원 관리 웹 애플리케이션 만들기
라이브러리 추가
스프링 부트 3.0 미만
//JSP 추가 시작
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'javax.servlet:jstl'
//JSP 추가 끝
나는 스프링 부트 프로젝트를 2.XX버전 사용했으므로 이렇게 추가하면 된다.
webapp 밑 디렉토리에 만들기 시작해야한다.
webapp 밑에 있는 것은 url로 바로 접근이 가능하다.
ex) http://localhost:8080/jsp/members.jsp // jsp 디렉토리의 jsp 페이지
JSP - 회원 등록 폼 만들기
http://localhost:8080/jsp/members/new-form.jsp 로 접속하면,
JSP - 회원 저장
이전에 서블릿으로 저장한 자바 코드를, jsp 파일에 붙이자! (로직은 같으므로)
서블릿 - 회원 저장 java코드
jsp 파일 (save.jsp)
<% ~~%>로 자바코드를 입력하고
<%= ~~ %>로 자바코드를 출력한다.
intellij에서 import는 자동으로 작성하여 위에 붙여준다.
JSP - 회원 목록
members.jsp
멤버 등록 후 결과
jsp는 결국 서블릿으로 바뀐다. jsp를 이용해 좀 더 편리하게 사용이 가능하다.
JSP에서 MVC 패턴으로
jsp를 사용하면 서블릿보다 편리하기는 하지만 비지니스 로직(java코드)와 뷰 영역(html코드)가 섞여서 복잡하다.
MVC 패턴은 비지니스 로직은 jsp가 아닌 다른 곳에서 처리하고, jsp는 목적에 맞게 html로 화면을 그리는 일(View)에만 집중하도록 한다.
MVC패턴으로 로직과 뷰를 분리해야하는 이유
✅ 너무 많은 역할 (서블릿이나 JSP만으로 비지니스 로직과 뷰 렌더링까지 처리하는것은 유지보수를 어렵게 한다.)
✅ 변경의 라이프 사이클이 다르다. (UI 수정과 로직 수정은 다른 때에 발생하고 서로 영향을 주지 않는다.)
✅ 기능 특화 (JSP같은 뷰 템플릿은 화면 렌더링에 특화되어있으므로 이 업무만 담당하도록 하자.)
=> MVC 패턴으로 프로젝트 리팩터링 하기!
MVC 패턴 (Model View Controller)
하나의 서블릿이나 JSP로 처리하던 것을 Controller와 View 영역으로 역할을 나눈다.
컨트롤러(Contoller)
HTTP 요청을 받아서 파라미터 검증, 비지니스 로직을 실행한다. 뷰에 전달할 결과 데이터를 조회하여 모델(Model)에 담는다.
✔️ 컨트롤러에 비지니스 로직까지 두면 너무 많은 역할을 수행하기때문에 일반적으로 Service라는 계층을 만들어 비지니스 로직을 처리한다. 컨트롤러는 비지니스 로직이 있는 서비스를 호출한다.
모델 (Model)
뷰에 출력할 데이터를 담아둔다.
뷰(View)
모델에 담겨있는 데이터를 사용해서 화면을 그린다. ( ex)HTML생성 )
그림
클라이언트는 컨트롤러를 호출하고, 컨트롤러는 파라미터 검증 및 비지니스 로직을 수행한다.
리포지토리의 데이터에 접근하여 모델에 담고, 뷰 로직에 넘긴다.
뷰 로직은 모델의 데이터를 참조하여 화면을 그리고, 응답한다.
MVC 패턴 - 적용
<MVC 패턴 적용>
컨트롤러 - 서블릿뷰 - jsp
모델 - HttpServletRequest
✅ request는 내부에 데이터 저장소를 가지고 있다.
request.setAttribute() : 데이터 보관
request.getAttribute(): 데이터 조회
항상 컨트롤러를 거쳐서 뷰가 호출되어야하므로, jsp를 컨트롤러에서 호출하자.
회원 등록 컨트롤러 - Servlet
뷰(jsp)를 호출하는 코드
dispatcher.forward는 다른 서블릿이나 JSP로 이동할 수 있다.
=> 서버 내부에서 다시 호출이 발생한다. (클라이언트로 안감, redirect와 다름, 같은 url에서 여러동작 수행)
/WEB-INF 폴더에 뷰 파일들을 저장하면 url로 html을 접근할 수 없도록 해준다.
회원 등록 폼 - jsp
"/WEB-INF/views/new-form.jsp"
form action에서 절대 경로가 아닌 상대경로(save)를 사용하면 호출될때 현재 경로 url에 /save만 붙는다.
(절대경로로 /save 작성시에는 http://localhost:8080/save 로 호출된다. )
회원 저장 컨트롤러 - Servlet
회원 저장 폼 - jsp
결과
회원 목록 컨트롤러 - Servlet
회원 목록 뷰 - jsp
결과
jsp는 반나절이면 학습할 수 있다. 요즘에는 타임리프를 사용하기때문에 굳이 배울필요는 없다 (레거시 프로젝트를 다룰 일이 없다면)
이렇게 MVC 패턴을 이용하여 뷰와 컨트롤러를 분리했다. 유지보수가 쉬워지고 깔꼼해졌다 😆🫶
MVC 패턴 - 한계
❕포워드 중복 : View로 이동하는 코드가 항상 중복 호출된다.
❕ViewPath 중복 : /WEB-INF ~~.jsp 부분이 중복되고, 경로를 바꿀 경우에 이 부분을 모두 수정해주어야한다.
❕사용하지 않는 코드 : response의 경우 사용하지 않는데 계속 작성해야한다.
❕공통 처리의 어려움 : 컨트롤러에서 공통으로 처리해야하는 부분이 중복된다.
=> Front Controller를 만들어 컨트롤러 호출 전에 먼저 공통 기능을 호출하자.
'Spring > 스프링 MVC' 카테고리의 다른 글
서블릿(Servlet) (0) | 2023.03.25 |
---|---|
스프링 MVC 1편 - 웹 애플리케이션 이해 (0) | 2023.03.24 |