1. signIn.jsp 파일 확인
2. UserController 로그인 처리 기능 확인
3. UserService 기능 추가
4. UserRepository 메소드 추가
5. user.xml 쿼리 추가
6. account/list 인증 처리 해보기
7. header.jsp 메뉴 처리 (jstl 선언 및 사용)
8. 로그아웃 기능 구현
9. 사용자 정의 클래스 추가 연습
10. ExceptionHandler 코드 추가
signIn.jsp 파일 확인
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/view/layout/header.jsp"%>
<div class="col-sm-8">
<h2>로그인 </h2>
<h5>어서오세요 환영합니다</h5>
<div class="bg-light p-md-5 h-75">
<form action="/user/sign-in" method="post">
<div class="form-group">
<label for="username">User name:</label>
<input type="text" class="form-control" placeholder="Enter username" id="username" name="username" value="길동">
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" class="form-control" placeholder="Enter password" id="password" name="password" value="1234">
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
<br>
</div>
<%@ include file="/WEB-INF/view/layout/footer.jsp"%>
UserController 로그인 기능 추가
/**
* 로그인 처리
* @param signInFormDto
* @return 메인 페이지 이동 (수정 예정)
* 생각해보기
* GET 방식 처리는 브라우저 히스토리에 남겨지기 때문에
* 예외적으로 로그인 POST 방식으로 처리 한다. (보안)
*/
@PostMapping("/sign-in")
public String signInProc(SignInFormDto signInFormDto) {
// 1. 유효성 검사 (인증 검사가 더 우선)
if(signInFormDto.getUsername() == null ||
signInFormDto.getUsername().isEmpty()) {
throw new CustomRestfullException("username을 입력하시오", HttpStatus.BAD_REQUEST);
}
if(signInFormDto.getPassword() == null ||
signInFormDto.getPassword().isEmpty()) {
throw new CustomRestfullException("password을 입력하시오", HttpStatus.BAD_REQUEST);
}
User principal = userService.signIn(signInFormDto);
session.setAttribute("principal", principal);
return "/account/list";
}
UserService 기능 추가
/**
* 로그인 서비스 처리
* @param signInFormDto
* @return userEntity 응답
*/
public User signIn(SignInFormDto signInFormDto) {
User userEntity = userRepository.findByUsernameAndPassword(signInFormDto);
if(userEntity == null) {
throw new CustomRestfullException("아이디 혹은 비번이 틀렸습니다",
HttpStatus.INTERNAL_SERVER_ERROR);
}
return userEntity;
}
기능 추가
@Mapper // MyBatis 의존 설정 함(build.gradle 파일)
public interface UserRepository {
// 코드 수정하기
public int insert(SignUpFormDto signUpFormDto);
public int updateById(User user);
public int deleteById(Integer id);
public User findById(Integer id);
public List<User> findAll();
// 추가 작업
public User findByUsernameAndPassword(SignInFormDto signInFormDto);
}
mapper설정
user.xml 기능 구현
<select id="findByUsernameAndPassword"
resultType="com.tenco.bank.repository.model.User">
select * from user_tb
where username = #{username}
and password = #{password}
</select>
account/list 인증 처리 해보기
package com.tenco.bank.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.tenco.bank.handler.exception.CustomPageException;
import com.tenco.bank.handler.exception.CustomRestfullException;
import com.tenco.bank.repository.model.User;
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private HttpSession session;
/**
* 계좌 목록 페이지
* @return 목록 페이지 이동
*/
@GetMapping({"/list", "/"})
public String list() {
//인증검사 처리
User principal = (User)session.getAttribute("principal");
if(principal == null) {
throw new CustomRestfullException("인증된 사용자가 아닙니다.",
HttpStatus.UNAUTHORIZED);
}
return "/account/list";
}
// 출금 페이지
@GetMapping("/withdraw")
public String withdraw() {
return "/account/withdrawForm";
}
// 입금 페이지
@GetMapping("/deposit")
public String deposit() {
return "/account/depositForm";
}
// 이체 페이지
@GetMapping("/transfer")
public String transfer() {
return "/account/transferForm";
}
// 계좌 생성 페이지
@GetMapping("/save")
public String save() {
return "/account/saveForm";
}
// 계좌 상세 보기 페이지
@GetMapping("/detail")
public String detail() {
return "";
}
}
account/list 인증 처리 해보기
package com.tenco.bank.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.tenco.bank.handler.exception.CustomPageException;
import com.tenco.bank.handler.exception.CustomRestfullException;
import com.tenco.bank.repository.model.User;
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private HttpSession session;
/**
* 계좌 목록 페이지
* @return 목록 페이지 이동
*/
@GetMapping({"/list", "/"})
public String list() {
//인증검사 처리
User principal = (User)session.getAttribute("principal");
if(principal == null) {
throw new CustomRestfullException("인증된 사용자가 아닙니다.",
HttpStatus.UNAUTHORIZED);
}
return "/account/list";
}
// 출금 페이지
@GetMapping("/withdraw")
public String withdraw() {
return "/account/withdrawForm";
}
// 입금 페이지
@GetMapping("/deposit")
public String deposit() {
return "/account/depositForm";
}
// 이체 페이지
@GetMapping("/transfer")
public String transfer() {
return "/account/transferForm";
}
// 계좌 생성 페이지
@GetMapping("/save")
public String save() {
return "/account/saveForm";
}
// 계좌 상세 보기 페이지
@GetMapping("/detail")
public String detail() {
return "";
}
}
header.jsp 메뉴 처리 (jstl 선언 및 사용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="en">
<head>
<title>My Bank</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" href="/css/styles.css">
<style>
</style>
</head>
<body>
<div class="jumbotron text-center banner--img" style="margin-bottom: 0">
<h1 class="m--title">My Bank</h1>
<img alt="sample" src="https://picsum.photos/300/200">
</div>
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<a class="navbar-brand" href="#">MENU</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link" href="#">Home</a></li>
<c:choose>
<c:when test="${principal != null}">
<li class="nav-item"><a class="nav-link" href="/user/logout">로그아웃</a></li>
</c:when>
<c:otherwise>
<li class="nav-item"><a class="nav-link" href="/user/sign-in">로그인</a></li>
<li class="nav-item"><a class="nav-link" href="/user/sign-up">회원가입</a></li>
</c:otherwise>
</c:choose>
</ul>
</div>
</nav>
<div class="container" style="margin-top: 30px">
<div class="row">
<div class="col-sm-4">
<h2>About Me</h2>
<h5>Photo of me:</h5>
<div class="m--profile"></div>
<p style="padding: 8px 0">자라나는 코린이에 은행 관리 시스템 입니다</p>
<h3>Some Links</h3>
<p>Lorem ipsum dolor sit ame.</p>
<ul class="nav nav-pills flex-column">
<li class="nav-item"><a class="nav-link" href="/account/save">계좌생성</a></li>
<li class="nav-item"><a class="nav-link" href="/account/list">계좌목록</a></li>
<li class="nav-item"><a class="nav-link" href="/account/withdraw">출금</a></li>
<li class="nav-item"><a class="nav-link" href="/account/deposit">입금</a></li>
<li class="nav-item"><a class="nav-link" href="/account/transfer">이체</a></li>
<li class="nav-item"><a class="nav-link disabled" href="#">My Info</a>
</li>
</ul>
<hr class="d-sm-none">
</div>
로그아웃 처리
@GetMapping("/logout")
public String logout() {
session.invalidate();
return "redirect:/user/sign-in";
}
사용자 정의 클래스 만들기 추가 연습
package com.tenco.bank.handler.exception;
import org.springframework.http.HttpStatus;
import lombok.Getter;
@Getter
public class UnAuthorizedException extends RuntimeException {
private HttpStatus status;
public UnAuthorizedException(String message, HttpStatus status) {
super(message);
this.status = status;
}
}
ExceptionHandler 처리
package com.tenco.bank.handler;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.tenco.bank.handler.exception.CustomRestfullException;
import com.tenco.bank.handler.exception.UnAuthorizedException;
/**
* 예외 발생 시 (Json, XML)
* 데이터를 내려 줄 수 있다
*/
@RestControllerAdvice // IoC 대상 + AOP 기반
public class MyRestfullExceptionHandler {
@ExceptionHandler(Exception.class)
public void exception(Exception e) {
System.out.println(e.getClass().getName());
System.out.println(e.getMessage());
}
// 사용자 정의 예외 클래스 활용
@ExceptionHandler(CustomRestfullException.class)
public String basicException(CustomRestfullException e) {
StringBuffer sb = new StringBuffer();
sb.append("<script>");
// 반드시 마지막에 ; 콜론을 붙어서 사용하자.
sb.append("alert('"+ e.getMessage() +"');");
sb.append("history.back();");
sb.append("</script>");
return sb.toString();
}
@ExceptionHandler(UnAuthorizedException.class)
public String unAuthorizedException(UnAuthorizedException e) {
StringBuffer sb = new StringBuffer();
sb.append("<script>");
// 반드시 마지막에 ; 콜론을 붙어서 사용하자.
sb.append("alert('"+ e.getMessage() +"');");
sb.append("location.href='/user/sign-in';");
sb.append("</script>");
return sb.toString();
}
}
'Spring boot > spring boot 앱 만들어 보기 2 단원' 카테고리의 다른 글
bank app - 계좌 목록 보기 (0) | 2023.04.19 |
---|---|
bank app - 계좌 생성하기 (0) | 2023.04.19 |
bank app - 회원가입(트랜잭션처리) (0) | 2023.04.19 |
bank app - Exception Handler (0) | 2023.04.18 |
bank app - 화면 구현(2) (0) | 2023.04.17 |