- 회원가입 폼
- 폼이 있어야 한다.
- input[name="username"] 필드가 있어야 한다.
- input[name="password"] 필드가 있어야 한다.
- 폼 체크
- 회원가입 폼 처리
- 유효성 체크를 해야 한다.
- member 테이블에 회원이 저장되어야 한다.
- 처리 후에 / 로 이동해야 한다. 302
@AllArgsConstructor
@Getter
public class JoinForm {
@NotBlank
@Size(min = 4,max = 20)
private final String username;
@NotBlank
@Size(min = 4, max = 30)
private final String password;
}
javsScript를 활용해서 script를 통해 현재 폼이 유효한지 확인하는 방식을 사용할 예정
function JoinForm__submit(form){
form.username.value = form.username.value.trim();
if(form.username.length == 0){
alert('아이디를 입력해주세요.');
form.username.focus();
return;
}
if(form.username.length < 4 || form.username.length > 20){
alert('아이디를 4자 이상 20자 이하로 입력해주세요.');
form.username.focus();
return;
}
form.password.value = form.password.value.trim();
if(form.password.length == 0){
alert("비밀번호를 입력해주세요.");
form.password.focus();
return;
}
if(form.password.length < 4 || form.password.length > 30){
alert("비밀번호는 4자 이상 30자이하로 입력해주세요.");
form.password.focus();
return;
}
form.submit();
}
join.html에 검증 스크립트를 추가
@Getter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@ToString
public class Member {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
private String username;
private String password;
@CreatedDate
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime modifyDate;
}
#할일
로그인 폼 추가하기
로그인 상태에서는 회원가입 폼에 갈 수 없게
로그인 폼 체크 필요
- 레이아웃 네비바 구현
- 로그인 버튼
- 회원가입 버튼
- 로그아웃 버튼
로그인을 하기위해서 필요한 작업
로그인 폼 자체는 회원가입 폼이랑 그렇게 차이가 없다
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>
<link rel="stylesheet" href="https://jhs512.github.io/toastr/toastr.css">
<script>
toastr.options = {
closeButton: true,
debug: false,
newestOnTop: true,
progressBar: true,
positionClass: "toast-top-right",
preventDuplicates: false,
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "5000",
extendedTimeOut: "1000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
function toastNotice(msg) {
toastr["success"](msg, "알림");
}
function toastWarning(msg) {
toastr["warning"](msg, "알림");
}
</script>
<style>
@font-face {
font-family: 'GmarketSansMedium';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2001@1.1/GmarketSansMedium.woff') format('woff');
font-weight: normal;
font-style: normal;
}
html > body {
font-family: "GmarketSansMedium";
text-underline-position: under;
}
</style>
</head>
<body>
<link href="https://cdn.jsdelivr.net/npm/daisyui@2.51.5/dist/full.css" rel="stylesheet" type="text/css"/>
<script src="https://cdn.tailwindcss.com"></script>
<main layout:fragment="main"></main>
</body>
</html>
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class CustomUserDetailService implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Member member = memberRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("username(%s) not found".formatted(username)));
return new User(member.getUsername(), member.getPassword(), member.getGrantedAuthorities());
}
}
메인 홈페이지 추가 및 로그인여부 확인
로그인 여부 확인 방법
<header>
<a href="/member/login" sec:authorize="isAnonymous()" class="btn btn-link">로그인</a>
<a href="/member/join" sec:authorize="isAnonymous()" class="btn btn-link">회원가입</a>
<a href="javascript:;" sec:authorize="isAuthenticated()" onclick="$(this).next().submit();" class="btn btn-link">로그아웃</a>
<form th:action="|/member/logout|" method="POST"></form>
</header>
빌터 패턴 참조 블로그 : https://mangkyu.tistory.com/163
빌터 패턴 doc : https://projectlombok.org/api/lombok/Builder
Collection<? extends GrantedAuthority> authorities 이해하기위한 참조 :