클래스 선언 및 의존성 주입

@RestController
- 이 클래스가 RESTful 웹 서비스의 컨트롤러 역할을 한다는 것을 선언
@RequiredArgsConstructor
- final로 선언된 필드에 대해 생성자를 자동으로 생성해 주입

@GetMapping("/oauth/kakao/callback")
- /oauth/kakao/callback 경로로 GET 요청을 받을 때 이 메서드가 실행
@RequestParam String code
ResponseEntity<Map<String, String>>
- 응답 데이터를 HTTP 상태와 함께 반환하는 객체
- Map을 사용하여 응답 데이터를 key-value 형식으로 전달
kakaoService.getAccessTokenFromKakao(code)
- 카카오 인증 코드를 이용해 엑세스 토큰을 발급받는 메서드
response.put("access_token", accessToken)
카카오 API를 통해 유저 정보 가져오기

kakaoService.getUserInfoFromKakao(accessToken)
- 발급받은 엑세스 토큰을 사용해 카카오 API에서 유저 정보를 가져오기
userInfo.getKakaoAccount().getEmail()
response.put("email", email)
프로필 정보 확인 및 닉네임 저장

if (userInfo.getKakaoAccount().getProfile() != null) {
- 프로필이 있는지 체크
- 닉네임이 있다면 nickname 변수에 저장하고, response 객체에 "nickname"으로 저장
- 프로필 정보가 없을 경우, 경고 메시지를 로그에 남기고 "프로필 정보 없음"이라는 값을 response에 저장
데이터베이스에서 이메일 조회

userAuthMapper.findByEmail(email)
- 데이터베이스에서 이메일을 가진 유저 정보를 조회
유저 정보 확인 및 이메일 비교

if (userAuth != null)
logger.info("DB에서 조회된 이메일: {}", userAuth.getEmail());
userAuth.getEmail() == null || userAuth.getEmail().isEmpty()
- 이메일 정보가 없거나 필드가 없으면 경고 로그 기록, 에러 응답메세지 출력
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response)
- 400 BAD REQUEST 상태 코드와 함께 response를 반환
이메일이 일치 할 경우

- 데이터베이스에서 조회된 이메일(userAuth.getEmail())과 카카오에서 받아온 이메일(email)이 일치하는지 확인
- trim() 메서드를 사용해 양쪽 이메일의 앞뒤 공백을 제거한 후 비교
- 이메일이 일치하는 경우, 로그에 "이메일이 일치함: {} 메시지를 기록
- 이후 return ResponseEntity.ok(response);를 사용해 200 OK 상태 코드와 함께 response를 반환
- response에는 엑세스 토큰, 이메일, 닉네임이 포함되어 있으므로, 클라이언트는 이 정보를 이용해 로그인 완료 후의 처리를 할 수 있음
이메일이 일치하지 않는 경우
logger.warn("이메일이 일치하지 않음.")
response.put("error", "해당 계정과 연동된 유저 정보가 없습니다")
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
- 400 BAD REQUEST 상태 코드와 함께 응답을 반환
디비에 해당 이메일이 없는 경우

if (userAuth != null)
logger.warn("DB에서 해당 이메일을 찾을 수 없음: {}", email)
- 해당 이메일이 데이터베이스에 없다는 경고 로그를 기록
response.put("error", "해당 계정과 연동된 유저 정보가 없습니다")
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response)
- 400 BAD REQUEST 상태 코드와 함께 response를 반환
유저 정보 가져오기 실패

catch (Exception e)
logger.error(...)
- logger.error는 오류가 발생했음을 로그에 기록
response.clear()
response.put("error", ...)
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response)
- HTTP 500 상태 코드와 함께 오류 메시지를 반환
엑세스 토큰 발급 오류 처리

catch (Exception e)
- 엑세스 토큰 발급 중 발생한 모든 예외를 처리
... 위와 동일