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