24. 08. 30 개발자교육 10주차 JSP DB 이클립스연동 User 프로젝트

2024. 9. 2. 09:26카테고리 없음

 

 

콩순이를 찾아라

package edu.kh.jdbc.controller;

 

import java.io.IOException;

import java.lang.ProcessBuilder.Redirect;

 

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/check")

public class CheckServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

String str = req.getParameter("check");

 

try {

UserService service = new UserServiceImpl();

 

String kong = service.selectKong(str);

 

req.setAttribute("kong", kong);

 

String path = "/WEB-INF/views/main.jsp";

 

req.getRequestDispatcher(path).forward(req, resp);

}catch(Exception e) {

e.printStackTrace();

}

}

}

<h1>콩순이를 찾아라!!!</h1>

    <form action="/check">
      <input type="text" name="check">
      <button>콩순이 확인</button>
    </form>
  </c:if>

  <%-- 로그인 상태인경우 --%>
  <c:if test="${not empty sessionScope.loginUser}" >
   
    <h1>${loginUser.userName} 환영하오 낯선이여</li>
      <li>userName   : ${loginUser.userName}</li>
      <li>enrollDate : ${loginUser.enrollDate}</li>
    </ul>

    <button id="logout">Logout</button>

    <hr>

 

 


 

IdCheckServlet

package edu.kh.jdbc.controller;

 

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.swing.tree.ExpandVetoException;

 

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/signUp/idCheck")

public class IdCheckServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

 

 

// 비동기로 /signUp/idCheck GET 방식 요천 시

// 응답으로 HTML 코드(문서)가 아닌

// 특정 값만 반환하는 코드 작성

 

// 전달받은 파라미터 얻어오기

String userId = req.getParameter("userId");

 

// 테스트용 코드

// int result = 0;

// if(userId.equals("user01")) result = 1;

 

// 중복확인 서비스 호출 후 결과 반환받기

UserService service = new UserServiceImpl();

int result = service.idCheck(userId);

 

 

// HTML이 아니라 "값" 을 반환하기 위한 응답세팅

// - application/json : (쉬운해석) JS에서 사용 가능한 값

resp.setContentType("application/json; charset=UTF-8");

 

// 클라이언트와 연결된 출력용 스트림 얻어오기

PrintWriter out = resp.getWriter();

out.print(result);

 

 

}catch(Exception e) {

e.printStackTrace();

}

 

}

 

 

 

}

 

 

DeleteUserServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/deleteUser")

public class DeleteUserServlet extends HttpServlet {

 

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

// 파라미터 얻어오기

int userNo = Integer.parseInt(req.getParameter("userNo"));

 

// 서비스 호출 후 결과 반환받기

UserService service = new UserServiceImpl();

 

int result = service.deleteUser(userNo);

 

// 삭제 결과에 따라 출력 메시지 지정

String message = null;

 

if(result > 0)message = "삭제되었습니다";

else message = "해당사용자가 존재하지 않습니다";

 

// session scope에 message 세팅

req.getSession().setAttribute("message", message);

 

// 사용자 목록(/selectAll) 리다이렉트

resp.sendRedirect("/selectAll");

 

}catch(Exception e) {

e.printStackTrace();

 

}

 

 

 

 

 

 

 

}

 

}

LoginServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

import jakarta.servlet.http.HttpSession;

 

@WebServlet("/login")

public class LoginServlet extends HttpServlet{

 

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

// 전달받은 파라미터 얻어오기

String userId = req.getParameter("userId");

String userPw = req.getParameter("userPw");

 

// id,pw가 일치하는 회원의 정보를 조회하는

// 서비스 호출 후 결과반환

UserService service = new UserServiceImpl();

 

User loginUser = service.login(userId, userPw);

 

// session객체 얻어오기

HttpSession session = req.getSession();

 

// 로그인 성공 시 (조회결과가 있는 경우)

// session scope에 로그인된 회원의 정보를 세팅

// + 만료시간 설정 <loginUser 가 null 이아니라면!! -> 로긴성공>

if(loginUser != null) {

session.setAttribute("loginUser", loginUser);

// 만료시간(최대 활성화되는 기간 - 초단위, 30분)

session.setMaxInactiveInterval(1800);

 

}else { // 로그인 실패

session.setAttribute("message", "ID 또는 PW 가 다릅니다");

}

 

// 메인페이지(/) 리다이렉트

resp.sendRedirect("/");

 

}catch(Exception e) {

e.printStackTrace();

}

 

 

 

 

 

}

 

 

 

 

}

LogoutServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/logout")

public class LogoutServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

req.getSession().invalidate(); // 세션 무효화

// == 세션 만료

 

// 메인페이지(/) 리다이렉트

resp.sendRedirect("/");

 

 

}

 

}

MainServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/main")

public class MainServlet extends HttpServlet {

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

String path = "/WEB-INF/views/main.jsp";

req.getRequestDispatcher(path).forward(req, resp);

 

 

 

}

 

}

SearchServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

import java.util.List;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/search")

public class SearchServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

// 파라미터 얻어오기

String searchId = req.getParameter("searchId");

 

UserService service = new UserServiceImpl();

 

// 검색어가 아이디에 포함된 사용자 모두 조회하는

// 서비스 호출 후 결과반환받기

List<User> userList = service.search(searchId);

 

// request scope에 userList 세팅

 

req.setAttribute("userList", userList);

 

// forward할 jsp경로

String path = "/WEB-INF/views/selectAll.jsp";

req.getRequestDispatcher(path).forward(req, resp);

 

 

}catch(Exception e) {

e.printStackTrace();

}

 

 

}

 

 

 

}

SelectAllServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

import jakarta.servlet.http.HttpSession;

 

@WebServlet("/selectAll")

public class SelectAllServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

 

// 요청

 

UserService service = new UserServiceImpl();

 

List<User> userList = new ArrayList<User>();

 

userList = service.selectAll();

 

req.setAttribute("userList", userList);

 

// 경로 지정 / 코드순서는 위에서 아래로

String path = "/WEB-INF/views/selectAll.jsp";

 

req.getRequestDispatcher(path).forward(req, resp);

 

}catch(Exception e) {

e.printStackTrace();

}

// String userNo = req.getParameter("userNo");

// String userId = req.getParameter("userId");

// String userPw = req.getParameter("userPw");

// String userName = req.getParameter("userName");

// String enrollDate = req.getParameter("enrollDate");

}

}

 

SelectUserServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/selectUser")

public class SelectUserServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

UserService service = new UserServiceImpl();

 

 

try {

 

int userNo = Integer.parseInt(req.getParameter("userNo"));

 

User userOne = service.selectUser(userNo);

 

// System.out.println(userOne);

 

req.setAttribute("userOne", userOne);

 

String path = "/WEB-INF/views/selectUser.jsp";

req.getRequestDispatcher(path).forward(req, resp);

 

}catch(Exception e) {

e.printStackTrace();

}

 

}

 

 

}

SignUpServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

import jakarta.servlet.http.HttpSession;

 

@WebServlet("/signUp")

public class SignUpServlet extends HttpServlet {

 

 

// 사용자 등록페이지로 전환

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

// 요청 위임

String path = "/WEB-INF/views/signUp.jsp";

req.getRequestDispatcher(path).forward(req, resp);

}

 

// 사용자 등록 요청처리

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

// 제출된 파라미터 얻어오기a

// 제출된 input의 name속성

String userId = req.getParameter("userId");

String userPw = req.getParameter("userPw");

String userName = req.getParameter("userName");

 

System.out.println(userId);

System.out.println(userPw);

System.out.println(userName);

 

try {

// 전달받은 파라미터를 한번에 저장할 User DTO객체 생성

User user = new User();

user.setUserId(userId);

user.setUserPw(userPw);

user.setUserName(userName);

 

// 서비스(INSERT) 호출 후 결과 반환받기

// 결과(삽입된 행의 개수, int) 반환받기

UserService service = new UserServiceImpl();

int result = service.insertUser(user);

 

// 결과에 따라 응답 방법처리

String message = null;

 

if(result >0) message = userId + "사용자 등록 성공";

else message = "등록 실패";

 

// page, request, session, application 중

// session을 이용해서 message 값 전달

HttpSession session = req.getSession();

 

session.setAttribute("message", message);

 

// 메인페이지로 리다이렉트(재요청)

resp.sendRedirect("/");

 

// 메인페이지로 리다이렉트(재요청)

}catch(Exception e) {

e.printStackTrace();

}

}

}

UpdateUserServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

 

@WebServlet("/updateUser")

public class UpdateUserServlet extends HttpServlet{

 

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

// 전달받은 파라미터 얻어오기

String userPw = req.getParameter("userPw");

String userName = req.getParameter("userName");

int userNo = Integer.parseInt(req.getParameter("userNo"));

 

// 파라미터를 User 객체에 세팅

User user = new User();

user.setUserPw(userPw);

user.setUserName(userName);

user.setUserNo(userNo);

 

// 서비스 호출 후 결과반환

UserService service = new UserServiceImpl();

int result = service.updateUser(user);

 

// 결과에따라 메시지 지정

String message = null;

if(result >0) message = "수정 성공";

else message = "수정 실패";

 

// session에 message 세팅

req.getSession().setAttribute("message", message);

 

// 사용자 상세 정보조회 페이지로 리다이렉트

resp.sendRedirect("/selectUser?userNo=" + userNo);

}catch(Exception e) {

e.printStackTrace();

}

}

}

 

이위에까지 Controller 패키지였음!

Servlet으로써

하나의 기능을 수행할 때마다

HttpServlet과 WebSevlet으로

경로를 지정해 VS코드와 연결해줌


common (package) - JDBCTemplate

package edu.kh.jdbc.common;

 

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

 

/* Template : 양식, 주형, 본을 뜨기 위한 틀

* -> "미리 만들어뒀다"를 의미

*

* JDBCTemplate :

* JDBC 관련 작업을 위한 코드를

* 미리 작성해서 제공하는 클래스

*

* - getConnection() + AutoCommit false

* - commit() / rollback()

* - 각종 close()

*

* ***** 중요 *****

* 어디서든 JDBCTemplate 클래스를

* 객체로 만들지 않고도 메서드를 사용할 수 있도록 하기위해

* 모든 메서드를 public static 으로 선언

*/

public class JDBCTemplate {

 

// 필드

private static Connection conn = null;

// -> static 메서드에서 사용가능한 필드는 static 필드만 가능

 

// 메서드

 

/**

* 호출 시 Connection 객체를 생성해서 반환하는 메서드

* @return conn

*/

public static Connection getConnection() {

 

try {

 

// 이전에 참조하던 Connection 객체가 존재하고

// 아직 close된 상태가 아니라

if(conn != null && !conn.isClosed()) {

return conn; // 새로 만들지 않고 기존 Connection 반환

}

 

 

 

/* DB 연결을 위한 정보들을 별도파일에 작성하여

* 읽어오는 형식으로 코드를 변경!!!

*

* 이유 1 : Github에 코드올리면 해킹하세요~ 이런 뜻이라

* 보안적인 측면에서 코드를 직접 보지 못하게함

*

* 이유 2 : 혹시라도 연결하는 DB정보가 변경될 경우

* Java 코드가 아닌

* 읽어오는 파일의 내용을 수정하면 되기 때문에

* Java 코드 수정 x -> 추가 컴파일 필요 x

* --> 개발 시간 단축!!

*/

 

/* driver.xml 파일내용 읽어오기 */

 

// 1. Properties 객체생성

// - Map의 자식클래스

// - K, V가 모두 String 타입

// - xml파일 입출력을 쉽게 할 수 있는 메서드제공

Properties prop = new Properties();

 

// 2. Properties 메서드를 이용해서

// driver.xml 파일내용을 읽어와 prop에 저장

 

String filePath =

JDBCTemplate.class

.getResource("/edu/kh/jdbc/sql/driver.xml").getPath();

 

// -> 빌드(코드를 실행 가능한 상태로 만드는 것) 시

// 컴파일된 JDBCTemplate.class 파일의 위치에서

// /edu/kh/jdbc/sql/driver.xml 파일을 찾아

// 실제경로를 얻어오기

 

// 프로젝트 폴더 바로아래 driver.xml 파일

 

prop.loadFromXML(new FileInputStream(filePath));

 

// prop에 저장된 값(driver.xml 에서 읽어온 값)을 이용해

// Connection 객체 생성하기

 

// prop.getProperty("KEY") : KEY가 일치하는 Value를 반환

Class.forName(prop.getProperty("driver"));

String url = prop.getProperty("url");

String userName = prop.getProperty("userName");

String password = prop.getProperty("password");

 

conn = DriverManager.getConnection(url, userName, password);

 

// 만들어진 Connection에 AutoCommit 끄기

conn.setAutoCommit(false);

 

}catch (Exception e) {

e.printStackTrace();

}

 

return conn;

}

 

// ------------------------------------------------------------------------------

 

/* 트랜잭션 제어 처리 메서드(commit, rollback) */

 

/**

* 전달받은 커넥션에서 수행한 SQL을 COMMIT하는 메서드

* @param conn

*/

public static void commit(Connection conn) {

try {

if(conn != null && !conn.isClosed()) conn.commit();

 

}catch(SQLException e) {

e.printStackTrace();

}

}

 

/**

* 전달받은 커넥션에서 수행한 SQL을 Rollback하는 메서드

* @param conn

*/

public static void rollback(Connection conn) {

try {

if(conn != null && !conn.isClosed()) conn.rollback();

 

}catch(SQLException e) {

e.printStackTrace();

}

}

 

// -------------------------------------------------------------

 

/**

* 전달받은 커넥션을 close(자원반환)하는 메서드

* @param conn

*/

public static void close(Connection conn) {

try {

if(conn != null && !conn.isClosed()) conn.close();

 

}catch(SQLException e) {

e.printStackTrace();

}

}

 

 

/**

* 전달받은 Statement를 close(자원반환)하는 메서드

* + PreparedStatement도 close 처리 가능!!

* 왜?? PreparedStatement가 Statement의 자식이기 때문에!!

* (다형성 업캐스팅)

* @param stmt

*/

public static void close(Statement stmt) {

try {

if(stmt != null && !stmt.isClosed()) stmt.close();

 

}catch(SQLException e) {

e.printStackTrace();

}

}

 

/**

* 전달받은 ResultSet을 close(자원 반환)하는 메서드

* @param rs

*/

public static void close(ResultSet rs) {

try {

if(rs != null && !rs.isClosed()) rs.close();

 

}catch(SQLException e) {

e.printStackTrace();

}

}

 

}

 


dto(package) - User

package edu.kh.jdbc.dto;

 

import lombok.AllArgsConstructor;

import lombok.Getter;

import lombok.NoArgsConstructor;

import lombok.Setter;

import lombok.ToString;

 

// DTO(Data Transfer Object) : 값을 묶어서 전달하는 용도의 객체

// -> DB에 데이터를 전달하거나, 가져올 때도 사용

// == DB 특정 테이블의 한 행의 데이터를 저장할 수 있는 형태로 class 작성

 

@Getter

@Setter

@NoArgsConstructor // 기본생성자

@AllArgsConstructor // 매개변수생성자

@ToString

public class User {

private int userNo;

private String userId;

private String userPw;

private String userName;

private String enrollDate;

// --> enrollDate는 왜 java.sql.Date가 아니라 Strig인가??

// -> DB 조회 시 날짜 데이터를 원하는 형태의 문자열로

// 변환하여 조회할 예정 -> TO_CHAR() 이용

}

 


Service(package) - SelectAllServlet

package edu.kh.jdbc.service;

 

import java.util.List;

 

import edu.kh.jdbc.dto.User;

 

public interface UserService {

 

 

/** 사용자등록

*

* @param user

* @return result 1 || 0

*/

int insertUser(User user) throws Exception;

 

/**

* 아이디 중복여부 확인

* @param userId

* @return result(1:중복, 0:중복X)

* @throws Exception

*/

int idCheck(String userId) throws Exception;

 

/** 로그인

* @param userId

* @param userPw

* @return loginUser

* @throws Exception

*/

User login(String userId, String userPw) throws Exception;

 

/**

* 사용자 목록조회

* @return

* @throws Exception

*/

List<User> selectAll() throws Exception;

 

/**

* 검색어가 아이디에 포함된 사용자 조회

* @param searchId

* @return

* @throws Exception

*/

List<User> search(String searchId) throws Exception;

 

/**

* 상세조회

* @param userNo

* @return

* @throws Exception

*/

User selectUser(int userNo) throws Exception;

 

/**

* 사용자 삭제

* @param userNo

* @return result

* @throws Exception

*/

int deleteUser(int userNo) throws Exception;

 

/**

* 사용자 수정

* @param user

* @return

* @throws Exception

*/

int updateUser(User user) throws Exception;

- 콩순이 -

String selectKong(String str) throws Exception;

}

 

service(package) - UserServiceImpl

package edu.kh.jdbc.service;

 

// 지정된 클래스의 static 메서드를 모두 얻어와 사용

import static edu.kh.jdbc.common.JDBCTemplate.*;

 

import java.sql.Connection;

import java.util.ArrayList;

import java.util.List;

 

import edu.kh.jdbc.common.JDBCTemplate;

import edu.kh.jdbc.dao.UserDao;

import edu.kh.jdbc.dao.UserDaoImpl;

import edu.kh.jdbc.dto.User;

 

public class UserServiceImpl implements UserService{

 

// 필드

private UserDao dao = new UserDaoImpl();

 

@Override

public int insertUser(User user) throws Exception {

 

// 1. Connection 생성

// JDBCTemplate.getConnection(); // 위에 써놔서 안써도됨

Connection conn = getConnection();

 

// 2. DAO 메서드 호출 후 결과 반환

int result = dao.insertUser(conn, user);

 

// 3. DML 수행 -> 트랜잭션 처리

if(result > 0) commit(conn);

else rollback(conn);

 

// 4. 사용 완료된 Connection 반환

close(conn);

 

// 5. 결과반환

return result;

}

 

@Override

public int idCheck(String userId) throws Exception {

 

Connection conn = getConnection();

 

int result = dao.idCheck(conn, userId);

 

close(conn);

 

return result;

}

 

@Override

public User login(String userId, String userPw) throws Exception {

 

Connection conn = getConnection();

 

// DAO 메서드 호출 후 결과 반환받기

User loginUser = dao.login(conn, userId, userPw);

 

close(conn);

 

return loginUser;

}

 

 

@Override

public List<User> selectAll() throws Exception {

 

Connection conn = getConnection();

 

List<User> userList = new ArrayList<User>();

// dao에게 DB 전달해서 정보 가져와

userList = dao.selectAll(conn);

 

close(conn);

 

return userList;

}

 

 

@Override

public List<User> search(String searchId) throws Exception {

 

// 커넥션 생성

Connection conn = getConnection();

 

// 데이터 가공(없으면 패스)

searchId = '%' + searchId + '%'; // %검색어% 형태로 가공

 

// DAO 호출 후 결과 반환받기

List<User> userList = dao.search(conn, searchId);

 

close(conn);

 

return userList;

}

 

@Override

public User selectUser(int userNo) throws Exception {

 

Connection conn = getConnection();

 

User userOne = dao.selectUser(conn, userNo);

 

close(conn);

 

return userOne;

}

 

@Override // DML은 commit, rollback 필요!!★☆★☆

public int deleteUser(int userNo) throws Exception {

 

Connection conn = getConnection();

 

int result = dao.deleteUser(conn, userNo);

 

// 트랜잭션 제어처리 (dao에서 DML 수행했으니까!!!)

if(result > 0) commit(conn);

else rollback(conn);

 

close(conn);

 

return result;

}

 

@Override

public int updateUser(User user) throws Exception {

 

Connection conn = getConnection();

 

int result = dao.updateUser(conn, user);

 

if(result > 0) commit(conn);

else rollback(conn);

 

close(conn);

 

return result;

}

 

@Override

public String selectKong(String str) throws Exception {

 

Connection conn = getConnection();

 

String kong = dao.selectKong(conn, str);

 

close(conn);

 

return kong;

}

 

}

 


 

dao(package) - UserDao

package edu.kh.jdbc.dao;

 

import java.sql.Connection;

import java.util.List;

 

import edu.kh.jdbc.dto.User;

 

public interface UserDao {

 

/** 사용자 등록

* @param conn

* @param user

* @return

* @throws Exception

*/

int insertUser(Connection conn, User user) throws Exception;

 

/**

* 아이디 중복 여부 확인

* @param conn

* @param userId

* @return

* @throws Exception

*/

int idCheck(Connection conn, String userId) throws Exception;

 

/** 로그인

* @param conn

* @param userId

* @param userPw

* @return loginUser

* @throws Exception

*/

User login(Connection conn, String userId, String userPw) throws Exception;

 

List<User> selectAll(Connection conn) throws Exception;

 

/**

* 검색어가 아이디에 포함된 사용자 조회

* @param conn

* @param searchId

* @return userList

* @throws Exception

*/

List<User> search(Connection conn, String searchId) throws Exception;

 

 

/**

* 상세조회

* @param conn

* @param userNo

* @return

* @throws Exception

*/

User selectUser(Connection conn, int userNo) throws Exception;

 

/**

* 사용자 삭제

* @param conn

* @param userNo

* @return result

* @throws Exception

*/

int deleteUser(Connection conn, int userNo) throws Exception;

 

/**

* 사용자 수정

* @param conn

* @param user

* @return result

* @throws Exception

*/

int updateUser(Connection conn, User user) throws Exception;

 

String selectKong(Connection conn, String str) throws Exception;

}

 

dao(package) - UserDaoImpl

package edu.kh.jdbc.dao;

 

import static edu.kh.jdbc.common.JDBCTemplate.*;

 

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

 

import edu.kh.jdbc.common.JDBCTemplate;

import edu.kh.jdbc.dto.User;

 

public class UserDaoImpl implements UserDao{

 

// 필드

 

// JDBC 객체 참조변수 + Properties 참조변수 선언!

private Statement stmt;

private PreparedStatement pstmt;

private ResultSet rs;

 

private Properties prop;

// -> K,V가 모두 String인 Map, 파일 입출력이 쉬움

 

// 기본 생성자 -- 생성될 때 실행되는 메서드

public UserDaoImpl() {

 

// 객체생성시

// 외부에 존재하는 sql.xml 파일을 읽어와

// prop에 저장

 

try {

String filePath =

JDBCTemplate.class

.getResource("/edu/kh/jdbc/sql/sql.xml").getPath();

 

// 지정된 경로의 XML 파일내용을 읽어와

// Properties 객체에 K:V 세팅

prop = new Properties();

prop.loadFromXML(new FileInputStream(filePath));

 

}catch(Exception e) {

e.printStackTrace();

}

 

}

 

@Override

public int insertUser(Connection conn, User user) throws Exception {

 

// 1. 결과 저장용 변수 선언

int result = 0;

 

try {

// 2. SQL 작성

// -> properties를 이용해 외부 sql.xml 파일에서

// 읽어온 sql 이용

String sql = prop.getProperty("insertUser");

 

// 3. PreparedStatement (플레이스홀더 3개라 써야함) 생성

pstmt = conn.prepareStatement(sql);

 

// 4. ? 에 알맞은 값 세팅

pstmt.setString(1, user.getUserId());

pstmt.setString(2, user.getUserPw());

pstmt.setString(3, user.getUserName());

 

// 5. SQL(INSERT) 수행(executeUpdate()) 후

// 결과(삽입된 행의 개수, int) 반환

result = pstmt.executeUpdate();

 

}finally {

// 6. 사용한 JDBC 객체 자원 반환(close)

close(pstmt);

 

}

 

 

return result;

}

 

@Override

public int idCheck(Connection conn, String userId) throws Exception {

 

// 결과 저장할 변수 선언

int result = 0;

 

try {

String sql = prop.getProperty("idCheck");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, userId);

 

rs = pstmt.executeQuery();

 

if(rs.next()) { // 결과가 1행밖에 없어서 if 사용

result = rs.getInt(1); // 조회결과 1번 컬럼 값 얻어옴

}

 

}finally {

close(rs);

close(pstmt);

 

}

 

 

return result;

}

 

@Override

public User login(Connection conn, String userId, String userPw) throws Exception {

 

// 결과 저장용 변수선언

User loginUser = null;

 

try {

 

String sql = prop.getProperty("login");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, userId);

pstmt.setString(2, userPw);

 

rs = pstmt.executeQuery();

 

if(rs.next()) {

int useNo = rs.getInt("USER_NO");

String id = rs.getString("USER_ID");

String pw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String enrollDate = rs.getString("ENROLL_DATE");

 

loginUser =

new User(useNo, userId, userPw, userName, enrollDate);

}

 

}finally {

close(rs);

close(pstmt);

}

 

 

return loginUser;

}

 

@Override

public List<User> selectAll(Connection conn) throws Exception {

 

// 결과 저장용 변수 선언 // ArrayList 객체를 만든 이유

// SQL얻어올 예정

List<User> userList = new ArrayList<User>();

 

try {

 

String sql = prop.getProperty("selectAll");

 

// 강사님이 한 코드

// stmt = conn.createStatement();

// rs = stmt.executeQuery(sql);

 

 

pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();

 

while(rs.next()) {

int userNo = rs.getInt("USER_NO");

String userId = rs.getString("USER_ID");

String userPw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String userEnrollDate = rs.getString("ENROLL_DATE");

 

User user = new User(userNo, userId, userPw, userName, userEnrollDate);

 

userList.add(user);

}

}finally {

close(rs);

close(pstmt);

}

 

return userList;

}

 

@Override

public List<User> search(Connection conn, String searchId) throws Exception {

 

// ArrayList 객체를 미리 생성하는 이유

// == 조회된 결과를 추가(add)해서 묶어 반환하기 위해

List<User> userList = new ArrayList<User>();

 

try {

 

String sql = prop.getProperty("search");

 

// 강사님이 한 코드

// stmt = conn.createStatement();

// rs = stmt.executeQuery(sql);

 

 

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, searchId); // '%검색어%'

 

rs = pstmt.executeQuery();

 

while(rs.next()) {

int userNo = rs.getInt("USER_NO");

String userId = rs.getString("USER_ID");

String userPw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String userEnrollDate = rs.getString("ENROLL_DATE");

 

User user = new User(userNo, userId, userPw, userName, userEnrollDate);

 

userList.add(user);

}

}finally {

close(rs);

close(pstmt);

}

 

return userList;

}

 

@Override

public User selectUser(Connection conn, int userNo) throws Exception {

 

User userOne = null;

 

try {

String sql = prop.getProperty("selectUser");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setInt(1, userNo);

 

rs = pstmt.executeQuery();

 

if(rs.next()) {

String userId = rs.getString("USER_ID");

String userPw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String userEnrollDate = rs.getString("ENROLL_DATE");

 

userOne = new User(userNo, userId, userPw, userName, userEnrollDate);

}

 

 

}finally {

close(rs);

close(pstmt);

}

 

 

return userOne;

}

 

/**

* 사용자 삭제

*/

@Override

public int deleteUser(Connection conn, int userNo) throws Exception {

 

// 결과 저장용변수

int result = 0; // 왜 0이냐? 결과 행을 저장할거니까 - delete 결과 행 개수 저장

 

try {

String sql = prop.getProperty("deleteUser");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setInt(1, userNo);

 

// DML은 executeUpdate() 호출

result = pstmt.executeUpdate();

 

}finally {

close(pstmt);

}

 

return result;

}

 

@Override

public int updateUser(Connection conn, User user) throws Exception {

 

int result = 0;

 

try {

String sql = prop.getProperty("updateUser");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, user.getUserName());

pstmt.setString(2, user.getUserPw());

pstmt.setInt(3, user.getUserNo());

 

result = pstmt.executeUpdate();

 

}finally {

 

close(pstmt);

}

 

return result;

}

 

@Override

public String selectKong(Connection conn, String str) throws Exception {

 

String kong = null;

 

try {

String sql = prop.getProperty("selectKong");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, str);

 

rs = pstmt.executeQuery();

 

if(rs.next()) {

 

// 담아갈 값이 담겨있는 변수이름 왼쪽 || 담아가고싶은 내용 or 값 or 결과 오른쪽

kong = rs.getString("USER_NAME");

 

}

}finally {

 

close(rs);

close(pstmt);

}

 

 

return kong;

}

 

}