티스토리 뷰

스프링 부트 REST API WEB 프로젝트

깃헙 링크

https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp

수행 목록

  1. 환경구성 및 helloworld 출력
  2. H2 DB 연동
  3. Swagger API 문서 연동
  4. REST API 설계
  5. RestControllerAdvice를 이용한 통합 예외 처리
  6. Entity - DTO 분리
  7. MessageSource를 이용해 예외 메시지 다국화
  8. JPA Aduting을 이용해 객체 생성시간/수정시간 적용
  9. 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
  10. 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
  11. Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
  12. JUnit Test (단위 테스트)
  13. JUnit Test (통합 테스트)
  14. OAuth 2.0 정리
  15. OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
  16. OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
  17. OAuth 2.0 카카오 로그인 테스트 검증
  18. 환경별 설정을 위해서profile 분리하기 

테스트 코드를 작성

  • 카카오 로그인 테스트 과정 중에서 인가코드를 발급받는 부분은 테스트 구현을 어떻게 해야될지 모르겠어서 제외하고 작성한다.
  • 해당 부분을 테스트하려면 요청 url을 보내고 뜬 화면에서 [카카오 로그인]버튼을 클릭하고 생성된 [카카오 로그인 창]에서 진행해야 리다이렉트 되는 [인가 코드]를 발급받고 해당 코드로 [토큰]까지 테스트할 수 있는데 그부분을 못하겠어서 제외한다.

1. 카카오 회원가입 / 로그인 테스트

세팅

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private UserJpaRepo userJpaRepo;

    @Autowired
    PasswordEncoder passwordEncoder;

    private static final String accessToken = "cLDCR4xs1TYyrJAIzQ9bzvXuzML37QiimPVuEwo9dVoAAAF7dvoLNw";

 

카카오 회원가입 성공

    @Test
    public void 카카오_회원가입_성공() throws Exception {
        //given
        String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
                .accessToken(accessToken)
                .build());

        //when
        ResultActions actions = mockMvc.perform(
                post("/v1/social/signup/kakao")
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON)
                        .content(object)
        );

        //then
        actions
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true))
                .andExpect(jsonPath("$.code").value(0));
    }

 

카카오 회원가입 토큰 에러로 실패

    @Test
    public void 카카오_회원가입_토큰에러_실패() throws Exception
    {
        //given
        String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
                .accessToken(accessToken+"_wrongToken")
                .build());

        //when
        ResultActions actions = mockMvc.perform(
                post("/v1/social/signup/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(object));

        //then
        actions.andDo(print())
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("$.success").value(false))
                .andExpect(jsonPath("$.code").value("-1007"));
    }

 

카카오 회원가입 기가입 유저로 실패

    @Test
    public void 카카오_회원가입_기가입_유저_실패() throws Exception
    {
        //given
        userJpaRepo.save(User.builder()
                .nickName("woonsik")
                .name("woonsik")
                .email("groom@kakao.com")
                .provider("kakao")
                .build());

        String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
                .accessToken(accessToken)
                .build());

        //when
        ResultActions actions = mockMvc.perform(post("/v1/social/signup/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(object));

        //then
        actions
                .andDo(print())
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("$.success").value(false))
                .andExpect(jsonPath("$.code").value("-1008"));
    }

 

카카오 로그인 성공

    @Test
    public void 카카오_로그인_성공() throws Exception
    {
        //given
        String object = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
                .accessToken(accessToken)
                .build());

        //when
        mockMvc.perform(post("/v1/social/signup/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(object));

        ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(object));

        //then
        actions
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true))
                .andExpect(jsonPath("$.code").value(0));
    }

 

카카오 로그인 토큰에러로 실패

    @Test
    public void 카카오_로그인_액세스토큰오류_실패() throws Exception
    {
        //given
        String signUpObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
                .accessToken(accessToken)
                .build());
        String logInObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
                .accessToken(accessToken+"_wrongToken")
                .build());

        //when
        mockMvc.perform(post("/v1/social/signup/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(signUpObject));

        ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(logInObject));

        //then
        actions
                .andDo(print())
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("$.success").value(false))
                .andExpect(jsonPath("$.code").value(-1007));
    }

 

카카오 로그인 미가입 유저로 실패

    @Test
    public void 카카오_로그인_비가입자_실패() throws Exception
    {
        //given
        String logInObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
                .accessToken(accessToken)
                .build());

        //when
        ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(logInObject));

        //then
        actions
                .andDo(print())
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("$.success").value(false))
                .andExpect(jsonPath("$.code").value(-1000));
    }

 

2. 액세스 토큰으로 카카오 정보 가져오기 테스트

@RunWith(SpringRunner.class)
@SpringBootTest
@WithMockUser(username = "mockUser")
public class KakaoServiceTest {

    @Autowired
    private KakaoService kakaoService;

    private static final String accessToken = "cLDCR4xs1TYyrJAIzQ9bzvXuzML37QiimPVuEwo9dVoAAAF7dvoLNw";

    @Test
    public void 액세스토큰으로_사용자정보_요청() throws Exception
    {
        //given
        //when
        KakaoProfile kakaoProfile = kakaoService.getKakaoProfile(accessToken);

        //then
        assertThat(kakaoProfile).isNotNull();
        assertThat(kakaoProfile.getKakao_account().getEmail()).isEqualTo("groom@kakao.com");
        assertThat(kakaoProfile.getProperties().getNickname()).isEqualTo("최운식");
    }
}

 

3. 카카오 회원 조회 테스트

이메일 + 제공자로 조회

    @Test
    public void 카카오_가입자_조회() throws Exception
    {
        //given
        userJpaRepo.save(User.builder()
                .name(name)
                .email(email)
                .nickName(name)
                .provider("kakao")
                .build());
        //when
        Optional<User> kakao = userJpaRepo.findByEmailAndProvider(email, "kakao");

        //then
        assertThat(kakao).isNotNull();
        assertThat(kakao.isPresent()).isEqualTo(true);
        assertThat(kakao.get().getName()).isEqualTo(name);
        assertThat(kakao.get().getProvider()).isEqualTo("kakao");
    }

 

테스트까지 진행하면서 OAuth 2.0 Kakao API로 회원가입 / 로그인 기능 구현 및 검증을 진행해보았다.

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday