TIL_20250206_소셜로그인

Kim jisu·2025년 2월 6일

TIL

목록 보기
1/43

소셜 로그인 구현 및 디버깅 경험 정리

1. 프로젝트 상황 및 배경

  • 프로젝트 개요:
    Spring Boot 기반의 웹 애플리케이션에서 네이버, 카카오 등 여러 소셜 로그인 방식을 도입하고자 했습니다.
  • 기존 경험:
    네이버 소셜 로그인을 로컬 환경에서 성공적으로 구현한 경험이 있으나, 배포 환경에서는 제 계정이 아닌 다른 계정 사용 및 URL/포트 설정 문제로 디버깅이 어려워 최종 구현에 어려움이 있었습니다.
  • 목표:
    이번 학습을 통해 소셜 로그인 구현 시 부족했던 부분을 보완하고, 일반 유저와 소셜 로그인 유저를 명확히 구분하며 안정적인 가입/로그인 처리를 구현하는 것이었습니다.

2. 소셜 로그인 구현 전략

2.1 일반 유저와 소셜 로그인 유저 구분

  • 문제 인식:
    과거에는 이메일이라는 공통 변수만을 사용해 회원을 구분했으나, 소셜 로그인에서는 같은 이메일을 사용하는 일반 회원과 소셜 회원을 명확히 구분할 필요가 있었습니다.
  • 해결 전략:
    • 소셜 로그인 전용 소셜 아이디(예: kakaoId, naverId) 칼럼을 추가하여 회원 가입 여부를 쉽게 확인할 수 있도록 함.
    • 이를 통해 가입 여부뿐 아니라, 소셜 로그인 전용 유저의 데이터를 별도로 관리하고 추후 필요한 추가 속성을 확장할 수 있도록 설계함.

2.2 가입 여부 처리

  • 문제 인식:
    소셜 로그인 과정에서 신규 가입 여부를 매번 로직 내에 구현하면 코드가 복잡해지고 중복이 발생할 수 있었습니다.
  • 해결 전략:
    • 가입 여부 확인 로직을 별도의 메소드(registerKakaoUserIfNeeded, registerNaverMemberIfNeeded 등)로 분리하여 코드의 가독성과 유지보수성을 높임.
    • 해당 메소드를 통해, 기존 회원과 신규 회원을 명확히 구분하고, 필요한 경우 추가 정보를 업데이트하도록 처리함.

2.3 서비스 클래스 분리

  • 문제 인식:
    일반 로그인과 소셜 로그인 로직을 한 클래스에서 처리하면 코드가 장황해지고, 각 유형별 디버깅이 어려워집니다.
  • 해결 전략:
    • 소셜 로그인 관련 로직을 전용 서비스 클래스(예: KakaoService, NaverService)로 분리하여 관리.
    • 이를 통해, 각 소셜 로그인 방식에 특화된 로직(액세스 토큰 요청, 사용자 정보 조회, 회원가입 로직 등)을 모듈화하여 보다 쉽게 파악하고 수정할 수 있게 되었습니다.

3. 부가적인 오류 및 디버깅 과정

3.1 파라미터 이름 누락 오류

  • 오류 메시지:

    Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, ...
  • 원인:
    Spring MVC에서 @RequestParam 어노테이션을 사용할 때, 파라미터 이름 정보를 리플렉션으로 가져오는데 컴파일 시 -parameters 옵션이 활성화되어 있지 않으면 이름 정보를 얻지 못해 발생함.

  • 해결 방법:

    • 방법 1: 컨트롤러 메서드에서 @RequestParam("code")와 같이 명시적으로 파라미터 이름을 지정.
    • 방법 2: Maven 또는 Gradle 컴파일 설정에서 -parameters 옵션을 활성화하여 파라미터 이름을 유지.

    예시:

    @GetMapping("/user/kakao/callback")
    public String kakaoLogin(@RequestParam("code") String code, HttpServletResponse response) throws JsonProcessingException {
        log.info("카카오 로그인 콜백 도착");
        // ...
    }

3.2 URL 매핑 오타 및 환경 설정 문제

  • 문제 상황:
    • 컨트롤러에서는 @GetMapping("/user/kako/callback")라고 잘못 매핑되어 있었음.
    • 반면, HTML에서는 카카오 인증 후 리다이렉트 URL을 http://localhost:8083/api/user/kakao/callback으로 설정하여 실제 요청이 해당 컨트롤러 메서드에 전달되지 않았음.
  • 원인:
    단순한 오타 및 포트/URL 설정 불일치로 인해, 디버깅 시 로그가 전혀 찍히지 않아 원인 파악에 어려움을 겪었음.
  • 해결 방법 및 교훈:
    • 오타 수정: 매핑 경로를 올바르게 @GetMapping("/user/kakao/callback")으로 변경.
    • 환경 설정 점검: 로컬 환경과 배포 환경의 포트 번호, 리다이렉트 URI 등을 반드시 확인하고, 모든 설정이 일치하도록 관리.
    • 교훈: 로그가 전혀 찍히지 않는다면, 우선 엔드포인트 URL 및 오타 여부를 의심해보자.

결론

오늘 학습과 디버깅을 통해 소셜 로그인 구현 시 회원 구분 방식, 가입 여부 처리 로직, 그리고 서비스 모듈화의 중요성을 다시 한 번 깨달았습니다.
또한, 단순한 오타나 컴파일 옵션 설정 미흡으로 인한 오류가 실제 서비스에 큰 영향을 미칠 수 있음을 명심하며, 앞으로는 환경 설정과 로그 관리에 더욱 신경쓰도록 하겠습니다.

profile
Dreamer

0개의 댓글