11package com .back .web7_9_codecrete_be .domain .auth .service ;
22
3+ import com .back .web7_9_codecrete_be .domain .auth .dto .google .GoogleUserInfo ;
34import com .back .web7_9_codecrete_be .domain .auth .dto .kakao .KakaoUserInfo ;
45import com .back .web7_9_codecrete_be .domain .auth .dto .request .LoginRequest ;
56import com .back .web7_9_codecrete_be .domain .auth .dto .request .SignupRequest ;
89import com .back .web7_9_codecrete_be .domain .users .entity .SocialType ;
910import com .back .web7_9_codecrete_be .domain .users .entity .User ;
1011import com .back .web7_9_codecrete_be .domain .users .repository .UserRepository ;
12+ import com .back .web7_9_codecrete_be .domain .users .util .NicknameGenerator ;
1113import com .back .web7_9_codecrete_be .global .error .code .AuthErrorCode ;
1214import com .back .web7_9_codecrete_be .global .error .code .UserErrorCode ;
1315import com .back .web7_9_codecrete_be .global .error .exception .BusinessException ;
@@ -28,6 +30,8 @@ public class AuthService {
2830 private final EmailService emailService ;
2931 private final TokenService tokenService ;
3032 private final KakaoOAuthService kakaoOAuthService ;
33+ private final GoogleOAuthService googleOAuthService ;
34+ private final NicknameGenerator nicknameGenerator ;
3135
3236 // 회원가입
3337 public void signUp (SignupRequest req ) {
@@ -165,7 +169,7 @@ public LoginResponse kakaoLogin(String code) {
165169
166170 private User registerKakaoUser (KakaoUserInfo info ) {
167171
168- String nickname = info . getNickname ();
172+ String nickname = nicknameGenerator . generate ();
169173 if (userRepository .existsByNickname (nickname )) {
170174 nickname = nickname + "_" + System .currentTimeMillis ();
171175 }
@@ -183,8 +187,55 @@ private User registerKakaoUser(KakaoUserInfo info) {
183187 return userRepository .save (user );
184188 }
185189
190+ @ Transactional
186191 public LoginResponse googleLogin (String code ) {
187- // TODO: 구글 인가 코드 → 사용자 정보 → 로그인 처리
188- throw new UnsupportedOperationException ("구글 로그인 미구현" );
192+
193+ // 1. 인가 코드 → 구글 Access Token
194+ String googleAccessToken = googleOAuthService .getAccessToken (code );
195+
196+ // 2. Access Token → 사용자 정보
197+ GoogleUserInfo googleUserInfo = googleOAuthService .getUserInfo (googleAccessToken );
198+
199+ if (googleUserInfo .getEmail () == null ) {
200+ throw new BusinessException (AuthErrorCode .SOCIAL_EMAIL_NOT_PROVIDED );
201+ }
202+
203+ // 3. 소셜 ID 기준 사용자 조회
204+ User user = userRepository
205+ .findBySocialTypeAndSocialId (
206+ SocialType .GOOGLE ,
207+ googleUserInfo .getSocialId ()
208+ )
209+ .orElseGet (() -> registerGoogleUser (googleUserInfo ));
210+
211+ // 4. 탈퇴 사용자 체크
212+ if (user .getIsDeleted ()) {
213+ throw new BusinessException (UserErrorCode .USER_DELETED );
214+ }
215+
216+ // 5. 토큰 발급
217+ tokenService .issueTokens (user );
218+
219+ return new LoginResponse (user .getId (), user .getNickname ());
220+ }
221+
222+ private User registerGoogleUser (GoogleUserInfo info ) {
223+
224+ String nickname = nicknameGenerator .generate ();
225+ if (userRepository .existsByNickname (nickname )) {
226+ nickname = nickname + "_" + System .currentTimeMillis ();
227+ }
228+
229+ User user = User .builder ()
230+ .email (info .getEmail ())
231+ .nickname (nickname )
232+ .password (null )
233+ .birth (null )
234+ .profileImage (info .getProfileImageUrl ())
235+ .socialType (SocialType .GOOGLE )
236+ .socialId (info .getSocialId ())
237+ .build ();
238+
239+ return userRepository .save (user );
189240 }
190241}
0 commit comments