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. 결론

 

뭔가 쉬운거 같으면서 어려운 느낌이다.

원래 수동적으로 선언하고 했던 것들을 어노테이션을 이용해

자동적으로 주입하고 선언해주는 그런 것이 익숙하지 않아서 그런 듯 하다.

 

조금 더 다뤄보면 익숙해지지는 않아도 어느정도? 이런 거구나~ 라고 이해할 수 있지 않을까??