Java Spring Boot - Web Architecture / Servlet
지금까지의 자바관련 수업 정리
- 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 트랜잭션
⇒ 요청 ~ 응답
서블릿 작성 방법
-
extends HttpServlet 상속
-
서비스 메서드 재정의
⇒ 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() 재정의
-
요청객체에 대한 한글 인코딩 설정
→ setChararcterEncoding(java.lang.String env)
-
요청데이터 추출하기:
→ String getParameter(String name) : 단일값 입력항목
→ String[] getParameterValues(String name): 단일값 또는 다중값 입력항목(checkbox, multiple select)
→ Map<String, String[]> getParameter(Map)
→ Enumeration
getParameterNames() -
서비스 수행 응답을 위한 컨텐트 mime-type 설정
→ void setContentType(java.lang.String type)
-
응답 하기
→ 서블릿 동적 응답하기 위한 출력스트림 객체 생성해서 출력스트림을 통한 동적 페이지 응답 코드 구현
→ 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
- 아이디, 이름, 휴대폰
댓글남기기