모도리는 공부중

21.01.20. JSP&Servlet - 메세지 개별 삭제, FrontController 구현 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/JAVA

21.01.20. JSP&Servlet - 메세지 개별 삭제, FrontController 구현

공부하는 모도리 2021. 1. 20. 12:00
728x90
반응형

지금은 메세지가 쌓이면 계속 아래로 길어지는 상태이므로 이걸 다르게 보이고 싶다면 페이징 기법을 직접 공부해서 넣어보도록 합시다.

 

기능 작동이 잘하는지 체크.

그리고 전체삭제버튼까지 잘 먹히고 있다.

 

오늘은 개별삭제 기능을 위해 5개정도 만들고 시작합니다.

 

 

반복문을 돌면서 삭제하는 라인으로 이동.

<% for (int i = 0; i < list.size(); i++) { %>
	<tr>
		<td><%= i+1 %></td>
		<td><%= list.get(i).getSend_name() %></td>
		<td><%= list.get(i).getContent() %></td>
		<td><%= list.get(i).getDay() %></td>
		<td>
			<a href="RemoveOneMessageService">삭제</a>
		</td>
	</tr>
<% } %>

개별삭제를 위해 a태그를 이용해 새로운 서블릿을 만들어 하이퍼링크를 걸 수 있도록 해준다.

삭제하게 만들 조건을 어떻게 걸 것인가, 그게 중요하다. 잘못 선택하면 엄한 다른 메세지가 삭제되는 문제를 일으킬 수 있다. 그럼 뭐가 좋을까? 우리는 이미 설정해놓은 녀석이 있다. 바로 시퀀스 넘버.

list.get(i)번째에 있는 getNum을 찾아서 넘겨줘야 한다. 우리가 맨 처음 배웠던 get방식을 이용하는 것이다.

<a href="RemoveOneMessageService?num=<%= list.get(i).getNum() %>">삭제</a>

저장 후 새로고침해서 확인해보면 각 삭제별로 밑줄이 쳐져있고

개발자도구를 확인하면 각 삭제마다 고유번호가 새겨진 것을 확인할 수 있다.

그럼 이 고유번호를 이용해서 우리는 개별삭제서블릿을 만들어보도록 합시다.

package com.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.model.MessageDAO;

@WebServlet("/RemoveOneMessageService")
public class RemoveOneMessageService extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		int num = Integer.parseInt(request.getParameter("num"));
		// 각 삭제별로 고유번호가 넘어오므로 String형 숫자를 int형으로 변환해준다.
		
		MessageDAO dao = new MessageDAO();
		int cnt = dao.removeOne(num);
		
		if (cnt > 0) {
			System.out.println("메세지 개별 삭제 성공");
		} else {
			System.out.println("메세지 개별 삭제 실패");
		}
		
		response.sendRedirect("main.jsp#two");
	}

}

고유번호를 이용해서 db에 저장된 메세지를 지우는 코드 작성.

public int removeOne(int num) {
	int cnt = 0;
	getConnection();
	String sql = "delete from web_message where num=?";
	try {
		psmt = conn.prepareStatement(sql);
		psmt.setInt(1, num);
		cnt = psmt.executeUpdate();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		close();
	}
	return cnt;
}

잘 삭제된 것을 확인할 수 있다.

 

 

 

 

각각의 클래스에서 입력한 것은 server를 통해 각각의 servlet으로 이동한다. servlet이 따로 생성되어있다보니 이것이 늘어나면 늘어날수록 컴퓨터는 무거워진다. 특히 servlet은 더 많이 무겁게 만들 것이다. 왜?

servlet은 HttpServlet을 상속받는다. 이것 안에는 파란색으로 적힌 것들(get, post 등등등)이 담겨있는데 그만큼 무겁다는것을 의미한다. servlet이 많으면 많아질수록 컴퓨터에 차지하는 용량이 커진다. 해결방법은 무엇이 있을까?

Front Controller로 한 번에 받아서 처리해준다. 로그인은 Loginservice, 회원가입은 JoinService를 요청한다. 어떤 url을 요청하든 모두 Front Controller로 넘어가게 하는 약속을 만드는데 이름에 *.do를 이용한다.

 

이 부분에 대한 실습을 위해 src에 또 폴더를 만들어서 진행해봅시다.

package com.front;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/FrontController")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("프론트컨트롤러 호출완료");
	}

}

테스트 삼아 실행.

현재 문제는 FrontController를 입력해줘야만 여기로 넘어올 수 있는 상태이다. 우리는 어떤 url을 입력들어오든 전부 여기로 옮겨오게 할 것이므로 바꿔주자.

@WebServlet(".do")

어떤것을 입력하든 다 여기로 넘어오도록,

@WebServlet("*.do")

*를 추가해준다.

 

.do로만 끝나면 프론트컨트롤러로 넘어오도록 설정이 끝났다. 이제 url뒤가 .do로 끝나게 입력되었다면 모두 이 서블릿으로 넘어오게 될 것이다.

 

 

해당 라인으로 이동해서

회원가입과 로그인 모두 .do를 붙여서 frontcontroller로 넘어가게 만든다.

<form action="LoginService.do" method="post"> <!--여긴 로그인 액션-->
<form action="JoinService.do" method="post"> <!--이건 회원가입 액션-->

package com.front;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("프론트컨트롤러 호출완료");
		
		// 사용자가 요청한 전체 URI → /MessageSystem/*.do
		String requestURI = request.getRequestURI();
		System.out.println(requestURI);
	}

}

사용자가 어디서 이곳으로 넘어왔는지 확인해주는 requestURI를 이용해서 잘 넘어오는지 확인.

String path = request.getContextPath();
System.out.println(path);

String resultURL = requestURI.substring(path.length()+1);
// /MessageSystem과 *앞에 있는/를 날리기 위해 +1
System.out.println(resultURL);

깔끔하게 가져온 것 확인.

이제 여기에서 각각의 기능이 구현되도록 만들어줍시다. 우리가 이미 만들어놓은 JoinService에 있는 코드를 그대로 복사해서 FrontController에 작성해놓은 코드 하단에 if문을 추가하여 해당 코드를 붙여넣기해준다.

if (resultURL.equals("JoinService.do")) {
	// 회원가입
	request.setCharacterEncoding("EUC-KR");
	
	String email = request.getParameter("email");
	String pw = request.getParameter("pw");
	String tel = request.getParameter("tel");
	String address = request.getParameter("address");
	
	MemberDTO dto = new MemberDTO(email, pw, tel, address);
	MemberDAO dao = new MemberDAO();
	int cnt = dao.join(dto);
	
	if (cnt > 0) {
		System.out.println("회원가입 성공");
	} else {
		System.out.println("회원가입 실패");
	}
	
	response.sendRedirect("main.jsp");
}

결과 :

DB에도 잘 삽입되어 회원가입이 성공한 것을 확인할 수 있다.

 

로그인서비스도 마찬가지로 만듭니다.

} else if (resultURL.equals("LoginService.do")) {
	// 로그인
	String email = request.getParameter("email");
	String pw = request.getParameter("pw");
	
	MemberDTO dto = new MemberDTO(email, pw);
	MemberDAO dao = new MemberDAO();
	MemberDTO info = dao.login(dto);
	
	if (info != null) {
		System.out.println("로그인 성공");
		HttpSession session = request.getSession();
		session.setAttribute("info", info);
	} else {
		System.out.println("로그인 실패");
	}
	
	response.sendRedirect("main.jsp");
}

로그인도 잘 진행되는지 확인.

 

문제없이 진행된다면 LoginService와 JoinService 서블릿은 이제 필요가 없으니 지워주도록 합시다.

 

회원정보수정도 이어서 진행합니다.

<form action="UpdateService.do" method="post">

FrontController로 돌아와서 UpdateService에 있는 코드를 복붙해준다.

} else if (resultURL.equals("UpdateService.do")) {
	// 회원정보 수정
	request.setCharacterEncoding("EUC-KR");
	HttpSession session = request.getSession();
	MemberDTO info = (MemberDTO) session.getAttribute("info");
	String email = info.getEmail();
	
	String pw = request.getParameter("pw");
	String tel = request.getParameter("tel");
	String address = request.getParameter("address");
	
	MemberDTO dto = new MemberDTO(email, pw, tel, address);
	MemberDAO dao = new MemberDAO();
	int cnt = dao.update(dto);
	
	if (cnt > 0) {
		System.out.println("회원정보수정 성공");
		session.setAttribute("info", dto);
		response.sendRedirect("main.jsp");
	} else {
		System.out.println("회원정보수정 실패");
		response.sendRedirect("update.jps");
	}
}

수정 잘 되는지 확인.

db 반영 완료.

웹페이지 배너에도 문제없이 수정된 정보가 나오는 것을 확인할 수 있다.

 

이제 마지막 남은 로그아웃까지 구현해주도록 합시다.

main.jsp 코드 변경 (.do 추가)

<!-- Header -->
	<header id="header" class="alt">
		<a href="index.html" class="logo"><strong>Forty</strong> <span>by HTML5 UP</span></a>
		<nav>
			<% if (info == null) { %>
				<a href="#menu">로그인</a>
			<% } else { %>
				<a href="LogoutService.do">로그아웃</a>
				<a href="update.jsp">회원정보수정</a>
			<% } %>
			<!-- 로그인 후 Logout.jsp로 이동할 수 있는 -->
		</nav>
	</header>

LogoutService에 있는 코드 복붙 후 잘 삭제되었다는 것을 FrontController 콘솔창에서 확인할 수 있도록 syso코드 입력.

} else if (resultURL.equals("LogoutService.do")) {
	// 로그아웃
	HttpSession session = request.getSession();
	session.removeAttribute("info");
	System.out.println("로그아웃 완료");
	response.sendRedirect("main.jsp");
}

서버를 재시작해서 로그인 후 로그아웃까지 진행해보면

로그아웃이 정상적으로 되면서 콘솔창에도 출력되는 것을 확인해볼 수 있다.

그럼 오늘 수업을 진행하면서 작성한 FrontController 코드를 전체 불러와서 확인해봅시다.

package com.front;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.model.MemberDAO;
import com.model.MemberDTO;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("프론트컨트롤러 호출완료");
		
		// 사용자가 요청한 전체 URI → /MessageSystem/*.do
		String requestURI = request.getRequestURI(); //클라이언트가 요청한 경로
		System.out.println(requestURI);
		String path = request.getContextPath(); //프로젝트이름만 잘라내기
		System.out.println(path);
		String resultURL = requestURI.substring(path.length()+1); // /MessageSystem과 *앞에 있는/를 날리기 위해 +1
		System.out.println(resultURL);
		
		if (resultURL.equals("JoinService.do")) {
			// 회원가입
			request.setCharacterEncoding("EUC-KR");
			
			String email = request.getParameter("email");
			String pw = request.getParameter("pw");
			String tel = request.getParameter("tel");
			String address = request.getParameter("address");
			
			MemberDTO dto = new MemberDTO(email, pw, tel, address);
			MemberDAO dao = new MemberDAO();
			int cnt = dao.join(dto);
			
			if (cnt > 0) {
				System.out.println("회원가입 성공");
			} else {
				System.out.println("회원가입 실패");
			}
			
			response.sendRedirect("main.jsp");
		} else if (resultURL.equals("LoginService.do")) {
			// 로그인
			String email = request.getParameter("email");
			String pw = request.getParameter("pw");
			
			MemberDTO dto = new MemberDTO(email, pw);
			MemberDAO dao = new MemberDAO();
			MemberDTO info = dao.login(dto);
			
			if (info != null) {
				System.out.println("로그인 성공");
				HttpSession session = request.getSession();
				session.setAttribute("info", info);
			} else {
				System.out.println("로그인 실패");
			}
			
			response.sendRedirect("main.jsp");
		} else if (resultURL.equals("UpdateService.do")) {
			// 회원정보 수정
			request.setCharacterEncoding("EUC-KR");
			HttpSession session = request.getSession();
			MemberDTO info = (MemberDTO) session.getAttribute("info");
			String email = info.getEmail();
			
			String pw = request.getParameter("pw");
			String tel = request.getParameter("tel");
			String address = request.getParameter("address");
			
			MemberDTO dto = new MemberDTO(email, pw, tel, address);
			MemberDAO dao = new MemberDAO();
			int cnt = dao.update(dto);
			
			if (cnt > 0) {
				System.out.println("회원정보수정 성공");
				session.setAttribute("info", dto);
				response.sendRedirect("main.jsp");
			} else {
				System.out.println("회원정보수정 실패");
				response.sendRedirect("update.jps");
			}
		} else if (resultURL.equals("LogoutService.do")) {
			// 로그아웃
			HttpSession session = request.getSession();
			session.removeAttribute("info");
			System.out.println("로그아웃 완료");
			response.sendRedirect("main.jsp");
		}
	}

}

 

 

메세지 삽입, 메세지 전체삭제, 메세지 개별삭제는 숙제입니다. 여러분이 직접 구현해보세요.

728x90
반응형
Comments