Skip to content

Conversation

@jiwon1217
Copy link
Collaborator

@jiwon1217 jiwon1217 commented Jul 14, 2025

🛰️ Issue Number

🪐 작업 내용

  • Kakao OAuth 회원가입, 로그인, 로그아웃 기능을 구현했습니다.
  • 아직 커스텀 예외처리는 적용하지 않았습니다.
  • Kakao OAuth 애플리케이션 정보는 수업 시간에 생성했던 환경을 그대로 사용했습니다. 이 부분도 어떻게 관리할 지 논의가 필요해보입니다.
  • 제가 구현한 기능의 흐름은 다음과 같습니다
    • 뇌이싱 시작하기 버튼 클릭 → /oauth2/authorization/kakao 으로 요청 → Kakao 로그인 화면에서 ID/Password 입력 후 OAuth 인증 → 닉네임 설정 페이지에서 닉네임 입력 후 /signup 요청 → 회원가입 완료
    • 만약 Kakao OAuth 인증만 한 상태로 닉네임 설정을 하지 않으면 User 테이블에 nickname이 null인 user가 생성됨 → 그래서 사용자 정보를 불러와서 nickname이 null인 사용자면 닉네임 설정 페이지로 분기 되도록 json 응답 처리
      • 이것에 대한 json 응답은 API 명세서에 추가했습니다.
@Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws IOException {
        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
        response.setContentType("application/json;charset=UTF-8");

        if (principal.getUserNickname() == null) {
            // 닉네임 설정 필요 → 202 Accepted
            response.setStatus(HttpServletResponse.SC_ACCEPTED);
            objectMapper.writeValue(response.getWriter(), Map.of(
                "message", "닉네임을 설정하세요."
            ));
        } else {
            // 정상 로그인 → 200 OK
            response.setStatus(HttpServletResponse.SC_OK);
            objectMapper.writeValue(response.getWriter(), Map.of(
                "message", "로그인 성공"
            ));
        }
    }
  • 혹시 몰라서 인증 정보는 세션과 SecurityContextHolder 두 군데 모두 저장했습니다.
private void updateSessionAfterSignup(HttpSession session, User user) {
        session.removeAttribute("OAuthUser");
        session.setAttribute("user", new SessionUser(user));
    }
 public static void setAuthentication(User user) {
        UserPrincipal userPrincipal = new UserPrincipal(user, Collections.emptyMap());
        UsernamePasswordAuthenticationToken authentication =
            new UsernamePasswordAuthenticationToken(userPrincipal, null,
                userPrincipal.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
  • handler가 많이 추가돼서 service/handler로 한 번더 패키지를 분리했습니다.
  • SessionUser, UserPrincipal 모두 값을 저장하고 전달하는 역할 수행하기 때문에 dto 패키지에 생성했습니다.
  • Mapper를 추가하지 않아서 관련 리팩토링 작업은 다음 이슈에서 진행하겠습니다

📚 Reference

✅ Check List

  • 코드가 정상적으로 컴파일되나요?
  • 테스트 코드를 통과했나요?
  • merge할 브랜치의 위치를 확인했나요?
  • Label을 지정했나요?

@jiwon1217 jiwon1217 self-assigned this Jul 14, 2025
@jiwon1217 jiwon1217 added the enhancement New feature or request label Jul 14, 2025
Copy link
Collaborator

@silver-eunjoo silver-eunjoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 ! 혹시 현재 로그인한 유저의 id를 가져올 수 있게 UserDetails의 principal의 id를 꺼내올 수 있는 메서드도 구현해주실 수 있으실까요?

@jiwon1217
Copy link
Collaborator Author

고생하셨습니다 ! 혹시 현재 로그인한 유저의 id를 가져올 수 있게 UserDetails의 principal의 id를 꺼내올 수 있는 메서드도 구현해주실 수 있으실까요?

public Long getUserId() {
    return user.getId();
}

public String getUserNickname() {
    return user.getNickname();
}

UserPrincipal에 해당 메서드 추가해뒀습니다 !

new UsernamePasswordAuthenticationToken(
userPrincipal, null, userPrincipal.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
Copy link
Collaborator

@sehee123 sehee123 Jul 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L4-변경제안]
여기서 User 엔티티대신 User에서 필요한 부분만 분리해서 dto로 변경한다음에 넣어주는건 어떨까요?
User 엔티티 전체를 넣어서 principal을 생성하면 provider, providerId, lastLogin같은 불필요한 정보들이 모두 포함되어있을 필요는 없다고 생각됩니다.
그리고 User라는게 엔티티이다보니 영속성 대상이 되는것도 . . 뭔가 꼬이지 않을까요 (?)

Copy link
Collaborator Author

@jiwon1217 jiwon1217 Jul 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다른 분들이 UserPrincipal을 읽어와서 각자 맡은 기능을 구현하실 때, 구체적으로 어떤 필드가 필요할 지 몰라서 분리를 안하고 user 전체를 넣었습니다 ! 그래서 각자 맡은 부분에 대한 초기 PR이 올라오면 그것을 보고 mapper 변환 작업 진행하면서 같이 분리해보겠습니다 👍
닉네임 수정 API를 아직 구현하지 않아서 생각하지 못한 부분이네요,,, 말씀대로 User 값이 변경되는 코드를 수행한 후에는 현재는 user 전체를 저장하기 때문에 다시 메서드를 호출해서 권한을 세팅해줘야 할 것 같습니다.
다른 분들이 작업하시는 코드 보고 달아주신 리뷰 반영해보겠습니다 !

@silver-eunjoo
Copy link
Collaborator

silver-eunjoo commented Jul 14, 2025

고생하셨습니다 ! 혹시 현재 로그인한 유저의 id를 가져올 수 있게 UserDetails의 principal의 id를 꺼내올 수 있는 메서드도 구현해주실 수 있으실까요?

public Long getUserId() {
    return user.getId();
}

public String getUserNickname() {
    return user.getNickname();
}

UserPrincipal에 해당 메서드 추가해뒀습니다 !

[L4-변경제안]
옹.. 이게 그 부분이었군요 !

혹시 이렇게 사용하면 어떻게 사용해야 하나요?

지금까지는 SecurityContextHolder에서 꺼내쓰는 방식으로만 구현해봤어서요 !!

UserPrincipal을 컨트롤러에서 @AuthenticationPrincipal UserPrincipal userPrincipal 파라미터를 추가해주면 사용할 수 있는 건가요?
만약, 이 방법으로 사용해야 한다면, 서비스에서도 바로 호출해서 사용할 수 있도록 SecurityContextHolder에서 꺼내 쓰는 방식으로 사용할 수 있도록 따로 클래스와 메서드를 빼는 것은 어떤가요?


String nickname = signupRequest.nickname();
validateNickname(nickname);
validateDuplicateNickname(nickname);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L5-참고의견]
validateDuplicateNickname 메서드는 validateNickname 내부에 위치시켜도 좋을 것 같습니다.


private void validateDuplicateNickname(String nickname) {
if (userRepository.existsUserByNickname(nickname)) {
throw new RuntimeException("닉네임 중복");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L5-참고의견]
닉네임 중복은 E409001 에러코드가 존재하는 것으로 확인됩니다.

@jiwon1217
Copy link
Collaborator Author

[L4-변경제안] 옹.. 이게 그 부분이었군요 !

혹시 이렇게 사용하면 어떻게 사용해야 하나요?

지금까지는 SecurityContextHolder에서 꺼내쓰는 방식으로만 구현해봤어서요 !!

UserPrincipal을 컨트롤러에서 @AuthenticationPrincipal UserPrincipal userPrincipal 파라미터를 추가해주면 사용할 수 있는 건가요? 만약, 이 방법으로 사용해야 한다면, 서비스에서도 바로 호출해서 사용할 수 있도록 SecurityContextHolder에서 꺼내 쓰는 방식으로 사용할 수 있도록 따로 클래스와 메서드를 빼는 것은 어떤가요?

넵 말씀하신대로 util 메서드를 추가하면 @AuthenticationPrincipal UserPrincipal userPrincipal 파라미터를 추가하지 않아도 되기 때문에 코드가 깔끔해질 것 같습니다. util 클래스로 분리해서 메서드 추가해보겠습니다 !

Copy link
Collaborator

@LimKangHyun LimKangHyun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

Copy link
Collaborator

@sehee123 sehee123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다. 🙌

@jiwon1217 jiwon1217 merged commit 5d6071c into prgrms-web-devcourse-final-project:dev Jul 14, 2025
@jiwon1217 jiwon1217 deleted the feat/2 branch July 14, 2025 05:28
dlsrks1021 added a commit to dlsrks1021/WEB5_7_F1_BE that referenced this pull request Jul 14, 2025
* ✨ feat:  웹소켓 config 파일 생성 

* ✨ 웹소켓 config 파일 생성

* chore: Java 스타일 수정

* ♻️  refactor:sockJS 제거

---------

Co-authored-by: github-actions <>

* ✨ feat: GitHub Action 자동 Release 추가 (prgrms-web-devcourse-final-project#8)

* ✨ feat: GitHub Action 자동 테스트 추가 (prgrms-web-devcourse-final-project#10)

* fix: Test DB 미등록으로 인한 테스트 실패 문제 해결

* feat: test workflow 등록

* fix: build.gradle tab 문자 적용

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* ✨ feat: SSE 기본 연결 기능 구현 (prgrms-web-devcourse-final-project#11)

* ✨ feat: SSE 기본 기능 구현

* chore: Java 스타일 수정

* 🚚 rename: SSE 관련 파일 패키지 구분 추가

* chore: Java 스타일 수정

* 🗑️ remove: SSE 관련 중복 파일 삭제

---------

Co-authored-by: github-actions <>

* ✨ feat: 게임 방 생성 구현

* ✨ feat: 게임 방 생성 구현

* ✨ feat: repository, service 책임 분리, mapper추가

* chore: Java 스타일 수정

* ♻️ 리뷰 반영 수정

* chore: Java 스타일 수정

* 🩹 컨트롤러 import 추가

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* ✨ feat: 게임 방 전체 목록 조회 구현

* 🔧 chore: Quiz, User에 @Getter 및 임시 @Setter 추가

* chore: Java 스타일 수정

* ✨ feat: 룸 목록 조회 응답 DTO(RoomListResponse) 추가
- RoomResponse 추가

* chore: Java 스타일 수정

* ✨ feat: 룸 전체 조회 API 구현

* chore: Java 스타일 수정

* ✅ test: 룸 전체 조회 리포지토리 테스트 추가

* chore: Java 스타일 수정

* ♻️ 리뷰 반영 수정
- RoomService의 RoomMapper를 static import로 변경
- roomResponse DTO의 title을 roomName으로 변경

---------

Co-authored-by: github-actions <>

* ✨ feat : 퀴즈 생성 기능 구현

* ✨ feat : 게임 방 입장(+유효성 검증) 구현

* ✨ 게임 방 입장(+유효성 검증) 구현

* ♻️ 누락 import 추가

* ♻️ 클라이언트 send시 로그 추가

* chore: Java 스타일 수정

* ♻️ PR 리뷰 반영

* chore: Java 스타일 수정

* 🔥 refactor: validationResponse삭제

no content로 응답 변경으로 인한 응답 dto 삭제

* ♻️ PR 리뷰 반영-2

* ♻️ PR 리뷰 반영-2

* ✨ 유효성 체크 요청시 validation 어노테이션 추가

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* [feat] Kakao OAuth 회원가입, 로그인, 로그아웃 기능 (prgrms-web-devcourse-final-project#24)

* 🔧 chore: Kakao OAuth 기능 관련 설정

* ✨ feat: Kakao Oauth 회원가입, 로그인, 로그아웃 구현

* chore: Java 스타일 수정

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* feat: Github Action 자동 도커 이미지 빌드 추가 (#1)

---------

Co-authored-by: hwangsehee <[email protected]>
Co-authored-by: kanghyun <[email protected]>
Co-authored-by: Lee Eunjoo (Silver) <[email protected]>
Co-authored-by: Jiwon Kwak <[email protected]>
dlsrks1021 added a commit to dlsrks1021/WEB5_7_F1_BE that referenced this pull request Jul 14, 2025
* ✨ feat:  웹소켓 config 파일 생성 

* ✨ 웹소켓 config 파일 생성

* chore: Java 스타일 수정

* ♻️  refactor:sockJS 제거

---------

Co-authored-by: github-actions <>

* ✨ feat: GitHub Action 자동 Release 추가 (prgrms-web-devcourse-final-project#8)

* ✨ feat: GitHub Action 자동 테스트 추가 (prgrms-web-devcourse-final-project#10)

* fix: Test DB 미등록으로 인한 테스트 실패 문제 해결

* feat: test workflow 등록

* fix: build.gradle tab 문자 적용

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* ✨ feat: SSE 기본 연결 기능 구현 (prgrms-web-devcourse-final-project#11)

* ✨ feat: SSE 기본 기능 구현

* chore: Java 스타일 수정

* 🚚 rename: SSE 관련 파일 패키지 구분 추가

* chore: Java 스타일 수정

* 🗑️ remove: SSE 관련 중복 파일 삭제

---------

Co-authored-by: github-actions <>

* ✨ feat: 게임 방 생성 구현

* ✨ feat: 게임 방 생성 구현

* ✨ feat: repository, service 책임 분리, mapper추가

* chore: Java 스타일 수정

* ♻️ 리뷰 반영 수정

* chore: Java 스타일 수정

* 🩹 컨트롤러 import 추가

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* ✨ feat: 게임 방 전체 목록 조회 구현

* 🔧 chore: Quiz, User에 @Getter 및 임시 @Setter 추가

* chore: Java 스타일 수정

* ✨ feat: 룸 목록 조회 응답 DTO(RoomListResponse) 추가
- RoomResponse 추가

* chore: Java 스타일 수정

* ✨ feat: 룸 전체 조회 API 구현

* chore: Java 스타일 수정

* ✅ test: 룸 전체 조회 리포지토리 테스트 추가

* chore: Java 스타일 수정

* ♻️ 리뷰 반영 수정
- RoomService의 RoomMapper를 static import로 변경
- roomResponse DTO의 title을 roomName으로 변경

---------

Co-authored-by: github-actions <>

* ✨ feat : 퀴즈 생성 기능 구현

* ✨ feat : 게임 방 입장(+유효성 검증) 구현

* ✨ 게임 방 입장(+유효성 검증) 구현

* ♻️ 누락 import 추가

* ♻️ 클라이언트 send시 로그 추가

* chore: Java 스타일 수정

* ♻️ PR 리뷰 반영

* chore: Java 스타일 수정

* 🔥 refactor: validationResponse삭제

no content로 응답 변경으로 인한 응답 dto 삭제

* ♻️ PR 리뷰 반영-2

* ♻️ PR 리뷰 반영-2

* ✨ 유효성 체크 요청시 validation 어노테이션 추가

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* [feat] Kakao OAuth 회원가입, 로그인, 로그아웃 기능 (prgrms-web-devcourse-final-project#24)

* 🔧 chore: Kakao OAuth 기능 관련 설정

* ✨ feat: Kakao Oauth 회원가입, 로그인, 로그아웃 구현

* chore: Java 스타일 수정

* chore: Java 스타일 수정

---------

Co-authored-by: github-actions <>

* feat: Github Action 자동 도커 이미지 빌드 추가 (#1)

* Feat/22 (#3)

* feat: Github Action 자동 도커 이미지 빌드 추가

* fix: next version으로 이미지 태그 생성

---------

Co-authored-by: hwangsehee <[email protected]>
Co-authored-by: kanghyun <[email protected]>
Co-authored-by: Lee Eunjoo (Silver) <[email protected]>
Co-authored-by: Jiwon Kwak <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants