-
[스프링 MVC 1] 3. 서블릿, JSP, MVC 패턴INFLEARN/스프링 MVC 1편 2021. 10. 18. 23:50
3. 서블릿, JSP, MVC 패턴
[강의 정리] 김영한님 :: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
1. 회원 관리 웹 애플리케이션 요구사항
# 기능 요구사항
- 회원정보
- 이름 : username
- 나이 : age
- 회원 저장
- 회원 목록 조회
# 도메인 모델
# 회원 저장소
- 싱글톤 패턴 적용 (스프링 없이 순수 서블릿으로 구현하는 것이 목적)
- save(Member member)
- findById(Long id)
- findAll()
- clearStore()
# 회원 저장소 테스트 코드
- 회원을 저장하고, 목록을 조회하는 (findAll()) 테스트 작성
- clearStore()로 각 테스트에 영향 주지 않도록
2. 서블릿으로 회원 관리 웹 애플리케이션 만들기
# 회원 등록 폼 - MemberFromServlet
- 단순하게 회원 정보를 입력할 수 있는 HTML Form을 만들어서 응답
# 회원 저장 - MemberSaveServlet
- request.getParameter로 조회 후 Member 객체 생성
- Member 객체를 MemberRepository 통해서 저장
- Member 객체 -> 동적 HTML 응답
# 회원 목록 - MemberListServlet
- memberRepository.findAll() 모든 회원 조회
- 회원 목록 HTML을 동적으로 생성하고 응답
# 템플릿 엔진
- 서블릿은 html을 java 코드로 만들어서 매우 불편하고 비효율적
- 템플릿 엔진은 html에다가 java 코드를 중간중간 넣는 방식으로 보다 편리 (ex. JSP, Thymeleaf)
- 스프링과 잘 통합되는 Thymeleaf 주로 사용, JSP는 스프링 부트에서 권장하지 않고 성능과 기능면에서 밀리면서 점점 사장되어 가는 추세
3. JSP로 회원 관리 웹 애플리케이션 만들기
# JSP 라이브러리 추가
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'javax.servlet:jstl'# 회원 등록 폼 JSP
- JSP 시작 (첫 줄 : JSP 문서)
- 회원 등록 폼 JSP는 HTML과 유사
- JSP는 서버 내부에서 서블릿으로 변환 (MemberFormServlet과 거의 비슷한 모습으로 변환)
- 실행 시 .jsp 까지 적어야 함
# 회원 저장 JSP
- JSP는 자바 코드를 그대로 사용할 수 있음
- 자바 코드 입력 <% ~~ %>
- 자바 코드 출력 <%= ~~ %>
- 회원 저장 JSP는 회원 저장 서블릿 코드와 같고, 다른 점은 HTML 중심에 자바 코드를 부분적으로 입력
# 회원 목록 JSP
- 회원 리포지토리 조회
- 결과 List를 사용해 출력
# 서블릿과 JSP의 한계
- 서블릿 : 뷰(View) 화면과 HTML이 자바 코드에 섞여서 지저분하고 복잡함
- JSP : 뷰를 생성하는 HTML 영역은 깔끔 + 동적으로 필요한 부분만 자바 코드로 구현 -> 뷰 영역 + 비즈니스 로직 이 섞여서 너무 많은 역할을 JSP가 처리함
=> MVC 패턴의 등장 (비즈니스 로직은 서블릿처럼 다른 곳에서 처리 + JSP는 HTML로 뷰(화면) 그리기)
4. MVC 패턴 - 개요
# 너무 많은 역할
- 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하면, 너무 많은 역할을 하게 되고 결과적으로 비즈니스 로직과 UI를 변경할 때도 섞여 있는 코드 때문에 변경이 어려움 (유지보수 어려움)
# 변경의 라이프 사이클
- UI를 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고 서로 영향을 주지 않음
# 기능 특화
- JSP와 같은 뷰 템플릿은 화면을 렌더링하는데 최적화 되어 있어 해당 영역 업무만 처리하는게 더 효과적
# Model View Controller
- MVC 패턴은 하나의 서블릿이나 JSP로 처리하던 것을 컨트롤러(Controller)와 뷰(View) 영역으로 나눈 것을 말함
- 웹 애플리케이션은 보통 MVC 패턴을 사용
- 컨트롤러(Controller)
- HTTP 요청을 받아서 파라미터를 검증
- 비즈니스 로직을 실행 (호출)
- 컨트롤러에 비즈니스 로직을 두게되면 컨트롤러가 너무 많은 역할을 담당
- 일반적으로 비즈니스 로직은 서비스(Service) 계층에서 처리
- 뷰에 전달할 결과 데이터를 조회해서 모델에 담음
- 모델(Model)
- 뷰에 출력할 데이터 담음
- 뷰(View)
- 모델에 담겨있는 데이터 사용하여 화면 그림
- 뷰가 필요한 데이터는 모델에서 전달하므로 뷰는 비즈니스 로직이나 데이터 접근 몰라도 됨
5. MVC 패턴 - 적용
# 서블릿을 컨트롤러로, JSP를 뷰로 사용하여 MVC 패턴 적용
- Model은 HttpServletRequest 객체 사용
- request 내부 데이터 저장소 (request.setAttribute(), request.getAttribute()) - 데이터 보관 조회 가능
# 회원 등록 폼 - 컨트롤러
- JSP 호출
- dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능 (서버 내부에서 호출 발생)
- /WEB-INF : 이 경로 안에 있으면 외부에서 직접 JSP 호출 불가 (무조건 컨트롤러 통하게)
- redirect vs forward
- redirect : 실제 클라이언트에 응답이 나갔다가, 클라이언트가 redirect 경로 재요청 (url 경로 실제 변경)
- forward : 서버 내부에서 일어나는 호출 (클라이언트 인지 불가)
# 회원 등록 폼 - 뷰
- 회원 등록 폼
- 상대 경로 (/ 없음) 사용 : 폼 전송시 현재 URL이 속한 계층 경로 + save 호출 (다른 컨트롤러에서 해당 jsp 계속 사용 가능)
# 회원 저장 - 컨트롤러
- HttpServletRequest를 모델로 사용
- request가 제공하는 setAttribute() 사용하여 request 객체에 데이터 보관하고 뷰에 전달 (뷰는 getAttribute()로 데이터 꺼냄)
# 회원 저장 - 뷰
- 회원 저장
- <%= request.getAttribute("member")%> 로 모델에 저장한 member 객체 꺼낼 수 있지만 복잡
- ${}는 JSP가 제공하는 문법. request의 attribute에 담긴 데이터 편리하게 조회 가능
# 회원 목록 조회 - 컨트롤러
- request 객체 사용하여 List<Member> members에 모델 보관
# 회원 목록 조회 - 뷰
- jstl : <c:forEach> 기능 사용하기 위해 선언
- 모델에 담아둔 members를 JSP가 제공하는 taglib 기능을 사용하여 출력
- members 리스트에서 member를 꺼내서 item 변수에 담고 출력하는 과정 반복
6. MVC 패턴 - 한계
# MVC 패턴의 한계
- MVC 패턴 -> 컨트롤러 역할과 뷰 렌더링 역할 명확하게 구분 가능
- 하지만, 컨트롤러는 중복이 많고 필요하지 않은 코드들도 많이 보임
# MVC 컨트롤러의 단점
- 포워드 중복
- View로 이동하는 코드 항상 중복 호출 (공통화 해도 메서드 항상 직접 호출 필요)
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);- Viewpath 중복
- prefix : /WEB-INF/views/
- suffix : .jsp
String viewPath = "/WEB-INF/views/members.jsp";
- 사용하지 않는 코드
- 특히 response는 현재 코드에서 사용되지 않음
HttpServletRequest request, HttpServletResponse response
- 공통 처리가 어렵다
- 공통 기능을 메서드로 뽑아도 결과적으로 해당 메서드를 항상 호출해야함
- 해결하기 위해서는 컨트롤러 호출 전에 먼저 공통 기능 처리 필요
- 프론트 컨트롤러(Front Controller) 패턴 도입! (수문장 역할)
'INFLEARN > 스프링 MVC 1편' 카테고리의 다른 글
[스프링 MVC 1] 6. 스프링 MVC - 기본 기능 (0) 2021.11.05 [스프링 MVC 1] 5. 스프링 MVC - 구조 이해 (0) 2021.10.27 [스프링 MVC 1] 4. MVC 프레임워크 만들기 (0) 2021.10.23 [스프링 MVC 1] 2. 서블릿 (0) 2021.10.16 [스프링 MVC 1] 1. 웹 애플리케이션 이해 (0) 2021.10.13 - 회원정보