public String loginForm(Model model) {
model.addAttribute("loginForm", new LoginForm());
return "members/loginForm";
}
@Getter
@Setter
public class LoginForm {
@NotEmpty(message = "이메일 주소는 필수입니다.")
@Email //이메일 형식 validation
private String email;
@NotEmpty(message = "비밀번호를 입력해주세요")
private String password;
}
@PostMapping("/members")
public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
//이메일 또는 비밀번호를 누락시
if(bindingResult.hasErrors()) {
log.info("error={}", bindingResult);
return "members/loginForm";
}
Member loginMember = memberService.login(form.getEmail(), form.getPassword());
log.info("login? {}", loginMember);
if (loginMember == null) {
bindingResult.reject("loginfail", "이메일 또는 비밀번호가 맞지 않습니다.");
return "members/loginForm";
}
/**
* HttpSession 생성
*/
HttpSession session = request.getSession(); //만약 세션이 있으면 기존 세션을 반환하고, 없으면 신규 세션 생성
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); //세션에 회원 정보 보관
//판매자, 구매자 역할 뷰 나누기 TODO
return "redirect:/userHome";
}
request.getSession(true) : 세션이 있으면 기존 세션을 반환, 세션이 없으면 신규 세션 생성해서 반환
request.getSession(false) : 세션이 있으면 기존 세션을 반환, 세션이 없어도 신규 세션을 생성하지 않고 null을 반환
server.servlet.session.tracking-modes=cookie
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true) //조회하는 곳에서 성능 최적화
public class MemberService {
private final MemberRepository memberRepository;
//회원가입
@Transactional(readOnly = false)
public Long join(Member member) {
validateDuplicateMember(member);
Member savedMember = memberRepository.save(member);
return savedMember.getId();
}
//중복 회원 검증
private void validateDuplicateMember(Member member) {
Member findMember = memberRepository.findByEmail(member.getEmail()).orElse(null);
if (findMember != null) {
throw new IllegalStateException("이미 존재하는 회원입니다");
}
}
//로그인 체크(null 이면 로그인 실패)
public Member login(String email, String password) {
return memberRepository.findByEmail(email)
.filter(m -> m.getPassword().equals(password))
.orElse(null);
}
public Member findMember(Long id) {
return memberRepository.findById(id).get();
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
}
/**
* 로그아웃
*/
@GetMapping("/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "redirect:/";
}