본문 바로가기
Spring/SpringBoot

[SpringBoot] 호텔예약사이트 - 사용자, 관리자 메뉴 구분

by 코딩맛 2024. 3. 20.
해당 글은 Spring으로 구현한 프로젝트를 SpringBoot로 리팩토링 하는 과정을 담은 글입니다.

 

이번 시간에는 사용자와 관리자로 로그인 했을 때 각자 다른 메뉴가 노출시키려 합니다.

 

1. MEMBER Entity에 권한 컬럼 추가

@Entity
@Data
@Table(name = "T_MEMBER")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @Column(name = "M_ID")
    private String mId;

    @Column(name = "M_PW")
    private String mPw;

    @Column(name = "M_AUTH")
    private String mAuth;
    private String country;
    private String eName;
    private String kName;
    private String birth;
    private String phone;
    private String email;
    private String insDate;
    private String modDate;

}

 

2. DB에 권한 데이터 추가

 

3. 로그인 성공 시 LoginController에 회원 정보로 세션값 저장

@PostMapping("/login")
    public String login(@ModelAttribute Member member,
                        Model model,
                        HttpSession session) throws Exception{

        String message = "";
        boolean isError = true;

        String viewPage = "common/message";

        String mId = member.getMId();
        Member loginMember = sonorousMemberService.getLogin(mId);
        if(loginMember != null && member.getMPw().equals(loginMember.getMPw())){
            session.setAttribute("loginMember", loginMember);
            message = member.getMId()+" 님 환영합니다.";
            isError = false;
        } else {
            message = "로그인에 실패하였습니다. 아이디와 비밀번호를 확인해주세요.";
            isError = true;
        }

        model.addAttribute("isError", isError);
        model.addAttribute("message", message);
        model.addAttribute("locationURL", "/main");

        return viewPage;
    }

 

4. header.html 에서 "loginMember" 세션값 불러와서 처리

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<!--headerFragment 선언-->
<div th:fragment="headerFragment">
<header>
        <a th:href="@{/main}"><img id="logo" th:src="@{/images/logo.png}"/></a>
        <nav id="top_menu">
                <th:block th:if="${session.loginMember != null}">

                        <a th:href="@{/login/logout}">로그아웃</a> | <a th:href="@{/member/memberInfo}">마이페이지</a>
                </th:block>
                <th:block th:if="${session.loginMember == null}">
                        <a th:href="@{/login/loginForm}">로그인</a> | <a th:href="@{/member/addMember}">회원가입</a>
                </th:block>
        </nav>
        <div class="dropmenu">
                <ul>
                        <li><a th:href="@{#}">소개</a></li>
                        <th:block th:if="${session.loginMember != null}" th:with="data=${session.loginMember.mAuth}">
                                        <th:block th:if="${#strings.equals(data,'USER')}">
                                                <li><a th:href="@{/rsvList}" id="current">예약</a></li>
                                        </th:block>
                                        <th:block th:if="${#strings.equals(data,'ADMIN')}">
                                                <li><a th:href="@{/roomList}">객실관리</a></li>
                                                <li><a th:href="@{/reservManageList}">예약관리</a></li>
                                        </th:block>
                                </li>
                        </th:block>
                        <li><a th:href="@{#}">공지사항</a></li>
                </ul>
        </div>
</header>
</div>
</html>

1. th:if="${session.loginMember != null}"

   : loginMember 세션값이 비어있지 않을 때만 예약, 객실관리, 예약관리 메뉴노출

 

2. th:with="data=${session.loginMember.mAuth}"

   : data 변수에 loginMember의 권한값 저장

 

3. th:if="${#strings.equals(data,'USER')}"

   : data 값이 'USER'와 동일한지 체크

 

4. th:if="${#strings.equals(data,'ADMIIN')}"

   : data 값이 'ADMIN'과 동일한지 체크

 

로그인 전
'USER' 권한을 가진 회원으로 로그인
'ADMIN' 권한을 가진 회원으로 로그인