요구사항 - 이름,나이 기능
기능 요구사항 - 회원 저장, 회원 목록 조회
회원 저장소
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중복 -확장자나 다른 뷰로 바뀌면 전체 코드를 다 바꿔야 한다
정리 - 공통 처리가 어렵다 => 프론트 컨트롤러의 탄생