본문 바로가기

Server Programming/Spring Boot Full-Stack Programming

[스프링 풀스택 클론 코딩] 회원가입 이메일 인증 정상/오류 시 분기

반응형

1. 에러 발생시

2. 에러가 null인 경우 -> 해당하는 model에서 numberOfUser와 nickname을 가져온다.

th:if="${error}"

th:if="${error == null}"
th:text="${numberOfUser}"
th:text="${nickname}"

 

3. 해당 이메일에 대한 토큰값과 해당 이메일 정상 여부 확인하기 위해서는  @Transactional 어노테이션 적용필수

-> DB와의 싱크 위해

@Transactional
public void processNewAccount(SignUpForm signUpForm) {
    // 1. 회원정보 저장
            // 2. 이메일 토큰 만들기
            // 3. 이메일 전송
            Account newAccount = saveNewAccount(signUpForm);

            // 회원가입 이메일 발송 -> starter-mail 이용 -> mailsender // 일단 가짜 객체에 저장해 콘솔에 출력
            // 계정인증을 위한 토큰값 생성 -> 유효 아이디를 이용해 랜덤 생성
            newAccount.generateEmailCheckToken();
            //emailCehckToken=null
            //저장 후 토큰 생성 -> 함수안에서만 트랜잭션이 존재하므로, DB에 싱크오류 ->@Transactional 필요
            //상태 종료시 DB에 싱크를 해주기 위함

            sendSignUpConfirmEmail(newAccount);

            // TODO 회원 가입 처리 valid에 안걸리면 회원가입
}

4. erro일 경우와 error가 아닐경우 분기

-> token값 동일여부, 이메일 정상여부 : 거짓

-> 그 외는 참

@GetMapping("/check-email-token")
	public String checkEmailToken(String token, String email, Model model) {
		Account account = accountRepository.findByEmail(email);
		String view = "account/checked-email";
		//같은 링크를 리턴하지만, 담은 정보는 각각 다르다. 
		//해당 뷰에서 error를 담아서 왔을 경우와 setEmailVerified가 true를 담아서 왔을 때를 구분해서 처리
		
		//리파지토리를 도메인 계층으로 생각해, 레이어계층에서의 리파지토리 참조를 자유롭게 한다.
		//반대로, 레이어 계층인, 서비스나 컨트롤러를 도메인 계층에서 참조하는 것은 지양한다.
		//1단계에서 이메일의 존재여부를 판단
		//2단계에서는 해당하는 이메일의 토큰값 동일 여부를 확인한다.
		if(account==null) {
			//해당 이메일이 존재하지 않을 때 오류 발생
			//정보제공을 줄이기 위해 -> 서버단에서만 wrong.email이라는 것을 명시하고, 리턴은 하지않는다.
			model.addAttribute("error", "wrong.email");
			return view;
		}
		
		//토큰이 같지 않다면
		if(!account.getEmailCheckToken().equals(token)){
			model.addAttribute("error", "wrong.token");
			return view;
		}
		
		//해당 이메일 검증을 참으로 설정하고, 가입 정보(시간정보)와 몇번째 회원인지 리턴한다.
		account.setEmailVerified(true);
		account.setJoinedAt(LocalDateTime.now());
		model.addAttribute("numberOfUser", accountRepository.count());
		model.addAttribute("nickname", account.getNickname());
		return view;
		
	}

 

반응형