Skip to content

Conversation

@ochanhyeok
Copy link
Contributor

@ochanhyeok ochanhyeok commented Oct 29, 2025

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • OAuth 로그인 지원 추가 (Google, GitHub, Kakao)
    • 회원가입 기능 강화 및 입력 데이터 검증 개선
  • 리팩토링

    • REST API 구조 개선으로 응답 처리 최적화
  • 테스트

    • 애플리케이션 컨텍스트 로드 및 유효성 검증 테스트 추가

@coderabbitai
Copy link

coderabbitai bot commented Oct 29, 2025

전체 흐름

스프링 MVC 컨트롤러 두 개를 RESTful 컨트롤러로 변환하고, 사용자 회원가입 및 OAuth 인증을 위한 새로운 DTO와 엔티티를 추가하며, 기본 테스트 클래스와 테스트 메타데이터를 보완했습니다.

변경사항

그룹 / 파일(들) 변경 요약
컨트롤러 어노테이션 변환
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceController.java, AttendanceSessionController.java
@controller에서 @RestController로 변경하여 응답 직렬화 방식 개선 및 REST API 표준화
회원가입 DTO
backend/src/main/java/org/sejongisc/backend/user/dto/SignupRequest.java
name, email, password, role, phoneNumber 필드를 포함하며 Lombok 및 유효성 검증 적용
회원가입 응답 DTO
backend/src/main/java/org/sejongisc/backend/user/dto/SignupResponse.java
User 엔티티에서 변환하는 정적 팩토리 메서드와 Jackson 타임존 포맷팅 적용
OAuth 인증 제공자
backend/src/main/java/org/sejongisc/backend/user/entity/AuthProvider.java
GOOGLE, GITHUB, KAKAO 상수를 포함하는 새로운 열거형 추가
OAuth 계정 엔티티
backend/src/main/java/org/sejongisc/backend/user/entity/UserOauthAccount.java
User와의 다대일 관계를 가진 JPA 엔티티로 provider와 providerUid 필드 포함
테스트 클래스
backend/src/test/java/org/sejongisc/backend/BackendApplicationTests.java, AttendanceSessionControllerTest.java
애플리케이션 컨텍스트 로드 검증 테스트 추가 및 테스트 표시명 오류 수정

시퀀스 다이어그램

sequenceDiagram
    participant Client
    participant Controller as 회원가입<br/>Controller
    participant Service as User<br/>Service
    participant DB as Database
    
    Client->>Controller: POST /signup<br/>(SignupRequest)
    Note over Controller: @RestController<br/>요청 검증
    Controller->>Service: signup(request)
    Service->>DB: User 저장
    Service->>DB: UserOauthAccount 생성
    DB-->>Service: 생성 완료
    Service-->>Controller: User 반환
    Note over Controller: SignupResponse로<br/>변환
    Controller-->>Client: 200 OK<br/>(SignupResponse)
Loading

예상 코드 리뷰 난이도

🎯 2 (Simple) | ⏱️ ~12 분

  • 주의 사항:
    • UserOauthAccount의 User 관계 설정 및 lazy fetch 전략이 성능에 미치는 영향 확인
    • SignupResponse의 Jackson 타임존 포맷팅(Asia/Seoul) 설정이 의도대로 동작하는지 검증
    • SignupRequest의 phoneNumber 정규표현식(^[0-9]{10,11}$)이 모든 대상 번호 형식을 커버하는지 확인

관련 PR

추천 리뷰어

  • discipline24
  • msciki7

🐰 REST로 춤을 추고, 🔐
OAuth 친구들도 인사하며,
가입 요청이 응답으로 변신한다네~
데이터 검증은 튼튼하고,
엔티티 관계는 우아하게! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed PR 제목 "[BE] SISC1 [FIX] controller annotation 수정"은 AttendanceController와 AttendanceSessionController에서 @controller@RestController로 변경하는 실제 변경사항을 정확하게 반영하고 있습니다. 제목이 구체적이고 명확하게 controller annotation의 변경을 설명하고 있으며, 이는 changeset의 일부 측면을 잘 나타냅니다. 다만 changeset에는 SignupRequest, SignupResponse, AuthProvider, UserOauthAccount 등 새로운 DTO 및 entity 추가도 포함되어 있어, 제목이 전체 변경사항의 일부만 다루고 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch BE-SISC1-FIX-controller-annotation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/user/dto/SignupResponse.java (1)

24-31: 할당 연산자 주변의 공백을 일관되게 유지하세요.

생성자 내 할당문에서 = 연산자 주변에 공백이 없어 코드 일관성이 떨어집니다.

다음 diff를 적용하여 일관성을 개선할 수 있습니다:

     private SignupResponse(UUID userId, String name, String email, Role role, LocalDateTime createdAt, LocalDateTime updatedAt) {
-        this.userId=userId;
-        this.name=name;
-        this.email=email;
-        this.role=role;
+        this.userId = userId;
+        this.name = name;
+        this.email = email;
+        this.role = role;
         this.createdAt = createdAt;
         this.updatedAt = updatedAt;
     }
backend/src/main/java/org/sejongisc/backend/user/dto/SignupRequest.java (1)

27-29: @Pattern 애노테이션에 사용자 친화적인 메시지를 추가하세요.

전화번호 패턴 검증에 message 속성이 누락되어 있어, 검증 실패 시 사용자에게 명확한 오류 메시지가 전달되지 않습니다.

다음 diff를 적용하여 개선할 수 있습니다:

     @NotBlank(message = "전화번호는 필수입니다.")
-    @Pattern(regexp = "^[0-9]{10,11}$")
+    @Pattern(regexp = "^[0-9]{10,11}$", message = "전화번호는 10-11자리 숫자여야 합니다.")
     private String phoneNumber;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7f9c318 and 42aabdd.

📒 Files selected for processing (8)
  • backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceController.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/user/dto/SignupRequest.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/user/dto/SignupResponse.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/user/entity/AuthProvider.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/user/entity/UserOauthAccount.java (1 hunks)
  • backend/src/test/java/org/sejongisc/backend/BackendApplicationTests.java (1 hunks)
  • backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (5)
backend/src/main/java/org/sejongisc/backend/user/entity/UserOauthAccount.java (3)
backend/src/main/java/org/sejongisc/backend/user/entity/User.java (1)
  • Entity (12-65)
backend/src/main/java/org/sejongisc/backend/auth/entity/UserOauthAccount.java (1)
  • Entity (10-37)
backend/src/main/java/org/sejongisc/backend/user/service/UserServiceImpl.java (2)
  • Slf4j (24-128)
  • newUser (79-97)
backend/src/main/java/org/sejongisc/backend/user/dto/SignupResponse.java (4)
backend/src/main/java/org/sejongisc/backend/user/dto/SignupRequest.java (1)
  • Getter (9-30)
backend/src/main/java/org/sejongisc/backend/user/service/UserService.java (1)
  • signUp (12-12)
backend/src/test/java/org/sejongisc/backend/user/service/UserServiceImplTest.java (1)
  • Test (46-92)
backend/src/main/java/org/sejongisc/backend/user/service/UserServiceImpl.java (1)
  • Override (34-68)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceController.java (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
  • RestController (18-211)
backend/src/main/java/org/sejongisc/backend/user/dto/SignupRequest.java (3)
backend/src/main/java/org/sejongisc/backend/user/dto/SignupResponse.java (1)
  • Getter (11-43)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetails.java (1)
  • Getter (14-65)
backend/src/main/java/org/sejongisc/backend/user/dto/UserInfoResponse.java (1)
  • Getter (9-19)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceController.java (1)
  • RestController (19-100)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Backend Gate
🔇 Additional comments (5)
backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java (1)

117-117: 오타 수정 완료!

테스트 표시명에서 "유혀성"을 올바른 단어인 "유효성"으로 수정했습니다. 테스트 가독성이 개선되었습니다.

backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)

18-18: REST API 패턴에 맞는 올바른 변경입니다!

@Controller에서 @RestController로 변경한 것은 적절합니다. 모든 메서드가 ResponseEntity를 반환하므로 @RestController 사용이 REST API의 의도를 명확히 표현하며, 자동 JSON 직렬화가 적용됩니다. AttendanceController.java와의 일관성도 확보되었습니다.

backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceController.java (1)

19-19: LGTM!

@RestController 어노테이션으로의 변경이 올바르게 적용되었습니다. 모든 핸들러 메서드가 ResponseEntity를 반환하므로 REST API 컨트롤러로서의 의도가 명확해졌으며, AttendanceSessionController와 일관된 패턴을 유지하고 있습니다.

backend/src/test/java/org/sejongisc/backend/BackendApplicationTests.java (1)

1-15: LGTM! 표준적인 Spring Boot 테스트 구성입니다.

@SpringBootTest@ActiveProfiles("test")를 사용하여 테스트 프로파일에서 애플리케이션 컨텍스트가 정상적으로 로드되는지 검증하는 표준적인 패턴입니다.

backend/src/main/java/org/sejongisc/backend/user/entity/AuthProvider.java (1)

1-5: LGTM! 명확하고 간결한 enum 정의입니다.

OAuth 인증 제공자를 표현하는 표준적인 enum 구현입니다.

Comment on lines +10 to +34
@Entity
@Table(name = "user_oauth_account")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserOauthAccount extends BasePostgresEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "user_oauth_account_id", columnDefinition = "uuid")
private UUID userOauthAccountId;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false, columnDefinition = "uuid")
private User user;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private AuthProvider provider;

@Column(name = "provider_uid", nullable = false)
private String providerUid;
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

중복 엔티티 클래스가 존재합니다 - JPA 매핑 충돌 발생 위험

동일한 테이블(user_oauth_account)에 대한 엔티티 클래스가 이미 backend/src/main/java/org/sejongisc/backend/auth/entity/UserOauthAccount.java에 존재합니다.

두 엔티티의 주요 차이점:

  • 기존 엔티티에는 @UniqueConstraint(columnNames = {"provider", "provider_uid"})가 있지만 새 엔티티에는 없습니다
  • 서로 다른 패키지에 위치: user.entity vs auth.entity

이로 인한 문제:

  • JPA가 동일한 테이블에 대해 어떤 엔티티를 사용할지 결정할 수 없어 충돌이 발생합니다
  • 유니크 제약조건 누락으로 중복 OAuth 계정이 생성될 수 있습니다
  • UserServiceImploauthAccountRepositoryauth.entity.UserOauthAccount를 참조하고 있어 불일치가 발생합니다

다음 스크립트로 중복을 확인하세요:

두 엔티티 중 하나를 제거하거나, 용도가 다르다면 테이블 이름을 변경해야 합니다.


🏁 Script executed:

#!/bin/bash
# Description: 동일한 테이블에 매핑된 엔티티 클래스 확인

# user_oauth_account 테이블에 매핑된 모든 엔티티 검색
rg -n --type=java -C3 '@Table\(name\s*=\s*"user_oauth_account"'

# UserOauthAccount 클래스 정의 위치 확인
fd -e java UserOauthAccount.java

# UserOauthAccount를 사용하는 Repository 확인
rg -n --type=java -C3 'UserOauthAccountRepository'

Length of output: 5862


Now let me verify the specific details by checking the repository and entity usages:Based on my verification using the provided script output and web search findings, I can now generate the rewritten review comment:

중복 엔티티 클래스 제거 필요 - 동일 테이블에 매핑된 두 개의 JPA 엔티티 존재

동일한 테이블에 두 개의 엔티티를 매핑하는 것은 좋지 않은 설계 관행입니다. 현재 user_oauth_account 테이블에 대해 두 엔티티가 존재합니다:

  • backend/src/main/java/org/sejongisc/backend/user/entity/UserOauthAccount.java
  • backend/src/main/java/org/sejongisc/backend/auth/entity/UserOauthAccount.java

주요 문제:

  • auth.entity 버전에는 @UniqueConstraint(columnNames = {"provider", "provider_uid"})가 있지만, 새로운 user.entity 버전에는 없습니다
  • 여러 엔티티 타입을 동일한 데이터베이스 테이블 레코드에 대해 fetch하면 Persistence Context flush 시 불일치가 발생할 수 있습니다
  • UserOauthAccountRepositoryauth.entity.UserOauthAccount를 참조하고 있어, user.entity 버전과의 불일치가 발생합니다

해결 방안:

  1. user.entity.UserOauthAccount 클래스를 삭제하고, 기존 auth.entity.UserOauthAccount만 사용하거나
  2. 두 버전이 서로 다른 목적이 있다면 테이블을 분리하고 명확한 구조 설계 필요
🤖 Prompt for AI Agents
In backend/src/main/java/org/sejongisc/backend/user/entity/UserOauthAccount.java
around lines 10 to 34, there is a duplicate JPA entity mapping the same
user_oauth_account table which conflicts with
backend/src/main/java/org/sejongisc/backend/auth/entity/UserOauthAccount; remove
or consolidate the duplicate: delete this user.entity.UserOauthAccount (or merge
its intent into the auth.entity version), ensure the retained entity contains
the @UniqueConstraint(columnNames = {"provider","provider_uid"}) and all needed
fields/annotations, and update every import/usages (repositories, services,
DTOs) to reference the single entity package so there are no remaining
references to the removed class.

@ochanhyeok ochanhyeok closed this Oct 29, 2025
@ochanhyeok ochanhyeok deleted the BE-SISC1-FIX-controller-annotation branch November 25, 2025 04:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant