Skip to content

[BE] [Widget] 위젯 기본 설정값 설정#439

Merged
kcw2205 merged 2 commits intobackendfrom
refactor-be/widget-default
Feb 15, 2026
Merged

[BE] [Widget] 위젯 기본 설정값 설정#439
kcw2205 merged 2 commits intobackendfrom
refactor-be/widget-default

Conversation

@codingbaraGo
Copy link
Contributor

작업 내용

  • 가계부/여행 폴더 생성 시 기본 위젯이 설정되도록 로직 리팩터링

@gemini-code-assist
Copy link

Summary of Changes

Hello @codingbaraGo, 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는 가계부 또는 여행 폴더 생성 시 자동으로 기본 위젯이 설정되도록 하는 기능을 구현합니다. 기존 가계부 생성 로직에 위젯 기본 설정 기능을 통합하고, 이를 위해 새로운 포트와 해당 포트의 구현체를 도입하여 위젯 설정 로직을 분리하고 모듈화했습니다. 이를 통해 사용자 경험을 개선하고, 위젯 설정의 일관성을 보장합니다.

Highlights

  • 새로운 포트 및 구현체 추가: 위젯 기본 설정 로직을 캡슐화하기 위해 AccountBookDefaultWidgetPort 인터페이스와 AccountBookDefaultWidgetSetter 구현체가 추가되었습니다.
  • 가계부 생성 시 기본 위젯 자동 설정: 가계부 생성 로직(AccountBookCommandFacade.createAccountBook)에 새로운 포트가 주입되어, 가계부 생성 직후 기본 위젯(예산, 기간, 카테고리)이 자동으로 설정되도록 변경되었습니다.
  • 위젯 설정 로직 분리: 위젯 설정 로직이 AccountBookCommandFacade에서 AccountBookDefaultWidgetSetter로 분리되어 책임이 명확해지고 유지보수성이 향상되었습니다.
Changelog
  • backend/src/main/java/com/genesis/unipocket/accountbook/command/facade/AccountBookCommandFacade.java
    • AccountBookDefaultWidgetPort 임포트가 추가되었습니다.
    • AccountBookDefaultWidgetPort 의존성이 주입되었습니다.
    • createAccountBook 메서드에서 가계부 생성 후 accountBookDefaultWidgetPort.setDefaultWidget 호출이 추가되었습니다.
  • backend/src/main/java/com/genesis/unipocket/accountbook/command/facade/port/AccountBookDefaultWidgetPort.java
    • setDefaultWidget 메서드를 포함하는 새로운 인터페이스가 추가되었습니다.
  • backend/src/main/java/com/genesis/unipocket/widget/command/facade/provide/AccountBookDefaultWidgetSetter.java
    • AccountBookDefaultWidgetPort를 구현하는 새로운 컴포넌트가 추가되었습니다.
    • setDefaultWidget 메서드에서 예산, 기간, 카테고리 위젯을 기본값으로 설정하는 로직이 구현되었습니다.
Activity
  • 현재까지 이 Pull Request에 대한 활동은 없습니다.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@codingbaraGo codingbaraGo changed the base branch from develop to backend February 13, 2026 09:53
@codingbaraGo codingbaraGo self-assigned this Feb 13, 2026
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 PR은 가계부 생성 시 기본 위젯을 설정하는 로직을 추가한 것을 확인했습니다. 의존성 역전 원칙을 적용하여 accountbook 모듈과 widget 모듈을 분리한 점이 좋습니다. 몇 가지 코드 개선 제안을 포함한 리뷰를 남깁니다.

package com.genesis.unipocket.accountbook.command.facade.port;

public interface AccountBookDefaultWidgetPort {
public void setDefaultWidget(Long accountBookId);

Choose a reason for hiding this comment

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

medium

인터페이스의 메서드에 public 접근 제어자는 불필요합니다. Java 인터페이스의 모든 메서드는 기본적으로 public이므로 명시적으로 선언할 필요가 없습니다. 코드를 간결하게 유지하기 위해 제거하는 것이 좋습니다.

Suggested change
public void setDefaultWidget(Long accountBookId);
void setDefaultWidget(Long accountBookId);

Comment on lines +16 to +31
public class AccountBookDefaultWidgetSetter implements AccountBookDefaultWidgetPort {

private final WidgetCommandService widgetCommandService;

@Override
public void setDefaultWidget(Long accountBookId) {
List<WidgetItem> items =
List.of(
new WidgetItem(0, WidgetType.BUDGET, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(1, WidgetType.PERIOD, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(2, WidgetType.CATEGORY, CurrencyType.BASE, Period.MONTHLY));

widgetCommandService.updateAccountBookWidgets(
new UpdateAccountBookWidgetsCommand(accountBookId, items));
}
}

Choose a reason for hiding this comment

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

medium

기본 위젯 목록이 setDefaultWidget 메서드 내에서 매번 생성되고 있습니다. 이 목록은 불변이므로 private static final 상수로 추출하여 클래스 수준에서 관리하는 것이 더 효율적이고 가독성이 좋습니다. 이렇게 하면 기본 위젯 구성이 명확해지고, 향후 수정이 필요할 때 한 곳에서 관리할 수 있습니다.

Suggested change
public class AccountBookDefaultWidgetSetter implements AccountBookDefaultWidgetPort {
private final WidgetCommandService widgetCommandService;
@Override
public void setDefaultWidget(Long accountBookId) {
List<WidgetItem> items =
List.of(
new WidgetItem(0, WidgetType.BUDGET, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(1, WidgetType.PERIOD, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(2, WidgetType.CATEGORY, CurrencyType.BASE, Period.MONTHLY));
widgetCommandService.updateAccountBookWidgets(
new UpdateAccountBookWidgetsCommand(accountBookId, items));
}
}
public class AccountBookDefaultWidgetSetter implements AccountBookDefaultWidgetPort {
private final WidgetCommandService widgetCommandService;
private static final List<WidgetItem> DEFAULT_WIDGETS =
List.of(
new WidgetItem(0, WidgetType.BUDGET, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(1, WidgetType.PERIOD, CurrencyType.BASE, Period.MONTHLY),
new WidgetItem(2, WidgetType.CATEGORY, CurrencyType.BASE, Period.MONTHLY));
@Override
public void setDefaultWidget(Long accountBookId) {
widgetCommandService.updateAccountBookWidgets(
new UpdateAccountBookWidgetsCommand(accountBookId, DEFAULT_WIDGETS));
}
}

Copy link
Collaborator

@kcw2205 kcw2205 left a comment

Choose a reason for hiding this comment

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

보고싶어요

@kcw2205 kcw2205 merged commit 6ebdef3 into backend Feb 15, 2026
1 check passed
kcw2205 pushed a commit that referenced this pull request Feb 15, 2026
* refactor(widget): 가계부 생성시 기본 위젯 설정

* refactor(widget): 여행 생성시 기본 위젯 설정
Kjiw0n added a commit that referenced this pull request Feb 15, 2026
* [BE] [Travel] 여행 도메인 리팩터링 (#303)

* refactor(travel): presentation 계층 리팩토링
- Command & Query 분리
- DTO 분리
- Swagger 주석 추가

* refactor(travel): facade 계층 리팩토링
- Command & Query 분리
- DTO 분리
- Command & Query 공통요소를 travel.common으로 분리

* refactor(travel): application 계층 리팩토링
- Command & Query 분리
- DTO 분리

* refactor(travel): application 계층 리팩토링
- Command & Query 분리
- DTO 분리
- Command와 Query의 repository 분리

* refactor(travel): travel 도메인 테스트 삭제

* chore: Apply Spotless

* refactor(travel): Repository 명 수정
- JpaRepository -> CommandRepository로 이름 수정

(cherry picked from commit f6938b1)

* [BE] [Exchange] 환율 관련 엔티티 정의 (#320)

* feat(exchange): 환율 엔티티 정의

* feat(exchange): 환율 레포지토리 정의

(cherry picked from commit f2ad2d1)

* [BE] [Expense] 패키지 구조 재배치 (#307)

* refactor(expense): 패키지 이동 및 구조 분리

* refactor(expense): Command/Result DTO 추가 및 기존 DTO 변경

* refactor(expense): query 패키지 추가

* feat(account_book): 지출내역에 필요한 가계부 소유권 검증 로직에 대한 타도메인 연결부 코드 추가

* test(expense): 지출내역 테스트 코드 업데이트

* feat: 어플리케이션 내 스케쥴링 옵션 활성화

* style: Spotless 적용

(cherry picked from commit 8abbb7e)

* [BE] [USER] 아키텍쳐 적용 통일화 유저 (#316)

* refactor: Entity, repository 리펙토링

* refactor: 서비스 리펙토링

* refactor: Facade 부분 추가

* refactor: 컨트롤러 부분 추가

* refactor: 리스폰스 리퀘스트 부분 추가

* chore: spotlessApply 적용

(cherry picked from commit 21785ef)

# Conflicts:
#	backend/src/main/java/com/genesis/unipocket/auth/controller/AuthController.java

* [BE] [Auth] 인증 도메인 패키지 리팩토링 (#318)

* refactor(auth): auth 패키지 구조 이동 + 기본 import 정리

- OAuth State Entity 삭제 -> 대신으로 레디스 사용으로 인해 미사용

* refactor(auth): OAuth DTO 이동 (auth 공용 DTO화)

* refactor(auth): auth 포트/공용 DTO 추가

* refactor(auth): DTO 명 변경으로 인한 user/auth 재연결

* refactor(auth): 패키지 이동으로 인한 import 문 변경

* refactor(auth): 사용되지 않는 DTO 삭제

* test(auth): 인증 관련 테스트 코드 재작성

(cherry picked from commit 3f9c7a9)

* [BE] [AccountBook] 가계부 코드 구조 리팩토링 (#322)

* refactor: Entity, repository 리펙토링

* refactor: 서비스 리펙토링

* refactor: Facade 부분 추가

* refactor: 컨트롤러 부분 추가

* refactor: 리스폰스 리퀘스트 부분 추가

* chore: spotlessApply 적용

* refactor: AccountBook 엔티티, 레파지토리

* refactor: AccountBook 서비스 리펙토링

* refactor: AccountBook 컨트롤러,서비스 리펙토링

* refactor: AccountBook 리스폰스,리퀘스트 리펙토링

* refactor: 검증 부분 리펙토링

* refactor: 테스트 부분 추가 및 리펙토링

---------

Co-authored-by: BE_김동균 <[email protected]>
(cherry picked from commit 2c19f14)

* [BE] [Global] 코드 리팩토링 과정 1차 연동 (#325)

* refactor(auth): 인증 관련 패키징 연동 충돌 해소

* refactor(auth): 가계부 관련 패키징 연동 충돌 해소

* refactor(expense): 지출내역 관련 패키징 연동 충돌 해소

* refactor(expense): 유저 관련 패키징 연동 충돌 해소

* refactor(expense): 여행 관련 패키징 연동 충돌 해소

* refactor(global): 설정 관련 패키징 연동 충돌 해소

* test: 바뀐 아키텍처에 따른 테스트 코드 재연동

(cherry picked from commit 69df5b4)

* Fix: User 카드 command controller 테스트와 CardCompany enum 직렬화 (#337)

(cherry picked from commit 87a3fb9)

* [BE] [User] Query API 수정 (#339)

* Fix: User query controller tests and UserCardQueryResponse type matching

* fix: 제미나이 수정 반영

(cherry picked from commit bfb18e5)

* Test: Cleanup and update user/auth service tests (#342)

(cherry picked from commit 0638fa7)

* [BE] [Auth] 커멘드 api 테스트 케이스 작성 (#345)

* Fix: AuthCommandControllerTest 작성 및 편집

* Test: API authorize, callback 테스트 추가

* chore: spotlessApply 적용

* fix(auth): 임포트 수정

(cherry picked from commit f2ed0fc)

* [BE] [Auth] Token 관련 API 수정 (#347)

* feat(auth): 쿠키 분리 AT, RT

* fix(auth): return 500 에러 코드 400 에러로 변환

* fix(auth): 안쓰는 DTO 정리

(cherry picked from commit 887206f)

* [BE] [AccountBook] 리펙토링으로 인한 commend 컨트롤러 확인 및 검증 (#355)

* test: accountbook command controller WebMvc 테스트 추가

* feat: accountbook update title 검증 강화

* chore: spotlessApply 적용

* fix: mockbean 지원중지로 인한 mockitbean 수정

* fix: import 로 변수명 축소

(cherry picked from commit a987fe3)

* [BE] [AccontBook] query api 리펙토링으로 인한 검증 (#360)

* fix: accountbook detail query에 사용자 소유권 조건 추가

* test: accountbook query service/controller 테스트 보강

* chore: spotlessApply 적용

* chore: mockitbean 으로 변경

* chore: spotlessApply 적용

(cherry picked from commit e2fb4d3)

* [BE] [TempExpense] 이미지 파싱 부분 강화 (#364)

* feat: 임시지출내역 수정 시 상태 자동 재평가

- updateTemporaryExpense에서 수정 후 필수 필드 기반 상태 재평가
- merchantName, localCurrencyAmount, occurredAt, category 모두 존재 시 NORMAL
- 하나라도 누락 시 INCOMPLETE, ABNORMAL은 유지
- 상태 재평가 관련 단위 테스트 3건 추가

* feat: 파일/이미지 처리 현황 조회 API 추가

- GET /api/account-books/{id}/files/summary: 파일별 처리 현황
- GET /api/account-books/{id}/image-processing-summary: 전체 이미지 처리 요약
- FileProcessingSummaryResponse, ImageProcessingSummaryResponse DTO 추가
- Repository에 findByTempExpenseMetaId/In, findByAccountBookId, findByFileIdIn 추가
- TemporaryExpenseQueryService에 요약 조회 메서드 2개 추가

* test: 파일/이미지 처리 현황 조회 단위 테스트 추가

- 파일별 요약 조회 테스트 3건 (전체 NORMAL, INCOMPLETE 포함, 빈 결과)
- 이미지 처리 현황 요약 테스트 2건 (정상 동작, 빈 결과)

* chore: spotlessApply 적용

* fix: 제미나이 의견 수렴

(cherry picked from commit 449f6a4)

* [BE] [Auth] 토큰 관련 시간 통일화 (#375)

* refactor(auth): JwtProperties yml 설정 변경 및 통일화

* refactor(auth): JwtProperties에 따른 서비스 로직 수정

* test(auth): JWT tests 수정

* chore: spotlessApply 적용

* fix: 제미나이 수정

* fix: yml 시크릿 으로 통일화 및 env파일로 관리

(cherry picked from commit 8ddd6a4)

* [BE] [Service] endpoint 수정 및 테스트 수정 (#377)

* refactor(api):  api 엔드포인트/api 접두사 제거 travel domain 제외

* test(spring): MockBean MockitoBean으로 변경

* chore: spotlessApply 적용

(cherry picked from commit 0b472b4)

* [BE] [Infra] S3 연동 코드 및 예제 연결 코드 작성 (#368)

* feat(infra): S3Service 구현체 추가

- S3 리소스 존재 확인 기능
- PUT Presigned URL 발급 기능
- GET Presigned URL 발급 기능
- S3 키에 대한 삭제 기능
- S3 키 전체 조회 기능

* feat(infra): S3Service 에 필요한 미디어 타입 정의

- CSV, PNG, JPG, JPEG

* feat(media): 이미지/파일을 업로드를 관리하는 서비스 코드 추가

- media 는 인터페이스만 정의한다.
- 이를 통해 필요한 구현체를 Provide 해주는 역할만 해준다.

* feat(media): s3Key 를 가지지 않는 리소스 정리 메서드 추가

- 특정 미디어 소스에서부터 사용중인 키를 가져오는 인터페이스 추가
- 전체 미디어 소스에서 사용중인 키들을 가져오는 구현체 추가

이 둘을 A - B 계산하여, 모든 소스로부터 한번도 사용되지 않는 리소스를 정리해주는 계산이 가능함.

* feat(infra): S3Service 를 사용하는 코드에 대한 바뀐 경로 적용

- 추후에 각 도메인에서는 `MediaPort` 인터페이스를 media 측에 요구해야합니다. TODO.

- 반대로 사용하는 리소스에 대한 UsedKeyProvider 또한 추가해주어야합니다.

* feat(expense): 지출내역 도메인 내 `MediaUsedPathProvider` 예제 코드 추가 및 Spotless 적용

* feat(image): 이미지 업로드 예제 API 추가

- `local` 프로파일 활성화시에만 지원
- 단순히 직접 올리고 적용되는지 확인용 API

* test(media,infra): S3 연동 및 이미지 관리에 필요한 테스트 코드 작성

* chore: dev 설정에 presigned url 관련 프로퍼티 추가

* chore: Spotless 적용

* feat(media): MediaObjectStoragePort 에서 MediaObjectStorage 로 네이밍 변경

- Port : 다른 도메인의 구현체가 필요한 경우의 요청 인터페이스로 접근

(cherry picked from commit d4209d7)

* [BE] [User] 이름 로직 추가 (#386)

* fix(user): 오어스 이름 못받아 올경우 로직추가

* test: test코드 추가

* fix: Gemini 수용

(cherry picked from commit 5bd0f5b)

* [BE] [Expense] 지출내역 패키지 리팩토링 및 자잘한 버그 수정 (#388)

* feat(account_book): AccountBookInfo 포트 DTO 에 필요한 정보 추가

- 가계부 Provider 코드 import 문 수정
- AccountBook 소유권 확인 Validator 위치 변경
- AccountBook 정보 확인 요청 구현체 위치 변경

* refactor(account_book): 임시 환율 데이터 코어 계층 패키지 위치 리팩토링

* fix(account_book): 카테고리 반환 값 수정

- 프론트 요청에 맞게 숫자값을 리턴해주도록 수정

* refactor(account_book): Expense 코어 계층 패키지 이동

* refactor(account_book): Expense 서비스 로직 계층 패키지 이동

* refactor(account_book): Expense 컨트롤러 계층 패키지 이동 및 사소한 설명 추가

* refactor(expense): 컨트롤러에 필요한 DTO 패키지 이동

* feat(expense): sort 검색 시 지원되지 않는 경우를 위한 ErrorCode 추가

* feat(expense): Expense 도메인이 제공해야할 요구사항 구현

* refactor(expense): 변경되지 않은 임시지출내역 부분에 대한 패키지 위치 이동

* fix(expense): baseCurrencyAmount인 경우 임베디드 경로로 매핑

* docs(expense): 지출내역 조회 API에 대한 swagger 문서 설명 작성

* chore: Spotless 적용

* test: 테스트 코드 import 문 수정

* feat(expense): 지출내역 필터링 시 시작,끝 날짜에 대한 방어코드 작성

- NPE 방어코드 작성
  - 시작날짜 null 이면 -> 시작날짜 제한 없애기
  - 끝날짜 null 이면 -> 끝날짜 제한 없애기
- AI 코드리뷰 수용

* style: Spotless 적용

(cherry picked from commit 48af9b2)

* [BE] [AccountBook] Budget관련 API 추가 및 BudgetCreatTime 추가 (#393)

* feat(accountbook): budget 만들때 타임스탬프 추가

* feat(accountbook): exchange-rate query endpoint 만들기

* feat(accountbook): 가계부 사용자 연동과 예산 저장 구조 개선

* feat(accountbook): 예산 설정 전용 API와 환율 응답 추가

* feat(accountbook): 가계부 예산 변경 시나리오 테스트 반영

* fix(accountbook): budgetCreatedAt 중복 필드 제거

* chore: spotlessApply 적용

* fix(accountbook): 유닛테스트 깨짐 원인 import 및 유저 검증 수정

* fix: 값 소수점 2자리 까지 사용가능

(cherry picked from commit 3320ade)

* [BE] [Widget] 위젯 코어계층 개발 (#380)

* feat(widget): 도메인 내 공통요소 정의
- ENUM 정의
- 타 도메인에 대한 validator 정의

* feat(widget): 예산 위젯 코어계층 개발
- DTO 정의
- 쿼리 메서드 개발
- 서비스 메서드 개발

* feat(widget): 카테고리 위젯 코어계층 개발
- DTO 정의
- 쿼리 메서드 개발
- 서비스 메서드 개발

* feat(widget): 통화별 위젯 코어계층 개발
- DTO 정의
- 통화별 지출액 조회 쿼리 메서드 개발
- 서비스 메서드 개발
- 퍼센테이지의 합을 100에 맞춰 설정해주는 헬퍼 메서드 개발

* feat(widget): 결제수단별 위젯 코어계층 개발
- DTO 정의
- 결제수단별 지출액 조회 쿼리 메서드 개발
- 서비스 메서드 개발

* feat(widget): 기간별 위젯 코어계층 개발
- DTO 정의
- 일별/주별/월별 지출액 조회 쿼리 메서드 개발
- 서비스 메서드 개발

* feat(widget): 월별 지출금액 조회 메서드 개발
- 월별 지출 총액 조회 메서드
- 월별 지출 총액 평균(타 유저) 조회 메서드

* chore: Apply Spotless

(cherry picked from commit 738a9a1)

* [BE] [ExpenseUpload] 임시지출 업로드/파싱 API 메타 중심 리팩토링 및 계층 정리 (#392)

* feat(account_book): AccountBookInfo 포트 DTO 에 필요한 정보 추가

- 가계부 Provider 코드 import 문 수정
- AccountBook 소유권 확인 Validator 위치 변경
- AccountBook 정보 확인 요청 구현체 위치 변경

* refactor(account_book): 임시 환율 데이터 코어 계층 패키지 위치 리팩토링

* fix(account_book): 카테고리 반환 값 수정

- 프론트 요청에 맞게 숫자값을 리턴해주도록 수정

* refactor(account_book): Expense 코어 계층 패키지 이동

* refactor(account_book): Expense 서비스 로직 계층 패키지 이동

* refactor(account_book): Expense 컨트롤러 계층 패키지 이동 및 사소한 설명 추가

* refactor(expense): 컨트롤러에 필요한 DTO 패키지 이동

* feat(expense): sort 검색 시 지원되지 않는 경우를 위한 ErrorCode 추가

* feat(expense): Expense 도메인이 제공해야할 요구사항 구현

* refactor(expense): 변경되지 않은 임시지출내역 부분에 대한 패키지 위치 이동

* fix(expense): baseCurrencyAmount인 경우 임베디드 경로로 매핑

* docs(expense): 지출내역 조회 API에 대한 swagger 문서 설명 작성

* chore: Spotless 적용

* test: 테스트 코드 import 문 수정

* feat(temp_expense): 지출내역 업로드 관련 엔티티 변경

* feat(temp_expense): 지출내역 업로드 관련 코어 계층 분리

* feat(temp_expense): 컨트롤러 및 요청/응답 DTO 이동

* test(temp_expense): 단위 테스트 경로 수정 및 스펙 수정

* refactor(temp_expense): 요청에 따라 임시지출내역을 하나의 도메인으로 승격

* Merge: backend 브랜치에 영향받는 코드 반영 -> 단순 import 문 수정

(cherry picked from commit 2768cfd)

* [BE] [Exchange] Query Commend 분리 및 서비스 로직 구현 (#404)

* feat: 환율 인터페이스를 query로 이관하고 기존 Naver 구현 제거

* feat: 환율 query 계층과 command 포트 인터페이스 분리

* feat: 환율 command 보정 로직과 저장소 조회 규칙 추가

* feat: 환율 query·command 분리 구조 단위 테스트 추가

* chore: spotlessApply 적용

* fix: Gemini 의견 수용

* chore: spotlessApply 적용

(cherry picked from commit 3129b03)

* [BE] [Expense] occurredAt Z 접미사 추가 및 paymentMethod → userCardId 리팩토링 (#408)

* feat(card): 유저 카드에서 필요한 정보 제공과 구현

- expense 에서 UserCardFetchService 에 대한 정보를 요청합니다.
- user 에서는 카드 정보를 제공해줍니다.

* feat(temp_expense): 임시지출내역 생성 시, 카드 정보 삭제

- 임시지출 쪽에서는 카드 연동은 나중에

* feat(expense): 결제 수단에 대한 구체적인 응답 DTO 생성

- 프론트 요청대로 작성됨

* feat(expense): 지출내역 엔티티에 카드 정보 연동

- 최대한 join 을 줄이거나 명시적으로 하기위해 ID 값만 추가함

* feat(expense): 지출 내역 도메인 내 카드 연동 코어 계층 기능 추가

* feat(expense): Category ID 방식으로 받을 수 있도록 최종 수정

* feat(expense): ISO-8601 표준 날짜 시간대로 입력받을 수 있도록 개선

* test(expense): 변경된 UserCard 입출력에 대해 테스트 코드 반영

(cherry picked from commit 6a277cd)

* [BE] [Expense] 지출내역 수기작성 및 조회 수정에 대한 통합테스트 재작성 (#405)

* test(expense): 지출내역 통합테스트 재작성

* refactor(account_book): 가계부 측 provide 코드 수정

(cherry picked from commit 7b64e15)

* [BE] [Widget] 위젯  (#411)

* refactor(widget): WidgetType Enum 이동
- travel 하위 -> global 하위

* refactor(widget): 위젯 반환 DTO 타입 변경
- BigDecimal -> String 변환

* feat(global): 공통 유틸 클래스 추가 - AmountFormat, CountryCodeTimezone, Percent

- AmountFormatUtil: BigDecimal 금액을 소수점 2자리 내림 문자열로 포맷
- CountryCodeTimezoneMapper: CountryCode → ZoneId 매핑
- PercentUtil: 퍼센트 계산 및 합계 100% 보정 유틸 클래스

* refactor(widget): WidgetQueryRepository 리팩토링 - 여행/통화/기간 필터 지원

- 공통 헬퍼 메서드 추출 (amountExpr, travelFilter, periodFilter, bind*)
- 모든 조회 메서드에 travelId, CurrencyType, period 파라미터 추가
- Comparison 위젯용 월간 조회 및 평균 지출 쿼리 추가
- Budget 쿼리 반환 타입 Long → BigDecimal 변경

* refactor(widget): WidgetQueryService 리팩토링 - 통합 조회 및 금액 포맷 적용

- WidgetQueryContext: 위젯 조회에 필요한 컨텍스트 헬퍼 객체 추가
- PeriodRangeUtil: 기간별(일/주/월) 슬롯 생성 및 UTC 변환 유틸 추가
- ComparisonWidgetResponse: 비교 위젯 응답 DTO 추가
- 개별 public 메서드를 통합 getWidget() 디스패처로 리팩토링
- AmountFormatUtil.format() 적용하여 모든 금액 응답을 포맷된 문자열로 반환

* feat(widget): 위젯 조회 Presentation 계층 추가

- WidgetQueryController: 가계부/여행 단위 위젯 조회 API 엔드포인트
- WidgetQueryRequest: widgetType, currencyType, period 파라미터 DTO

* chore: Apply Spotless

(cherry picked from commit c2bc758)

* [BE] [Expense] 지출내역 통합테스트 재작성 (#415)

(cherry picked from commit 947addc)

* [BE] [Swagger] Swagger API 일부 기능 단위로 그룹화 (#417)

(cherry picked from commit f370f71)

* [FE] [FEAT] 결제수단 필터 구현 (#374)

* chore: Popover modal={false} 속성 추가
- 서로 popover 연 상태로 다른 필터 클릭시 바로 다른 필터 열리도록 구현

* chore: HighlightText 컴포넌트 분리

* refactor: 최근 검색 내역 컴포넌트 추출 및 검색내역 저장 로직 훅으로 분리

* refactor: 결제수단 필터 구현

* chore: 불필요 주석 제거

* chore: HighlightText 컴포넌트 에러 핸들링 로직 추가

* fix: DataTableFilter min-height 설정

* [BE] [Auth] 사용되지 않는 JwtProvider 내 헬퍼 메서드삭제

- feat: 코드베이스 대폭변경으로 인해 사용되지 않는 메서드 삭제

* [FE] [FEAT] 위젯 관리 구조 세팅 (type, renderWidget) (#410)

* chore: add svg Icon (CloseButton)

* feat: Widget 편집 모드 실행 여부(isEditMode) 컨텍스트 추가

* chore: 변수명 변경(isLoading -> isPreview) 및 인터페이스 ChartMode 타입화

* chore: 위젯 type 추가

* chore: API 명세 스펙에 맞는 mockData 추가

* feat: 케이스 별 위젯 렌더링 함수(renderWidget) 구현

* chore: svg 아이콘의 사용하지 않는 fill-opacity 속성 제거

* feat: 위젯 섹션 임시 UI 추가

* refactor: renderWidget 가독성 개선 (switch -> 객체 Record 후 매핑 처리)

* chore: svg파일 코드 단순화 및 파일 크기 조정(close-button.svg)

* [FE] [FEAT] 결제내역 정렬 UI 구현 (#395)

* chore: swap-vertical 아이콘 추가

* chore: SortDropdown 파일 생성

* feat: SortDropdown 완성

* chore: 매직넘버 상수화

* refactor: sort 상태 통합

* chore: SwapVertical 아이콘을 Icon 컴포넌트로 사용하여 hover 효과 적용

* [BE] [Dev] 개발용 API에서 입력 요청사항 및 리턴 형식 변경에 따른 DTO 변환 로직 적용

* feat: 개발용 토큰 발급 API 내에서 DTO 변환 추가

* feat: /api 접두사 제거

* [FE] [FEAT] BottomSheet 구현 (#424)

* feat: BottomSheet 구현

* chore: import문 정렬

* refactor(global): API 공통 엔드포인트 제거 (#427)

- '/api' 제거

* [BE] [AccountBook] 가계부 통합 테스트 추가 (#425)

* [BE] [Expense] 임시 지출내역 이미지, 파일 로직 추가 (#418)

* fix: GeminiService 파싱 서비스 프롬프트 작성

* chore: spotlessApply 적용

* fix: gradle 엑셀 파일 추가

* fix S3서비스와 임시지출내역 변환

* chore: spotlessApply 적용

(cherry picked from commit e535052)

* [BE] [Widget] 위젯 메타데이터 수정/조회 기능 개발 (#422)

* feat(widget): 위젯 순서 공통 모듈 추가 - WidgetItem, WidgetSizePolicy, WidgetLayoutValidator

- WidgetItem: 위젯 순서 정보 공통 레코드 (order, widgetType, currencyType, period)
- WidgetSizePolicy: widgetType → size 매핑 (CATEGORY=2, 나머지=1)
- WidgetLayoutValidator: order 중복 검증, size 합 ≤ 5 검증, 기본값 적용(BASE/ALL), 정렬
- ErrorCode: WIDGET_ORDER_DUPLICATED, WIDGET_SIZE_EXCEEDED 추가

* feat(widget): 위젯 순서 엔티티 및 영속성 계층 추가

- AccountBookWidgetEntity: accountBookId 기준, unique(accountBookId, displayOrder)
- TravelWidgetEntity: travelId 기준, unique(travelId, displayOrder)
- AccountBookWidgetJpaRepository / TravelWidgetJpaRepository: deleteAll, findAll 메서드
- AccountBookWidgetCommandConverter / TravelWidgetCommandConverter: Entity ↔ WidgetItem 변환

* feat(widget): 위젯 순서 수정 Command 계층 추가

- PUT /account-books/{accountBookId}/widgets
- PUT /account-books/{accountBookId}/travel/{travelId}/widgets
- replace 전략: 기존 rows 삭제 → flush → 새 rows 저장 (트랜잭션 원자성 보장)
- Request → Command → Service(검증/저장) → Result → Response 변환 흐름 구현
- WidgetCommandOrchestrator: 요청 DTO → Command 변환 및 서비스 호출 오케스트레이션

* feat(widget): 위젯 순서 조회 Query 계층 추가

- GET /account-books/{accountBookId}/widgets
- GET /account-books/{accountBookId}/travel/{travelId}/widgets
- WidgetItemQueryRes: 조회 전용 projection DTO (엔티티 노출 없음)
- JPQL constructor expression으로 DTO 직접 반환, ORDER BY displayOrder ASC 정렬

* test(widget): 위젯 순서 조회/수정 단위 테스트 추가

- WidgetSizePolicyTest: CATEGORY=2, 나머지=1 매핑 검증 (2건)
- WidgetLayoutValidatorTest: 기본값 적용, order 중복, size 합, 정렬 검증 (11건)
- AccountBookWidgetCommandConverterTest: Entity ↔ WidgetItem 변환 검증 (2건)
- TravelWidgetCommandConverterTest: Entity ↔ WidgetItem 변환 검증 (2건)
- WidgetCommandServiceTest: replace 전략(삭제→flush→저장), 검증 실패 예외 (7건)
- WidgetCommandOrchestratorTest: Request→Command 변환 및 서비스 위임 (2건)
- WidgetLayoutQueryServiceTest: repository 위임 및 빈 결과 반환 (3건)

* chore: Apply Spotless

(cherry picked from commit 5aed7bc)

* [FE] [CHORE] api base url 수정 (#420)

* chore: api base url 수정

* chore: 임시 로그아웃 구현
- 쿠키 삭제 로직

* chore: 임시로그인 uuid 환경변수에서 받도록 구현

* fix(github): 깃헙 워크플로우 에러 수정 (#442)

* [BE] [Tempexpense]  임시지출내역 로직 보강 (#441)

* feat: 임시지출 파싱 배치 환율/카테고리 최적화

* test: 임시지출 파싱 서비스 최적화 테스트 추가

* fix: 제미나이 반영

* [BE] [AccountBook] API 수정 (#438)

* fix: 예산이 null 값일때 환율 조회가 안되는 부분을 고침

* fix: 요구사항 재반영 환율조회를 누르면 Account북의 그날의 환율 값을 알려줌

* fix: 요구사항 재반영 환율조회를 누르면 Account북의 그날의 환율 값을 알려줌

* fix: 요구사항 재반영

* [BE] [Analysis] 분석 도메인 조회 기능 개발 (#437)

* feat(analysis): 분석 도메인 공통 enum 및 응답 DTO 정의

* feat(analysis): 분석 쿼리 Repository 구현

* feat(analysis): 분석 Query Service 및 Controller 구현

* refactor(analysis): 분석 도메인 리팩터링 (타임존, 중복 제거, 타입 개선)

- AmountFormatUtil.format()으로 중복 formatAmount() 제거
- CountryCodeTimezoneMapper 활용하여 localCountryCode 기준 타임존 계산
- AccountBookAnalysisRes의 countryCode를 String에서 CountryCode 타입으로 변경
- Category import를 global.common.enums로 통일
- getAccountBookInfo를 getAccountBookCountryCodes로 개선하여 불필요한 userId 조회 제거

* test(analysis): 단위 테스트 작성

* chore: Apply Spotless

* [BE] [Widget] 위젯 기본 설정값 설정 (#439)

* refactor(widget): 가계부 생성시 기본 위젯 설정

* refactor(widget): 여행 생성시 기본 위젯 설정

* [BE] [Auth] 카카오 OAuth 기능 활성화 (#443)

* feat(auth): 카카오 OAuth 기능 활성화

* fix(auth): 카카오 OAuth 앱에 맞게끔 필요한 scope 수정

* [BE] [Expense] 어카운북 변경에 따른 지출내역 로직 수정  (#446)

* feat: 소비 내역 파싱 시 AI가 제공한 기본 통화 금액 우선 사용하도록 개선

* feat: 가계부 기준 통화 변경 시 기존 지출 내역의 기준 금액 재계산 기능 구현

* feat: 지출 환율 원본 저장 및 기준통화 재계산 개선

* feat: 임시지출 환율 원본 저장 연동

* refactor: expense repository 조회 메서드 중복 제거

* chore: spotlessApply 적용

* fix: 제미나이 의견 수렴

* [BE] [Auth/AccountBook] 테스트 스펙 정합성 및 refresh_token 쿠키 경로/예외 처리 개선 (#447)

* feat(account_book): 가계부 생성 조회 시 반환값 로직 수정

* feat(account_book): 가계부 생성 조회 시 반환값 수정

* test(account_book): 가계부 생성/조회 시 반환값 수정에 따른 테스트 코드 업데이트

* test(auth): 리프레쉬 토큰 없을때 500 에러 수정

* style: Spotless 적용

* [BE] [AccountBook] 프론트분들 요청 환율 조회 (#448)

* feat: 특정 시점의 가계부 환율 조회 기능 구현 (occurredAt 파라미터 추가)

* chore: spotlessApply 적용

* fix: 제미나이 의견 수렴

* [BE] [Docs] Swagger 문서 설명 추가 (#449)

* docs: AccountBook 도메인에 대한 설명 보강

* docs: Auth 도메인에 대한 설명 추가

* docs: TempExpense 도메인에 대한 API 설명 추가

* docs: User 도메인에 대한 API 설명 추가

* docs: 로컬 이미지 테스트 API 설명 추가

* docs: 헬스체크 컨트롤러 API 설명 추가

* docs: 분석 도메인에 대한 API 설명 추가

* style: Spotless 적용

* feat(docs): 새롭게 변경된 환율 조회 API 에 대한 설명 추가

* style: Spotless 적용

* [BE] [Auth] Auth 도메인 로직 안정화 작업 (#451)

* fix(auth): OAuth 상태/응답 검증 안정화

* fix(auth): 쿠키/토큰 예외 처리 강화

* test(auth): 컨트롤러 예외/누락 쿠키 케이스 보강

* feat(auth): 토큰 필드명 상수화

---------

Co-authored-by: 김현창 <[email protected]>
Co-authored-by: Chanwoo Kim <[email protected]>
Co-authored-by: BE_김동균 <[email protected]>
Co-authored-by: Mingyu Seong <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants