Skip to content

release: 2026.09.28 배포 - #2465

Merged
taejinn merged 16 commits into
mainfrom
develop
Sep 28, 2026
Merged

taejinn merged 16 commits into
mainfrom
develop

Conversation

@taejinn

@taejinn taejinn commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

🔍 개요

  • 버스 시간표 조회 시 하나의 노선에 대해 여러 대가 운행할 경우 잘못 저장되고 조회되던 문제를 해결했습니다.
  • 콜벤팟 노출 기준을 변경했습니다.

✅ Checklist (완료 조건)

  • 코드 스타일 가이드 준수
  • 테스트 코드 포함됨
  • Reviewers / Assignees / Labels 지정 완료
  • 보안 및 민감 정보 검증 (API 키, 환경 변수, 개인정보 등)

taejinn and others added 16 commits September 21, 2026 18:33
* feat: 웹 전용 HttpOnly 쿠키 인증 추가

* fix: 웹 쿠키 인증 예외 경로와 회귀 검증 보완 (#2424)

* docs: 웹 인증 Swagger 명세 및 계약 테스트 보완 (#2424)

* feat: 웹 CSRF 토큰을 서명된 일반 쿠키로 전달 (#2424)

기존 SSR·브라우저 직접 호출 구조에서 쿠키 기반 CSRF 처리를 지원합니다.

Constraint: 기존 앱 인증과 BFF 미도입 유지
Not-tested: 실제 브라우저·프론트 SSR 통합 및 운영·stage 배포

* test: 웹 인증 HTTP 테스트 결과를 CI에 포함 (#2424)

Constraint: 분리한 HTTP 테스트도 기존 결과 게시와 실패 표시 대상에 포함

* fix: 운영·stage 웹 인증 쿠키 설정 분리 (#2424)

확정된 프론트 주소에 맞춰 프로필별 공유 범위와 쿠키 이름을 분리합니다.

Constraint: API 호출 경로와 Refresh 호스트 전용 범위 유지
Not-tested: 실제 서버 키 설정 및 브라우저·SSR 통합 배포
feat: 콜벤팟 만료 게시글 필터링 적용
* feat: 주문 번호 컬럼 추가

POS에서 사장님에게 노출할 주문 번호가 필요하다. 기본키와 PG 주문 ID는
노출하기 부적절하여 대문자 알파벳과 숫자를 혼합한 10자리 번호를 도입한다.
규칙 변경에 대비해 생성 책임을 OrderNumberGenerator로 분리했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: 사장님 주문 목록, 상태별 주문 수, 주문 상세 조회 API 추가

POS 배달 주문 관리 화면에 필요한 조회 API를 추가한다.
목록은 탭에 대응하는 상태 구분을 파라미터로 받아 접수 일시 내림차순 전체를 반환한다.
탭 뱃지 숫자는 목록과 함께 갱신할 필요가 없어 별도 API로 분리했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: 사장님 주문 조회 서비스 단위 테스트 추가

탭별 상태 매핑, 완료 수 합산, 상세 응답 구성과 권한 검증을 검증한다.
다른 상점의 주문을 조회하면 존재 여부를 노출하지 않도록 404로 처리하는
동작도 함께 검증한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 주문 조회 권한 검증을 도메인 엔티티로 이동

서비스가 상점에서 사장님 식별자까지 세 단계를 타고 들어가 결합도가 높았다.
OrderableShop에 requireOwner를, Order에 isOrderedAt을 두어 자신의 상태는
스스로 판단하게 한다. requireShopOpen 등 기존 엔티티 검증 메서드와 형태를 맞췄다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 주문 상태 구분 열거형 생성자를 롬복으로 대체

직접 작성한 생성자를 @requiredargsconstructor로 바꿔 ApiResponseCode 등
기존 열거형과 형태를 맞춘다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style: 응답 코드 정적 임포트를 와일드카드로 정리

OrderStatusCriteria 등 기존 파일과 동일하게 ApiResponseCode를 와일드카드로
임포트해 응답 코드가 늘어도 임포트 목록이 길어지지 않게 한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore: 로컬 설정값을 환경 변수로 분리

application-local.yml에 하드코딩된 접속 정보와 외부 연동 값을 환경 변수
참조로 바꾸고 기존 값을 기본값으로 남겨 별도 설정 없이도 동작하게 한다.
웹 인증 CSRF 키 항목을 .env.example에 추가한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 진행 중 주문 판별을 쿼리에서 OrderStatus로 이동

JPQL 문자열 안에 완료 상태 목록이 하드코딩되어 있어 상태가 늘어날 때
쿼리를 고쳐야 했다. 각 상태가 진행 중인지를 OrderStatus가 직접 알도록 하고
쿼리는 전달받은 목록으로만 필터링한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 탭별 상태 구성 지식을 OwnerOrderStatusCriteria로 일원화

완료 탭이 배달 완료와 반려를 합친다는 규칙이 열거형과 응답 DTO, 서비스
상수에 흩어져 있었다. 집계 대상 상태와 탭별 합산을 열거형이 책임지게 하여
탭이 늘거나 구성이 바뀔 때 한 곳만 고치면 되도록 한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 예상 시각 조회를 Order 메서드로 이동

응답 DTO가 주문 타입에 따라 배달과 포장 연관관계를 직접 헤집으며 예상 시각을
꺼내고 있었다. 같은 탐색이 사장님 목록과 고객 진행 중 목록에 중복되어 있었고
고객 쪽은 널 검사가 없어 연관관계가 비면 터질 수 있었다.
Order가 자신의 예상 시각을 알려주도록 하고 두 DTO가 함께 사용한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 상태별 집계 프로젝션 제거하고 탭별 개수 조회로 대체

집계를 위해 리포지토리 안에 OrderStatusCount 인터페이스를 두고 결과를
맵으로 옮겨 담아 탭별로 합산하고 있었다. 탭마다 개수를 세는 파생 쿼리로
바꿔 프로젝션 타입과 합산 로직을 모두 걷어낸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 주문 수 조회 파생 쿼리 이름에서 언더스코어 제거

countByOrderableShopIdAndStatusIn으로 바꿔 다른 파생 쿼리와 표기를 맞춘다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 주문 상세 조회를 상점 범위로 좁혀서 수행

주문을 먼저 가져온 뒤 상점 소속을 코드에서 다시 확인하고 있었다.
조회 조건에 상점 식별자를 포함해 애초에 다른 상점의 주문이 걸리지 않게 한다.
쓰임이 사라진 Order.isOrderedAt과 서비스의 검증 메서드를 제거한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* revert: 고객 진행 중 주문 응답의 예상 시각 조회 변경 되돌리기

InprogressOrderResponse를 원래 구현으로 되돌린다.
Order.getEstimatedAt은 사장님 주문 목록에서 계속 사용한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 고객 진행 중 주문 응답도 Order.getEstimatedAt 사용

응답 DTO가 주문 타입에 따라 배달과 포장 연관관계를 직접 탐색하던 것을
되돌렸던 변경을 다시 적용한다. 사장님 목록과 같은 방식으로 예상 시각을
가져오고, 연관관계가 비어 있을 때 발생하던 널 역참조 위험도 함께 사라진다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: 사장님 주문 상태 변경 API 추가

POS 화면의 승인, 반려, 조리 완료, 배달 완료 버튼을 처리한다.
전이마다 엔드포인트를 두는 대신 목표 상태를 요청 바디로 받아 하나로 합쳤다.
허용 전이를 OrderStatus가 알도록 하여 어느 경로로 들어오든 동일하게 막는다.
반려는 결제 전액 취소까지 함께 수행한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: 가게 영업 상태 변경 API 추가

POS 화면의 영업 시작, 영업 종료 버튼을 처리한다.
shop_operation.is_open 컬럼은 있었으나 이를 변경하는 코드가 없어
사장님이 직접 영업을 여닫을 방법이 없었다.
주문 가능 상점으로 설정되지 않은 상점은 변경할 수 없다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: 영업 상태 변경을 주문 도메인으로 이동

POS의 다른 API가 모두 orderableShopId를 받는데 영업 토글만 shopId를 받아
클라이언트가 식별자 두 개를 관리해야 했다. 주문 가능 상점 기준으로 받고
컨트롤러와 서비스도 주문 도메인에 둔다.
연관관계 탐색은 OrderableShop.changeOpenStatus 안에 가둔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: POS 주문 API 경로를 주문 도메인 아래로 이동

/owner/shops/{id}는 shopId를 받는데 POS API는 같은 자리에서
orderableShopId를 받아, 다른 종류의 식별자가 한 경로에 섞여 있었다.
둘 다 작은 정수라 잘못 넣어도 조용히 다른 가게가 조회될 수 있다.
고객용 /order/shop/{orderableShopId}와 같은 형태로 맞춰 구분한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: 사장님 전용 주문 가능 상점 목록 조회 API 추가

POS 로그인 후 매장 선택 화면에 필요한 목록을 반환한다.
기존 /owner/shops는 shopId와 이름만 내려주어 이후 POS API에 필요한
orderable_shop_id와 주소, 영업 여부를 얻을 수 없었다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: 주문 응답에 배달/포장 유형 추가하고 포장 주문 처리

목록과 상세 응답에 order_type을 추가한다.
기존 구현은 배달 정보를 널 검사 없이 꺼내 포장 주문이 들어오면 터졌고,
완료 탭에 포장 완료와 포장 수령이 빠져 있어 포장 주문이 조리중 이후
어느 탭에도 보이지 않았다.

유형별 연관관계 탐색을 Order 안으로 옮기고, 각 유형이 가질 수 있는 상태를
OrderType이 알도록 하여 유형에 맞지 않는 전이를 막는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: 배달중 주문 조회에 포장 완료 포함

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…lity-regardless-of-status

fix: 콜벤팟 만료 판정을 상태와 무관하게 출발 시간 기준으로 통일
* feat: 주문 상태 변경 이벤트 발행 (#2455)

* feat: 주문 알림 문구와 예상 시간 생성 (#2455)

* feat: 주문 상태 알림을 커밋 후 비동기로 전송 (#2455)

* refactor: 주문 알림 리스너의 예외 처리 제거 (#2455)

* refactor: 주문 알림과 이벤트의 주문 모델 의존 제거 (#2455)

* refactor: 주문 취소 분기에서 조기 반환 (#2455)

* refactor: 사장님 주문 상태 변경에만 알림 발행 (#2455)

* refactor: 주문 알림 이벤트 팩토리와 메시지 책임 분리 (#2455)

* refactor: 주문 상태 문자열로 알림 이벤트 단순화 (#2455)

* refactor: 주문 서비스에서 직접 이벤트 발행하고 알림 문구 단순화 (#2455)

* refactor: 예상 시간 알림의 생략 조건 제거 (#2455)

* test: 주문 상태 변경 서비스의 이벤트 발행 목 추가 (#2455)
* fix: 사장님 비밀번호 재설정 계정 조회 수정 (#2457)

* test: 사장님 SMS 테스트에 기존 픽스처 적용
취업공지(board_id=8) 등에서 크롤링이 뒤늦게 발견/백필한 과거 게시글이
id 기준 정렬 때문에 "방금 올라온 글"처럼 최상단에 노출되던 문제를 수정한다.

- ArticleRepository.findAllByBoardId 를 COALESCE(registered_at, created_at)
  DESC, id DESC 로 정렬하도록 네이티브 쿼리로 변경
- 등록일 역전 케이스(과거 글이 더 늦게 백필된 경우) 회귀 테스트 추가
- 실제 로컬 서버(백엔드+프론트엔드)에 재현 데이터로 정렬 동작 확인

close #2459

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
findAllByBoardId 가 자체 ORDER BY 를 가지게 되어, 이 메서드를 호출하는
LostItemArticleService.getLostItemArticles() 도 Sort 가 담긴 Pageable 대신
Sort 없는 Pageable 을 넘기도록 수정한다. 관련 테스트가 없었으므로
GET /articles/lost-item(type 없음) 회귀 테스트를 추가한다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Removed some reviewers and added new ones.
…registered-at

fix: 게시판 목록을 id가 아닌 등록일(registered_at) 기준으로 정렬
* fix: 주문 상태 FCM 알림 제목과 본문 수정

* test: 주문 알림 문구 테스트 파일 제거
* fix: 셔틀 시간표 동명 회차 및 일괄 수정 오류 해결

같은 이름의 회차를 순서대로 연결하고 요청 전체의 입력 검증 후 저장한다.
실제 HTTP와 MongoDB 회귀 테스트로 반복 저장 및 검증 실패 시 데이터 보존을 확인한다.

Refs: #2439
Constraint: 기존 동명 회차 순서와 API 계약 유지
Confidence: high
Scope-risk: moderate
Not-tested: 전체 테스트, 별도 웹 인증 테스트, 운영 배포 및 데이터 복구

* fix: 학교버스 시간표 교체 및 교통편 조회 개선

* test: 시간표 PR 추가 테스트 및 샘플 데이터 제거

* refactor: 학교버스 저장 분기와 중복 검증 정리

* style: 위키 코드 컨벤션에 맞춰 버스 코드 포맷 정리

* refactor: 버스 엑셀 처리와 방향 판정 중복 제거

* fix: 시간표 부분 수정 시 정류장 상세정보 보존
@coderabbitai

coderabbitai Bot commented Sep 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: d79d35ba-5927-42c5-8f44-39a60d6d18a7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actions

Copy link
Copy Markdown

Unit Test Results

   283 files     283 suites   2m 48s ⏱️
1 366 tests 1 363 ✔️ 3 💤 0 ❌
1 374 runs  1 371 ✔️ 3 💤 0 ❌

Results for commit 0462f7d.

@dnjswldnd-3513 dnjswldnd-3513 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

코드 검토 해봤는데
따로 문제는 없는거 같아용

@taejinn
taejinn merged commit ea097e4 into main Sep 28, 2026
9 checks passed
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.

5 participants