2025.06.30 팀 프로젝트 – 로그인/헤더 구조 정리 요약
📌 주요 논의 주제
“회원(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}} | 해당 변수가 있을 때 출력되는 템플릿 조건문 |
✅ 정리된 핵심 흐름
- 사용자 역할은 enum으로 관리
- 로그인 form에 role을 hidden으로 전달
- 서버에서는 role 확인 후 로그인 분기
- 로그인 성공 시 세션에 사용자 저장
- 헤더에서는 sessionUser.role을 기준으로 메뉴 분기