1. 결정된 구조

@Component
@RequiredArgsConstructor
public class MemberResolver implements HandlerMethodArgumentResolver {

    private final OauthAccountRepository oauthAccountRepository;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(MemberDetails.class);
    }

    @Override
    public MemberDetails resolveArgument(
            MethodParameter parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory
    ) {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

        Long accountId = (Long) request.getAttribute("account_id");
        OauthAccount account = oauthAccountRepository.findByIdWithMember(accountId)
                .orElseThrow(() -> new CommonException(NOT_FOUND_OAUTH_ACCOUNT));

        return new MemberDetails(account.getMember().getId());
    }
}

@Component
@RequiredArgsConstructor
public class OauthAccountResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(OauthAccountDetails.class);
    }

    @Override
    public OauthAccountDetails resolveArgument(
            MethodParameter parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory
    ) {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

        Long accountId = (Long) request.getAttribute("account_id");

        return new OauthAccountDetails(accountId);
    }
}

2. 구조 요약

🔑 토큰 정보

🎯 Resolver 반환 타입

📂 Resolver의 DB 접근 방식


3. 고려한 대안

🅰️ MemberResolver 삭제, OauthAccountResolver만 유지

✅ 이점

⚠️ 우려