Java Spring Boot - Web Architecture / Servlet

3 분 소요

지금까지의 자바관련 수업 정리

  • Java Programming
  • DBMS: Oracle / MySQL
  • JDBC Programming
    • Pattern Programmin
    • DAO (Data Access Object)
    • DTO (Data Transfer Object)
    • Singleton Pattern
    • Factory Pattern
    • DBMS Resource Property: Driver, URL, user, password (오라클 접속시 사용)
  • Web UI
    • Front end
    • core: html(정적화면구조), css(화면표현), javascript(기능, 동적화면)

Web Architecture

  • Web Site

    • 정적(static) 웹 서비스
    • Web Server 필요
  • Web Application (Web Component)

    • 정적(static) 웹 서비스 + 동적(dynamic) 웹 서비스

    • WAS ( Web Application Server)

      사용 = Web Server + Web container

      • Tomcat WAS (open source)
      • 웹스피어, 웹로직: 상용
  • CGI (Common Gateway Interface) 기술

    • 동적(dynamic) 웹 서비스를 위한 기술
    • PHP, ASP, C 등
    • 요청마다 프로세스 단위로 서비스 제공 ⇒ 수행속도 느림, 서버 부하가 가중 됨
    • 특정 서버 종속
  • 확장 CGI

    • 동적(dynamic) 웹 서비스를 위한 기술
    • Servlet & JSP (Java 기반 기술)
    • in processing (요청마다 프로세스 단위로 서비스 제공) ⇒ 수행속도 빠름
    • 요청시 thread 단위 서비스 제공: 서버 부하 감소
    • 특정 서버 독립: Servlet Container 구현
  • MVC Pattern

    • Model: 업무 로직, 서비스, dao, dto, Java Class
    • View: 화면 로직, html(정적), css, javascript, JSP(동적)
    • Controller: 요청 및 응답 제어, Servlet Class
  • Servlet & JSP

    • Java 기반의 동적 웹 어플리케이션 개발 기술
    • Servlet의 역할: 요청 및 응답 제어
    • JSP (Java Server Page): 정적서비스 + 동적서비스

Servlet

Servlet 주요 API

  • javax.servlet.*

    • 서블릿과 관련된 공통 패키지
  • javax.servlet.http.*

    • http 프로토콜에 특화된 서블릿 관련 서브 패키지
  • Interface Servlet

    ⇒ javax.servlet

    • init(servletConfig config)
    • service(ServletRequest req, ServletResponse res)
    • destroy()
  • Class GenericServlet

    — Servlet 인터페이스의 서브클래스

    • public abstract class (추상클래스)
    • init()
    • abstract void - service(ServletRequest req, ServletResponse res)
  • Class HttpServlet

    — GenericServlet 추상클래스의 서브클래스

    • public abstract class (추상클래스)
    • service(HttpServletRequest req, HttpServletResponse resp) : 중복정의
    • doGet(HttpServletRequest req, HttpServletResponse resp) : 추가정의, get 요청에 대한 서비스 메서드
    • doPost(HttpServletRequest req, HttpServletResponse resp) : 추가정의, post 요청에 대한 서비스 메서드
    • doDelete(HttpServletRequest req, HttpServletResponse resp) : 추가정의, delete 요청에 대한 서비스 메서드
    • doXxxx..(HttpServletRequest req, HttpServletResponse resp) : 추가정의, http 메서드에 매핑되는 요청 서비스 메서드
    • 추상메서드가 존재하지 않음: 상속 강제 목적 (추상 클래스는 직접 객체생성이 불가하기 때문에)
  • ServletConfig

    • 서블릿 개별 인스턴스에 대한 환경 설정 객체
    • web.xml 에서 설정된 데이터 사용
  • ServletContext

    • Web Application에 대한 환경 설정 객체
    • 해당 Web Application에 존재하는 모든 서블릿(jsp 포함)이 공유 설정
    • web.xml 에서 설정된 데이터 사용
  • ServletRequest

  • HttpServletRequest

    ⇒ 요청 객체

  • ServletResponse

  • HttpServletResponse

    ⇒ 응답객체

— HTTP 트랜잭션

⇒ 요청 ~ 응답

서블릿 작성 방법

  1. extends HttpServlet 상속

  2. 서비스 메서드 재정의

    ⇒ service(ServletRequest req, ServletResponse res)

    ⇒ service(HttpServletRequest req, HttpServletResponse resp)

    ⇒ doGet(HttpServletRequest req, HttpServletResponse resp) : get 요청에 대한 메서드 재정의

    ⇒ doPost(HttpServletRequest req, HttpServletResponse resp) : post 요청에 대한 메서드 재정의

서비스 메서드 재정의 방법

  • get: doGet() 재정의
  • post: doPost() 재정의
  1. 요청객체에 대한 한글 인코딩 설정

    → setChararcterEncoding(java.lang.String env)

  2. 요청데이터 추출하기:

    → String getParameter(String name) : 단일값 입력항목

    → String[] getParameterValues(String name): 단일값 또는 다중값 입력항목(checkbox, multiple select)

    → Map<String, String[]> getParameter(Map)

    → Enumeration getParameterNames()

  3. 서비스 수행 응답을 위한 컨텐트 mime-type 설정

    → void setContentType(java.lang.String type)

  4. 응답 하기

    → 서블릿 동적 응답하기 위한 출력스트림 객체 생성해서 출력스트림을 통한 동적 페이지 응답 코드 구현

    → character: PrintWriter getWriter()

    → byte: ServletOuputStream getOutputStream()

    → jsp 페이지 응답 이동

    → redirect: void sendRedirect(java.lang.String location)

    → forward:

    RequestDispatcher getRequestDispatcher(String path)

    void forward(ServletRequest request, ServletResponse response)

http 요청방식

  • get
    • 기본요청방식
    • 직접 url 입력, , location.href=”url”, <form method="get">, <form>
    • 사용자입력데이터 전송: 요청url?key=value&key=value
    • 보안이슈(url을 통해서 데이터가 보임), 길이제한 있음
    • 로그인, 회원가입 보안이슈 관련 데이터 전송시에는 사용하지 않음
    • 검색, 즐겨찾기, 페이지 이동 등에 쓰임
  • post
    • 위 방식으로 지정하지 않은 모든 요청은 get 방식
    • 사용자 입력데이터 전송 : body에 첨부되어 전송됨
    • 사용자 볼 수 없음, 길이 제한없음
    • 로그인, 회원가입 보안이슈 관련데이터 전송시에 사용함

서블릿 라이프 사이클: Servlet

  • init(ServletConfig config) → init() : 사용자 초기화 메서드 재정의 권장
  • service(ServletRequest req, ServletResponse res) : 서비스 메서드, doGet(), doPost()
  • destroy() : 자원해제 메서드 재정의

→ 라이프 사이클을 이해해야 추후 필요에 따른 재정의가 가능하다

실습

  • 로그인 서블릿 예제

    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
      
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// 1. 요청객체에 대한 한글 인코딩 설정
    		request.setCharacterEncoding("utf-8");
      		
    		// 2. 요청데이터 추출하기: html, jsp <input name="xxxx">
    		String memberId = request.getParameter("memberId");
    		String memberPw = request.getParameter("memberPw");
      	
    		System.out.println("debug:" + memberId + ", " + memberPw);
      		
    		// Model을 통해서 로그인 요청 처리 : 
    		// user01/password01 성공 응답 : 000님 로그인 성공
    		// 아이디틀림/비밀번호틀림 실패 응답 : 로그인 정보가 올바르지 않습니다. 로그인 실패
      				
    		// 3. 서비스 수행 응답을 위한 컨텐트 mime-type 및 한글인코딩 설정
    		response.setContentType("text/html;charset=utf-8");
      		
    		// 4. 응답 하기: 서블릿에서 출력스트림을 통한 응답하기
    		PrintWriter out = response.getWriter();
    		out.println("<html><head><title></title></head><body>");
    		if (memberId.equals("user01") && memberPw.equals("password01")) {
    			out.println(memberId + "님 로그인 성공");
    		} else {
    			out.println("<script type='text/javascript'>");
    			out.println("alert('로그인 정보가 올바르지 않습니다. 로그인 실패')");
    			out.println("location.href='login.jsp'");
    			out.println("</script>");
    		}
    		out.println("</body></html>");
    		out.close();
    	}
    }
    
  • 회원가입페이지: memberInput.jsp

    • 요청view: memberInput.jsp
    • controller: MemberInputServlet.java
    • 아이디, 비밀번호, 이름, 휴대폰, 이메일
  • 아이디찾기페이지: findMember.jsp

    • 요청 view: findMemberid.jsp
    • controller: FindMemberIdServlet.java
    • 이름, 휴대폰
  • 비밀번호찾기페이지:

    • 요청 view: findMemberPw.jsp
    • controller: FindMemberPwServlet.java
    • 아이디, 이름, 휴대폰

댓글남기기