
1. 컨트롤러에서 요청받아 처리하기
@Controller
public class UserController {
@PostMapping("/login")
public String login(@RequestParam("user_id") String user_id, @RequestParam("user_pw") String user_pw, HttpSession session, Model model) {
boolean success = userService.login(user_id, user_pw);
if (success) {
session.setAttribute("LoginUser", user_id);
return "redirect:/index";
} else {
model.addAttribute("LoginError", "아이디 또는 비밀번호가 올바르지 않습니다.");
return "Log_in";
}
}
}
2. Service interfaceclass 에 메소드 선언
public interface UserService {
boolean login(String user_id, String user_pw);
}
3. ServiceImpl 에서 메소드 구현하기
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public boolean login(String user_id, String user_pw) {
UserBean userBean = userMapper.findByUser_id(user_id);
if (userBean != null && userBean.getUser_pw().equals(user_pw)) {
return true;
}
return false;
}
}
4. Mapper.java 에서 메소드 선언
@Mapper
public interface UserMapper {
UserBean findByUser_id(@Param("user_id") String user_id);
}
5. Mapper.xml 에서 쿼리문 사용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.SharePlatformProject.mapper.UserMapper">
<select id="findByUser_id" parameterType="String" resultType="com.SharePlatformProject.beans.UserBean">
SELECT *
FROM user
WHERE user_id = #{user_id}
</select>
</mapper>
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>로그인</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/Log_in.css">
</head>
<body>
<div class="container">
<div class="login form">
<header>로그인</header>
<form action="${pageContext.request.contextPath}/login" method="post">
<input type="text" name="user_id" placeholder="Enter your id">
<input type="password" name="user_pw" placeholder="Enter your password">
<input type="submit" class="button" value="Login">
<c:if test="${not empty LoginError}">
<div style="color: red">${LoginError}</div>
</c:if>
</form>
<div class="signup">
<span class="signup">아직 회원이 아니신가요?
<a href="${pageContext.request.contextPath}/Join">회원가입하기</a>
</span>
</div>
</div>
</div>
</body>
</html>
Web Browser 에서 /login 요청발생 --> Controller 에서 정의된 @Mapping 으로 /login 에 대한 요청처리 --> @Autowired private UserService userService; 로 Service를 자동연결 --> Service를 구현하는 Impl 에서도 @Autowired private UserMapper userMapper; Mapper를 자동연결 함으로 써 서로 유기적으로 연결되며 이는 Inversion of Control(IoC) 컨테이너의 한 형태인 Dependency Injection(DI) 패턴을 구현한 것.
@PostMapping("/login") 으로 /login에 대한 요청을 받는다.
public String login(@RequestParam("user_id") String user_id, @RequestParam("user_pw") String user_pw, HttpSession session, Model model) {
}
(1) @RequestParam("user_id") String user_id 와 @RequestParam("user_pw") String user_pw
을 통해서 브라우저가 전송한 요청 중에서 user_id와 user_pw라는 이름의 파라미터를 각각 메소드 인자 user_id와 user_pw로 받아오도록 지정.
받은 걸로 boolean success = userService.login(user_id, user_pw); 에 전달하여 로그인 로직을 수행한다.
*login.jsp 을 확인해보면 input 타입의 name 이 user_id, user_pw 로 설정되어있는데 이것을 받아오는 것.
(2) HttpSession session 으로 HttpSession타입의 session객체를 생성하고
boolean success = userService.login(user_id, user_pw);
if (success) {
session.setAttribute("LoginUser", user_id);
return "redirect:/index";
}
boolean 타입으로 결과가 true or flase 가 success에 반환되는데 success가 참이면
session.setAttribute("LoginUser", user_id); 즉, user_id를 session에 setting 하게된다.
*session은 브라우저가 종료되기전까지 메모리를 유지한다.
(3) Model model , Model 타입의 model 이라는 객체를 생성하고
else {
model.addAttribute("LoginError", "아이디 또는 비밀번호가 올바르지 않습니다.");
return "Log_in";
}
boolean 타입으로 결과 즉, success에 담긴 결과가 거짓일 시
model 객체에 addAttribute("LoginError", "아이디 또는 비밀번호가 올바르지 않습니다.");
"LoginError" 라는 이름으로 "아이디 또는 비밀번호가 올바르지 않습니다." 값을 저장 후
View 에서 "LoginError" 에 접근하여 사용할 수 있다.
Service 에서 boolean타입의 login이라는 메소드를 선언하고 받을 파라미터 입력
boolean login(String user_id, String user_pw);
ServiceImpl 에서 Service에 선언된 메소드를 구현
@Override
public boolean login(String user_id, String user_pw) {
UserBean userBean = userMapper.findByUser_id(user_id);
if (userBean != null && userBean.getUser_pw().equals(user_pw)) {
return true;
}
return false;
}
@Override 로 구현했음을 명시적으로 표현하고 UserBean 타입의 userBean 객체를 생성하고 userBean에는 userMapper.findByUser_id(user_id); 이 값을 넣는다.
if, 만약 findByUser_id(user_id) 이 null 이 아니면서 userBean.getUser_pw().equals(user_pw),
user_pw가 getUser_pw() 와 일치하는 경우 true를 리턴하고 조건에 만족하지 못한다면 false를 반환한다.
Mapper.java 에 xml과 연동할 메소드를 선언
UserBean findByUser_id(@Param("user_id") String user_id);
Mapper.xml 에 id가 findByUser_id 인 user_id를 조회하는 select문을 사용
<select id="findByUser_id" parameterType="String" resultType="com.SharePlatformProject.beans.UserBean">
SELECT *
FROM user
WHERE user_id = #{user_id}
</select>
아래 코드는 본 과정에서 사용된 UserBean 코드
package com.SharePlatformProject.beans;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class UserBean {
@NotBlank(message = "사용자 이름은 필수 입력 값입니다.")
@Size(min = 2, max = 50, message = "사용자 이름은 2자 이상 50자 이하이어야 합니다.")
private String user_name;
//
@NotBlank(message = "사용자 ID는 필수 입력 값입니다.")
@Pattern(regexp = "^[A-Za-z0-9_]{5,20}$", message = "사용자 ID는 5-20자의 알파벳, 숫자, 밑줄(_)만 가능합니다.")
private String user_id;
//
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
@Size(min = 8, message = "비밀번호는 최소 8자 이상이어야 합니다.")
private String user_pw;
//
@NotBlank(message = "비밀번호 확인은 필수 입력 값입니다.")
private String user_pw2;
//
@Min(value = 18, message = "최소 나이는 1살입니다.")
@Max(value = 150, message = "최대 나이는 120살입니다.")
private int user_age;
// ---getter and setter---
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getUser_pw() {
return user_pw;
}
public void setUser_pw(String user_pw) {
this.user_pw = user_pw;
}
public String getUser_pw2() {
return user_pw2;
}
public void setUser_pw2(String user_pw2) {
this.user_pw2 = user_pw2;
}
public int getUser_age() {
return user_age;
}
public void setUser_age(int user_age) {
this.user_age = user_age;
}
}
로그인 기능 구현 끝!