
๐์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ก, ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ, ์ธ์ ์ด๋ฒคํธ ๋ฑ์ด ์๋ค. ์ฝ๊ฒ ๋งํด ์๋ฒ๊ฐ ๊ฐ๋ํ๊ณ ์ข ๋ฃ๋ ๋ ์ด๋ฒคํธ๊ฐ ์์ฑ๋๊ธฐ๋ ํ๊ณ RequestEvent(์์ฒญ์ด๋ฒคํธ)๋ฅผ ํตํด์ ๋๊ตฐ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐฉ๋ฌธ ํ๋ค๋๊ฒ์ ์ ์ ์๋ค.
๐ ๊ธฐ์กด์ DAO์์ enum์ ํตํด INSTANCE ์์ฑํ์ฌ ์ด๋ค ์ปจํธ๋กค๋ฌ์์๋ ํ๊ฐ์ ๊ฐ์ฒด๋ก singleton์ ์ฌ์ฉํ๋๊ฒ ์ฒ๋ผ, ํ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ด๋ค๊ณณ์์๋ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
๐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ก ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋ฆฌ์ค๋๋ฅผ ๊ฐ์ด ์ฌ์ฉํ์ฌ ๋ชจ๋ ์๋ธ๋ฆฟ๋ค์ด ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊ฒฝ ์ค์ ๋ฐ ์์์ ์ ๊ทผํ ์ ์๋ค.
@WebListener
@Log4j2
public class LoadListener implements ServletContextListener, ServletRequestListener {
@Override
public void contextDestroyed(ServletContextEvent sce) { //์๋ฒ๊ฐ ์ข
๋ฃ๋ ๋ ํธ์ถ
log.info("contextDestroyed");
log.info("contextDestroyed");
log.info("contextDestroyed");
log.info("contextDestroyed");
}
@Override
public void contextInitialized(ServletContextEvent sce) { //์๋ฒ๊ฐ ๊ฐ๋ํ ๋
ServletContext context = sce.getServletContext(); // context์์ฑ
ReqCounter counter = new ReqCounter(); // counter ๊ฐ์ฒด์์ฑ
context.setAttribute("counter", counter); // ์ธ์ ์ด๋์๋ counter๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ํด๋น ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
log.info("contextInitialized");
log.info("contextInitialized");
log.info("contextInitialized");
log.info("contextInitialized");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.info("requestDestroyed");
}
@Override
public void requestInitialized(ServletRequestEvent sre) { //์๋ก์ด ์์ฒญ์ด ๋ค์ด์ฌ๋
log.info(sre.getServletRequest().getRemoteAddr());
Object counterObj = sre.getServletRequest().getServletContext().getAttribute("counter");
// "counter"๋ผ๋ ์ด๋ฆ์ผ๋ก ServletContext์ ์ ์ฅ๋ ReqCounter ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.
ReqCounter counter = (ReqCounter) counterObj;
counter.inc();
}
}
package org.example.w2.common;
import lombok.ToString;
import lombok.extern.log4j.Log4j2;
@ToString
public class ReqCounter {
private int count;
public void inc(){
count+=1;
}
public int getCount(){
return count;
}
}
${counter}
๐ ๊ฒฐ๊ณผํ์ด์ง

๐ ํ์ฌ๋ฐฉ๋ฌธ์์ ๋ฐ Request ํ์๋ฅผ ์ ์ ์๋ค.
@WebServlet(value = "/login")
@Log4j2
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uid = req.getParameter("uid");
String upw = req.getParameter("upw");
try {
Optional<MemberVO> result = MemberDAO.INSTANCE.get(uid,upw);
result.ifPresentOrElse( memberVO -> {
Cookie loginCookie = new Cookie("member", uid); //member๋ผ๋ ์ด๋ฆ์ผ๋ก uid์ ๊ฐ์ด ๋ฃ์ด์ ธ์๋ค.
loginCookie.setPath("/"); // /์ฌ๋์ฌ๋ก ํด๋์ผ๋ฉด ๋ชจ๋ ๊ฒฝ๋ก์ ๋ค ๋จนํ๋ค.
loginCookie.setMaxAge(60 * 60 * 24); //24์๊ฐ ์ ์ง๋๋ ์ฟ ํค
resp.addCookie(loginCookie); //์ฟ ํค ์ ์ฅํด์ฃผ๊ธฐ.
try {
resp.sendRedirect("/mypage");
} catch (IOException e) {
throw new RuntimeException(e);
}
}, () -> {
try {
resp.sendRedirect("/login");
} catch (IOException e) {
e.printStackTrace();
}
} );
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
๐ getParameter๋ฅผ ํตํด ๊ฐ์ ธ์จ uid, upw์ ๊ฐ์ DAO ๋ฉ์๋๋ฅผ ํตํด์ memberVO์ ๊ฐ์ด ์๋์ง ์๋์ง ํ๋ณํ๋๋ฐ, ๋ง์ฝ ๊ฐ์ด ์์ผ๋ฉด ๋ด๊ฐ ์ฐพ๋ ์์ด๋๊ฐ DB์๋ ์๋ค๋ ๋ง์ด๋๊น Cookie๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ ํด๋น cookie๋ฅผ member๋ผ๋ ์ด๋ฆ์ผ๋ก uid์ ์ ๋ณด๋ฅผ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ฟ ํค๋ 1์ผ๊ฐ ์ ์ง๊ฐ ๋๋ค.
@WebServlet(value = "/mypage")
@Log4j2
public class MyPageController extends HttpServlet { //redirect๋ก ๋ถ๋ฌ์จ ์ ๋ get๋ฐฉ์์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("get");
Cookie[] cks = req.getCookies(); //์ฟ ํค๋ฅผ ์ด์ฉํ๊ธฐ
if(cks == null || cks.length == 0){
resp.sendRedirect("/login");
return;
}
req.getRequestDispatcher("/WEB-INF/mypage.jsp").forward(req, resp);
}
}
๐ ํด๋น์ฝ๋์์๋ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ์ฟ ํค๊ฐ ์๋ค๋ฉด loginํ๋ฉด์ผ๋ก ์ด๋์์ผ๋ฒ๋ฆฌ๊ณ , ๊ทธ๊ฒ ์๋๋ผ๋ฉด mypage๋ก ์ด๋ํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์ฟ ํค๋ฅผ ์ด์ฉํ๋ค.
@WebServlet(value="/logout")
@Log4j2
public class LogoutController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//์ฟ ํค๋ฅผ ์ด์ฉํ ๋ก๊ทธ์์
//์ฟ ํค๋ฅผ ์ด์ฉํ ๋ก๊ทธ์์์ ํ๊ฒ ๋๋ฉด mypage๋ ๋์ค๋๋ฐ, mypage์ ๋์ค๋ cookie์ ์ฃผ์๊ฐ์ ๋์ค์ง์๋๋ค.
Cookie[] cookies = req.getCookies();
if(cookies != null && cookies.length > 0) {
for(Cookie cookie : cookies) {
if(cookie.getName().equals("member")) {
cookie.setMaxAge(0);
resp.addCookie(cookie);
break;
}
}
}
๐ ๋ก๊ทธ์ธ ๊ด๋ จ ์ฟ ํค๋ member์ฟ ํค์ธ๋ฐ, ํ์ฌ ๊ฐ์ง๊ณ ์๋ ์ฟ ํค๋ฅผ ๋ก๋ ํ์ฌ, ๋ง์ฝ ๊ทธ ์ฟ ํค์ ์ด๋ฆ์ด member๋ผ๋ฉด ์ ํจ๊ธฐ๊ฐ์ 0์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ก๊ทธ์์์ํจ๋ค.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<div>
<img src="/capcha">
<input name="number" type = "text">
</div>
<div>
<label>ID or Email</label>
<input name="uid" type="text">
</div>
<div>
<label>PassWord</label>
<input name="upw" type="password">
</div>
<button>LOGIN</button>
</form>
<div>
<form action="/member/join">
<button type="submit">Join</button>
</form>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>MyPage</h1>
<h2>${cookie.member}</h2>
<form action = "/logout" method="post">
<button>LOGOUT</button>
</form>
</body>
</html>
๐ mypage์์๋ cookie.member๋ฅผ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
@WebServlet(value="/signin")
@Log4j2
public class SigninController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("sign doGet");
req.getRequestDispatcher("/WEB-INF/signin.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("sign doPost");
String uid = req.getParameter("uid"); //uid์ ์ ๋ณด๋ฅผ ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
HttpSession session = req.getSession(); //์ธ์
์ด ์์ผ๋ฉด ์์ฑ, ์์ผ๋ฉด ๊ธฐ์กด๊ฒ์ผ๋ก ์์.
session.setAttribute("userInfo", uid);
// userInfo๋ผ๋ ์ด๋ฆ์ ์ธ์
์ uid์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค. ๊ฒฐ๊ตญ์๋ Obejct userInfo = uid
// ์ด๋ ๊ฒ ๋ณ์์ฒ๋ผ ํ์ฉ๋ ๊ฐ๋ฅํ๊ณ , ๋ค๋ฅธ ํ์ด์ง์์ ์ด ํ์ด์ง๋ฅผ ๋ค๋ ธ๋ค๋ ์
์ฅ๊ถ ์ญํ ๋ ํ๋ค.
resp.sendRedirect("/movies");
}
}
@WebServlet(value="/movies")
@Log4j2
public class MoviesController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("movies doGet");
ArrayList<String> movies = new ArrayList<>();
// movies๋ผ๋ ์ด๋ฆ์ผ๋ก jpg์ฌ์ง์ ๋ฃ์ list๋ฅผ ์์ฑํด์ค๋ค.
movies.add("movie1.jpg");
movies.add("movie2.jpg");
movies.add("movie3.jpg");
movies.add("movie4.jpg");
movies.add("movie5.jpg");
req.setAttribute("movies", movies);
//jsp์์๋ movies๋ผ๋ ์ด๋ฆ์ผ๋ก movies ๋ฐฐ์ด์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ์์ด์ ๋ณ์์ญํ ์ ํ๊ณ .
//Controller์์๋ session์
์ฅ๊ถ ์ญํ ์ํ๋ค.
req.getRequestDispatcher("/WEB-INF/movies.jsp").forward(req, resp);
}
}
@WebServlet(value = "/buy")
@Log4j2
public class BuyController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("buy doPost");
String [] items = req.getParameterValues("item");
// movies.jsp์์ ์ ํํ๊ฒ์ธ name="item"์ item์ ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
// ๊ทธ๊ฒ๋ค์ String์ผ๋ก ๋ฐฐ์ด์ ๋ด๋๋ค.
if(items == null || items.length == 0){ //๋ง์ฝ์ movies์์ ๋ด์ง ์์์ผ๋ฉด movies๋ก ๋ค์ ๋ณด๋ธ๋ค.
log.info("no");
resp.sendRedirect("/movies");
return;
}
HttpSession session = req.getSession(false);
// session์ ์์ฑํ์ง์๊ณ , ํ๋ฒ ๊บผ๋ด๋ด.
Object cartObj = session.getAttribute("cart");
//cart๋ผ๋ session์ด ์๋์ง ์๋์ง ํ์ธํ๋ค.
if(cartObj == null){ // cart session์ด ์๋ค๋ฉด (์ฒซ๋ฐฉ๋ฌธ)
ArrayList<String> cartItems = new ArrayList<>();
for(int i = 0; i < items.length; i++){
cartItems.add(items[i]);
}
session.setAttribute("cart", cartItems); // ๋์ค์ cart๋ผ๋ ์ด๋ฆ์ผ๋ก cartItems๋ฐฐ์ด์ ์ฌ์ฉํ ๊ฑฐ์ผ.
}
else{ // ์ฌ๋ฐฉ๋ฌธํ ๋
ArrayList<String> cartItems = (ArrayList<String>) cartObj; //๋ค์ด์บ์คํ
for(int i = 0; i < items.length; i++){
cartItems.add(items[i]);
}
}
log.info("buy now");
resp.sendRedirect("/mypage");
}
}
@WebServlet(value = "/mypage")
@Log4j2
public class MypageController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("mypage doGet");
HttpSession session = req.getSession(false);
// ์ธ์
๊ฒ์ฌํ๋ค. ์์ผ๋ฉด ์์ฑ์ํด์ฃผ๊ณ , ์๋๊ฑฐ ๊บผ๋ด๋ผ.
Object cartSession = session.getAttribute("cart");
//cart๋ผ๋ ์ธ์
์ cartSession์ ๋ด์๋๊ณ (์ด ๊ณผ์ ์๋ตํ๊ณ ๋ฐ์ ์ฝ๋๋ ํฉ์ณ๋ ๋ฌด๋ฐฉ session์ด Object ํ์
์ธ๊ฑธ ๋ณด์ฌ์ฃผ๊ณ ์ถ์์.)
if(cartSession == null) { // cart session์ด ์๋ค๋ฉด movies๋ก ๋ค๋ ค
resp.sendRedirect("/movies");
return;
}
req.getRequestDispatcher("/WEB-INF/mypage.jsp").forward(req, resp);
}
}
@WebFilter(urlPatterns = {"/movies","/buy","/mypage"})
// ๊ฐ์ฅ ๊ธฐ์ด์ ์ผ๋ก ๋ค๊ณ ์์ด์ผํ๋ userInfo๋ผ๋ session ๊ฐ์ ๋งค ๋ธ๋ผ์ฐ์ ๋ง๋ค ๊ฒ์ฌํ ๊ฑฐ์ผ.
// value ๋ผ๊ณ ํด๋ ์๊ด์์.
@Log4j2
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpSession session = req.getSession(false);
//session ๊ฒ์ฌํ๋ค. ์์ผ๋ฉด ๊บผ๋ด๊ณ , ์์ผ๋ฉด ์์ฑ์ํด์ค
if(session == null || session.getAttribute("userInfo") == null){
//๊ฐ์ฅ ์ฒ์์ ์ง๊ธํ๋ userInfo ๊ฒ์ฌ.
resp.sendRedirect("/signin"); //์์ผ๋ฉด ์ด๊ธฐํ๋ฉด์ผ๋ก
log.info("No session");
return;
}
filterChain.doFilter(servletRequest, servletResponse); //๊ผญํด์ค์ผํด.
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Signin Page</h1>
<form action ="/signin" method="post">
<div>
<label>ID</label>
<input type="text" name="uid">
</div>
<div>
<label>PW</label>
<input type="password" name="upw">
</div>
<button>Signin</button>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Movies Page</h1>
<style>
.pic{
width: 12rem;
margin : 2rem;
}
</style>
<form action="/buy" method="post"> <!--buy๋ฒํผ์ ๋๋ฅด๋ฉด post๋ง ์๋ buy์ปจํธ๋กค๋ฌ๋ก ์ด๋ํ๋ค.-->
<c:forEach items="${movies}" var="movie">
<!--movies์ปจํธ๋กค๋ฌ์์ ๋ฐฐ์ด๋ก ๋ฃ์ด๋๊ณ movies๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.-->
<li>
<img class="pic" src="/img/${movie}">
<input type="checkbox" name="item" value="${movie}" >${movie}
<!-- name="item"์ ๋์ค์ buy์ปจํธ๋กค๋ฌ์์ item์ ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋๋ฉด ๋ด๊ฐ ์ ํํ value(์ฌ์ง)๋ค์ด ๋ค์ด์จ๋ค.-->
</li>
</c:forEach>
<button>BUY</button>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<style>
.pic{
width: 12rem;
margin : 2rem;
}
</style>
<h1>My Page</h1>
<h2>๋ด๊ฐ ๊ตฌ๋งคํ ๋ชฉ๋ก</h2>
<ul>
<c:forEach items="${cart}" var="item">
<li>
<img class="pic" src="/img/${item}">
${item}
</li>
</c:forEach>
</ul>
</body>
</html>
@WebServlet(value = "/capcha")
public class ImageMaker extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//์ง๊ธ ๋ง๋๋๊ฑด imageํ์ผ์ด๋ค ๋ผ๊ณ ์ ์ธ
resp.setContentType("image/jpeg");
//๋ฉ๋ชจ๋ฆฌ์์ ๋ง๋๋ ์ด๋ฏธ์ง, ๊ฐ๋ก 300 ์ธ๋ก200์ธ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค
BufferedImage image
= new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics(); //๋ถ์ ๋ง๋ ๋ค
g.setColor(Color.lightGray);
g.fillRect(0, 0, 300, 200); //(0,0) ~ (300,200) ๊น์ง ์ฑ์ฐ๊ธฐ
g.setColor(Color.black);
g.setFont(new Font("Arial", Font.BOLD, 20)); //ํฐํธ์ ํ๊ธฐ
int number = (int)(Math.random() * 10000);
HttpSession session = req.getSession();
session.setAttribute("tempNum", number); //์ด๋ฏธ์ง ์ซ์์ ์ผ์นํ์ง ํ์ธ
g.drawString("" + number ,10,100); // ๋ฌธ์์ ์ซ์๋ฅผ ํฉ์ณ์ ๋ฌธ์๋ฅผ ๋ง๋ค๊ธฐ / 10,100์ ์ขํ
@Cleanup OutputStream out = resp.getOutputStream();
//์์ image๊ฐ์ฒด๋ฅผ jpeg์ ํํ๋ก OutputStremํ ๊ฒ์ด๋ค.
ImageIO.write(image, "jpeg", out);
}
}
๐ ์ดํ์ ์ฌ์ฉํ๊ณ ์ ํ๋ jsp์ ํด๋น ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด๋๋ค.
<div>
<img src="/capcha">
<input name="number" type = "text">
</div>