v1 구조 먼저 컨트롤러를 인터페이스로 만들어놓고, 각 컨트롤러들은 이 인터페이스를 구현한다. ControllerV1 public interface ControllerV1 { void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } 서블릿과 모양이 똑같은 인터페이스 이것 가지고 구현을 여러 개 할 것이다. 매핑 정보에서 찾아서 호출할 때 다형성을 이용해서 프론트 컨트롤러는 인터페이스에 의존하면서 편리하게 할 수 있음. 로직은 기존 서블릿과 똑같다. 대신에 얘들은 서블릿 상속 대신에 인터페이스를 구현하고, webservlet 같은 게 전혀 없다. MemberFormC..
MVC 패턴 - 적용 회원 등록 회원 등록 폼 - 컨트롤러 @WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form") public class MvcMemberFormServlet extends HttpServlet { // 컨트롤러 역할 @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 그냥 jsp로 가주기만 하면 된다. String viewPath = "/WEB-INF/views/new-form.jsp"; Reques..
JSP 라이브러리 추가하기 build.gradle에 dependencies { // 전략 //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP 추가 끝 //후략 } new-form.jsp : 회원 등록 폼 username: age: 전송 실행 화면 save.jsp - 회원 저장 JSP 실행해서 데이터 두 개를 집어넣고 확인해보면 다 들어가 있음을 확인할 수 있음. 정리 서블릿과 JSP의 한계
MemberFormServlet - 회원 등록 폼 @WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form") public class MemberFormServlet extends HttpServlet { private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("tex..
3. 서블릿, JSP, MVC 패턴 시작 회원 관리 웹 애플리케이션 요구사항 회원 도메인 모델 Member @Getter @Setter @NoArgsConstructor public class Member { private Long id; private String username; private int age; public Member(String username, int age) { this.username = username; this.age = age; } } 회원 저장소 MemberRepository /** * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려 */ public class MemberRepository { private..