데이터융합 JAVA응용 SW개발자 기업 채용연계 연수과정 44일차 강의 정리

misung·2022년 5월 17일
0

JSP

실습 1. 지난 주차에 이어서 (게시판 시스템)

글 확인

content.jsp

<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 요청과 함께 넘어오는 파라미터값(글 번호)을 얻어와서
	// DAO의 selectOne()을 호출하여 객체 받아오기
	
	int bId = Integer.parseInt(request.getParameter("bId"));
	BoardVO vo = BoardDAO.getInstance().selectOne(bId);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1><%=vo.getBoardId() %>번 게시물 내용</h1>
	<p>
		# 작성자: <%=vo.getWriter() %> <br>
		# 제목: <%=vo.getTitle() %> <br>
		# 내용: <br>
		<textarea rows="5" readonly><%=vo.getContent() %></textarea> <br>
		# 작성일: <%=vo.getRegDate() %>
	</p>
	
	<a href="list.jsp">글 목록 보기</a>
	<a href="modify.jsp?bId=<%=vo.getBoardId() %>">글 수정하기</a>
</body>
</html>

글 수정

modify.jsp

<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int bId = Integer.parseInt(request.getParameter("bId"));
	BoardVO vo = BoardDAO.getInstance().selectOne(bId);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1><%=vo.getBoardId() %>번 게시물 내용 수정</h1>
	
	<form action="modify_con.jsp" method="post">
		<%-- hidden type은 브라우저에 input창을 노출하지 않고, 데이터 전송시 사용 --%>
		<input type="hidden" name="bId" value="<%=vo.getBoardId()%>">
		
		# 작성자: <input type="text" name="writer" value="<%=vo.getWriter()%>" readonly> <br>
		# 제목: <input type="text" name="title" value="<%=vo.getTitle()%>"> <br>
		# 내용 : <br>
		<textarea rows="5" name="content"><%=vo.getContent() %></textarea>
		
		<input type="submit" value="수정">
	</form>
</body>
</html>

modify_con.jsp

<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
		- 수정에 필요한 파라미터값을 불러와서 그것을 토대로
		BoardVO 객체를 생성하세요. (제목, 내용만 수정됩니다.)
		
		- BoardDAO의 update()를 이용하여 수정한 객체를 DB에 적용시켜 주시고
		결과가 성공이라면 해당 글 상세보기 페이지로 이동시켜 주세요.
		결과가 실패라면 list.jsp로 리다이렉팅 해주세요.
	*/
	request.setCharacterEncoding("utf-8");
	int bId = Integer.parseInt(request.getParameter("bId"));

	BoardVO vo = new BoardVO();
	vo.setBoardId(Integer.parseInt(request.getParameter("bId")));
	vo.setTitle(request.getParameter("title"));
	vo.setContent(request.getParameter("content"));
	
	if (BoardDAO.getInstance().update(vo)) {
		response.sendRedirect("content.jsp?bId=" + vo.getBoardId());
	} else {
		response.sendRedirect("list.jsp");
	}
%>

글 삭제

delete.jsp

<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int bId = Integer.parseInt(request.getParameter("bId"));

	if(BoardDAO.getInstance().delete(bId)) { %>
		<script>
			alert("삭제가 정상 처리되었습니다.");
			location.href="list.jsp";
		</script>
	<% } else { %>
		<script>
			alert("삭제에 실패했습니다.");
			location.href="list.jsp";
		</script>
	<% } %>

BoardDAO 대거 수정

package kr.co.jsp.board.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import kr.co.jsp.util.JdbcUtil;

public class BoardDAO implements IBoardDAO {

	// 커넥션 풀의 정보를 담을 변수를 선언.
	private DataSource ds;
	
	private BoardDAO() {
		// 클래스에서 커넥션 풀을 구하는 방법 (설정 파일이 InitialContext에 저장됨)
		try {
			InitialContext ct = new InitialContext();
			ds = (DataSource) ct.lookup("java:comp/env/jdbc/myOracle");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	private static BoardDAO dao = new BoardDAO();
	
	public static BoardDAO getInstance() {
		if (dao == null) {
			dao = new BoardDAO();
		}
		return dao;
	}
	
	// --------------------------------
	
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	/*
	private Connection getConnection () throws Exception {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "jsp";
		String upw = "jsp";
		
		return DriverManager.getConnection(url, uid, upw);
	}
	*/
	
	@Override
	public boolean insert(BoardVO vo) {
		boolean flag = false;
		
		String sql = "INSERT INTO board(board_id, writer, title, content) "
				+ "VALUES(bid_seq.NEXTVAL, ?, ?, ?)";
		
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getWriter());
			pstmt.setString(2, vo.getTitle());
			pstmt.setString(3, vo.getContent());
			
			if (pstmt.executeUpdate() == 1) flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, pstmt);
		}
		
		return flag;
	}

	@Override
	public List<BoardVO> selectAll() {
		List<BoardVO> articles = new ArrayList<>();
		String sql = "SELECT * FROM board ORDER BY board_id DESC";
		
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				BoardVO vo = new BoardVO (
						rs.getInt("board_id"),
						rs.getString("Writer"),
						rs.getString("title"),
						rs.getString("content"),
						rs.getTimestamp("reg_date")
						);
				articles.add(vo);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, pstmt, rs);
		}
		
		return articles;
	}

	@Override
	public BoardVO selectOne(int bId) {
		BoardVO vo = null;
		
		String sql = "SELECT * FROM board WHERE board_id=?";
		
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, bId);
			rs = pstmt.executeQuery();
			
			if (rs.next()) {
				vo = new BoardVO(
						rs.getInt("board_id"),
						rs.getString("writer"),
						rs.getString("title"),
						rs.getString("content"),
						rs.getTimestamp("reg_date")
						);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, pstmt, rs);
		}
		
		return vo;
	}

	@Override
	public boolean update(BoardVO vo) {
		boolean flag = false;
		
		String sql = "UPDATE board SET title=?, content=? WHERE board_id=?";
		
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getTitle());
			pstmt.setNString(2, vo.getContent());
			pstmt.setInt(3, vo.getBoardId());
			
			if (pstmt.executeUpdate() == 1) flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, pstmt);
		}
		return flag;
	}

	@Override
	public boolean delete(int bId) {
		boolean flag = false;
		
		String sql = "DELETE FROM board WHERE board_id=?";
		
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, bId);
			if (pstmt.executeUpdate() == 1) flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, pstmt);
		}
		return flag;
	}

}

기존의 경우 커넥션을 직접 생성했지만 이제는 아래와 같은 커넥션 풀을 통한 연결로 변경.

연결 풀 (Connection Pool)

  • 데이터베이스 연결 풀은 데이터에 대한 요청이 발생하면 재사용 되는 것으로, 데이터베이스의 수행 능력을 향상시키기 위해 사용됨
  • 연결 풀에서 하나의 연결이 생성되어 풀에 배치되면, 새로운 연결이 만들어지지 않도록 재사용하지만, 만약 모든 연결이 사용 중에 있으면 새로운 연결이 만들어져 풀에 추가된다.
  • 연결 풀을 통해 사용하는 데이터베이스 연결을 위해 기다리는 시간을 축소시켜준다.

JSP의 연결 풀 설정

  • 커넥션 풀 설정은 Eclipse → Servers 폴더에 → context.xml을 수정하면 된다.

커넥션 풀

  • 커넥션 풀링은 미리 정해진 개수만큼 DB 커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때마다 Pool에서 꺼내서 할당하며, 다시 돌려받아서 Pool에 넣는 기법

DataSource

  • DB에 이용되는 URL, id, pw, DriverClass를 미리 정의해 놓고 사용하는 객체

현재의 경우 필요할 때 마다 객체(conn, pstmt, rs)를 생성하여 데이터베이스에 접속하고 있는데, 이러한 일이 증가하면 할 수록 객체를 생성하는데에 시간이 점점 누적되면서 문제가 생길 수 있다.

강사님의 실 경험에 빗댄 이야기에 따르면 뚝배기집과도 같다고 볼 수 있다.
메뉴를 주문하면 주문을 받은 뒤 재료를 준비하고 요리를 시작하는 것이 아니라, 미리 뚝배기와 재료를 준비해 두었다가 주문이 들어오면 바로 끓이기 시작하는 방식과도 비슷하다고 생각할 수 있다고 한다.

context.xml 수정하기

<Resource
    	auth="Container"
    	driverClassName="oracle.jdbc.driver.OracleDriver"
    	url="jdbc:oracle:thin:@Localhost:1521:xe"
    	username="jsp"
    	password="jsp"
    	name="jdbc/myOracle"
    	type="javax.sql.DataSource"
    	maxActive="8"
    	maxWait="1000"
/>

실습 2. 사이트 템플릿을 이용해서 각종 기능 개발하기

logout, mypage 부분의 li는 주석 처리

index.jsp의 내용이 난잡하므로 정리 필요함.
따라서 head 태그 안의 carousel 태그 부분 제외한 나머지 위 태그 전부를 잘라다가 WebContent 폴더에 include 폴더 생성 후, header.jsp 작성하고 해당 jsp파일의 head 태그 내의 내용을 삭제한 후 붙여넣기한다.
(캐러셀은 메인 페이지에서만 <옆으로 사진 슬라이드 하는 기능> 보여줄거니까 header.jsp에는 안 넣을 것)

그리고 index.jsp의 body의 header라고 써진 주석 파트 시작부터 종료 부분까지 전부 header.jsp로 떼올 것.

오늘 하루 진행한 부분에서는 다음과 같은 구조를 가짐.

css, img, js 등은 제공받은 것을 사용하고 있음.
물론 index.jsp와 include 내의 footer.jsp, header.jsp등도 제공받은 것을 사용 중.

진행 내용이 상당히 많고 구현 내용이 많아지면서, 이전에 진행한 내용과 중복되는 내용들에 대한 설명은 최대한 생략하고 어떤 것을 진행했는지에 대한 설명과, 추후 복습 시 어떠한 부분이 핵심이었는지만 정리하겠다.

우선 index.jsp를 먼저 보도록 한다.

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <!-- Script to Activate the Carousel -->
    <script>
        $('.carousel').carousel({
            interval: 2000 //changes the speed
        })
    </script>
</head>
<body>
	<%@include file="include/header.jsp" %>
	<div class="container">
        <div class="row ">
            <div class="box">
                <div class="col-lg-6 text-center">
                    <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
                        <!-- data-ride="carousel" 자동 슬라이드 기능 -->
                        <ol class="carousel-indicators hidden-xs">
                            <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
                            <li data-target="#carousel-example-generic" data-slide-to="1"></li>
                            <li data-target="#carousel-example-generic" data-slide-to="2"></li>
                        </ol>
                        <div class="carousel-inner">
                            <div class="item active">
                                <img class="img-responsive img-full" src="img/1.jpg">
                            </div>
                            <div class="item">
                                <img class="img-responsive img-full" src="img/2.jpg"> <!-- img-full 옵션 class -->
                            </div>
                            <div class="item">
                                <img class="img-responsive img-full" src="img/5.jpg">
                            </div>
                        </div>
                        <a class="left carousel-control" href="#carousel-example-generic" data-slide="prev">
                            <span class="icon-prev"></span>
                        </a>
                        <a class="right carousel-control" href="#carousel-example-generic" data-slide="next">
                            <span class="icon-next"></span>
                        </a>
                    </div>
                </div>
                <div class="col-lg-6 text-center">
                    <h2>영상 링크</h2>
                    <p>
                        	원하는 영상을 링크해 보세요.
                    </p>
                    <hr>
                    <h3>영상 자동재생</h3>
                    <iframe width="100%" height="485px" src="https://www.youtube.com/embed/MEkaqZecpUQ" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="box">
                <div class="col-lg-12">
                    <hr>
                    <h2 class="intro-text text-center">Jsp Web Programming
                        <strong>공지 사항</strong>
                    </h2>
                    <hr>
                    <div class="inner" align="center">
                        <img class="img-responsive img-center" src="img/intro.jpg" alt=""><!-- img-border -->

                        <hr class="visible-xs">

                        <p>1. 공지사항을 작성하는 란입니다.</p>
                        <p>2. 자유롭게 작성 해 보세요.</p>
                        <p>3. -----------------------------------</p>
                    </div>
                </div>
            </div>
        </div>
        <!-- /.container -->
    </div>
    <%@ include file="include/footer.jsp" %>
</body>
</html>

원래 index.jsp의 내용이 상당히 길었으나 header, footer별로 jsp를 각각 분리하여 저장한 다음 @include 로 불러오도록 하였다.

오늘 진행한 내용 중 중요한 내용은 요약하자면..

  • 회원 테이블 구현
  • 회원 가입 페이지와 컨트롤러 구현
  • 회원 로그인 페이지와 컨트롤러 구현
  • 회원 객체 VO, 관리용 DAO, DAO 사양서인 IDAO
  • try with resource 구문으로 finally 부분에 사용한 객체 해제하는 부분 제거 및 위에서 이미 배운 커넥션 풀 적용

UserVO

UserVO.java

package kr.co.jsp.user.model;

public class UserVO {
	private String id;
	private String pw;
	private String name;
	private String email;
	private String address;
	
	public UserVO() {}

	public UserVO(String id, String pw, String name, String email, String address) {
		super();
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.email = email;
		this.address = address;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
	
}

VO는 평소와 같이 구현하였으므로 크게 볼 것이 없다.

IUserDAO

IUserDAO.java

package kr.co.jsp.user.model;

public interface IUserDAO {
	// 중복ID 여부 검증
	boolean confirmId(String id);
	
	// 회원 가입 처리
	void insertUser(UserVO vo);
	
	// 로그인 유효성 검증
	int userCheck(String id, String pw);
	
	// 특정 회원의 모든 정보 가져오기
	UserVO getUserInfo(String id);
	
	// 비밀번호를 변경하는 메서드
	void changePassword(String id, String newPw);
	
	// 회원 정보를 수정하는 메서드
	void updateUser(UserVO vo);
	
	// 회원 탈퇴를 처리할 메서드
	void deleteUser(String id);
}

기능 구현을 해야 할 메서드를 미리 작성.

UserDAO

UserDAO.java

package kr.co.jsp.user.model;

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

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class UserDAO implements IUserDAO {
	
	private DataSource ds;
	
	private UserDAO() {
		InitialContext ct;
		try {
			ct = new InitialContext();
			ds = (DataSource) ct.lookup("java:comp/env/jdbc/myOracle");
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private static UserDAO dao = new UserDAO();
	
	public static UserDAO getInstance() {
		if (dao == null) {
			dao = new UserDAO();
		}
		return dao;
	}

	@Override
	public boolean confirmId(String id) {
		boolean flag = false;
		String sql = "SELECT * FROM my_user WHERE user_id=?";
		
		/*
		 # try with resource 구문
		 - try문을 작성할 때 자원 객체를 소괄호 안에 전달하면
		 try블록이 끝날 때 자동으로 자원을 해제해 줍니다.
		 
		 - 자동으로 종료되는 자원은 반드시 AutoCloseable 인터페이스의 구현체여야 합니다.
		 */
		
		try(Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			ResultSet rs = pstmt.executeQuery();
			
			if (rs.next()) flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return flag;
	}

	@Override
	public void insertUser(UserVO vo) {
		String sql = "INSERT INTO my_user VALUES(?,?,?,?,?)";
		try (Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, vo.getId());
			pstmt.setString(2, vo.getPw());
			pstmt.setString(3, vo.getName());
			pstmt.setString(4, vo.getEmail());
			pstmt.setString(5, vo.getAddress());
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public int userCheck(String id, String pw) {
		int flag = -1;
		
		String sql = "SELECT * FROM my_user WHERE user_id=?";
		
		try (Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			ResultSet rs = pstmt.executeQuery();
			
			if (rs.next()) {
				if(rs.getString("user_pw").equals(pw)) flag = 1;
				else flag = 0;
			} else {
				flag = -1;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return flag;
	}

	@Override
	public UserVO getUserInfo(String id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void changePassword(String id, String newPw) {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateUser(UserVO vo) {
		// TODO Auto-generated method stub

	}

	@Override
	public void deleteUser(String id) {
		// TODO Auto-generated method stub

	}

}

먼저 여기

private UserDAO() {
		InitialContext ct;
		try {
			ct = new InitialContext();
			ds = (DataSource) ct.lookup("java:comp/env/jdbc/myOracle");
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

UserDAO() 생성자에서 커넥션 풀을 통해 DataSource 를 받아옴.

그 후 주목할 부분은 confirmID() 메서드

try(Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			ResultSet rs = pstmt.executeQuery();

try with resource 구문을 작성해서, try문 작성 시 객체를 소괄호 안에 전달하면서 try블록 종료시 자동으로 자원이 해제되고 있어서 finally 안에 자원을 해제하는 구문이나 Util 클래스를 따로 만들어 해제할 필요가 없어졌다.

그 외의 메서드들은 요구사항대로 그대로 구현한 것이라 크게 어려운 부분이 없었다.

user_join_con, user_login_con

user_join_con.jsp

<%@page import="kr.co.jsp.user.model.UserVO"%>
<%@page import="kr.co.jsp.user.model.UserDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
		사용자가 입력한 id를 얻어와 중복 체크 먼저 진행
	*/
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	UserDAO dao = UserDAO.getInstance();
	
	if (dao.confirmId(id)) { %>
		<script>
			alert("아이디가 중복되었습니다.");
			history.back();
		</script>
<% 	} else { // 아이디가 중복되지 않음! 
	// 회원가입 처리가 들어가면 됨.
	// "회원 가입을 환영합니다!" -> user_login.jsp로
		UserVO vo = new UserVO(
					id,
					request.getParameter("pw"),
					request.getParameter("name"),
					request.getParameter("email"),
					request.getParameter("address")
				);
		dao.insertUser(vo); %>
		<script>
			alert("회원가입을 환영합니다!");
			location.href="user_login.jsp";
		</script>		
<% } %>

프론트단 페이지는 직접 작성한게 아니기도 하고, 레이아웃 잡는데 쓰인 코드가 대부분이라 생략. 여기서는 로직이 중요하므로 로직을 보도록 한다.

그래도 그렇게 어려운 부분은 없고, 입력된 id를 중복 체크한 후 중복되지 않은 경우에 한해 UserVO 객체를 새로 하나 만들어 dao의 insertUser() 메서드를 호출해 방금 만든 유저 객체를 넣고 리다이렉트를 해 주고 있을 뿐이다.

user_login_con.jsp

<%@page import="kr.co.jsp.user.model.UserVO"%>
<%@page import="kr.co.jsp.user.model.UserDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 파라미터값 얻어오기 id, pw
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	
	// DAO 주소값 얻어오기
	UserDAO dao = UserDAO.getInstance();
	
	/*
		로그인 유효성 검증 메서드 userCheck() 호출
		- 아이디가 없다면 스크립트 경고 출력 후 로그인 페이지 이동(-1)
		- 비밀번호가 틀렸다면 틀렸다고 경고 후 뒤로가기 (0)
		- 로그인 성공일 경우 user_mypage.jsp로 리다이렉트 (1)
	*/
	// 로그인 성공 시 페이지 이동 전 getUserInfo() 호출하여
	// 로그인 성공한 회원의 모든 정보를 받아와 세션에 저장
	// 세션 이름 : user, 저장할 값 : 로그인 성공한 회원의 UserVO 객체
	int flag = dao.userCheck(id, pw);
	
	if (flag == -1) { %>
	<script>
		alert("존재하지 않는 아이디입니다.")
		location.href="user_login.jsp";
	</script>
	<% } else if (flag == 0) { %>
	<script>
		alert("비밀번호가 일치하지 않습니다..")
		location.href="user_login.jsp";
	</script>
	<% } else if (flag == 1) {
		UserVO vo = dao.getUserInfo(id);
		session.setAttribute("user", vo);
		response.sendRedirect("user_mypage.jsp");
	} %>

이 부분의 경우에도 사양대로 그대로 구현 (강사님 코드와는 다른 내 구현이라, 추후 코드가 좀 달라질 여지가 있지만) 한 부분이었고, 딱히 큰 오류 없이 만들었기 때문에 특별히 분석할 부분은 없다.

일단 오늘 강의는 이것으로 종료되었다.

0개의 댓글