서블릿,jsp,mvc패턴

이성준·2022년 2월 18일
0

스프링 MVC

목록 보기
3/10

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

요구사항 - 이름,나이 기능
기능 요구사항 - 회원 저장, 회원 목록 조회
회원 저장소

package hello.servlet.domain.member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {
 private static Map<Long, Member> store = new HashMap<>(); //static 사용
 private static long sequence = 0L; //static 사용
 private static final MemberRepository instance = new MemberRepository();
 public static MemberRepository getInstance() {
 return instance;
 }
 private MemberRepository() {
 }
 public Member save(Member member) {
 member.setId(++sequence);
 store.put(member.getId(), member);
 return member;
 }
 public Member findById(Long id) {
 return store.get(id);
 }

회원 저장, 회원 목록 조회 구현

회원 저장소 테스트 코드

 @AfterEach
void afterEach() {
memberRepository.clearStore();
}

AfterEach 각 테스트가 끝날때마다 실행시켜줌


서블릿으로 회원 관리 웹 애플리 케이션 만들기
MemberFormServlet

아직 /servlet/members/save가 없어서 오류

MemberSaveServlet

폼에서 온걸 getParameter로 꺼내고 member 만들어서 저장, 그리고 결과를 html로 응답을 한다

jsp로 회원관리 웹 애플리케이션 만들기

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

jsp 문서라는 뜻
회원 저장 로직

<%
// request, response 사용 가능
 MemberRepository memberRepository = MemberRepository.getInstance();
 System.out.println("save.jsp");
 String username = request.getParameter("username");
 int age = Integer.parseInt(request.getParameter("age"));
 Member member = new Member(username, age);
 System.out.println("member = " + member);
 memberRepository.save(member);
%>

<% %>안에 자바 로직을 넣어준다.
한계 - 로직과 뷰가 한공간에 있다.
그래서 MVC 패턴이 등장, 비즈니스 로직은 다른곳에서 처리하고, jsp는 최대한 화면을 그리는 일에 집중한다


MVC 패턴 - 개요
UI를 일부 수정하는 일과 비즈니스 로직을 수정하는 일이 변경 라이프 사이클이 다르기 때문에 유지보수 하기 어렵다 그래서 나온게 MVC 패턴

컨트롤러: http 요청을 받아서 파라미터를 검증, 비즈니스 로직 실행
모델 : 뷰에 출력할 데이터를 담아두는 곳,
뷰 : 모델에 담겨있는 데이터를 사용하여 화면을 그리는 곳

서블릿을 컨트롤러, jsp를 뷰, httpservletrequest 객체를 모델로 사용한 mvc패턴

@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/
members")
public class MvcMemberListServlet extends HttpServlet {
 private MemberRepository memberRepository = MemberRepository.getInstance();
 @Override
protected void service(HttpServletRequest request, HttpServletResponse
response)
 throws ServletException, IOException {
 System.out.println("MvcMemberListServlet.service");
 List<Member> members = memberRepository.findAll();
 request.setAttribute("members", members);
 String viewPath = "/WEB-INF/views/members.jsp";
 RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
 dispatcher.forward(request, response);
 }
}

dispatcher 다른 서블릿이나 jsp로 이동할수 있음
web-inf 안에 있는 자원들은 외부에서 호출되지 않음 -> 항상 컨트롤러에서 내부에서 포워드를 해야 호출 가능

mvc패턴의 한계
포워드 중복 - view로 이동하는 코드가 항상 중복 충돌
viewpath중복 -확장자나 다른 뷰로 바뀌면 전체 코드를 다 바꿔야 한다
정리 - 공통 처리가 어렵다 => 프론트 컨트롤러의 탄생

0개의 댓글