Spring 관리자 로그인, 회원 강제 탈퇴 기능 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 22. 14:20

관리자 로그인 및 관리자 권한중 하나인 회원 강제 탈퇴 기능 구현

 

관리자 권한 : 모든 게시글 삭제 가능, 모든 댓글 삭제 가능, 공지사항에 글쓰기 가능, 회원 강제 탈퇴 가능

 

 

 

- 기본 구조 -

 



  
  메인페이지에서 관리자 로그인 페이지로 접속후 admin 테이블에 저장된 관리자의 아이디와 비밀번호가 일치하면 로그인을 하도록함.


  관리자로 로그인한 상태에서만 출력되는 숨겨진 기능인 회원 강제 탈퇴 메뉴가 출력되도록 함.


  회원 강제 탈퇴 메뉴를 클릭하면 강제 탈퇴 시킬 회원의 아이디를 입력하게 한 후에 해당 회원의 아이디가 member 테이블안에 있는 id일때


  메시지를 출력하고 해당 회원을 강제 탈퇴 시킨다.

 

 



  view
  ㄴadmin_login.jsp (관리자 로그인 관련)
  ㄴadmin_member_forced_eviction_view.jsp (회원 강제 탈퇴 기능 관련)




  Controller
  ㄴAdminController.java (관리자 로그인 및 기능 관련 컨트롤러)




  Service
  ㄴAdminService.java (관리자 관련 서비스 인터페이스)
  ㄴAdminServiceImpl.java (관리자 관련 서비스 구현 클래스)




  model
  ㄴAdminDAO.java (관리자 관련 DAO 인터페이스)
  ㄴAdminDAOImpl.java (관리자 관련 DAO 구현 클래스)
  ㄴAdminDTO (계층별 자료 전송)




  adminMapper.xml (쿼리 작성 mapper.xml)

 

 

 

admin_login.jsp (관리자 로그인 관련)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="576736845363-o0474pib5q69qlcv6lm7o42hs6lu5u59.apps.googleusercontent.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name = "viewport" content = "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,
width=device-width" />
 
<title>Insert title here</title>
 
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
 
 
<br>
<br>
<br>
<br>
<br>
 
<center>
<table border="1" width="400">
 
<tr>
<td>
<br>
<center>
<span style="color:green; font-weight : bold;">관리자 로그인</span>
</center>
 
<center>
<!-- 로그인창 -->
<form action ="admin_login.do" method = "post">
<center>
<br>
-관리자 아이디- <input type = "text" name="admin_id" placeholder="  ID를 입력하세요 "><br><br>
-관리자 비밀번호- <input type = "password" name="admin_pass" placeholder="  비밀번호를 입력하세요 "><br><br>
<button type = "submit" name = "submit" >로그인</button>
 
<br>
<br>
<div class = "row">
    <div class="col-xs-8">
        <div class="checkbox icheck">
        <label>
            <input type = "checkbox" name = "useCookie"> 로그인유지
        </label>
        </div>
    </div>
</div>
</center>
 
<center>
 
 
</form>
 
</center>
</td>
</tr>
</table>
</center>
</body>
 
 
<!-- 로그인 실패나 성공시 메시지를 받아서 출력하는 자바스크립트 구문 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(function(){
        var responseMessage = "<c:out value="${message}" />";
        if (responseMessage != ""){
            alert(responseMessage)
        }
    })
</script>
 
 
 
</html>
cs

 

 

admin_member_forced_eviction_view.jsp (회원 강제 탈퇴 기능 관련)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="576736845363-o0474pib5q69qlcv6lm7o42hs6lu5u59.apps.googleusercontent.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name = "viewport" content = "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,
width=device-width" />
 
<title>Insert title here</title>
 
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
 
 
<br>
<br>
<br>
<br>
<br>
 
<center>
<table border="1" width="200">
 
<tr>
<td>
<br>
<center>
<span style="color:green; font-weight : bold;">회원 강제 탈퇴</span>
</center>
 
<center>
<!-- 로그인창 -->
<form action ="admin_member_forced_eviction.do" method = "post">
<center>
<br>
-회원 아이디- <input type = "text" name="user_id" placeholder="  탈퇴시킬 회원의 아이디를 입력하세요. "><br><br>
<button type = "submit" name = "submit" > 회원 강제 탈퇴</button>
 
<br>
<br>
 
 
</center>
</form>
 
</center>
</td>
</tr>
</table>
</center>
</body>
 
<!-- 로그인 실패나 성공시 메시지를 받아서 출력하는 자바스크립트 구문 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(function(){
        var responseMessage = "<c:out value="${message}" />";
        if (responseMessage != ""){
            alert(responseMessage)
        }
    })
</script>
 
 
 
</html>
cs

 

 

 

AdminController.java (관리자 로그인 및 기능 관련 컨트롤러)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.example.hansub_project.controller.admin;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.hansub_project.controller.member.MemberController;
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
import com.example.hansub_project.service.admin.AdminService;
 
 
@Controller //관리자 관련 컨트롤러 빈 선언
public class AdminController {
    
    @Inject    //서비스를 호출하기 위해서 의존성을 주입
    AdminService adminservice;
 
    
        private static final Logger logger= 
        LoggerFactory.getLogger(MemberController.class);  //로깅을 위한 변수
        
        
    //메뉴 페이지에서 관리자 로그인 버튼을 클릭하면 맵핑되는 메소드
    //관리자 로그인 페이지로 이동시킨다.
    @RequestMapping("/admin/admin_login_view.do")
    public String admin_login_view() {
        
        return "admin/admin_login";
    }
    
    
    //관리자 로그인 페이지에서 관리자 아이디와 패스워드를 입력후 로그인 버튼을 누를시에 맵핑되는 메소드
    //관리자 로그인을 할 수 있도록 한다.
    @RequestMapping("/admin/admin_login.do")
    public ModelAndView admin_login(String admin_id, String admin_pass,HttpSession session) throws Exception    {
        
        //로그인 체크도 같이 함
        //dto에 값들을 넣기 위해 객체를 생성한다.
        AdminDTO dto = new AdminDTO();
        
        
        dto.setAdmin_id(admin_id);
        dto.setAdmin_pass(admin_pass);
        
        //로그인 체크를 하기위한 메소드, 로그인 체크후 결과를 result 변수에 넣는다.
        boolean result = adminservice.loginCheck(dto, session);
        ModelAndView mav = new ModelAndView();
        
        
        if(result)    {//로그인이 성공했을시 출력되는 구문
            mav.setViewName("home");    //로그인이 성공했을시 이동하게되는 뷰의 이름
            mav.addObject("admin_id", session.getAttribute(admin_id));
            
            }else if(session.getAttribute(admin_id) == null) {    //로그인 실패 했을시 출력
                
                //로그인이 실패했을 시에 다시 관리자 로그인 페이지로 이동함
                
                mav.setViewName("admin/admin_login");
                
                //뷰에 전달할 값
                
                mav.addObject("message""관리자의 아이디 혹은 비밀번호가 일치하지 않습니다.");
            
            }
        
                return mav;
        }
    
    
    //관리자로 로그인 후에 회원을 강제 탈퇴시키는 페이지로 연결시키는 메소드
    @RequestMapping("/admin/admin_member_forced_eviction_view.do")
    public String admin_member_forced_evction_view() {
        
    
        return "admin/admin_member_forced_eviction_view";
    }
    
    
    //관리자로 로그인 후에 강제 탈퇴시킬 회원의 아이디를 입력후 강제탈퇴 버튼을 누르면 연결되는 메소드
    @RequestMapping("/admin/admin_member_forced_eviction.do")
    public ModelAndView admin_member_forced_eviction(String user_id) throws Exception {
        
        //유저의 아이디를 삭제 (강제탈퇴) 시키기위해서 dto에 담는다.
        MemberDTO dto = new MemberDTO();
        dto.setUser_id(user_id);
        
        //회원탈퇴 체크를 하기위한 메소드, 탈퇴 시키려는 회원의 아이디가 있는지 검사한후에 result 변수에 저장한다.
        adminservice.admin_member_forced_evictionCheck(dto);
        
 
        ModelAndView mav = new ModelAndView();
        
        if(dto.getUser_id() != null) {    //회원 강제탈퇴가 성공했을시 출력되는 뷰
            
            mav.setViewName("home");
            
            mav.addObject("message""회원이 정상적으로 강제탈퇴 처리 되었습니다.");
            
        }else {
            
            mav.setViewName("admin/admin_member_forced_eviction_view");
            
            mav.addObject("message""회원 목록에 없는 회원입니다. 다시 확인해주세요.");
        }
        
        
        return mav;
                
    }
    
}
 
cs

 

 

 

AdminService.java (관리자 관련 서비스 인터페이스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.hansub_project.service.admin;
 
import javax.servlet.http.HttpSession;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
public interface AdminService {
 
    boolean loginCheck(AdminDTO dto, HttpSession session) throws Exception;    //관리자 로그인을 체크하는 메소드
 
    
    void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception; //강제탈퇴 시킬때 해당 회원이 있는지 체크하는 메소드
 
    
}
 
cs

 

 

 

AdminServiceImpl.java (관리자 관련 서비스 구현 클래스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.example.hansub_project.service.admin;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Service;
 
import com.example.hansub_project.model.admin.dao.AdminDAO;
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
@Service    //서비스 빈으로 설정함
public class AdminServiceImpl implements AdminService {
 
    
    @Inject    //dao를 호출하기때문에 의존성을 주입한다.
    AdminDAO admindao;
    
    
    
    @Override    //로그인 체크 관련 메소드 (세션에 아이디와 비밀번호를 저장함)
    public boolean loginCheck(AdminDTO dto, HttpSession session) throws Exception {
        
        boolean result = admindao.loginCheck(dto);
        
        if(result) {    //로그인 성공
            
            session.setAttribute("admin_id", dto.getAdmin_id());
            session.setAttribute("admin_pass", dto.getAdmin_pass());
            
        }
        
        return result;
    }
 
 
    //회원 강제탈퇴 관련 메소드
    @Override
    public void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception{
 
        admindao.admin_member_forced_evictionCheck(dto);
        
    }
 
}
 
cs

 

 

 

AdminDAO.java (관리자 관련 DAO 인터페이스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.hansub_project.model.admin.dao;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
public interface AdminDAO {
 
    boolean loginCheck(AdminDTO dto) throws Exception;    //로그인을 체크하는 메소드
 
 
    void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception;    //회원 강제탈퇴 관련 메소드
 
}
 
cs

 

 

 

AdminDAOImpl.java (관리자 관련 DAO 구현 클래스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.example.hansub_project.model.admin.dao;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
 
@Repository    //dao 관련 빈
public class AdminDAOImpl implements AdminDAO {
 
    
    @Inject        //sql쿼리를 사용하기 위해서 의존성을 주입함
    SqlSession sqlSession;
    
    
    //로그인 체크
    //id가 null이면 false를 리턴하고 값이 있으면 true를 리턴한다.
    @Override
    public boolean loginCheck(AdminDTO dto) throws Exception{
        
        String name = sqlSession.selectOne("admin.login_check", dto);
        
        //조건식 ? true일때의 값 : false일때의 값
        return (name==null) ? false : true;
        
    }
 
    
    //회원 강제탈퇴 관련 메소드 구현
    @Override
    public void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception{
        
            sqlSession.delete("admin.admin_member_forced_evictionCheck", dto);
 
    }
 
 
    
}
 
cs

 

 

 

AdminDTO (계층별 자료 전송)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.example.hansub_project.model.admin.dto;
 
import java.util.Date;
 
public class AdminDTO {
    
    
    private String admin_id;    //아이디
    private String admin_pass;    //비밀번호
    private String e_mail;    //이메일
    private Date reg_date;    //등록일자
    
    
    public String getAdmin_id() {
        return admin_id;
    }
    public void setAdmin_id(String admin_id) {
        this.admin_id = admin_id;
    }
    public String getAdmin_pass() {
        return admin_pass;
    }
    public void setAdmin_pass(String admin_pass) {
        this.admin_pass = admin_pass;
    }
    public String getE_mail() {
        return e_mail;
    }
    public void setE_mail(String e_mail) {
        this.e_mail = e_mail;
    }
    public Date getReg_date() {
        return reg_date;
    }
    public void setReg_date(Date reg_date) {
        this.reg_date = reg_date;
    }
        
    @Override
    public String toString() {
        return "AdminDTO [admin_id=" + admin_id + ", admin_pass=" + admin_pass + ", e_mail=" + e_mail + ", reg_date="
                + reg_date + "]";
    }
    
 
}
 
cs

 

 

 

adminMapper.xml (쿼리 작성 mapper.xml)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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와 중복되지 않도록 네임스페이스 기재 -->
<!-- 회원가입 -->
<mapper namespace="admin">
    
    
    <!-- 로그인 관련 mapper-->
    <select id = "login_check" parameterType=
    "com.example.hansub_project.model.admin.dto.AdminDTO"
    resultType="String">
        select admin_id from admin
        where admin_id=#{admin_id} and admin_pass=#{admin_pass}
    </select>    
 
 
    <!-- 회원 강제탈퇴관련 mapper -->
    <delete id="admin_member_forced_evictionCheck">
    delete from member
    where user_id=#{user_id}
    </delete>
    
 
</mapper>
 
cs

 

 

 

 

 

아래 책은 제가 공부할때 활용했던 책으로 추천드리는 책이니 한번씩 읽어보시는것을 추천드립니다!! ㅎㅎ

토비의 스프링 3.1 세트:스프링의 이해와 원리 + 스프링의 기술과, 에이콘출판

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

: