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