JSP를 이용해 구성할 수 있는 웹 구조는 크게 두 가지로 나뉜다.
- JSP가 Client의 요청에 대한 Logic 처리와 View 처리를 모두 하는 구조
- JSP가 View에 대한 처리만 하는 구조 (MVC 패턴)
1번 모델은 아래와 같다. 하나의 JSP가 View와 Logic을 모두 처리한다.
Java Bean은 특정한 기능을 가진 컴포넌트를 의미한다. Java Bean의 규칙은 아래와 같다.
- 기본 패키지 외에 특정 패키지에 속해야 한다.
- 기본 생성자가 존재해야 한다.
- 멤버 변수의 접근 제어자는 private 이다.
- 접근 제어자가 public인 멤버 변수의 setter와 getter가 존재해야 한다.
1번 모델의 장단점은 아래와 같다.
2번 모델은 아래와 같다.
각 모델이 어떤 MVC 패턴에 해당하고 무슨 역할을 하는지는 아래와 같다.
각 패턴의 대표적인 라이브러리는 아래와 같다.
- Model : Mybatis, JSP
- View : Vue, React (둘 다 CSR 방식)
- Controller : Spring
2번 모델의 장단점은 아래와 같다.
※ 대부분의 DB 예외는 Business Layer에서 처리한다.
Http 프로토콜의 특징은 서버가 클라이언트에 응답하면 연결이 해제된다는 것이다.
따라서 클라이언트 단위로 상태 정보를 유지하기 위해 Cookie와 Session을 사용한다.
Cookie의 특징은 아래와 같다.
- javax.servlet.http.Cookie에 존재하는 클래스이다.
- 사용자의 컴퓨터에 파일 형태로 저장된다.
- key와 value로 구성되고, String 형태로 이루어져 있다.
- Browser마다 저장되는 쿠키는 다르다.
Cookie의 주요 메서드는 아래와 같다.
Cookie의 생성 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie cookie = new Cookie("name", "samsung"); // 반드시 둘 다 String
cookie.setMaxAge(60); // 숫자의 단위는 sec
response.addCookie(cookie);
Cookie cookie2 = new Cookie("age", "22");
cookie2.setMaxAge(60);
response.addCookie(cookie2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키 생성 => 클라이언트로 보내기
</body>
</html>
새로고침을 한 후 실행 결과는 아래와 같다.
요청 헤더에 쿠키 정보가 있는 이유는 새로 고침을 하기 전에 쿠키가 저장됐기 때문이다.
설정한 시간이 지나면 사용자의 컴퓨터에서 쿠키가 사라진다.
Cookie를 조회하는 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키 읽기<br>
<%
Cookie[] cookies = request.getCookies(); // getCookies()의 반환값은 null일 수 있다.
if (cookies == null) {
%>
저장된 쿠키가 없습니다.
<%
} else {
for (Cookie c : cookies) {
%>
<%= c.getName() %> : <%= c.getValue() %> <br>
<%
}
}
%>
</body>
</html>
조회 결과는 아래와 같다.
Cookie를 수정하는 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie cookie = new Cookie("name", "java");
cookie.setMaxAge(60*60*2);
response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키 수정
</body>
</html>
수정 후 Cookie를 조회하면 아래와 같다.
Cookie를 삭제하는 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie cookie = new Cookie("age", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키 삭제
</body>
</html>
삭제 후 Cookie를 조회하면 아래와 같다.
Session의 특징은 아래와 같다.
- javax.servlet.http.HttpSession에 존재하는 인터페이스이다.
- 방문자가 웹 서버에 접속해 있는 상태를 의미한다.
- WAS의 Memory에 Object의 형태로 저장한다.
따라서 Memory가 허용하는 용량까지 저장 가능하다.- Browser당 하나의 JSESSIONID를 부여받는다. JSESSIONID는 쿠키로 저장된다.
HttpSession의 주요 메서드는 아래와 같다.
HttpSession의 생성 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session = "false" %> <%-- 자동으로 Session을 안 만들기 위함 --%>
<%
HttpSession session = null;
session = request.getSession(); // Session이 존재하면 현재 Session을 반환하고 존재하지 않으면 Session을 새로이 생성
// session = request.getSession(false); // Session이 존재하면 현재 Session을 반환하고 존재하지 않으면 새로이 생성하지 않고 그냥 null을 반환
session.setAttribute("name", "samsung"); // 두 번째 인자는 Object이므로 String, Integer 등 가능
session.setAttribute("age", 1);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
세션 만들기
</body>
</html>
HttpSession의 생성 후 조회 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
세션 읽기 <br>
<%= session.getAttribute("name") %> : <%= session.getAttribute("age") %>
</body>
</html>
조회 결과는 아래와 같다.
HttpSession의 삭제 예시는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.invalidate();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
세션 삭제
</body>
</html>
삭제 후 조회 결과는 아래와 같다.