[BOOK 개인 프로젝트] 1. 회원 가입 및 로그인 구현

이재민·2024년 6월 1일
0

JPA 

목록 보기
3/21

LoginController - "/"를 통해 홈 화면 이동

    @GetMapping("/")
    public String home(Model model) {
        log.info("home Controller");
        model.addAttribute("loginForm", new LoginForm());
        return "login";
    }

홈 화면

밑에 Sign up 버튼을 통해 회원가입 폼으로 이동

    @GetMapping("/signup")
    public String createForm(Model model) {
        log.info("회원 가입 폼을 표시합니다.");
        model.addAttribute("memberForm", new MemberForm());
        return "signup";
    }

회원 가입 Form 객체에 @NotBlank, @Email, @Size 등 Validation 적용

package Book_Toy_Project.BOOK.Form;

import jakarta.validation.constraints.*;
import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class MemberForm {

    @NotBlank(message = "회원 이름은 필수 입니다.")
    private String name;

    @NotBlank(message = "회원 아이디는 필수 입니다.")
    @Email(message = "올바른 이메일 주소 형식이어야 합니다.")
    private String email;

    @NotBlank(message = "비밀번호는 필수 입니다.")
    @Size(min = 8, message = "비밀번호는 최소 8글자 이상이어야 합니다.")
    @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=!~`*()_+=]).*$",
            message = "정규 표현식을 사용하여 대문자, 소문자, 숫자, 특수 문자를 포함해야 합니다.")
    private String password;

    @NotBlank(message = "주소를 입력해주세요")
    private String address;

    private String address2;
}

controller의 PostMapping으로 값을 매핑 후 다시 로그인 화면으로 리다이렉트

-LoginController

    @PostMapping("/signup")
    public String create(@Valid MemberForm form, BindingResult result) {
        if (result.hasErrors()) {
            log.error("회원가입 실패: 유효성 검사 오류가 발생했습니다.");
            return "signup";
        }

        String hashedPassword = passwordEncoder.encode(form.getPassword());

        Member member = memberService.getMember(form, hashedPassword);

        try {
            memberService.join(member);
            log.info("회원가입 성공: {}", member.getName());
            return "redirect:/";
        } catch (DuplicateMemberException e) {
            log.error("회원가입 실패 : 이미 존재하는 회원입니다.");
            result.rejectValue("email", "duplicate.email", "이미 존재하는 회원입니다.");
            return "signup";
        }
    }

로그인 검증

-LoginController

    @PostMapping("/login")
    public String postHomePage(@Valid LoginForm loginForm, BindingResult result, HttpServletRequest request, Model model) {
        if (result.hasErrors()) {
            log.error("로그인 오류 : 회원정보를 다시 확인해주세요.");
            return "login";
        }

        Member findMember = memberRepository.findByEmail(loginForm.getEmail());
        if (findMember == null) {
            log.error("로그인 실패 : 존재하지 않는 이메일입니다.");
            model.addAttribute("loginError", "로그인 실패, 아이디 또는 비밀번호를 다시 확인해주세요.");
            return "login";
        }

        //Validation 검증
        //검증 실패시
        if (!memberService.authenticateUser(loginForm.getEmail(), loginForm.getPassword())) {
            log.error("로그인 실패 : 아이디 또는 비밀번호가 일치하지 않습니다.");
            model.addAttribute("loginError", "로그인 실패, 아이디 또는 비밀번호를 다시 확인해주세요.");
            return "login";
        }

        //검증 성공
        log.info("로그인 성공");

        //세션 처리 및 저장
        memberService.processLoginSuccess(request,findMember);

        log.info("홈 화면으로 이동합니다");

        return "home/home";
    }

로그인 성공시 -> 홈 화면으로 이동

로그인 실패시 -> 로그인 화면으로 리다이렉트 & Validaition 적용

profile
복학생의 개발 일기

0개의 댓글

관련 채용 정보