관리 메뉴

거니의 velog

231004_Servlet 5 본문

대덕인재개발원_자바기반 애플리케이션

231004_Servlet 5

Unlimited00 2023. 10. 2. 16:09


[dbinfo.properties]

# 이 줄은 주석 처리 줄 입니다...
# 이 properties 파일을 작성하는 방법은
# 'key값=value값' 과 같은 모양으로 작성합니다.

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=pc_09
password=java

[DBUtil3.java]

package kr.or.ddit.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

// JDBC드라이버를 로딩하고 
// Connection객체를 생성해서 반환하는 메서드로 구성된 class

//(dbinfo.properties 파일의 내용을 이용하여 설정하기)
//==> ResourceBundle 객체 이용하기

public class DBUtil3 {
	
	static ResourceBundle bundle; // ResourceBundle객체 변수 선언
	
	static {
		
		// 객체 생성
		bundle = ResourceBundle.getBundle("kr.or.ddit.jdbc.config.dbinfo");
		
		try {
//			Class.forName("oracle.jdbc.driver.OracleDriver");
			Class.forName(bundle.getString("driver"));
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패~~~");
			e.printStackTrace();
		}
		
	}
	
	public static Connection getConnection() {
		
		Connection conn = null;
		
//		String url = "jdbc:oracle:thin:@localhost:1521:xe";
//		String user = "pc_09";
//		String password = "java";
		
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			System.out.println("DB 연결 실패~~~");
			e.printStackTrace();
		}
		return conn;
		
	}

}

[MemberVO.java]

package kr.or.ddit.vo;

public class MemberVO {

	private String mem_id;
	private String mem_pass;
	private String mem_name;
	private String mem_tel;
	private String mem_addr;
	
	public MemberVO() {}
	public MemberVO(String mem_id, String mem_pass, String mem_name, String mem_tel, String mem_addr) {
		this.mem_id = mem_id;
		this.mem_pass = mem_pass;
		this.mem_name = mem_name;
		this.mem_tel = mem_tel;
		this.mem_addr = mem_addr;
	}
	
	public String getMem_id() {
		return mem_id;
	}
	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}
	public String getMem_pass() {
		return mem_pass;
	}
	public void setMem_pass(String mem_pass) {
		this.mem_pass = mem_pass;
	}
	public String getMem_name() {
		return mem_name;
	}
	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}
	public String getMem_tel() {
		return mem_tel;
	}
	public void setMem_tel(String mem_tel) {
		this.mem_tel = mem_tel;
	}
	public String getMem_addr() {
		return mem_addr;
	}
	public void setMem_addr(String mem_addr) {
		this.mem_addr = mem_addr;
	}
	
	@Override
	public String toString() {
		return "MemberVO [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
				+ mem_tel + ", mem_addr=" + mem_addr + "]";
	}
	
}

[MemberDao.java]

package kr.or.ddit.member.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import kr.or.ddit.util.DBUtil3;
import kr.or.ddit.vo.MemberVO;

public class MemberDao {

	private static MemberDao dao;
	private MemberDao() {}
	public static MemberDao getinstance() {
		if (dao == null) dao = new MemberDao();
		return dao;
	}
	
	// 세션에 무엇을 저장할지에 따라 메서드가 달라짐
	public MemberVO getLoginMember(MemberVO memVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		MemberVO memberVo = null; // 로그인한 결과가 저장될 변수

		try {
			conn = DBUtil3.getConnection();

			String sql = "select * from mymember where mem_id = ? and mem_pass = ? ";
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, memVo.getMem_id());
			pstmt.setString(2, memVo.getMem_pass());

			rs = pstmt.executeQuery();

			if (rs.next()) {
				memberVo = new MemberVO();

				memberVo.setMem_id(rs.getString("mem_id"));
				memberVo.setMem_pass(rs.getString("mem_pass"));
				memberVo.setMem_name(rs.getString("mem_name"));
				memberVo.setMem_tel(rs.getString("mem_tel"));
				memberVo.setMem_addr(rs.getString("mem_addr"));
			}

		} catch (SQLException e) {
			memberVo = null;
			e.printStackTrace();
		} finally {
			if (rs != null)
				try {
					rs.close();
				} catch (SQLException e) {
				}
			if (pstmt != null)
				try {
					pstmt.close();
				} catch (SQLException e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (SQLException e) {
				}
		}

		return memberVo;
	}

}

[SessionLogin.java]

package kr.or.ddit.session;

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 kr.or.ddit.member.dao.MemberDao;
import kr.or.ddit.vo.MemberVO;


@WebServlet("/sessionLogin.do")
public class SessionLogin extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		// 사용자가 입력한 id와 pass를 파라미터로 받는다.
		String userId = request.getParameter("id");
		String userPass = request.getParameter("pass");
		// 실제 회원인지 아닌지 검사
		MemberDao memDao = MemberDao.getinstance();
		// 입력받은 데이터를 MemberVO객체에 담는다.
		MemberVO memVo = new MemberVO();
		// 파라미터로 받은 아이디와 비밀번호 받기
		memVo.setMem_id(userId);
		memVo.setMem_pass(userPass);
		// 세션객체 만들기(서버가 가진 데이터)
		HttpSession session = request.getSession();
		// if("admin".equals(userId) && "1234".equals(userPass)) {session.setAttribute("loginID", userId);}
		// DB에서 id와 pass를 이용하여 해당 회원 정보를 가져온다.
		MemberVO returnMemVo = memDao.getLoginMember(memVo);
		if(returnMemVo == null) { // 로그인 실패...
			response.sendRedirect(request.getContextPath() + "/basic/session/sessionLogin.jsp");
		}else { // 로그인 성공
			// Session에 로그인 정보 저장
			session.setAttribute("loginMember", returnMemVo);
			response.sendRedirect(request.getContextPath() + "/basic/session/sessionLogin.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

[SessionLogout.java]

package kr.or.ddit.session;

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;


@WebServlet("/sessionLogout.do")
public class SessionLogout extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Session을 삭제한 후 JSP 페이지 이동
		HttpSession session = request.getSession();
		
		session.invalidate(); // 세션 삭제
		
		response.sendRedirect(request.getContextPath() + "/basic/session/sessionLogin.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

[sessionLogin.jsp]

<%@page import="kr.or.ddit.vo.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Session Login 처리</title>
		<% 
			// JSP문서에서 HttpSession객체는 'session'이라는 이름으로 이미 생성되어 있다.
			
			// 세션에 저장된 '로그인 정보' 가져오기.
			// String loginId = (String) session.getAttribute("loginID");
			MemberVO memVo = (MemberVO) session.getAttribute("loginMember"); // 키값으로 가져옴
		%>
	</head>
	<body>
		<% 
			// if(loginId == null) { // 로그인이 안되었을 떄...
			if(memVo == null) { // 세션이 없을 때...(로그인이 안 되었을 때)
		%>
		<form action="<%= request.getContextPath() %>/sessionLogin.do" method="get">
			<table border="1">
				<tr>
					<td>ID : </td>
					<td><input type="text" name="id" placeholder="ID 입력하세요"></td>
				</tr>
				<tr>
					<td>PASS : </td>
					<td><input type="password" name="pass" placeholder="PassWord 입력하세요"></td>
				</tr>
				<tr>
					<td colspan="2" style="text-align: center;">
					     <input type="submit" value="Login"/>
					</td>
				</tr>
			</table>
		</form>
		<% 
			}else { // 로그인이 되었을 때...
		%>
				<%-- <h2><%= loginId %>님 반갑습니다...</h2> --%>
				<h2><%= memVo.getMem_id() %>, <%= memVo.getMem_name() %>님 반갑습니다...</h2>
				<br />
				<br />
				<a href="<%= request.getContextPath() %>/sessionLogout.do">로그아웃</a>
		<% 
			}
		%>
	</body>
</html>

- http://localhost:8090/webTest/basic/session/sessionLogin.jsp


[심화 과정 - MyBatis로 작성]

[mybatis-config.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
	PUBLIC "-//mybatis.org/DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- DB연결 정보가 저장된 properties파일에 대한 정보를 설정한다. -->
	<properties resource="kr/or/ddit/mybatis/config/dbinfo.properties" />
	
	<!-- MyBatis 설정과 관련된 기본 setting 설정 -->
	<settings>
		<!-- 데이터가 null로 전달되었으면 빈칸으로 인식하지 말고 null로 인식하라 -->
		<setting name="jdbcTypeForNull" value="NULL" />
	</settings>
	
	<typeAliases>
		<typeAlias type="kr.or.ddit.vo.MemberVO" alias="memVo" />
	</typeAliases>
	
	<!-- DB연결 설정 -->
	<environments default="oracleDev">
		<environment id="oracleDev">
			<!-- 오라클 -->
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${user}" />
				<property name="password" value="${pass}" />
			</dataSource>
		</environment>
		<!-- <environment id="m1">
			MySql
		</environment> -->
	</environments>
	
	<mappers>
		<mapper resource="kr/or/ddit/mybatis/mappers/member-mapper.xml" />
	</mappers>
</configuration>

[member-mapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
	PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="member">

	<select id="getLoginMember" parameterType="memVo" resultType="memVo">
		select * from mymember where mem_id = #{mem_id} and mem_pass = #{mem_pass}
	</select>
	
</mapper>

[MemberVO.java]

package kr.or.ddit.vo;

public class MemberVO {

	private String mem_id;
	private String mem_pass;
	private String mem_name;
	private String mem_tel;
	private String mem_addr;
	
	public MemberVO() {}
	public MemberVO(String mem_id, String mem_pass, String mem_name, String mem_tel, String mem_addr) {
		this.mem_id = mem_id;
		this.mem_pass = mem_pass;
		this.mem_name = mem_name;
		this.mem_tel = mem_tel;
		this.mem_addr = mem_addr;
	}
	
	public String getMem_id() {
		return mem_id;
	}
	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}
	public String getMem_pass() {
		return mem_pass;
	}
	public void setMem_pass(String mem_pass) {
		this.mem_pass = mem_pass;
	}
	public String getMem_name() {
		return mem_name;
	}
	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}
	public String getMem_tel() {
		return mem_tel;
	}
	public void setMem_tel(String mem_tel) {
		this.mem_tel = mem_tel;
	}
	public String getMem_addr() {
		return mem_addr;
	}
	public void setMem_addr(String mem_addr) {
		this.mem_addr = mem_addr;
	}
	
	@Override
	public String toString() {
		return "MemberVO [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
				+ mem_tel + ", mem_addr=" + mem_addr + "]";
	}
	
}

[ILoginMemberDao.java]

package kr.or.ddit.login.dao;

import kr.or.ddit.vo.MemberVO;

public interface ILoginMemberDao {

	/**
	 * 회원 ID와 패스워드가 저장된 MemberVO객체를 인수값으로 받아서 
	 * 해당 회원을 검색하여 반환하는 메서드
	 * 
	 * @param memVo 검색할 회원ID와 패스워드가 저장된 MemberVO객체
	 * @return 검색된 회원 정보가 저장된 MemberVO객체(검색된 데이터가 없으면 null 반환)
	 */
	public MemberVO getLoginMember(MemberVO memVo);
	
}

[ILoginMemberService.java]

package kr.or.ddit.login.service;

import kr.or.ddit.vo.MemberVO;

public interface ILoginMemberService {

	/**
	 * 회원 ID와 패스워드가 저장된 MemberVO객체를 인수값으로 받아서 
	 * 해당 회원을 검색하여 반환하는 메서드
	 * 
	 * @param memVo 검색할 회원ID와 패스워드가 저장된 MemberVO객체
	 * @return 검색된 회원 정보가 저장된 MemberVO객체(검색된 데이터가 없으면 null 반환)
	 */
	public MemberVO getLoginMember(MemberVO memVo);
	
}

[LoginMemberDaoImpl.java]

package kr.or.ddit.login.dao;

import org.apache.ibatis.session.SqlSession;

import kr.or.ddit.util.MyBatisUtil;
import kr.or.ddit.vo.MemberVO;

public class LoginMemberDaoImpl implements ILoginMemberDao {

	private static LoginMemberDaoImpl dao;
	private LoginMemberDaoImpl() {}
	public static LoginMemberDaoImpl getInstance() {
		if(dao == null) dao = new LoginMemberDaoImpl();
		return dao;
	}
	
	@Override
	public MemberVO getLoginMember(MemberVO memVo) {
		SqlSession session = MyBatisUtil.getSqlSession();
		MemberVO loginMemberVo = null;
		
		try {
			loginMemberVo = session.selectOne("member.getLoginMember", memVo);
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(session != null) session.close();
		}
		
		return loginMemberVo;
	}

}

[LoginMemberServiceImpl.java]

package kr.or.ddit.login.service;

import kr.or.ddit.login.dao.ILoginMemberDao;
import kr.or.ddit.login.dao.LoginMemberDaoImpl;
import kr.or.ddit.vo.MemberVO;

public class LoginMemberServiceImpl implements ILoginMemberService {

	private ILoginMemberDao dao;
	
	private static LoginMemberServiceImpl service;
	private LoginMemberServiceImpl() {
		dao = LoginMemberDaoImpl.getInstance();
	}
	public static LoginMemberServiceImpl getInstance() {
		if(service == null) service = new LoginMemberServiceImpl();
		return service;
	}
	
	@Override
	public MemberVO getLoginMember(MemberVO memVo) {
		return dao.getLoginMember(memVo);
	}

}

[SessionLoginDB.java]

package kr.or.ddit.login.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 javax.servlet.http.HttpSession;

import kr.or.ddit.login.service.ILoginMemberService;
import kr.or.ddit.login.service.LoginMemberServiceImpl;
import kr.or.ddit.vo.MemberVO;


@WebServlet("/sessionLoginDB.do")
public class SessionLoginDB extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	private ILoginMemberService service;
	
	public SessionLoginDB() {
		service = LoginMemberServiceImpl.getInstance();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 사용자가 입력한 회원 ID와 패스워드를 받는다.
		request.setCharacterEncoding("utf-8");
		
		String userId = request.getParameter("id");
		String userPass = request.getParameter("pass");
		
		// 입력받은 데이터를 VO에 저장한다.
		MemberVO memVo = new MemberVO();
		memVo.setMem_id(userId);
		memVo.setMem_pass(userPass);
		
		// Service에게 VO데이터를 주고 결과를 받아온다.
		MemberVO loginMemberVo = service.getLoginMember(memVo);
		
		// 받은 결과를 이용하여 로그인 여부를 검사한다.
		//		==> 받은 결과가 null이 아니면 로그인 성공
		
		HttpSession session = request.getSession();
		
		if(loginMemberVo != null) { // 로그인 성공
			session.setAttribute("loginMember", loginMemberVo);
		}
		
		// 로그인 페이지로 이동한다.
		response.sendRedirect(request.getContextPath() + "/basic/session/dbLogin/sessionLoginDB.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

[SessionLogoutDB.java]

package kr.or.ddit.login.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 javax.servlet.http.HttpSession;


@WebServlet("/sessionLogoutDB.do")
public class SessionLogoutDB extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.invalidate(); // 세션 삭제
		// 로그인 페이지로 이동한다.
		response.sendRedirect(request.getContextPath() + "/basic/session/dbLogin/sessionLoginDB.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

[sessionLoginDB.jsp]

<%@page import="kr.or.ddit.vo.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Session Login 처리</title>
		<% 
			// JSP문서에서 HttpSession객체는 'session'이라는 이름으로 이미 생성되어 있다.
			
			// 세션에 저장된 '로그인 정보' 가져오기.
			// String loginId = (String) session.getAttribute("loginID");
			MemberVO loginVo = (MemberVO) session.getAttribute("loginMember"); // 키값으로 가져옴
		%>
	</head>
	<body>
		<% 
			// if(loginId == null) { // 로그인이 안되었을 떄...
			if(loginVo == null) { // 세션이 없을 때...(로그인이 안 되었을 때)
		%>
		<form action="<%= request.getContextPath() %>/sessionLoginDB.do" method="post" style="text-align: center;">
			<table border="1" style="display: inline-block;">
				<tr>
					<td>ID : </td>
					<td><input type="text" name="id" placeholder="ID 입력하세요"></td>
				</tr>
				<tr>
					<td>PASS : </td>
					<td><input type="password" name="pass" placeholder="PassWord 입력하세요"></td>
				</tr>
				<tr>
					<td colspan="2" style="text-align: center;">
					     <input type="submit" value="Login"/>
					</td>
				</tr>
			</table>
		</form>
		<% 
			}else { // 로그인이 되었을 때...
		%>
				<%-- <h2><%= loginId %>님 반갑습니다...</h2> --%>
				<h2><%= loginVo.getMem_id() %>, <%= loginVo.getMem_name() %>님 반갑습니다...</h2>
				<br />
				<br />
				<a href="<%= request.getContextPath() %>/sessionLogoutDB.do">로그아웃</a>
		<% 
			}
		%>
	</body>
</html>

- http://localhost:8090/webTest/basic/session/dbLogin/sessionLoginDB.jsp

[log4j.properties]

# Root logger option

# 1. 로그 출력 Level은 INFO부터 할것임.
# 2. rootLogger 에 사용할 로깅 Appender로 stdout이라는것과 
#    logfile이라는 것 두가지를 사용하겠다
#log4j.rootLogger=error, stdout, logfile
log4j.rootLogger=debug, stdout

# Direct log messages to stdout
# ConversionPattern은 로그가 어떠한 형식으로 출력될것인지 
# 그 포맷을 정의하는 것.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %F-(%C{2}:%L) - %m%n

# Direct log message to log file
# logfile이라는 appender는 로그를 파일로 출력해주는 놈인데, 
# 파일path를 정의 할 수 있다.
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.File=D:/application.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %5p (%C{2} - %M:%L) - %m%n
log4j.appender.logfile.Append=true

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

231005_JSON  (0) 2023.10.05
231004_유스케이스 다이어그램 작성  (0) 2023.10.04
231002_Servlet 4  (0) 2023.09.27
230927_Servlet 3  (2) 2023.09.27
230926_Servlet 2  (0) 2023.09.26