Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- pointcut
- 백준
- transaction
- kotlin
- Servlet
- jpa
- SpringBoot
- AOP
- 알고리즘
- java
- 김영한
- Exception
- JPQL
- Thymeleaf
- Android
- 스프링 핵심 기능
- Spring Boot
- 자바
- 스프링
- db
- http
- 인프런
- springdatajpa
- 스프링 핵심 원리
- 그리디
- QueryDSL
- JDBC
- spring
- Proxy
- Greedy
Archives
- Today
- Total
개발자되기 프로젝트
[로그인] 로그인 기능. 본문
로그인 기능을 개발해보자. 로그인 ID, 비밀번호를 입력하는 부분에 집중
1. LoginService
- 람다식을 이용하면 코드를 깔끔하게 정리할 수 있음.
- loginId로 찾은 결과에서 member의 password가 입력된 password와 일치하는 member만 다음 로직 진행.
- 일치하는 결과 없는 경우 null 반환 -> 로그인 실패.
@Service
@RequiredArgsConstructor
public class LoginService {
private final MemberRepository memberRepository;
/**
* @return null 로그인 실패
*/
public Member login(String loginId, String password){
/* Optional<Member> findMemberOptional = memberRepository.findByLoginId(loginId);
Member member = findMemberOptional.get();
if(member.getPassword().equals(password)){
return member;
}else {
return null;
}*/
return memberRepository.findByLoginId(loginId)
.filter(m -> m.getPassword().equals(password))
.orElse(null);
}
}
2. LoginController
- 로그인 컨트롤러는 로그인 서비스를 호출해서 로그인에 성공하면 홈 화면으로 이동
- 로그인에 실패하면 bindingResult.reject() 를 사용해서 GlobalError( ObjectError )를 생성한다.
- 그리고 정보를 다시 입력하도록 로그인 폼을 뷰 템플릿으로 사용
@Slf4j
@Controller
@RequiredArgsConstructor
public class LoginController {
private final LoginService loginService;
@GetMapping("/login")
public String loginForm(@ModelAttribute("loginForm") LoginForm form){
return "login/loginForm";
}
@PostMapping("/login")
public String login(@Validated @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if(loginMember == null){
bindingResult.reject("loginFail", "id 또는 pw가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리 TODO
return "redirect:/";
}
}
3. LoginForm.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
<style>
.container {
max-width: 560px;
}
.field-error {
border-color: #dc3545;
color: #dc3545;
}
</style>
</head>
<body>
<div class="container">
<div class="py-5 text-center">
<h2>로그인</h2>
</div>
<form action="item.html" th:action th:object="${loginForm}" method="post">
<div th:if="${#fields.hasGlobalErrors()}">
<p class="field-error" th:each="err : ${#fields.globalErrors()}"
th:text="${err}">전체 오류 메시지</p>
</div>
<div>
<label for="loginId">로그인 ID</label>
<input type="text" id="loginId" th:field="*{loginId}" class="formcontrol"
th:errorclass="field-error">
<div class="field-error" th:errors="*{loginId}" />
</div>
<div>
<label for="password">비밀번호</label>
<input type="password" id="password" th:field="*{password}"
class="form-control"
th:errorclass="field-error">
<div class="field-error" th:errors="*{password}" />
</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='items.html'"
th:onclick="|location.href='@{/}'|"
type="button">취소</button>
</div>
</div>
</form>
</div> <!-- /container -->
</body>
</html>
4. 실행
- 실행해보면 로그인이 성공하면 홈으로 이동하고,
- 로그인에 실패하면 "아이디 또는 비밀번호가 맞지 않습니다."라는 경고와 함께 로그인 폼이 나타남.
- 그런데 아직 로그인이 되면 홈 화면에 고객 이름이 보여야 한다는 요구사항을 만족하지 못함.
- 로그인의 상태를 유지하면서, 로그인에 성공한 사용자는 홈 화면에 접근시
- 고객의 이름을 보여주려면 어떻게 해야함?????????
5. GitHub : 210925 login
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[로그인] 쿠키와 보안 문제 (0) | 2021.09.26 |
---|---|
[로그인] 로그인 처리 - 쿠키 (0) | 2021.09.26 |
[로그인] 회원가입 (0) | 2021.09.25 |
[로그인] 프로젝트 생성, home 화면 (0) | 2021.09.25 |
[로그인] 로그인 요구사항 (0) | 2021.09.25 |
Comments