[JSP] 14. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인)
Session(세션) 방식으로 로그인 페이지를 처리하는 방법에 대해서 소개하려고 한다.
시중 책보다도 훨씬 쉽고 빠르게 적용할 수 있는 수준으로 작성하기 위해서 노력을 많이 하였으니 참고해주었으면 좋겠다.
적용된 패턴: MVC2 - FrontController, Command 패턴
* Session(세선)이란?
그림 가-1) 세션 객체와 세션 ID
HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 "상태정보"를 세션이라고 한다.
세션은 HttpSession이라는 인터페이스 객체로 표현되며, HttpSession 객체는 HttpServletRequest의 getSession()이나 getSession(true) 메소드를 이용하여 생성할 수 있다.
- 활용 예: 로그인, 로그아웃, 장바구니 기능 등 사용자 인증 처리에 사용함.
* HttpSession 메소드
접근자&반환형 |
메소드 |
기능 |
public Object |
getAttribute(String name) |
HttpSession 객체에 등록된 정보 중 getAttribute() 메소드의 인자값으로 지정된 데이터 값을 반환한다. |
public Enumeration |
getAttributeNames() |
HttpSession 객체에 등록되어 있는 모든 정보의 이름만을 반환한다. |
public String |
getId() |
HttpSession 객체의 지정된 세션 ID를 반환함. |
public long |
getCreationTime() |
HttpSession 객체가 생성된 시간을 밀리초 단위로 반환함. |
public long |
getLastAccessedTime() |
클라이언트 요청이 마지막으로 시도된 시간을 밀리초 단위로 반환됨. |
public int |
getMaxInactiveInterval() |
클라이언트의 요청이 없을 때 서버가 현재의 세션을 언제까지 유지할지를 초 단위로 반환한다. 기본 유효 시간은 30분으로 지정되어 있다. |
public void |
invalidate() |
현재의 세션을 삭제한다. |
public boolean |
isNew() |
서버 측에서 새로운 HttpSession 객체를 생성한 경우에는 true를 반환, 기존 세션이 유지되는 경우라면 false를 반환 |
public void |
setAttribute(String name, Object value) |
HttpSession 객체에 name으로 지정된 이름으로 value값을 등록한다. |
public void | removeAttributes(String name) | HttpSession 객체에서 name으로 지정된 객체를 삭제한다. |
public void | setMaxInactiveInterval(int second) | HttpSession 객체의 유지 시간을 설정한다. 지정된 시간이 지나면 HttpSession 객체는 자동 삭제된다. |
1. 결과
Session 기반의 로그인 페이지를 아래처럼 만들어보려고 한다.
그림 1. 프로젝트 결과 - 로그인 페이지
그림 2. 프로젝트 결과 - 오류 출력
그림 3. 로그인 상태
그림 4. 자바스크립트 - 알람 메시지 출력
2. 프로젝트 구성도
다음은 작업할 프로젝트에 관한 것이다. 양이 조금 많아서 2~3부 정도로 컨텐츠를 구성하였다.
그림 5. 프로젝트 구성도
3. Maven Project 생성하기
새 프로젝트를 만든다.
그림 6. New-> Maven 프로젝트
Maven 폴더의 "Maven Project"를 선택한다.
"Next"를 누른다.
그림 7. New-> Maven 프로젝트
org.apache.maven.archetypes | maven-archetype-webapp를 선택한다.
Next를 누른다.
그림 8. New-> Maven 프로젝트
Group ID와 Artifact ID를 입력한 후 Finish를 누른다.
4. Project Facts, Build Path 설정하기
의외로 프로젝트 속성을 못 찾는 경우가 있어서 그림으로 매우 친절하게 작성하였다.
그림 9. 프로젝트 - 마우스 오른쪽 버튼 모습
프로젝트를 마우스 오른쪽 버튼을 누른다.
Properties를 클릭한다.
그림 10. Build Path 설정 모습
JRE System Library [JavaSE-14] 버전으로 변경해준다.
(Edit 버튼을 눌러서 JRE 클릭 후 변경해주면 됨.)
Apply를 누른다.
그림 11. Project Factes
Project Facet의 Java 항목에 Version을 14로 변경해준다.
Apply를 누른다.
5. pom.xml 설정하기
http://mvnrepository.com에 접속한다.
그림 12. Java Servlet API - 4.0.1 - Mvnrepository.com
servlet을 찾아서 Maven 정보를 복사한다.
그림 13. pom.xml 설정하기
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
6. Servlet - FrontController 생성하기
서블릿 생성을 한다.
그림 14. 프로젝트의 "Java Resources" 메뉴
Java Resources를 오른쪽 버튼을 클릭한다.
New->Servlet을 클릭한다.
그림 15. Create Servlet
패키지명(Java Package)은 "com.member.web.controller"로 지정하였다.
클래스명(Class Name)은 "FrontController"를 입력하였다.
Next를 누른다.
(중략)
그림 16. web.xml (src/main/webapp/WEB-INF/web.xml)
web.xml 파일을 수정해준다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.do</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.do</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>com.member.web.controller.FrontController</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
파일명: web.xml
[첨부(Attachments)]
web.zip
7. Controller - HttpUtil.java
forward 함수에 관한 것이다.
package com.member.web.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HttpUtil extends HttpServlet {
private static final long serialVersionUID = 1L;
private static String charset = null;
public static void forward(HttpServletRequest req, HttpServletResponse res,
String path) throws ServletException, IOException {
try {
RequestDispatcher dispatcher = req.getRequestDispatcher(path);
dispatcher.forward(req, res);
}catch(Exception e) {
e.printStackTrace();
}
}
}
파일명: HttpUtil.java
[첨부(Attachments)]
HttpUtil.zip
8. Controller(Interface) - Controller.java
Interface Controller를 하나 설계하였다.
package com.member.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Controller {
public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;
}
파일명: Controller.java
[첨부(Attachments)]
Controller.zip
9. Controller - FrontController.java
FrontController, Command 패턴에 관한 것이다.
package com.member.web.controller;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
private String charset = null;
public FrontController() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doAction(req, res);
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doGet(req, res);
}
protected void doAction(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
charset = sc.getInitParameter("charset");
req.setAttribute("charset", charset);
req.setCharacterEncoding(charset);
res.setContentType("text/html; charset=" + charset);
String uri = req.getRequestURI();
String conPath = req.getContextPath();
String command = uri.substring(conPath.length());
Controller subController = null;
if(command.equals("/member/login.do")){
System.out.println("login");
System.out.println("----------------");
subController = new MemberLoginController();
subController.execute(req, res);
}else if (command.equals("/member/process.do")) {
System.out.println("process");
System.out.println("----------------");
subController = new MemberProcessController();
subController.execute(req, res);
}else if (command.equals("/member/logon.do")) {
System.out.println("logon");
System.out.println("----------------");
subController = new MemberLogonController();
subController.execute(req, res);
}else if (command.equals("/member/logout.do")) {
System.out.println("logout");
System.out.println("----------------");
subController = new MemberLogoutController();
subController.execute(req, res);
}else if (command.equals("/member/sessionAllKill.do")) {
System.out.println("sessionAllKill");
System.out.println("----------------");
subController = new MemberSessionAllKillController();
subController.execute(req, res);
}else if (command.equals("/member/errorAlert.do")) {
System.out.println("errorAlert");
System.out.println("----------------");
subController = new MemberErrorAlertController();
subController.execute(req, res);
}
// end of if
}
}
파일명: FrontController.java
[첨부(Attachments)]
FrontController.zip
[비고]
MemberLoginController()
MemberProcessController()
MemberLogonController()
MemberLogoutController()
MemberSessionAllKillController()
MemberErrorAlertController()
번호 |
구현부 |
인터페이스 | 비고 |
1 |
MemberLoginController |
Controller |
|
2 |
MemberProcessController |
Controller |
|
3 |
MemberLogonController |
Controller | |
4 |
MemberLogoutController |
Controller |
|
5 |
MemberSessionAllKillController |
Controller | |
6 | MemberErrorAlertController | Controller | |
약 6개의 Controller들은 추후 생성할 것이다.
다소 이름이 길긴 하지만, 추후 고민할 문제해봐도 되는 문제이고 진행하도록 하겠다.
실제 설계하고 코딩했을 때는 바로 저 코드가 한번에 나오지 않았다는 것이다.
단계, 단계 구간별로 필요에 의해서 하나 하나 만들어진 것이다.
* 2부에서 만나요.
2부에서는 view생성, 나머지 콘트롤러 구현에 대해서 소개하도록 하겠다.
[JSP] 14. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인) - (2), 2020-09-25
https://yyman.tistory.com/1417