본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/1부 (개발환경, 회원가입, 로그인, 계정설정)

09. 회원 가입: 인증 메일 확인 테스트 및 리팩토링

by Backchus 2020. 4. 18.

테스트

  • 입력값이 잘못 된 경우
    • error 프로퍼티가 model에 들어가 있는지 확인
    • 뷰 이름이 account/checked-email 인지 확인
  • 입력값이 올바른 경우
    • 모델에 error가 없는지 확인
    • 모델에 numberOfUser가 있는지 확인
    • 모델에 nickname이 있는지 확인
    • 뷰 이름 확인

리팩토링

  • 코드의 위치가 적절한가?

 

테스트 코드 추가

package me.weekbelt.studyolle.account;

@Transactional	// 추가
@AutoConfigureMockMvc
@SpringBootTest
class AccountControllerTest {

    // 기존 코드 ...........
    
    @DisplayName("인증 메일 확인 - 입력값 오류")
    @Test
    public void checkEmailToken_with_wrong_input() throws Exception {
        mockMvc.perform(get("/check-email-token")
                .param("token", "sdfasdfasdfa")
                .param("email", "email@email.com"))
                .andExpect(status().isOk())
                .andExpect(model().attributeExists("error"))
                .andExpect(view().name("account/checked-email"))
        ;
    }

    @DisplayName("인증 메일 확인 - 입력값 정상")
    @Test
    public void checkEmailToken_with_correct_input() throws Exception {
        Account account = Account.builder()
                .email("test@email.com")
                .password("12345678")
                .nickname("joohyuk")
                .build();

        Account newAccount = accountRepository.save(account);
        newAccount.generateEmailCheckToken();

        mockMvc.perform(get("/check-email-token")
                .param("token", newAccount.getEmailCheckToken())
                .param("email", newAccount.getEmail()))
                .andExpect(status().isOk())
                .andExpect(model().attributeDoesNotExist("error"))
                .andExpect(model().attributeExists("nickname"))
                .andExpect(model().attributeExists("numberOfUser"))
                .andExpect(view().name("account/checked-email"))
        ;
    }
}

 

AccountController의 checkEmailToken메소드 리팩토링

package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Controller
public class AccountController {
    @GetMapping("/check-email-token")
    public String checkEmailToken(String token, String email, Model model) {
       
       // 기존코드 .......
       
       // 이메일은 있지만 토큰 값이 다른지 확인
       if(!account.isValidToken(token)){          <= 조건을 가독성을 높이기 위해 수정
            model.addAttribute("error", "worng.token");
            return view;
        }
        
       account.setEmailVerified(true);            // 제거
       account.setJoinedAt(LocalDateTime.now());  // 제거
       
       account.completeSignUp();                  // 추가
       model.addAttribute("numberOfUser", accountRepository.count());
       model.addAttribute("nickname", account.getNickname());

       return view;
    }
}

 

package me.weekbelt.studyolle.domain;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.UUID;

@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @EqualsAndHashCode(of = "id")
@Entity
public class Account {
    
    // 기존 코드 ........

    // 추가
    public void completeSignUp() {
        this.emailVerified = true;
        this.joinedAt = LocalDateTime.now();
    }
    
    // 추가
    public boolean isValidToken(String token) {
        return this.emailCheckToken.equals(token);
    }
}

 

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 활용 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의 스

www.inflearn.com