이번 프로젝트는 로그인, 회원가입, 정보수정, 탈퇴, 로그아웃을 만들어 본다.


기능은 거의 전과 비슷하다.


폴더 구조는 다음과 같다.





전에 사용했던 기술들은 모두 사용한다.


사진에는 안나와 있지만 WEB-INF 아래 lib 폴더에 ojdbc6.jar 파일이 있다.


시작페이지(form)


로그인 폼이 있다.

------------------------------------------------------------------------------------------------------------------------------------

index.jsp



<%@ 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>
<style type="text/css">
    html{
        height: 100%;
    }
    body {
        background: skyblue;
        height: 100%;
    }
    #main{
        min-height: 90%;
    }
    h1{
        color: navy;
    }
    #title{
        color: orangered;
    }
    input[type='submit'] {
        height: 50px;
        background: orangered;
        color: white;
        border-radius: 10px;
    }
</style>
</head>
<body>
    <div id="main">
        <h1 align="center">Welcome to <label id="title">둘리's World</label></h1>
       
        <div>
            <form action="<%=request.getContextPath() %>/login" method="post">
                <table align="center">
                    <tr>
                        <td><label>ID</label></td>
                        <td colspan="2"><input type="text" name="userId"></td>
                        <td rowspan="2"><input type="submit" value="LOGIN"></td>
                    </tr>
                    <tr>
                        <td><label>PWD</label></td>
                        <td colspan="2"><input type="password" name="password"></td>
                    </tr>
                    <tr>
                        <td colspan="4"><a href="views/member/memberJoinForm.jsp">회원가입하기</a></td>
                    </tr>
                    <tr>
                        <td colspan="4"><a href="#">아이디 / 비밀번호 찾기</a></td>
                    </tr>
                </table>
            </form>
        </div>
    </div>
   
   
    <%@ include file="views/common/footer.jsp" %>
   
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------


회원가입(form, servlet)


------------------------------------------------------------------------------------------------------------------------------------

memberJoinForm.jsp



<%@ 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>
    <h1 align="center">회원가입</h1>
    <form action="<%= request.getContextPath() %>/insertMember" method="post">
        <table align="center">
            <tr>
                <td><label>아이디</label></td>
                <td><input type="text" name="userId"></td>
            </tr>
            <tr>
                <td><label>비밀번호</label></td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><label>비밀번호 확인</label></td>
                <td><input type="password" name="password2"></td>
            </tr>
            <tr>
                <td><label>이름</label></td>
                <td><input type="text" name="userName"></td>
            </tr>
            <tr>
                <td><label>나이</label></td>
                <td><input type="number" name="age"></td>
            </tr>
            <tr>
                <td>성별</td>
                <td>
                    <input type="radio" name="gender" value="M" id="male">
                    <label for="male">남</label>
                    <input type="radio" name="gender" value="F" id="female">
                    <label for="female">여</label>
                </td>
            </tr>
            <tr>
                <td><label>이메일</label></td>
                <td><input type="email" name="email"></td>
            </tr>
            <tr>
                <td><label>전화번호</label></td>
                <td><input type="tel" name="phone"></td>
            </tr>
            <tr>
                <td><label>주소</label></td>
                <td><input type="text" name="address"></td>
            </tr>
            <tr>
                <td><label>취미</label></td>
                <td>
                    <input type="checkbox" name="hobby" value="운동" id="sports">
                    <label for="sports">운동</label>
                    <input type="checkbox" name="hobby" value="낚시" id="fishing">
                    <label for="sports">낚시</label>
                    <input type="checkbox" name="hobby" value="등산" id="climbing">
                    <label for="sports">등산</label>
                    <input type="checkbox" name="hobby" value="요리" id="cooking">
                    <label for="sports">요리</label>
                </td>
            </tr>
            <tr align="center">
                <td colspan="2">
                    <input type="reset" value="리셋"> &nbsp; &nbsp;
                    <input type="submit" value="가입하기">
                </td>
            </tr>
        </table>
    </form>
</body>
</html>




InsertMemberServlet.java



package com.kh.w7.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.kh.w7.member.model.service.MemberService;
import com.kh.w7.member.model.vo.Member;

@WebServlet("/insertMember")
public class InsertMemberServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
    public InsertMemberServlet() {
        super();
    }
   
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 인코딩
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
       
        // 2. request에서 파라미터 값 꺼내기
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
        String userName = request.getParameter("userName");
        String gender = request.getParameter("gender");
        int age = Integer.parseInt(request.getParameter("age"));
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        String address = request.getParameter("address");
        String[] hobby = request.getParameterValues("hobby");
       
        String hobbies = "";
        for (int i = 0; i < hobby.length; i++) {
            if (i == 0) {
                hobbies += hobby[i];
            }else {
                hobbies += ", " + hobby[i];
            }
        }
       
        // 3. Member 객체 생성
        Member reqMember = new Member();
        reqMember.setUserId(userId);
        reqMember.setPassword(password);
        reqMember.setUserName(userName);
        reqMember.setGender(gender);
        reqMember.setAge(age);
        reqMember.setEmail(email);
        reqMember.setPhone(phone);
        reqMember.setAddress(address);
        reqMember.setHobby(hobbies);
       
       
        // 4. Service 로직으로 전달
        int result = new MemberService().insertMember(reqMember);
       
        if(result > 0) {
            String page = "views/common/successPage.jsp";
            request.getSession().setAttribute("msg", "회원 가입에 성공하셨습니다.");
            response.sendRedirect(page);
        }else {
            String page = "views/common/errorPage.jsp";
            request.setAttribute("msg", "회원 가입에 실패하셨습니다!");
           
            RequestDispatcher view = request.getRequestDispatcher(page);
            view.forward(request, response);
        }
       
       
       
       
    }
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

------------------------------------------------------------------------------------------------------------------------------------


로그인(servlet)


------------------------------------------------------------------------------------------------------------------------------------

LoginServlet.java



package com.kh.w7.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.kh.w7.member.model.service.MemberService;
import com.kh.w7.member.model.vo.Member;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    public LoginServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 전송값에 한글이 있는 경우 인코딩 처리 해야 함
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
       
        // 2. 전송값 꺼내서 변수에 기록하기
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
       
        System.out.println("ID : " + userId);
        System.out.println("PW : " + password);
       
        Member reqMember = new Member();
       
        reqMember.setUserId(userId);
        reqMember.setPassword(password);
       
        // 3. 서비스 로직 호출
        Member loginUser = new MemberService().loginCheck(reqMember);
       
       
        // 4. 받은 결과에 따라 뷰 페이지 내보내기
        String page = "";
        if (loginUser != null) { // 성공
           
            HttpSession session = request.getSession();
            session.setAttribute("loginUser", loginUser);
           
            page = "views/main/main.jsp";
           
        }else {                     // 실패
           
            request.setAttribute("msg", "로그인 실패!");
            page = "views/common/errorPage.jsp";
           
        }
       
        RequestDispatcher view = request.getRequestDispatcher(page);
        view.forward(request, response);
       
       
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

------------------------------------------------------------------------------------------------------------------------------------


메인 페이지, 성공, 에러 페이지(form), 로그아웃(servlet)


------------------------------------------------------------------------------------------------------------------------------------

main.jsp



<%@page import="com.kh.w7.member.model.vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- <% Member loginUser = (Member)session.getAttribute("loginUser"); %> --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%@ include file="../common/menubar.jsp" %>
    <%-- <h1><% out.println(loginUser.getUserName()); %></h1> --%>
   
</body>
</html>




menubar.jsp(실질적인 메인)



<%@page import="com.kh.w7.member.model.vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    Member loginUser = (Member)session.getAttribute("loginUser");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
    div > button {
        float: right;
    }
   
</style>
</head>
<body>
    <h1 align="center">메인화면</h1>
    <h3 align="right"><%= loginUser.getUserName() %>님 환영합니다.</h3>
    <div>
        <button onclick="logout()">로그아웃</button>
        <% if(!loginUser.getUserId().equals("admin")){ %>
            <button onclick="location.href='/w7/views/member/memberUpdateForm.jsp'">내 정보 수정</button>
        <% }else {%>
            <button>관리자 메뉴로</button>
        <% } %>
    </div>
   
    <script type="text/javascript">
        function logout() {
            var check = window.confirm("로그아웃 하시겠습니까?");
           
            if(check == true){
                location.href="<%= request.getContextPath() %>/logout";
               
            }
        }
    </script>
</body>
</html>




errorPage.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% String msg = (String)request.getAttribute("msg"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>에러 발생!</h1>
    <h3><%= msg %></h3>
</body>
</html>






successPage.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String msg = (String)session.getAttribute("msg");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1><%= msg %></h1>
    <a href="/w7/index.jsp">메인으로 이동</a>
</body>
</html>








LogoutServlet.java



package com.kh.w7.member.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;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    public LogoutServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().invalidate();
       
        response.sendRedirect("index.jsp");
    }

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

}

------------------------------------------------------------------------------------------------------------------------------------


정보수정, 탈퇴(form, servlet)


계정삭제는 서블릿을 따로 만들지 않고 UpdateForm 스크립트에 했다.

------------------------------------------------------------------------------------------------------------------------------------

memberUpdateForm.jsp



<%@page import="com.kh.w7.member.model.service.MemberService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.kh.w7.member.model.vo.Member"%>
<% Member loginUser = (Member)session.getAttribute("loginUser"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <h1 align="center"><%= loginUser.getUserName() %>님의 회원 정보 수정<button onclick="deleteMember()">탈퇴하기</button></h1>
   
    <script type="text/javascript">
        function deleteMember() {
            <%
                int result = 0;
           
                result = new MemberService().deleteMember(loginUser);
           
                if(result > 0){
                    session.invalidate();
            %>
                    alert("계정이 삭제되었습니다.");
                    window.location.href = '../../index.jsp';
            <%
                }else{
            %>
                    alert("계정 삭제에 실패했습니다.");
            <%
                }
            %>
           
        }
    </script>
   
    <form action="<%= request.getContextPath() %>/updateMember" method="post">
        <table align="center">
            <tr>
                <td><label>아이디</label></td>
                <td><input type="text" name="userId" value="<%= loginUser.getUserId() %>" readonly></td>
            </tr>
            <tr>
                <td><label>비밀번호</label></td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><label>비밀번호 확인</label></td>
                <td><input type="password" name="password2"></td>
            </tr>
            <tr>
                <td><label>이름</label></td>
                <td><input type="text" name="userName" value="<%= loginUser.getUserName() %>"></td>
            </tr>
            <tr>
                <td><label>나이</label></td>
                <td><input type="number" name="age" value="<%= loginUser.getAge() %>"></td>
            </tr>
            <tr>
                <td>성별</td>
                <td>
                    <% if(loginUser.getGender().equals("M")){%>
                        <input type="radio" name="gender" value="M" id="male" checked>
                        <label for="male">남</label>
                        <input type="radio" name="gender" value="F" id="female">
                        <label for="female">여</label>
                    <% }else { %>
                        <input type="radio" name="gender" value="M" id="male">
                        <label for="male">남</label>
                        <input type="radio" name="gender" value="F" id="female" checked>
                        <label for="female">여</label>
                    <% } %>
                </td>
            </tr>
            <tr>
                <td><label>이메일</label></td>
                <td><input type="email" name="email" value="<%= loginUser.getEmail() %>"></td>
            </tr>
            <tr>
                <td><label>전화번호</label></td>
                <td><input type="tel" name="phone" value="<%= loginUser.getPhone() %>"></td>
            </tr>
            <tr>
                <td><label>주소</label></td>
                <td><input type="text" name="address" value="<%= loginUser.getAddress() %>"></td>
            </tr>
            <tr>
                <td><label>취미</label></td>
                <td>
                    <input type="checkbox" name="hobby" value="운동" id="sports">
                    <label for="sports">운동</label>
                    <input type="checkbox" name="hobby" value="낚시" id="fishing">
                    <label for="sports">낚시</label>
                    <input type="checkbox" name="hobby" value="등산" id="climbing">
                    <label for="sports">등산</label>
                    <input type="checkbox" name="hobby" value="요리" id="cooking">
                    <label for="sports">요리</label>
                </td>
            </tr>
            <tr align="center">
                <td colspan="2">
                    <input type="reset" value="리셋"> &nbsp; &nbsp;
                    <input type="submit" value="변경하기">
                </td>
            </tr>
        </table>
       
        <script type="text/javascript">
            $(function() {
                var arr = '<%= loginUser.getHobby() %>'.split(", ");
               
                $("input[name=hobby]").each(function() {
                    for (var i = 0; i < arr.length; i++) {
                        if ($(this).val() === arr[i]) {
                            $(this).attr("checked", true);
                        }else{
                           
                        }
                    }
                });
            });
           
           
        </script>
       
    </form>
</body>
</html>







UpdateMemberServlet.java



package com.kh.w7.member.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 com.kh.w7.member.model.service.MemberService;
import com.kh.w7.member.model.vo.Member;

@WebServlet("/updateMember")
public class UpdateMemberServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    public UpdateMemberServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //인코딩
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
       
        //request객체에서 parameter꺼내기
       
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
        String userName = request.getParameter("userName");
        String gender = request.getParameter("gender");
        int age = Integer.parseInt(request.getParameter("age"));
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        String address = request.getParameter("address");
        String[] hobby = request.getParameterValues("hobby");
       
        String hobbies = "";
        for (int i = 0; i < hobby.length; i++) {
            if (i == 0) {
                hobbies += hobby[i];
            }else {
                hobbies += ", " + hobby[i];
            }
        }
       
        //reqMember 객체 생성
        Member reqMember = new Member(userId, password, userName, gender, age, email, phone, address, hobbies);
       
        //service 로직으로 전달
        int result = new MemberService().updateMember(reqMember);
       
        //처리 결과에 따른 뷰 페이지 결정
        if (result > 0) {
            HttpSession session = request.getSession();
            session.setAttribute("loginUser", reqMember);
            response.sendRedirect("views/member/memberUpdateForm.jsp");
           
        }
    }

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

}

------------------------------------------------------------------------------------------------------------------------------------


모델(vo, service, dao)


------------------------------------------------------------------------------------------------------------------------------------

Member.java



package com.kh.w7.member.model.vo;

import java.sql.Date;

public class Member implements java.io.Serializable{
    private String userId;
    private String password;
    private String userName;
    private String gender;
    private int age;
    private String email;
    private String phone;
    private String address;
    private String hobby;
    private Date enrollDate;
   
    public Member() {}

    public Member(String userId, String password, String userName, String gender, int age, String email, String phone,
            String address, String hobby, Date enrollDate) {
        super();
        this.userId = userId;
        this.password = password;
        this.userName = userName;
        this.gender = gender;
        this.age = age;
        this.email = email;
        this.phone = phone;
        this.address = address;
        this.hobby = hobby;
        this.enrollDate = enrollDate;
    }

    public Member(String userId, String password, String userName, String gender, int age, String email, String phone,
            String address, String hobby) {
        super();
        this.userId = userId;
        this.password = password;
        this.userName = userName;
        this.gender = gender;
        this.age = age;
        this.email = email;
        this.phone = phone;
        this.address = address;
        this.hobby = hobby;
    }
   
   

    @Override
    public String toString() {
        return "Member [userId=" + userId + ", password=" + password + ", userName=" + userName + ", gender=" + gender
                + ", age=" + age + ", email=" + email + ", phone=" + phone + ", address=" + address + ", hobby=" + hobby
                + ", enrollDate=" + enrollDate + "]";
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public Date getEnrollDate() {
        return enrollDate;
    }

    public void setEnrollDate(Date enrollDate) {
        this.enrollDate = enrollDate;
    }
   
   
   
}





MemberService.java



package com.kh.w7.member.model.service;

import java.sql.Connection;

import com.kh.w7.member.model.dao.MemberDao;
import com.kh.w7.member.model.vo.Member;
import static com.kh.w7.common.JDBCTemplate.*;

public class MemberService {
   
    // 로그인용 메소드
    public Member loginCheck(Member reqMember) {
        Connection con = getConnection();
       
        System.out.println(con);
       
        Member loginUser = new MemberDao().loginCheck(con, reqMember);
       
        close(con);
       
        return loginUser;
    }

    public int insertMember(Member reqMember) {
        Connection con = getConnection();
       
        System.out.println(con);
       
        int result = new MemberDao().insertMember(con, reqMember);
       
        if (result > 0) {
            commit(con);
        }else {
            rollback(con);
        }
       
        close(con);
       
        return result;
    }

    public int updateMember(Member reqMember) {
        Connection con = getConnection();
       
        System.out.println(con);
       
        int result = new MemberDao().updateMember(con, reqMember);
       
        if (result > 0) {
            commit(con);
        }else {
            rollback(con);
        }
       
        close(con);
       
        return result;
    }
   
    public int deleteMember(Member reqMember) {
        Connection con = getConnection();
       
        System.out.println(con);
       
        int result = new MemberDao().deleteMember(con, reqMember.getUserId());
       
        if (result > 0) {
            commit(con);
        }else {
            rollback(con);
        }
       
        close(con);
       
        return result;
    }

}







MemberDao.java



package com.kh.w7.member.model.dao;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.kh.w7.member.model.vo.Member;
import static com.kh.w7.common.JDBCTemplate.*;

public class MemberDao {
   
    private Properties prop = new Properties();

    public MemberDao() {
        String fileName = MemberDao.class.getResource("/sql/member/member-query.properties").getPath();
               
        try {
            prop.load(new FileReader(fileName));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public Member loginCheck(Connection con, Member reqMember) {
        PreparedStatement pstmt = null;
        ResultSet rset = null;
        Member loginUser = null;
       
        String query = prop.getProperty("loginCheck");
       
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, reqMember.getUserId());
            pstmt.setString(2, reqMember.getPassword());
           
            rset = pstmt.executeQuery();
           
            if (rset.next()) {
                loginUser = new Member();
               
                loginUser.setUserId(rset.getString("USER_ID"));
                loginUser.setPassword(rset.getString("PASSWORD"));
                loginUser.setUserName(rset.getString("USER_NAME"));
                loginUser.setGender(rset.getString("GENDER"));
                loginUser.setAge(rset.getInt("AGE"));
                loginUser.setEmail(rset.getString("EMAIL"));
                loginUser.setPhone(rset.getString("PHONE"));
                loginUser.setAddress(rset.getString("ADDRESS"));
                loginUser.setHobby(rset.getString("HOBBY"));
                loginUser.setEnrollDate(rset.getDate("ENROLL_DATE"));
               
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rset);
            close(pstmt);
        }
       
        return loginUser;
    }

    public int insertMember(Connection con, Member reqMember) {
        PreparedStatement pstmt = null;
        int result = 0;
       
        String query = prop.getProperty("insertMember");
       
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, reqMember.getUserId());
            pstmt.setString(2, reqMember.getPassword());
            pstmt.setString(3, reqMember.getUserName());
            pstmt.setString(4, reqMember.getGender());
            pstmt.setInt(5, reqMember.getAge());
            pstmt.setString(6, reqMember.getEmail());
            pstmt.setString(7, reqMember.getPhone());
            pstmt.setString(8, reqMember.getAddress());
            pstmt.setString(9, reqMember.getHobby());
           
            result = pstmt.executeUpdate();
       
       
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
        }
        return result;
    }

    public int updateMember(Connection con, Member reqMember) {
        PreparedStatement pstmt = null;
        int result = 0;
       
        String query = prop.getProperty("updateMember");
       
        try {
            pstmt = con.prepareStatement(query);
           
            pstmt.setString(1, reqMember.getPassword());
            pstmt.setString(2, reqMember.getUserName());
            pstmt.setString(3, reqMember.getGender());
            pstmt.setInt(4, reqMember.getAge());
            pstmt.setString(5, reqMember.getEmail());
            pstmt.setString(6, reqMember.getPhone());
            pstmt.setString(7, reqMember.getAddress());
            pstmt.setString(8, reqMember.getHobby());
            pstmt.setString(9, reqMember.getUserId());
           
           
            result = pstmt.executeUpdate();
           
           
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
        }
        return result;
    }

    public int deleteMember(Connection con, String userId) {
        PreparedStatement pstmt = null;
        int result = 0;
       
        String query = prop.getProperty("deleteMember");
       
        try {
            pstmt = con.prepareStatement(query);
           
            pstmt.setString(1, userId);
           
            result = pstmt.executeUpdate();
           
           
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
        }
        return result;
    }

}

------------------------------------------------------------------------------------------------------------------------------------


그 외 (Properties, Template, footer)


------------------------------------------------------------------------------------------------------------------------------------

JDBCTemplate.java



package com.kh.w7.common;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {
    public static Connection getConnection() {
        Connection conn = null;
        Properties prop = new Properties();
       
        String fileName = JDBCTemplate.class.getResource("/sql/driver.properties").getPath();
               
        System.out.println(fileName);
       
        try {
            prop.load(new FileReader(fileName));
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
           
            // 아래 클래스 구문은 신버전에서는 자동으로 추가되어서 생략해도 되지만
            // 구버전 호환을 위해 명시해두자.
            Class.forName(driver);
           
            conn = DriverManager.getConnection(url, user, password);
           
            conn.setAutoCommit(false);
           
            System.out.println(conn);
           
        } catch (Exception e) {
            e.printStackTrace();
        }
        // prop 파일을 수정할 때 classes 폴더 아래의 파일을 수정하면 서버 껏따 킬때 재생성 되기 때문에 사라진다.
        // 그리고 바로바로 수정사항이 적용이 안될 때도 있는데 메뉴바 상단의 Project - clean을 실행하면 강제 재컴파일 시켜준다.
       
        return conn;
    }
   
    public static void close(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void close(Statement stmt) {
        try {
            if(stmt != null && !stmt.isClosed()) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void close(ResultSet rset) {
        try {
            if(rset != null && !rset.isClosed()) {
                rset.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void commit(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.commit();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void rollback(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}





driver.properties


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



member-query.properties


loginCheck=SELECT * FROM member WHERE user_id=? AND password=?
insertMember=INSERT INTO member VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)
updateMember=UPDATE member SET password = ?, user_name = ?, gender = ?, age = ?, email = ?, phone = ?, address = ?, hobby = ? WHERE user_id = ?
deleteMember=DELETE FROM member WHERE user_id = ?







footer.jsp



<%@ 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>
<style type="text/css">
    hr {
        color: gray;
    }
    p {
        text-align: center;
    }
</style>
</head>
<body>
    <hr>
    <p>Copyright, All right reserved</p>
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------





특별한 기능은 없다.


전부 전에 설명했던 기능들을 짜집기하여 만든 예시이다.


로그아웃 시 Session을 invalidate 하여 삭제한다.




MVC 패턴을 적용한 이번 예의 구조를 살펴보자





폴더의 수가 많고 매우 복잡해 보이지만


파일 하나하나가 잘 분류되어 어떤 기능을 하는지 예상이 된다.


WEB-INF / lib / ojdbc6.jar 파일은 예5 게시글과 같이 끌어오면 된다.





이번 예는 DB를 조회, 입력하여 로그인, 회원가입, 로그아웃을 만들어보자.


새로 나오는 개념은 Session이라는 개념으로 로그인을 성공 했을 경우 로그인의 정보들(계정정보 등)을


담아두어 여러 페이지에서 사용 할 수 있는 방이라고 생각하면 된다.


예를 들어서 네이버에 로그인을 하고 아무 활동도 안하고 시간이 지나면 "세션이 만료되었습니다." 하고 자동 로그아웃 된다.


세션은 로그인 시점부터 관련 정보를 Session을 통해서 담고 있다가


설정해둔 일정 시간이 지나면 파기하게끔 설정해둔 것이다.


파기가 되면 로그아웃 처리가 되는것이다.






그리고 이번에는 java를 공부할 때 다루었던 Properties 파일을 이용해서


반복적으로 사용할 키워드들을 Key, Value 형태로 다룬다.


예에서는 서버의 jdbc.oracle~~~이나 oracle:jdbc:thin과 같이 쓰기 귀찮은 구문을 미리 입력해둔다.










예를 확인해보자.




먼저 로그인폼


index.jsp, loginForm.jsp

------------------------------------------------------------------------------------------------------------------------------------

index.jsp



<%@ 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>
    <h1 align="center">MVC model2 방식을 이용한 회원 로그인</h1>
    <h3 align="center"><a href="views/member/loginForm.jsp">회원 서비스 테스트</a></h3>
</body>
</html>





loginForm.jsp



<%@ 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>
<style type="text/css">
    input[type='submit'] {
        height:55px;
    }
</style>
</head>
<body>
    <div align="center">
        <h2>로그인 테스트</h2>
        <form action="<%=request.getContextPath() %>/login" method="post">
            <table>
                <tr>
                    <td><label>아이디</label></td>
                    <td><input type="text" name="userId"></td>
                    <td rowspan="2"><input type="submit" value="로그인"></td>
                </tr>
                <tr>
                    <td><label>비밀번호</label></td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr>
                    <td colspan="3"><input type="button" onclick="location.href='newAccount.jsp'" value="회원가입"></td>
                </tr>
            </table>
        </form>
       
    </div>
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------


로그인 기능구현 MemberService.java는 멤버 추가도 포함되어 있다.


LoginServlet.java, MemberService.java, MemberDao.java

------------------------------------------------------------------------------------------------------------------------------------

LoginServlet.java



package com.kh.w6.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.kh.w6.member.model.service.MemberService;
import com.kh.w6.member.model.vo.Member;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
    // 로그인처리를 위한 상수 선언
    public static int LOGIN_OK = 1;
    public static int WRONG_PASSWORD = 0;
    public static int ID_NOT_EXIST = -1;
   
    public LoginServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 전송값에 한글이 있는 경우
        request.setCharacterEncoding("UTF-8");
       
        // 2. 전송값 꺼내서 변수에 기록하기
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
       
        System.out.println("ID : " + userId);
        System.out.println("Pwd : " + password);
       
        //3. 비지니스 로직을 처리할 서비스 클래스의 메소드로 전달값 넘김
        Member requestMember = new Member();
        requestMember.setUserId(userId);
        requestMember.setPassword(password);
               
        Member loginUser = new MemberService().loginCheck(requestMember);
       
        //4. 받은 결과에 따라서 성공/실패 페이지 내보내기
            String view = "";
           
            if(loginUser.getStatus() == LOGIN_OK) {
                view = "views/main/main.jsp";
               
                HttpSession session = request.getSession();
               
                session.setAttribute("loginUser",  loginUser);
               
            }else {
                String msg;
               
                if(loginUser.getStatus() == WRONG_PASSWORD) {
                    msg = "패스워드를 잘못 입력하셨습니다.";
                }else {
                    msg = "존재하지 않는 아이디입니다.";
                }
               
                request.setAttribute("msg", msg);
               
                view = "views/common/errorPage.jsp";
               
            }
           
           
            RequestDispatcher reqDispatcher = request.getRequestDispatcher(view);
            reqDispatcher.forward(request, response);
    }

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

}







MemberService.java



package com.kh.w6.member.model.service;

import java.sql.Connection;
import java.sql.SQLException;

import static com.kh.w6.common.JDBCTemplate.*;

import com.kh.w6.member.controller.LoginServlet;
import com.kh.w6.member.model.dao.MemberDao;
import com.kh.w6.member.model.vo.Member;

public class MemberService {
    //로그인 처리용 메소드
    public Member loginCheck(Member requestMember) {
        Connection con = getConnection();
       
        MemberDao mDao = new MemberDao();
       
        int result = mDao.checkStatus(con, requestMember);
       
        Member loginUser = new Member();
        if(result == LoginServlet.LOGIN_OK) { // 로그인 성공
            loginUser = mDao.selectOne(con, requestMember);
            loginUser.setStatus(LoginServlet.LOGIN_OK);
        }else {
            if (result == LoginServlet.WRONG_PASSWORD) { // 비밀번호 틀림
                loginUser.setStatus(LoginServlet.WRONG_PASSWORD);
            }else { // 아이디 틀림
                loginUser.setStatus(LoginServlet.ID_NOT_EXIST);
            }
        }   
       
        return loginUser;
    }
   
    // 회원 추가용 메소드
    public int addMember(Member newMember) {
        Connection con = getConnection();
       
        MemberDao mDao = new MemberDao();
       
        int result = mDao.updateMember(con, newMember);

        try {
            if(result > 0){
                con.commit();
            }else{
                con.rollback();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        return result;
    }
}








MemberDao.java



package com.kh.w6.member.model.dao;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.kh.w6.member.controller.LoginServlet;
import com.kh.w6.member.model.vo.Member;
import static com.kh.w6.common.JDBCTemplate.*;

public class MemberDao {
    private Properties prop = new Properties();
   
    public MemberDao() {
        String fileName = MemberDao.class.getResource("/sql/member/member-query.properties").getPath();
   
        try {
            prop.load(new FileReader(fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }
       
    }
   
    // 로그인 상태 조회용 메소드
    public int checkStatus(Connection con, Member requestMember) {
        PreparedStatement pstmt = null;
        int result = LoginServlet.ID_NOT_EXIST; // 실패했을 때를 위한 초기화
        ResultSet rset = null;
       
        String query = prop.getProperty("checkStatus");
       
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, requestMember.getUserId());
           
            rset = pstmt.executeQuery();
           
            String userId = "";
            String password = "";
           
            if (rset.next()) {
                userId = rset.getString("USER_ID");
                password = rset.getString("PASSWORD");
               
            }
           
            if (requestMember.getUserId().equals(userId) && requestMember.getPassword().equals(password)) {
                result = LoginServlet.LOGIN_OK;
            }else if (requestMember.getUserId().getClass().equals(userId) && !requestMember.getPassword().equals(password)) {
                result = LoginServlet.WRONG_PASSWORD;
            }else {
                result = LoginServlet.ID_NOT_EXIST;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rset);
            close(pstmt);
        }
       
       
        return result;
    }

    // 로그인 정보 조회용 메소드
    public Member selectOne(Connection con, Member requestMember) {
        Member loginUser = null;
        PreparedStatement pstmt = null;
        ResultSet rset = null;
       
        String query = prop.getProperty("selectOne");
       
       
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, requestMember.getUserId());
            pstmt.setString(2, requestMember.getPassword());
           
           
            rset = pstmt.executeQuery();
           
            if (rset.next()) {
                loginUser = new Member();
               
                loginUser.setUserId(rset.getString("USER_ID"));
                loginUser.setPassword(rset.getString("PASSWORD"));
                loginUser.setUserName(rset.getString("USER_NAME"));
                loginUser.setGender(rset.getString("GENDER"));
                loginUser.setAge(rset.getInt("AGE"));
                loginUser.setEmail(rset.getString("EMAIL"));
                loginUser.setPhone(rset.getString("PHONE"));
                loginUser.setAddress(rset.getString("ADDRESS"));
                loginUser.setHobby(rset.getString("HOBBY"));
                loginUser.setEnrollDate(rset.getDate("ENROLL_DATE"));
               
               
               
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rset);
            close(pstmt);
        }
       
       
        return loginUser;
    }

    public int updateMember(Connection con, Member newMember) {
        PreparedStatement pstmt = null;
        int result = 0;
        String query = prop.getProperty("updateOne");
       
        try {
            pstmt = con.prepareStatement(query);
           
            pstmt.setString(1, newMember.getUserId());
            pstmt.setString(2, newMember.getPassword());
            pstmt.setString(3, newMember.getUserName());
            pstmt.setString(4, newMember.getGender());
            pstmt.setInt(5, newMember.getAge());
            pstmt.setString(6, newMember.getEmail());
            pstmt.setString(7, newMember.getPhone());
            pstmt.setString(8, newMember.getAddress());
            pstmt.setString(9, newMember.getHobby());
           
            result = pstmt.executeUpdate();
           
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
        }

       
        return result;
    }

}

------------------------------------------------------------------------------------------------------------------------------------



driver.properties, member-query.properties

------------------------------------------------------------------------------------------------------------------------------------

driver.properties



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






member-query.properties



checkStatus=SELECT * FROM member WHERE user_id = ?
selectOne=SELECT * FROM member WHERE user_id = ? AND password = ?
updateOne=INSERT INTO MEMBER VALUES(?,?,?,?,?,?,?,?,?,SYSDATE)

------------------------------------------------------------------------------------------------------------------------------------



멤버의 정보가 담길 객체



Member.java

------------------------------------------------------------------------------------------------------------------------------------

package com.kh.w6.member.model.vo;

import java.sql.Date;

public class Member implements java.io.Serializable{
    private String userId;
    private String password;
    private String userName;
    private String gender;
    private int age;
    private String email;
    private String phone;
    private String address;
    private String hobby;
    private Date enrollDate;
    private int status = 99; // 1또는 0으로 로그인 성공 실패를 가리기 때문에 쓰레기값을 넣어놓는다.
   
    public Member() {}

    public Member(String userId, String password, String userName, String gender, int age, String email, String phone,
            String address, String hobby, Date enrollDate, int status) {
        super();
        this.userId = userId;
        this.password = password;
        this.userName = userName;
        this.gender = gender;
        this.age = age;
        this.email = email;
        this.phone = phone;
        this.address = address;
        this.hobby = hobby;
        this.enrollDate = enrollDate;
        this.status = status;
    }

    public Member(String userId, String password, String userName, String gender, int age, String email, String phone,
            String address, String hobby) {
        super();
        this.userId = userId;
        this.password = password;
        this.userName = userName;
        this.gender = gender;
        this.age = age;
        this.email = email;
        this.phone = phone;
        this.address = address;
        this.hobby = hobby;
    }
   
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString();
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public Date getEnrollDate() {
        return enrollDate;
    }

    public void setEnrollDate(Date enrollDate) {
        this.enrollDate = enrollDate;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
   
   
   
}

------------------------------------------------------------------------------------------------------------------------------------




로그아웃, 회원가입


LogoutServlet.java, newAccount.java

------------------------------------------------------------------------------------------------------------------------------------

LogoutServlet.java



package com.kh.w6.member.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;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.getSession().invalidate();
       
        response.sendRedirect("views/member/loginForm.jsp");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}



newAccount.java



package com.kh.w6.member.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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.kh.w6.member.model.service.MemberService;
import com.kh.w6.member.model.vo.Member;

@WebServlet("/newaccount")
public class newAccount extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    public newAccount() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
       
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
        String userName = request.getParameter("userName");
        int age = Integer.parseInt(request.getParameter("age"));
        String gender = request.getParameter("gender");
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        String address = request.getParameter("address");
        String[] hobbies = request.getParameterValues("hobby");
       
        String hobby = String.join(",", hobbies);
       
        System.out.println("입력한 정보----------\r\n"
                + userId + "\r\n"
                + password + "\r\n"
                + userName + "\r\n"
                + age + "\r\n"
                + gender + "\r\n"
                + email + "\r\n"
                + phone + "\r\n"
                + address + "\r\n"
                + hobby);
       
        Member newMember = new Member(userId, password, userName, gender, age, email, phone, address, hobby);
       
        System.out.println(newMember.toString());
       
        int result = new MemberService().addMember(newMember);
       
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
       
        if(result > 0){
            out.println("<script>alert('성공적으로 회원 가입 되었습니다.');</script>");
            out.println("<script>location.href='views/member/loginForm.jsp';</script>");
            out.close();
           
        }else{
            out.println("<script>alert('회원 가입에 실패했습니다.');</script>");
            out.println("<script>history.back();</script>");
            out.close();
           
        }

    }

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

}

------------------------------------------------------------------------------------------------------------------------------------




JDBCTemplate.java

------------------------------------------------------------------------------------------------------------------------------------

JDBCTemplate.java



package com.kh.w6.common;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {
    public static Connection getConnection() {
        Connection conn = null;
        Properties prop = new Properties();
       
        String fileName = JDBCTemplate.class.getResource("/sql/driver.properties").getPath();
               
        System.out.println(fileName);
       
        try {
            prop.load(new FileReader(fileName));
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
           
            // 아래 클래스 구문은 신버전에서는 자동으로 추가되어서 생략해도 되지만
            // 구버전 호환을 위해 명시해두자.
            Class.forName(driver);
           
            conn = DriverManager.getConnection(url, user, password);
           
            conn.setAutoCommit(false);
           
            System.out.println(conn);
           
        } catch (Exception e) {
            e.printStackTrace();
        }
        // prop 파일을 수정할 때 classes 폴더 아래의 파일을 수정하면 서버 껏따 킬때 재생성 되기 때문에 사라진다.
        // 그리고 바로바로 수정사항이 적용이 안될 때도 있는데 메뉴바 상단의 Project - clean을 실행하면 강제 재컴파일 시켜준다.
       
        return conn;
    }
   
    public static void close(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void close(Statement stmt) {
        try {
            if(stmt != null && !stmt.isClosed()) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void close(ResultSet rset) {
        try {
            if(rset != null && !rset.isClosed()) {
                rset.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void commit(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.commit();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    public static void rollback(Connection con) {
        try {
            if(con != null && !con.isClosed()) {
                con.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------------





이 외의 폼들은 다음과 같다.


main.jsp, newAccount.jsp, errorPage.jsp

------------------------------------------------------------------------------------------------------------------------------------

main.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.kh.w6.member.model.vo.Member"%>
<% Member loginUser = (Member)session.getAttribute("loginUser"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
    #userInfo {
        float:right;
    }
</style>
</head>
<body>
    <h1 align="center">Welcome to MVC 랜드</h1>
    <div id="userInfo">
        <label><%= loginUser.getUserName() %>님 환영합니다.</label><br>
        <button id="changeInfo">정보수정</button>
        <button id="logout">로그아웃</button>
    </div>
    <script type="text/javascript">
        $(function name() {
            $("#logout").click(function() {
                location.href="<%=request.getContextPath()%>/logout";
            });
        });
    </script>
</body>
</html>





newAccount.jsp



<%@ 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>
    <form action="<%=request.getContextPath() %>/newaccount" method="post">
        <input type="text" placeholder="아이디" name="userId" id="userId">
        <br>
        <input type="password" placeholder="패스워드" name="password" id="password">
        <br>
        <input type="text" placeholder="이름" name="userName" id="userName">
        <br>
        <input type="text" placeholder="나이" name="age" id="age">
        <br>
        <input type="email" placeholder="이메일" name="email" id="email">
        <br>
        <input type="tel" placeholder="휴대폰" name="phone" id="phone">
        <br>
        <input type="text" placeholder="주소" name="address" id="address">
        <br>
        <label>성별 : </label>
        <input type="radio" name="gender" id="male" value="M">
        <label for="male">남</label>
        <input type="radio" name="gender" id="female" value="F">
        <label for="female">여</label>
        <br>
        <label>취미 : </label>
        <input type="checkbox" name="hobby" id="hobby0" value="운동">
        <label for="hobby0">운동</label>
        <input type="checkbox" name="hobby" id="hobby1" value="등산">
        <label for="hobby1">등산</label>
        <input type="checkbox" name="hobby" id="hobby2" value="독서">
        <label for="hobby2">독서</label>
        <input type="checkbox" name="hobby" id="hobby3" value="게임">
        <label for="hobby3">게임</label>
        <input type="checkbox" name="hobby" id="hobby4" value="여행">
        <label for="hobby4">여행</label>
        <br><br>
        <input type="submit" value="가입">&nbsp;&nbsp;
        <input type="reset" value="취소">
    </form>
</body>
</html>






errorPage.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% String msg = (String)request.getAttribute("msg"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1><%= msg %></h1>
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------











MemberException.java 파일은 따로 내용을 수정 안하였으니 만들 내용이 없다.





MVC 패턴이란 Model, View, Controller의 구조로 이루어진걸 말한다.


Run에서 Main 스레드에 의해 프로그램이 실행되고


View를 통해서 화면을 보여주고


Controller에서 사용자가 이용할 기능들을 view와 연결한다.


Model은 Controller에서 사용할 객체와 같은 모델들을 사용하게 된다.


모델에서는 DB와의 통신을 통해 조회, 수정 등 SQL문을 사용한다.




MVC 2 패턴에서는


Controller와 Model 사이에 공통적으로 사용할 기능(DB연결이나 기능) Common이 추가된다.





이 후의 예제는 위와 같은 구조로 작성된다.



+ Recent posts