학습목표
Project에서의 인증을 구현할 수 있다.
JDBC 핵심 API 사용 방법에 대해 설명할 수 있다.
로그인
데이터베이스의 정보와 같으면 성공, 다르면 실패
JDBC Driver 로딩
- 사용하고자 하는 데이터베이스에 맞는 JDBC Driver 로딩
- Driver 클래스명을 지정하거나 직접 생성해서 로딩
Class.forName("org.h2/Driver");
// or
DriverManager.registerDriver(new org.h2.Driver());
데이터베이스별 Driver
- Oracle Driver : oracle.jdbc.driver.OracleDriver
- H2 Driver : org.h2.Driver
- MySQL Driver : org.git.mm.mysql.Driver
Connection 획득
- DriverManager의 getConnection() 함수로 획득
- 데이터베이스 URL 정보와 인증 정보 지정
String url = "jdbc:h2:tcp://localhost/~/test";
Connecgtion connection = DriverManager.getConnection(url, "sa", "");
Oracle Driver URL
jdbc:oracle:oci8:scott/tiger@myhost
jdbc:oracle:thin:scott/tiger@myhost:1521:orcl
MySQL Driver URL
jdbc:mysql://localhost/dev
localhost 위치에 실제 DB가 있는 IP Address 등 지정
H2 Driver URL
jdbc:h2:tcp://localhost/~/test
Statement 생성
- SQL문을 실행시키는 객체
- Connection객체의 createStatement()로 획득
Statement stmt = conn.createStatement();
- execute() : 모든 SQL문 실행, 결과값이 ResultSet이면 true 리턴
- executeQuert() : SELECT문 실행, ResultSet 리턴
- executeUpdate() : UPDATE, INSERT, DELETE 등 실행, 영향을 받은 Row 수 리턴
stmt.executeUpdate(BOARD_DELETE);
ResultSet
- executeQuery()의 리턴 타입
- SELECT 결과 값 표현
- Select 작성 시 Where 절을 어떻게 쓰는가에 따라 맞는 ROW, COLUMN이 추출됨
- ResultSet의 next() 함수로 Row 획득, Row가 획득되면 true 리턴, 획득되지 않으면 false 리턴
- ResultSet의 getXxx() 함수로 COLUMN DATA 획득
- getXxx() 함수의 매개변수로 SELECT된 COLUMN의 Index 혹은 COLUMN NAME 지정
ResultSet rs = stmt.executeQuery(SQL);
while(rs.next()) {
BoardVO board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
board.setTitle(rs.getString("TITLE"));
board.setWriter(rs.getString("WRITER"));
board.setContent(rs.getString("CONTENT"));
board.setRegDate(rs.getDate("REGDATE"));
boardList.add(board);
}
while문안에서 현재 선택된(rs.next()) ROW의 컬럼의 데이터를 추출해서 활용할 수 있다.
Connection close
ResultSet, Statement, Connection은 close 함수 제공
if(rs!=null) rs.close(); // ResultSet rs
if(stmt!=null) stmt.close(); // Statement stmt
if(conn!=null && conn.isClosed())conn.close(); // Connection conn
실습
로그인 처리를 프로젝트에 추가함
UserDAO.java
private static String USER_GET =
"select * from users where id=? and password=?";
데이터베이스에 저장된 데이터가 클라이언트가 입력한 것과 맞는지 비교
public UserVO getUser(UserVO vo) {
UserVO user = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(USER_GET);
stmt.setString(1, vo.getId());
stmt.setString(2, vo.getPassword());
rs = stmt.executeQuery();
if(rs.next()) {
user = new UserVO();
user.setId(rs.getString("ID"));
user.setPassword(rs.getString("PASSWORD"));
user.setName(rs.getString("NAME"));
user.setRole(rs.getString("ROLE"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, stmt, conn);
}
return user;
}
실제 로그인 업무 처리가 필요할 때 호출되는 함수 선언
매개변수 UserVO는 User가 입력한 데이터, 리턴 UserVO는 데이터베이스에서 select 한 User 데이터를 의미함
- 최종적으로 함수가호출되면 User 객체 리턴 (return user;)
- DB가 select 된 게 있다면 (if가 true라면 = 유저가 정상적으로 입력했다면)
- 데이터베이스의 데이터가 저장된 VO 객체 리턴
- 데이터가 없다면 if문 실행 안됨 --> null 객체 리턴
User가 로그인 요청했을 때 실행될 컨트롤러 작성
LoginController.java
public class LoginController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
// User가 입력한 데이터 추출
String id = request.getParameter("id");
String password = request.getParameter("password");
//DBMS 함수에 전달하기 위한 VO 객체 생성
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO dao = new UserDAO();
UserVO user = dao.getUser(vo);
if(user != null) {
// 로그인 성공 상황을 처리하기 위해 HttpSession 객체 작성
HttpSession session = request.getSession();
session.setAttribute("user", user);
return "ok.jsp";
}else {
return "login.html";
}
}
}
로그아웃 요청을 위한 컨트롤러 작성
LogoutController.java
public class LogoutController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.invalidate();
return "login.html";
}
}
로그아웃 처리는 로그인 성공 상태가 저장된 Session 객체의 정보를 무효화 시키면 됨
public class HandlerMapping {
private Map<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String, Controller>();
mappings.put("/insertUser.do", new InsertUserController());
mappings.put("/login.do", new LoginController());
mappings.put("/logout.do", new LogoutController());
}
public Controller getController(String path) {
return mappings.get(path);
}
}
로그인, 로그아웃 컨트롤러를 HandlerMapping.java에 등록함
마지막으로 로그인이 성공했을 때 ok.jsp 화면 전환
ok.jsp
<body>
login ok....
</body>
테스트 진행
login.html 브라우저로 띄워서 테스트
DB에 저장된 데이터 입력하고 login 누르면 500 에러난다 ㅠ 어제 Name쪽 오류 안고치고 해서 그런가? 학원 ot다녀와서 고쳐봐야겠다
--
Name 오류는 고쳤는데 여전히 500 에러...
--> HandlerMapping의 login.do, logout.do를 앞에 대문자로 바꿔서 해결했다.
mappings.put("/Login.do", new LoginController());
mappings.put("/Logout.do", new LogoutController());
에러 로그 잘 보고 대소문자 비교 필수 ...
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
22차시 Project - 게시판 수정, 삭제 (0) | 2023.07.06 |
---|---|
21차시 Project - 게시판 등록, 조회 (0) | 2023.07.05 |
19차시 Project - 회원등록 (1) | 2023.07.05 |
18차시 Project - 환경 구축 (0) | 2023.07.04 |
17차시 Spring Boot (0) | 2023.07.04 |