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();
}
}
}
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;
}
}