클라이언트로 부터 받은 code를 바탕으로 유저 정보를 가져왔다. 이후 유저 정보를 멤버 엔티티로 전환하기 위해 CustomOidcUserService를 구현했다.
OidcUserService를 상속받는 것과 위임받는 것에는 무슨 차이가 있을까..
방법1) 상속 방식 extends OidcUserService
public class CustomOidcUserService extends OidcUserService {
@Override
public OidcUser loadUser(OidcUserRequest request) {
OidcUser user = super.loadUser(request);
// 사용자 커스터마이징
return user;
}
}
방법2) 위임 방식
implements OAuth2UserService<OidcUserRequest, OidcUser> + delegate
public class CustomOidcUserService implements OAuth2UserService<OidcUserRequest, OidcUser> {
private final OidcUserService delegate = new OidcUserService();
@Override
public OidcUser loadUser(OidcUserRequest request) {
OidcUser user = delegate.loadUser(request);
// 사용자 커스터마이징
return user;
}
}
위임방식을 사용하는 경우 더 유연하게 테스트 코드를 조작할 수 있다.
아래와 같이 진짜 구글 API 호출 없이도 delegate.loadUser() 부분을 mocking할 수 있다.
상속받은 경우 super.loadUser(request) 코드로 인해 단위테스트가 어렵다.
@Test
void 사용자정보를_정상적으로_가져온다() {
// 1. delegate를 mocking
OidcUserService mockDelegate = mock(OidcUserService.class);
OidcUser mockUser = mock(OidcUser.class);
when(mockDelegate.loadUser(any())).thenReturn(mockUser);
// 2. 내가 테스트할 대상에 mock 주입
CustomOidcUserService service = new CustomOidcUserService(mockDelegate);
// 3. 테스트 실행
OidcUser result = service.loadUser(mock(OidcUserRequest.class));
// 4. 검증
assertEquals(mockUser, result);
}
'Spring' 카테고리의 다른 글
| 프레임워크를 사용하는 이유 (0) | 2023.10.06 |
|---|---|
| @Transactional의 작동 방식과 롤백되지 않는 문제(Checked Exception) (0) | 2023.08.31 |
| Spring Data JPA Projections (0) | 2023.04.24 |