코드 분석

2025.06.30 팀 프로젝트 – 로그인/헤더 구조 정리 요약

mynote6676 2025. 6. 30. 20:01

📌 주요 논의 주제

“회원(user), 기업(company), 관리자(admin)의 로그인 분기 처리와
로그인 이후 헤더에 각 사용자 유형에 맞는 UI를 출력하는 방법”

 

 

1️⃣  enum으로 역할(Role) 구분하기

🔧역활 정의 예시

java

복사 편집

public enum Role {
    USER, COMPANY, ADMIN

}

 

  • 회원가입 시 DB에 role값 저장
  • 눈에 보이지 않지만 숨겨진(hidden)값으로 role 구분

2️⃣ 로그인 버튼은 2개지만 역할은 3개! 어떻게 처리할까?

✅ 방법: hidden input 으로 role을 서버에 전달

html

복사편집

<!-- 개인 로그인 -->

<form action="/login" method="post">

    <input type="text" name="username">

    <input type="password" name="password">

    <input type="hidden" name="role" value="USER">

</form>

 

<!-- 기업 로그인 -->

<form action="/login" method="post">

    <input type="hidden" name="role" value="COMPANY">

</form>

 

3️⃣ 로그인 처리 로직 (Spring Controller)

java

복사편집

@PostMapping("/login")

public String login(@RequestParam String username,

                    @RequestParam String password,

                    @RequestParam String role,

                    HttpSession session) {

 

    Role requestedRole = Role.valueOf(role);

    User user = userService.findByUsername(username);

 

    if (user == null || !user.getPassword().equals(password)) {

        return "redirect:/login-form?error=true";

    }

 

    if (user.getRole() != requestedRole) {

        return "redirect:/login-form?roleError=true";

    }

 

    session.setAttribute(Define.SESSION_USER, user);

 

    // 로그인 후 사용자별 리다이렉트

    return switch (user.getRole()) {

        case USER -> "redirect:/user/home";

        case COMPANY -> "redirect:/company/home";

        case ADMIN -> "redirect:/admin/dashboard";

    };

}

4️⃣ 세션 키는 Define 클래스에 상수로 관리

java

복사편집

public class Define {

    public static final String SESSION_USER = "loginUser";

}

 

세션 키를 문자열로 직접 쓰지 않고 상수로 관리해서 오타 방지


5️⃣ 로그인 이후 헤더 분기 처리 (layout/header.mustache)

mustache

복사편집

{{^sessionUser}}

  <a href="/login-form">로그인</a>

  <a href="/join-form">회원가입</a>

{{/sessionUser}}

 

{{#sessionUser}}

  {{#isUser}}<a href="/user/home">마이페이지</a>{{/isUser}}

  {{#isCompany}}<a href="/company/home">기업관리</a>{{/isCompany}}

  {{#isAdmin}}<a href="/admin/dashboard">관리자</a>{{/isAdmin}}

  <a href="/logout">로그아웃</a>

{{/sessionUser}}

 

User 객체에 역할 확인을 위한 도우미 메서드 필요

java

복사편집

public boolean isUser() { return role == Role.USER; }

public boolean isCompany() { return role == Role.COMPANY; }

public boolean isAdmin() { return role == Role.ADMIN; }

 


6️⃣ display: none, display: block을 활용한 로그인 전환

  • 하나의 로그인 페이지에서 개인/기업 폼을 전환할 수 있음

  • JavaScript로 display 속성 조작

  • 관리자 로그인은 화면에 안 보이게 숨길 수도 있음


🔍 개념 정리

용어 설명
enum 고정된 상태값 집합 (USER, COMPANY, ADMIN)
hidden input 사용자에게 안 보이는 값 전달용 input
session 로그인 상태를 유지하는 서버 저장소
Define 전역에서 쓰이는 상수들을 모아둔 클래스
@ControllerAdvice 모든 뷰 템플릿에 공통 데이터 전달
mustache {{#var}} 해당 변수가 있을 때 출력되는 템플릿 조건문

✅ 정리된 핵심 흐름

  1. 사용자 역할은 enum으로 관리

  2. 로그인 form에 rolehidden으로 전달

  3. 서버에서는 role 확인 후 로그인 분기

  4. 로그인 성공 시 세션에 사용자 저장

  5. 헤더에서는 sessionUser.role을 기준으로 메뉴 분기

 

728x90