3층 1구역 - 개발의 장/Spring
Spring - DB에 저장된 데이터로 로그인하는 퀴즈(2022-10-18)
상이태상
2022. 10. 18. 13:16
1. 서론
이번에는 데이터베이스에 저장되어 있는 값으로 로그인을 진행해보도록 하자.
데이터베이스의 테이블은 기존에 있던 것을 이용할 것이다.
2. 본론
index와 login 또한 기존에 있던 것을 이용하도록 하자.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인덱스 페이지</title>
<!-- http://localhost:8085/cs/session/index -->
</head>
<body>
<h1>인덱스 페이지</h1>
<br>
<br>
<c:choose>
<c:when test="${empty sessionScope.id }">
<a href="login">로그인</a>
</c:when>
<c:otherwise>
<a href="logout">로그아웃</a><br>
</c:otherwise>
</c:choose>
</body>
</html>
인덱스 잘 나온다. 지금은 로그인이 되어있지 않기 때문에 로그인만 나온다.
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 하기</title>
</head>
<body>
<h3>로그인 페이지</h3>
<form action="login" method="post">
<input type="text" name="id" placeholder="아이디" /> <br>
<input type="password" name="pw" placeholder="비밀번호" /><br>
<input type="submit" value="로그인" />
<input type="button" value="취소" onclick="location.href='index'" />
</form>
</body>
</html>
com.care.cs.session 패키지 내에
4가지 java파일을 만들었다.
SessionDbController, SessionDbDAO, SessionDbDTO, SessionDbService
SessionDbController.java
package com.care.cs.session;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
public class SessionDbController {
@Autowired private HttpSession session;
@Autowired private SessionDbService service;
@RequestMapping("session/index") public void index() {}
// 로그인 폼을 보여주기 위한 get맵핑
@GetMapping("session/login") public void login() {}
// 아이디 비밀번호 검증을 위한 post맵핑
// 요청받은 것에 대한 데이터를 받고 서비스로 넘겨서 검증하고 다시 받아서 뿌려주는 것을
// controller가 한다.
@PostMapping("session/login")
public String login(
String id, String pw,
Model model, RedirectAttributes ra) {
String result = service.login(id, pw);
if(result.equals("로그인 성공")) {
// redirect로 반환 했기 때문에 model이 아닌 RedirectAttributes을 사용해야함.
ra.addFlashAttribute("msg", result);
return "redirect:index";
}
model.addAttribute("msg", result);
return "session/login";
}
@RequestMapping("session/logout")
public String logout() {
session.invalidate();
return "redirect:index";
}
}
SessionDbDAO.java
package com.care.cs.session;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Repository;
//스프링에서 DAO에 무조건적으로 거는 그냥 규약
@Repository
public class SessionDbDAO {
private Connection con;
public SessionDbDAO() {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "시스템에서 권한얻은 아이디";
String password = "오라클 설치 시 설정 비밀번호";
try {
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
}
public SessionDbDTO login(String id) {
String sql = "SELECT * FROM session_test WHERE id=?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(sql);
ps.setString(1, id);
rs = ps.executeQuery();
if(rs.next()) {
SessionDbDTO dto = new SessionDbDTO();
dto.setId(rs.getString("id"));
dto.setPw(rs.getString("pw"));
dto.setName(rs.getString("name"));
dto.setEmail(rs.getString("email"));
return dto;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
SessionDbDTO.java
package com.care.cs.session;
public class SessionDbDTO {
private String id;
private String pw;
private String name;
private String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
SessionDbService.java
package com.care.cs.session;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SessionDbService {
@Autowired private HttpSession session;
@Autowired private SessionDbDAO dao;
public String login(String id, String pw) {
if (id.isEmpty() || pw.isEmpty()) {
return "필수 정보입니다.";
}
SessionDbDTO dto = dao.login(id); //dao에 아이디 값 dto에 넘겨주기
if(dto == null || dto.getPw().equals(pw) == false) {
return "아이디/비밀번호를 확인 후 입력해 주세요.";
}
session.setAttribute("id", id);
session.setAttribute("name", dto.getName());
session.setAttribute("email", dto.getEmail());
return "로그인 성공";
}
}
로그인을 해보자
데이터베이스에 있는 위 아이디로 로그인을 한번 해보자.
로그인도 성공적으로 되었고, 그 결과 세션값도 제대로 갖고 오는 것을 볼 수 있다.
3. 결론
뭔가 쉬운거 같으면서 어려운 느낌이다.
원래 수동적으로 선언하고 했던 것들을 어노테이션을 이용해
자동적으로 주입하고 선언해주는 그런 것이 익숙하지 않아서 그런 듯 하다.
조금 더 다뤄보면 익숙해지지는 않아도 어느정도? 이런 거구나~ 라고 이해할 수 있지 않을까??