Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 36 additions & 23 deletions src/main/java/cnu/mvc/domain/member/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/members")
Expand All @@ -17,50 +14,66 @@ public class MemberController {

private final MemberService memberService;

// 초기 데이터 등록 (테스트용)
@PostConstruct
public void init() {
memberService.join(new Member("kim", "kim@gmail.com", "010-1234-5678", "1234"));
try {
memberService.join(new Member("kim", "kim@gmail.com", "010-1234-5678", "1234"));
} catch (IllegalStateException e) {
// 이미 등록되어 있으면 무시
}
}

// 회원등록 화면
// 회원가입 폼(GET): joinMemberForm.html 사용
@GetMapping("/join")
public String joinForm() {
public String joinForm(Model model) {
model.addAttribute("member", new Member());
return "member/joinMemberForm";
}

//회원등록
// 회원가입 처리(POST)
@PostMapping("/join")
public String join(Member member, Model model) {

try {
memberService.join(member);
model.addAttribute(member);
return "member/member";

} catch (Exception e) {
return "member/member"; // 가입 성공 시 회원 상세 화면
} catch (IllegalStateException e) {
// 중복 이메일 시 에러 메시지를 모델에 담고 다시 가입 폼으로 전달
model.addAttribute("error", e.getMessage());
model.addAttribute("member", member);
return "member/joinMemberForm";
}
}

@PostMapping("/login")
public String login(@RequestParam("email") String email, @RequestParam("pwd") String pwd, HttpSession session, Model model){
// 로그인 폼(GET): loginForm.html 사용
@GetMapping("/login")
public String loginForm() {
return "member/loginHome";
}

// 로그인 처리(POST)
@PostMapping("/login")
public String login(@RequestParam("email") String email,
@RequestParam("pwd") String pwd,
HttpSession session,
Model model) {
try {
Member member = memberService.validateMember(email, pwd);
session.setAttribute("currentMember", member); // session 추가
model.addAttribute("memberName", member.getName());
return "loginHome";

} catch (Exception e) {
Member loginMember = memberService.validateMember(email, pwd);
session.setAttribute("currentMember", loginMember);
model.addAttribute("memberName", loginMember.getName());
return "loginHome"; // 로그인 성공 시 loginHome.html로 이동
} catch (IllegalArgumentException e) {
model.addAttribute("error", e.getMessage());
return "index";
return "index"; // 로그인 실패 시 index.html(로그인 폼)로 이동
}
}



// 로그아웃 처리(POST)
@PostMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
return "redirect:/"; // 로그아웃 후 메인으로 리다이렉트
}
}
12 changes: 9 additions & 3 deletions src/main/java/cnu/mvc/domain/member/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cnu.mvc.domain.member;

import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.Map;

Expand All @@ -11,18 +10,25 @@ public class MemberRepository {
private static final Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;

// 회원 저장: ID 부여 후 Map에 저장
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}

// ID로 회원 조회
public Member findById(Long id) {
return store.get(id);
}

// 구현
// 이메일로 회원 조회 (회원가입 중복검사 및 로그인 시 사용)
public Member findByEmail(String email) {
for (Member m : store.values()) {
if (m.getEmail().equals(email)) {
return m;
}
}
return null;
}
}

21 changes: 11 additions & 10 deletions src/main/java/cnu/mvc/domain/member/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,23 @@ public class MemberService {

private final MemberRepository memberRepository;

public Member join(Member member){
public Member join(Member member) {
if (memberRepository.findByEmail(member.getEmail()) != null) {
throw new IllegalStateException("이미 존재하는 이메일 계정입니다.");
}
return memberRepository.save(member);
}

public Member validateMember(String email, String pwd) {
Member findMember = findById(1L);
return findMember;
public Member validateMember(String email, String password) {
Member member = memberRepository.findByEmail(email);
if (member == null || !member.getPwd().equals(password)) {
throw new IllegalArgumentException("이메일 또는 비밀번호를 확인해주세요.");
}
return member;
}


public Member findById(Long id) {
return memberRepository.findById(id);
}

// 구현
public Member findByEmail(String email) {
return memberRepository.findByEmail(email);
}

}
19 changes: 6 additions & 13 deletions src/main/resources/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,12 @@
button {
background-color: #008CBA;
color: white;
padding: 10px 20px; /* 높이 10px로 줄임 */
margin: 0 10px; /* 버튼 사이의 간격 */
padding: 10px 20px;
margin: 0 10px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px; /* 폰트 크기 14px로 줄임 */
font-size: 14px;
}
button:hover {
background-color: #005f73;
Expand All @@ -69,29 +69,22 @@
<header>
<h1>도서 관리 시스템에 오신 것을 환영합니다!</h1>
</header>

<div class="login-container">
<h2>로그인</h2>
<form action="/members/login" method="POST">
<label for="email">이메일:</label>
<input type="text" id="email" name="email" placeholder="이메일을 입력하세요." required />

<label for="pwd">비밀번호:</label>
<input type="pwd" id="pwd" name="pwd" placeholder="비밀번호를 입력하세요." required />

<input type="password" id="pwd" name="pwd" placeholder="비밀번호를 입력하세요." required />
<button type="submit">로그인</button>
</form>

<!-- 로그인 실패 메시지 표시 영역 -->
<!-- 로그인 실패 시 에러 메시지 표시 (검은 글씨) -->
<div class="error-message" th:if="${error != null}" th:text="${error}"></div>
</div>

<!-- 회원가입 및 도서목록 버튼 -->
<div class="button-container">
<button onclick="window.location.href='/members/join'">회원가입</button>
<button onclick="window.location.href='/books'">도서목록</button>
</div>

</div>
</body>
</html>
</html>
3 changes: 2 additions & 1 deletion src/main/resources/templates/loginHome.html
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,11 @@ <h1>도서 관리 시스템에 오신 것을 환영합니다!</h1>
</form>
</div>

<div class="error-message" th:if="${error != null}" style="color: black; font-weight: bold;" th:text="${error}"></div>




</div>
</body>
</html>
</html>
59 changes: 19 additions & 40 deletions src/main/resources/templates/member/joinMemberForm.html
Original file line number Diff line number Diff line change
@@ -1,36 +1,18 @@
<!DOCTYPE HTML>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link href="../css/bootstrap.min.css"
th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
<link href="../css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
<title>회원 등록 폼</title>
<style>
body {
background-color: #f4f4f4;
}
.container {
max-width: 560px;
margin-top: 50px;
}
h2 {
color: #4CAF50;
}
label {
font-weight: bold;
color: #333;
}
.form-control {
border-radius: 0;
border-color: #ddd;
}
.btn-primary {
background-color: #008CBA;
border-color: #008CBA;
}
.btn-secondary {
background-color: #ccc;
border-color: #ccc;
}
body { background-color: #f4f4f4; }
.container { max-width: 560px; margin-top: 50px; }
h2 { color: #4CAF50; }
label { font-weight: bold; color: #333; }
.form-control { border-radius: 0; border-color: #ddd; }
.btn-primary { background-color: #008CBA; border-color: #008CBA; }
.btn-secondary { background-color: #ccc; border-color: #ccc; }
.error-message { margin-top: 10px; color: black; font-weight: bold; }
</style>
</head>
<body>
Expand All @@ -39,38 +21,35 @@
<h2>회원 등록 폼</h2>
</div>
<h4 class="mb-3">회원 정보 입력</h4>
<form action="member.html" th:action method="post">
<form th:action="@{/members/join}" th:object="${member}" method="post">
<div class="form-group">
<label for="name">이름</label>
<input type="text" id="name" name="name" class="form-control" placeholder="이름을 입력하세요">
<input type="text" id="name" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="text" id="email" name="email" class="form-control" placeholder="메일 주소를 입력하세요">
<input type="text" id="email" th:field="*{email}" class="form-control" placeholder="메일 주소를 입력하세요">
</div>
<div class="form-group">
<label for="phoneNumber">h.p</label>
<input type="text" id="phoneNumber" name="phoneNumber" class="form-control" placeholder="번호를 입력하세요">
<input type="text" id="phoneNumber" th:field="*{phoneNumber}" class="form-control" placeholder="번호를 입력하세요">
</div>
<div class="form-group">
<label for="pwd">비밀번호</label>
<input type="password" id="pwd" name="pwd" class="form-control" placeholder="비밀번호를 입력하세요">
<input type="password" id="pwd" th:field="*{pwd}" class="form-control" placeholder="비밀번호를 입력하세요">
</div>
<hr class="my-4">
<div class="row">
<div class="col">
<button class="w-100 btn btn-primary btn-lg" type="submit">회원 등록</button>
</div>
<div class="col">
<button class="w-100 btn btn-secondary btn-lg"
onclick="location.href='/'" type="button">취소</button>
<button class="w-100 btn btn-secondary btn-lg" onclick="location.href='/'" type="button">취소</button>
</div>
</div>
</form>

<!-- 회원등록 실패 메시지 표시 영역 -->
<!-- 회원 등록 실패 시 에러 메시지 (예: 중복된 이메일) 출력 -->
<div class="error-message" th:if="${error != null}" th:text="${error}"></div>

</div> <!-- /container -->
</div>
</body>
</html>