Conversation
…인 변경 (#66) * feat: 모든 도메인 내 메서드 isFestivalIdEqualTo → isOrganizationIdEqualTo로 변경 * refactor: PlaceFavorite 삭제 * refactor: LostItem 도메인 + 컨트롤러 권한 검증 수정 * refactor: EventDate 도메인 + 컨트롤러 권한 검증 수정 * refactor: Event 도메인 + 컨트롤러 권한 검증 수정 * refactor: Announcement 도메인 + 컨트롤러 권한 검증 수정 * refactor: Council 도메인 삭제 * refactor: ImageStoreController 권한 검증 수정 * refactor: Lineup 도메인 + 컨트롤러 권한 검증 수정 * refactor: council -> organization 으로 인한 변경 사항 * refactor: PlaceAnnouncement 도메인 + 컨트롤러 권한 검증 수정 * refactor: Question 도메인 + 컨트롤러 권한 검증 수정 * refactor: TimeTag 도메인 + 컨트롤러 권한 검증 수정 * refactor: Festival, FestivalImage 도메인 + 컨트롤러 권한 검증 수정 * refactor: Place 도메인 + 컨트롤러 권한 검증 수정 * refactor: PlaceImage 도메인 + 컨트롤러 권한 검증 수정 * refactor: PlaceGeographyController 컨트롤러 권한 검증 수정 * refactor: Council -> Organization 시큐리티 코드 변경 * refactor: FestivalNotificationSubscriptionController 컨트롤러 권한 검증 수정 * docs: 스웨거 제목 수정 * refactor: Organization 도메인 + 컨트롤러 권한 검증 수정 * refactor: Council -> Organization으로 인한 Festival 쪽 응답 수정 * refactor: Festival 검색 API 및 Service 권한 로직 수정 * refactor: LostItemService 권한 로직 수정 * refactor: TimeTagService 권한 로직 수정 * refactor: QuestionService 권한 로직 수정 * refactor: LineupService 권한 로직 수정 * refactor: FestivalImageService 권한 로직 수정 * refactor: PlaceAnnouncementService 권한 로직 수정 * refactor: PlaceGeographyService 권한 로직 수정 * refactor: PlaceImageService 권한 로직 수정 * refactor: EventDateService 권한 로직 수정 * refactor: OrganizationService 권한 로직 수정 * refactor: AnnouncementService 권한 로직 수정 * refactor: PlaceService 권한 로직 수정 * test: Fixture 수정 * refactor: EventService 권한 로직 수정 * refactor: AnnouncementService 권한 로직 수정 * feat: flyway 스키마 추가 * test: 도메인 분리로 인한 테스트 수정 * [Refactor] festival 도메인 분리 과정에서 발생한 버그 수정 및 예외 메시지 변경 (#71) * fix: organization에 속하는 place만 클론할 수 있도록 변경 * refactor: 모든 권한 예외 응답 메시지를 "접근 권한이 없습니다."로 통일 * fix: 파라미터 변수 이름이 organizationId가 아닌 festivalId로 작성되어있던 버그 수정 - 메서드 명도 festival -> organization으로 변경 * refactor: 불필요한 주석 삭제 * feat: 조직별 축제 리스트 조회 API 구현 * [Feat] Organizer, Staff, StaffAuthorize 추가 (#75) * feat: Organizer 로그인 및 비밀번호 변경 추가 * feat: Organizer 생성 및 테스트 추가 * feat: Staff 생성 및 테스트 추가 * feat: OrganizationDetails를 AccountDetails로 변경 * refactor: 축제 이미지 컨트롤러 분리 * docs: 축제 관리자로 네이밍 변경 * refactor: 유추하지 못하도록 존재하지 않는 조직 관리자, 존재하지 않는 축제 관리자, 비밀번호 불일치 예외 메시지 통일 * docs: 권한 별, 용도 별로 Swagger 표시 * feat: 특정 축제의 지리 정보 수정 API 추가 * feat: Staff에 name 컬럼 추가 - SecurityConfig에 POST 화이트리스트 테스트 API를 Device로 변경, Staff 로그인에서 security 예외와, 로그인 실패 예외가 같아 변경 * test: EnumSource 권한 검증 테스트에서 권한을 사용하도록 변경 - Staff 권한 추가 - Staff의 Roles 테이블 제거 - StaffControllerTest 추가 * refactor: /organizer 엔드포인트 /organizers로 변경 * fix: 축제 생성 api에 STAFF 권한 제거 - 권한 테스트 추가 * feat: Staff username의 UNIQUE 제약조건 제거 - Staff에 organization과 N:1 제약조건 추가 - username, organization_id 복합 유니크 제약조건 추가 * feat: staff_roles 추가 * test: 잘못된 명명 규칙 수정 * refactor: staffId와 festivalId 노출 제거 * [Refactor] Festival 권한 정책을 주요 도메인 전반으로 확장 적용 (#76) * refactor: festival 권한 정책을 주요 도메인 서비스 전반에 확장 * refactor: 불필요한 메서드 파라미터 제거 - 테스트를 프로덕션에 맞게 수정 * refactor: 불필요한 JpaRepository 메서드 제거 * refactor: 클래스 명 및 메서드 명 변경 - FestivalAccess -> Authorzation - AccessCreate -> validateFestivalAccess * refactor: Policy -> Resolver로 네이밍 변경 * feat: festivalImage id 리스트 검증 추가 * feat: PlaceImage id 리스트 검증 추가 * feat: Place id 리스트 검증 추가 * feat: TimeTag id 리스트 검증 추가 * feat: Question id 리스트 검증 추가 * chore: 주석 제거 * refactor: Id 추출을 Ids 추출과 통일해서 하나만 유지하도록 변경 * refactor: 불필요한 import 제거 * test: 불필요한 import 제거 * refactor: 권한 검증을 먼저 수행하도록 변경 * refactor: getAuthenticatedAccountDetails 메서드에서, Authentication null 검증 추가 * refactor: resolver가 없는 경우, 서버 에러로 명시 * test: 괸리자를 admin으로 명시 * test: 잘못된 변수명 수정 * test: 잘못된 변수명 수정 * feat: Staff 권한 수정 API 추가 * feat: Staff 생성 시, festival 접근 권한도 같이 설정 * feat: Staff 삭제 API 추가 * feat: Staff username, deleteAt UNIQUE 제약조건 변경 - 로그인시 organization_id 반환 * fix: 권한 검증 중, 조회된 festivalId가 없다면 예외가 발생 * chore: NULL 유니크 키 값 방지를 위해 NULL인 경우 고정값을 넣도록 수정 * chore: NULL 유니크 키 값 방지를 위해 NULL인 경우 고정값을 넣도록 수정 * refactor: AuthorizationService에서, 접근하려는 엔티티가 없다면 권한 검증 통과 * refactor: 검증 추가 및 변경 * refactor: staff 저장 stub 추가 * refactor: 중복 검사 제거 * refactor: 주석 제거 * refactor: 중복 사용자 예외 메시지 변경 * refactor: 스태프 -> 축제 관리자 예외 메시지 변경 * refactor: getOrganizationByOgranizationId * refactor: getStaffByStaffId * refactor: LinkedHashSet 제거 * refactor: 사용하지 않는 파라미터 제거 * test: 테스트 메서드 네이밍 통일 - 존재하지_않는_축제는_권한_검증_통과 - 권한_없는_축제는_권한_검증_실패 - 존재하지_않는_{엔티티}는_권한_검증_실패 * feat: organization id 추출 resolver 추가 * feat: AuthorizationService에 organization 접근 권한 검증 추가 - AccountDetails 테스트 추가 * feat: 축제 생성 권한 검증 로직 변경 * refactor: 조직의 축제 전체 조회 검증 로직 변경 * refactor: 축제 관리자 생성의 권한 검증 로직 변경 * refactor: 축제 관리자 삭제의 권한 검증 로직 변경 * refactor: 축제 관리자 권한 변경 로직의 권한 검증 로직 변경 * refactor: 조직 관리자 비밀번호 변경 로직의 권한 검증 로직 변경 * feat: AuthorizationService에 organization과 연관된 객체 검증 로직 추가 * refactor: Staff 삭제, 권한 수정 로직에 Staff 권한 로직을 변경 * refactor: staff 로그인 시, organizationId 없이 로그인하도록 변경 * test: 오타 수정 * test: actual을 result로 변경 * refactor: 불필요한 import 제거 * refactor: organizationId로 변경 * refactor: authentication도 403 예외를 던지도록 통일 * refactor: swagger 전역 변수 추가 및 organizationId 헤더 변경 * test: 네이밍 통일 * test: authority endpoint 명을 authorities로 변경 * fix: 잘못된 경로 수정 * test: organizationId, festivalId 헤더 생성을 AcceptanceTestSupport로 중복 제거 - 불필요하게 변수로 가지고있는 헤더도 바로 생성 후 사용하도록 변경 * test: 세미콜론 두개를 하나로 줄임 * refactor: 존재하지 않는 축제 관리자도, 접근 권한 없음로 응답 --------- Co-authored-by: soeun2537 <soeun2537@gmail.com> * [Feat] 조직 관리자 API, 축제 관리자 API, 권한 검증 API, 계정 관리 조회 API 구현, 축제 수정 API 분리 (#77) * feat: 민감 정보 마스킹 처리 * feat: api prefix 제거 * refactor: 폴뎌 경로 이동 * docs: SwaggerConfig 수정 * feat: 로그인 응답값에 organizationName 추가 * feat: 조직 관리자 이름 변경 API, 아이디 중복 API 구현 * test: Organizer 도메인 테스트 추가 * feat: flyway 스크립트 수정 * feat: 관리자 권한 검증 API, 계정 관리 조회 API 구현 * test: 관리자 권한 검증 API, 계정 관리 조회 API 테스트 추가 * refactor: 축제 지리 정보 수정 API 3개로 분리 * test: 축제 지리 정보 수정 API 3개로 분리 테스트 수정 * feat: 누락된 변경사항 반영 * feat: 누락된 어노테이션 추가 * refactor: 오타 수정 * test: 깨진 테스트 수정 * refactor: 미사용 메서드 삭제 * test: 오타, 깨지는 테스트 수정 * test: 검증 로직 수정 * refactor: 폴더 이동 * refactor: 관리자 권한 검증 도메인 변경 * test: 테스트 폴더 변경 * refactor: 로그인 응답 값 변경 * feat: 조직 정보 조회 API 구현, 중복 아이디 검증 로직 수정 * feat: flyway Organizer 유니크 제약 조건 추가 * refactor: 조직 관리자 아이디 검증 로직 변경 * refactor: 축제 관리자 아이디 검증 로직 변경 * feat: 조직 정보 조회 API 구현 * refactor: 오타 수정 * refactor: 유니크 제약 삭제 * test: 오타 삭제 * refactor: 선언 방식 변경 * feat: OperatorId 구현 * test: JwtTestHelper 수정 * refactor: Organizer PATCH API 권한 검증 로직 수정 * feat: JwtProvider ADMIN 관련 로직 추가 * feat: Staff 4개 API 구현 * test: Staff 4개 API 테스트 작성 및 타 테스트 로직 보완 * test: 오타 수정 * test: ADMIN 우회 로직 테스트 추가 * test: Fixture 줄바꿈 * test: 테스트 누락 사항 반영 * test: Fixture 사용하도록 변경 * test: StaffServiceTest 리팩터링 * test: 불필요한 RoleType 제거 * refactor: 불필요한 검증 로직 수정 * refactor: 불필요한 코드 삭제 * refactor: == null 비교 Objects.isNull로 변경 * test: 필드 수 검증 추가 * test: operatorId 할당 로직 변경 * test: jwtProvider 호출로 변경 * refactor: OperationId 비교 로직 수정 * refactor: 예외명 변경 * refactor: 아이디 중복 검사 응답 변경 * refactor: 함수 인자 변경 * refactor: 쿼리 deleted 삭제 * refactor: 조직 조회 STAFF 권한까지 가능하도록 변경 * refactor: 검증 로직 리팩터링 * refactor: null 검증 로직 변경 * refactor: polygon 구멍 좌표 개수 제한 * refactor: 축제 조회 권한 변경 * docs: Swagger명 변경 * feat: 축제 관리자들 조회에 권한 목록 추가, 단일 축제 관리자 API 구현 * test: getAllByOrganizationId 테스트 추가 * docs: 스웨거 수정 * feat: Organizer, Staff 길이 검증 추가 * feat: Organizer, Staff 비밀번호 바이트 검증 추가 * docs: 제목 변경 * test: 테스트명 변경 * test: 불필요한 모킹 제거 * refactor: AuthorizationServiceTest 추상화를 통해 메서드 합치기 * feat: flyway 스크립트 수정 * refactor: AuthorizationService 메서드 네이밍 변경 * refactor: OnlineDDL Lock, Algorithm 최소한으로 설정 - INPLACE, NONE --------- Co-authored-by: changui <122252160+changuii@users.noreply.github.com>
* refactor: image path-prefix configuration 삭제 * refactor: 이미지 경로 관련 불필요한 코드 제거 및 테스트 정리 * chore: 컨테이너 실패 원인 분석 * chore: 다시 삭제 * chore: sudo 설정 * chore: 명시 지정 * fix: workflows ubuntu 버전 환경 고정 * chore: 피드백 수정 * Delete ~/Desktop/log/application.json * fix: docker api version 명시 * ci: 스크립트 수정 * fix: docker 29 버전 대응 testcontainers 버전으로 업그레이드 --------- Co-authored-by: changui <122252160+changuii@users.noreply.github.com> Co-authored-by: soeun2537 <soeun2537@gmail.com>
* fix: s3 접근 경로를 image path로 사용하도록 변경 * fix: path를 s3에 저장한 위치로 변경
* refactor: 예외 통일 * docs: Swagger 문서화 수정 * refactor: 예외 변경 * refactor: 예외 조립 방식 변경 * refactor: 변수명 변경 * test: 필요없는 변수 제거 * refactor: 예외명 통일 * refactor: 불필요한 import 제거 * test: 테스트 수정 * refactor: 예외명 명시적으로 변경
* feat: PlaceManager 생성 * feat: placeId를 이용해 PlaceManager 조회(key, expiresAt) * feat: PlaceManager의 만료 일자를, 지난 날짜로 수정하여 만료시키는 기능 추가 * docs: Swagger 문서 변경 * feat: placeManager 로그인 추가 * refactor: PlaceManager 권한 검증을 연관 엔티티 기준으로 변경 * feat: 플레이스 관리자용 메인 플레이스 수정 API 추가 * fix: 플레이스 관리자 로그인에 비밀번호 검증이 없던 버그 수정 * fix: 도메인 내부 SQLDelete 쿼리 테이블 수정 * docs: PlaceManagerController Swagger Tag 추가 * fix: PlaceManagerCreateRsponse -> Response로 오타 수정 * refactor: expiresAt을 expirationDays로 변경 - expiresAt은 날짜처럼 느껴짐 -> 상대적 만료 일자로 변경 * fix: 만료 일자가 0일 이하인 경우 예외 발생 * fix: 중복 활성 플레이스 매니저 생성 검증 추가 * test: isEmptyOrNullString -> emptyOrNullString - Deprecated 메서드 제거 * test: test 접미사 제거 * refactor: 빈 record 개행 추가 * test: 불필요한 placeId 변수 선언 제거 * test: response -> result 컨벤션 규칙 반영 * test: 응답 필드명 오타 수정 * fix: URL 경로 '/' 누락 수정 * test: response 필드 수 검증 추가 * test: response 필드 수 검증 추가 * refactor: PlaceManager -> PlaceAccess로 변경 * test: PlaceManager -> PlaceAccess로 변경 * refactor: DB 스키마 변경 * fix: 잘못 변경한 부분 수정 * refactor: 엔드포인트명 수정 * refactor: 글자 수 선언 * refactor: 클래스명 변경 * test: Helper 예외 타입 특정 * test: 예외 타입 특정 * test: 예외 타입 특정 * refactor: long -> int 수정 * refactor: 권한 축소 * refactor: 만료 일시 검증 수정 * refactor: 응답에 만료 일시 추가 * refactor: 응답에 만료 일시 버그 수정 * refactor: 접근 링크 검증 수정 * refactor: 로그인 응답 수정 * refactor: 로그인 접근 권한 없습니다로 예외 타입 변경 * refactor: 이미지 추가 권한 수정 * refactor: jpa 쿼리 수정, 메서드 인자 타입 수정 * feat: 만료된 링크 예외 처리 --------- Co-authored-by: 이소은 <soeun2537@gmail.com>
* refactor: 권한 선언 순서 변경 * docs: Swagger 엔드포인트명 수정 * docs: Swagger 엔드포인트명 수정
- 컨벤션 최신화 - 충돌하는 컨벤션 예외 조항들 추가
* refactor: AccountDetails를 분리한다. - 각 ROLE별로 상속 관계로 분리한다. - 공통 필드인 roles만 유지하고, 나머지는 하위 타입으로 이동시키고 동작은 AccountDetails에 정의한다. * refactor: JwtAuthenticationFilter의 토큰 추출 책임을 분리하고 전략 패턴을 도입해 확장할 수 있도록 변경 * refactor: OperatorId를 제거 - OperatorId를 제거하고 현재, 접근중인 Account의 type은 AuthorizationService가 추출해서 검증하는 방식으로 변경 * refactor: 불필요한 switch 문 제거 * fix: OperatorCommandAccess에 PlaceAccess는 접근 불가한 규칙을 제거 * refactor: Admin과 PlaceAccess Details에서 username 지정 * test: DisplayNameGenerator 누락 * test: gitleaks 주석 추가 * test: 누락된 DisplayNameGeneration 추가 * docs: CLAUDE 지침 파일 추가 * refactor: 토큰 추출 과정 중에서, 값을 찾을 수 없는 경우 예외를 던지도록 변경 * feat: AccountDetails에 hasRole 추가 * refactor: supportedRole 네이밍을 getSupportedRole로 변경 * refactor: 토큰에 null 값이 존재하는 경우 예외처리 * refactor: AccountDetailsStrategy 네이밍을 AccountDetailsExtractStrategy로 변경 * test: 테스트케이스 보완 * fix: extract 전략 NPE 처리, 토큰 데이터 누락 예외 메시지 추가 * test: when 절의 테스트 대상 메서드 응답값은 result 변수명으로 통일 * refactor: Roles가 Claim에 없다면, 빈 컬렉션 반환
|
Important Review skippedToo many files! This PR contains 300 files, which is 150 over the limit of 150. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (300)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
* refactor: 불필요 클래스 삭제 * refactor: 권한 전면 리팩터링 * refactor: 네이밍 변경 * refactor: 불필요 메서드 삭제 * refactor: 불필요 빈 등록 삭제 * refactor: 주요 도메인 권한 검증 구현 * refactor: 불필요한 메서드 삭제 및 피드백 반영 * fix: 검증 논리적 오류 수정 * refactor: 불필요 공백 제거 * docs: 컨벤션 엡데이트 * refactor: 메서드 네이밍 변경 * refactor: 예외 통일 * refactor: 메서드 통일 * test: 권한 검증 전면 리팩터링 테스트 수정 * docs: 코드 컨벤션 업데이트 * test: 권한 검증 주요 도메인 테스트 추가 * fix: 누락된 어노테이션 추가 * refactor: Announcement 권한 검증 로직 수정 * refactor: Event 권한 검증 로직 수정 * refactor: EventDate 권한 검증 로직 수정 * refactor: FestivalImage 권한 검증 로직 수정 * refactor: Lineup 권한 검증 로직 수정 * refactor: LostItem 권한 검증 로직 수정 * refactor: PlaceGeography 권한 검증 로직 수정 * refactor: Question 권한 검증 로직 수정 * refactor: TimeTag 권한 검증 로직 수정 * refactor: PlaceImage 권한 검증 로직 수정 * refactor: PlaceAnnouncement 권한 검증 로직 수정 * refactor: 미사용 메서드 삭제 * refactor: PlaceTimeTag 권한 검증 로직 수정 * refactor: EventDate 권한 검증 로직 수정 * refactor: 하위 도메인 권한 검증 로직 테스트 수정 * docs: 도메인 검증 로직 컨벤션 추가 * test: 주요 도메인 권한 검증 테스트 추가 * docs: 도메인 권한 검증 컨벤션 추가 * refactor: 불필요한 주석 삭제 * refactor: 하위 도메인 권한 검증 로직 수정 * docs: 도메인 권한 검증 컨벤션 추가 * test: 하위 도메인 권한 검증 테스트 추가 * fix: 테스트 깨지는 부분 수정 * test: 테스트 컨벤션 맞춰 수정 * docs: 컨벤션 엡데이트 * test: 테스트 컨벤션 맞춰 수정
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 본 Pull Request는 코드 품질 향상, API 보안 강화, 문서 정비 및 테스트 코드 개선을 목표로 합니다. 코드 컨벤션 가이드 업데이트를 통해 AI Agent 및 자동 코드 리뷰의 효율성을 높이고, 의존성 업데이트를 통해 안정성을 확보합니다. 또한, 학생회 관련 기능 제거 및 권한 검증 로직 개선을 통해 코드 복잡성을 줄이고 API 보안을 강화합니다. 마지막으로, API 문서 개선 및 테스트 코드 개선을 통해 개발 생산성을 향상시킵니다. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
|
There was a problem hiding this comment.
Code Review
이번 PR은 기존 Council 모델을 Organization, Organizer, Staff 계층 구조로 대체하여 더 견고하고 세분화된 새로운 권한 시스템을 도입하는 대규모 리팩토링으로 보입니다. AuthorizationService와 Resolver 패턴을 도입하여 권한 검사를 중앙에서 관리하도록 변경한 점은 설계와 유지보수성 측면에서 큰 개선입니다. 전반적으로 코드가 훨씬 깔끔해졌고, 새로 정의된 상세한 스타일 가이드를 잘 따르고 있습니다. 제 리뷰는 코드의 일관성과 안정성을 더욱 높이기 위한 몇 가지 제안에 초점을 맞추었습니다.
Note: Security Review did not run due to the size of the PR.
I am having trouble creating individual review comments. Click here to see my feedback.
src/main/java/com/daedan/festabook/announcement/controller/AnnouncementController.java (54)
code-style.md의 9.4. @Operation summary 권한 접두사 이모지 규칙에 따르면, 누구나 접근 가능한 API에는 ⚪ (U+26AA)를 사용하도록 되어 있습니다. 현재 코드에서는 ⚪️ (U+26AA U+FE0F)가 사용되어 미세한 차이가 있습니다. 시각적으로는 비슷해 보일 수 있으나, 유니코드 값이 달라 잠재적인 파싱 오류를 방지하고 규칙의 일관성을 지키기 위해 가이드에 명시된 문자로 통일하는 것이 좋습니다.
@Operation(summary = "⚪ 축제의 공지 전체 조회")
References
- Style guide section 9.4 specifies the emoji to be used for different authorization levels in
@Operationsummaries. For APIs accessible without authentication, the⚪(U+26AA) emoji should be used. The current code uses a variant with a selector (⚪️), which is a minor deviation. (link)
src/main/java/com/daedan/festabook/authorization/service/AuthorizationService.java (7)
code-style.md의 1.1. 공통 원칙에 따라 사용하지 않는 import는 제거해야 합니다. com.daedan.festabook.global.exception.BusinessException import가 현재 파일에서 사용되지 않고 있으므로 제거하여 코드를 더 깔끔하게 유지하는 것이 좋습니다.
References
- Style guide section 1.1 states that unused imports must be removed to improve code readability and avoid confusion. (link)



#️⃣ 이슈 번호
🛠️ 작업 내용
🙇🏻 중점 리뷰 요청
📸 이미지 첨부 (Optional)