# Guide #77 — deposit_sessions 테이블 및 코드 제거

> **대상**: DDL, common, core, admin-api, partner-api, open-api, partner-ui
> **사유**: Guide #76에서 `deposit_reservations`(입금 예약)로 대체. 입금 세션 개념 완전 폐기.
> **영향 범위**: DDL 1개 테이블 DROP + 2개 테이블 컬럼 제거 + Java 23개 파일 + Vue/TS 7개 파일

---

## 영향 분석 요약

### 완전 삭제 파일 (10개)

| 모듈 | 파일 | 유형 |
|------|------|------|
| common | `DepositSession.java` | Entity |
| common | `DepositSessionRepository.java` | Repository |
| common | `DepositSessionStatus.java` | Enum |
| common | `DepositSessionRequestSource.java` | Enum |
| common | `DepositSessionException.java` | Exception |
| partner-api | `CreateDepositSessionRequest.java` | DTO |
| partner-api | `DepositSessionResponse.java` | DTO |
| admin-api | `DepositSessionSearchRequest.java` | DTO |
| admin-api | `DepositSessionDetailResponse.java` | DTO |
| partner-ui | `DepositSessionsView.vue` | Vue 페이지 |
| partner-ui | `DepositSessionNewView.vue` | Vue 페이지 |

### 메서드/필드 제거 파일 (부분 수정, 14개)

| 모듈 | 파일 | 제거 대상 |
|------|------|----------|
| common | `Deposit.java` | `depositSessionId` 필드 |
| common | `PaymentLink.java` | `depositSessionId` 필드 |
| core | `DepositService.java` | `createSession()`, `createSessionFromPaymentLink()` + `sessionRepository` 의존성 |
| open-api | `DepositController.java` | 세션 관련 6개 엔드포인트 + `depositSessionRepository` 의존성 |
| admin-api | `DepositManagementController.java` | `GET /deposit-sessions` 엔드포인트 |
| admin-api | `DepositManagementService.java` | `getDepositSessions()` 메서드 |
| admin-api | `DepositSearchMapper.java` | `searchDepositSessions()` 메서드 |
| partner-api | `PartnerDepositController.java` | 세션 관련 3개 엔드포인트 |
| partner-api | `PartnerDepositService.java` | 세션 관련 3개 메서드 |
| partner-api | `PartnerDepositMapper.java` | `searchDepositSessions()`, `findDepositSessionDetail()` |
| partner-api | `PartnerUserContextController.java` | `getUserSessions()` 엔드포인트 |
| partner-api | `PartnerUserContextService.java` | `getUserSessions()` 메서드 |
| partner-api | `PartnerUserContextMapper.java` | deposit_sessions JOIN 쿼리 변경 (Part D-3 참고) |
| partner-api | `DepositResponse.java` (DTO) | `depositSessionId` 필드 (있으면) |

### Frontend (partner-ui, 5개 파일 수정)

| 파일 | 제거 대상 |
|------|----------|
| `deposit.service.ts` | `getDepositSessions()`, `getDepositSession()`, `createDepositSession()` |
| `deposit.ts` (types) | `DepositSessionResponse`, `DepositSessionSearchParams`, `CreateDepositSessionRequest` 인터페이스 + `depositSessionId` 필드 |
| `router/index.ts` | `deposit-sessions`, `deposit-sessions/new` 라우트 2개 |
| `constants.ts` | `{ label: '입금 세션', path: '/partner/deposit-sessions' }` 사이드바 메뉴 |
| `UserDetailView.vue` | "입금 세션 생성" 버튼 → "입금 예약" 버튼으로 이미 변경됨 (Guide #76) |

---

## Part A. DDL 변경

### A-1. deposit_sessions 테이블 DROP

```sql
-- ⚠️ 운영 데이터 확인 후 실행
DROP TABLE IF EXISTS deposit_sessions;
```

### A-2. deposits 테이블 — deposit_session_id 컬럼 제거

```sql
ALTER TABLE deposits
    DROP INDEX idx_session,           -- KEY idx_session (deposit_session_id)
    DROP COLUMN deposit_session_id;
```

### A-3. payment_links 테이블 — deposit_session_id 컬럼 제거

```sql
ALTER TABLE payment_links
    DROP COLUMN deposit_session_id;
```

### A-4. CRYPTOMENTS_V2_DDL.sql 수정

1. **`CREATE TABLE deposit_sessions ...` 블록 전체 삭제** (3-6번 섹션)
2. **`deposits` 테이블**: `deposit_session_id` 컬럼 + `KEY idx_session` 제거
3. **`payment_links` 테이블**: `deposit_session_id` 컬럼 제거
4. **테이블 인덱스**: `deposit_sessions` 항목 삭제
5. **버전**: v1.9 → v2.0, 테이블 수 41 → 40
6. **SECTION 3 입금 계층**: 테이블 수 10 → 9

---

## Part B. common 모듈

### B-1. 완전 삭제 (5개 파일)

```
common/src/main/java/com/cryptoments/common/
├── entity/DepositSession.java              ← 삭제
├── repository/DepositSessionRepository.java ← 삭제
├── enums/DepositSessionStatus.java          ← 삭제
├── enums/DepositSessionRequestSource.java   ← 삭제
└── exception/DepositSessionException.java   ← 삭제
```

### B-2. 필드 제거

**`Deposit.java`** — `depositSessionId` 필드 제거:
```java
// 삭제 대상
@XColumn("deposit_session_id")
private Long depositSessionId;
```

**`PaymentLink.java`** — `depositSessionId` 필드 제거:
```java
// 삭제 대상
@XColumn("deposit_session_id")
private Long depositSessionId;
```

---

## Part C. core 모듈

**`DepositService.java`** — 세션 관련 코드 제거:

1. **의존성 제거**: `DepositSessionRepository sessionRepository` 필드 + 생성자 파라미터
2. **메서드 삭제**:
   - `createSession(Long partnerId, String partnerUserId, DepositSessionRequestSource, DepositMethod, BigDecimal, String, Long, Long, Integer)` — 전체 메서드
   - `createSessionFromPaymentLink(String linkCode, String partnerUserId, DepositMethod)` — 전체 메서드
   - 세션 관련 헬퍼 메서드 (있으면)
3. **import 정리**: `DepositSession`, `DepositSessionRepository`, `DepositSessionStatus`, `DepositSessionRequestSource`, `DepositSessionException` import 제거

---

## Part D. partner-api 모듈

### D-1. 완전 삭제 (2개 파일)

```
partner-api/src/main/java/com/cryptoments/partnerapi/dto/
├── request/CreateDepositSessionRequest.java  ← 삭제
└── response/DepositSessionResponse.java      ← 삭제
```

### D-2. 메서드 제거

**`PartnerDepositController.java`** — 3개 엔드포인트 삭제:
```java
// 삭제: GET /api/partner/deposit-sessions
@GetMapping(name = "입금 세션 목록", value = "/deposit-sessions")

// 삭제: POST /api/partner/deposit-sessions
@PostMapping(name = "입금 세션 생성", value = "/deposit-sessions")

// 삭제: GET /api/partner/deposit-sessions/{sessionId}
@GetMapping(name = "입금 세션 상세", value = "/deposit-sessions/{sessionId}")
```

**`PartnerDepositService.java`** — 3개 메서드 삭제:
```java
// 삭제
public XPage<DepositSessionResponse> getDepositSessions(...)
public DepositSessionResponse createDepositSession(...)
public DepositSessionResponse getDepositSession(...)
```

**`PartnerDepositMapper.java`** — 2개 메서드 삭제:
```java
// 삭제
@Select("<script>SELECT ... FROM deposit_sessions ...</script>")
XPage<DepositSessionResponse> searchDepositSessions(...)

@Select("SELECT ... FROM deposit_sessions ...")
DepositSessionResponse findDepositSessionDetail(...)
```

### D-3. PartnerUserContextController/Service — 세션 조회 제거

**`PartnerUserContextController.java`**:
```java
// 삭제: GET /api/partner/users/{partnerUserId}/sessions
@GetMapping(name = "사용자 세션 내역 조회", value = "/{partnerUserId}/sessions")
public XPage<DepositSessionResponse> getUserSessions(...) { ... }
```

**`PartnerUserContextService.java`**:
```java
// 삭제
public XPage<DepositSessionResponse> getUserSessions(...) { ... }
```
- `DepositSessionResponse` import 제거

### D-4. PartnerUserContextMapper — deposit_sessions JOIN 변경

현재 payment_links 조회 시 deposit_sessions를 JOIN하고 있음:
```java
// 현재 (deposit_sessions JOIN으로 partnerUserId 필터)
@Select("SELECT pl.* FROM payment_links pl" +
        "  INNER JOIN deposit_sessions ds ON ds.payment_link_id = pl.id" +
        " WHERE ds.partner_id = #{partnerId}" +
        "   AND ds.partner_user_id = #{partnerUserId}")
XPage<PaymentLink> findPaymentLinksByPartnerUserId(...)
```

**두 가지 선택지**:

**선택 A (권장)**: payment_links 테이블에 직접 partner_user_id가 없으므로 이 쿼리 자체를 빈 결과로 대체하거나, 사용자 상세에서 결제 링크 탭을 비활성화.

**선택 B**: payment_links 테이블에 `partner_user_id` 컬럼 추가 (DDL 변경 필요).
→ 현재 사용자별 결제 링크가 많지 않다면 **선택 A**로 진행하고, 추후 필요 시 B로 확장.

```java
// 선택 A: 쿼리를 payment_links 자체 컬럼으로 변경
// payment_links에 partner_user_id가 있으면 직접 필터, 없으면 이 메서드 제거
@Select("SELECT pl.* FROM payment_links pl" +
        " WHERE pl.partner_id = #{partnerId}" +
        "   AND pl.partner_user_id = #{partnerUserId}")
XPage<PaymentLink> findPaymentLinksByPartnerUserId(...)
```

> **주의**: payment_links DDL에 `partner_user_id VARCHAR(255)` 컬럼이 이미 있는지 확인 필요.
> 있으면 선택 A로 직접 변경, 없으면 메서드 자체를 제거하고 사용자 상세에서 결제 링크 탭 숨김.

### D-5. DepositResponse DTO — depositSessionId 필드 제거 (있으면)

**`DepositResponse.java`**: `depositSessionId` 필드가 있으면 제거.

---

## Part E. admin-api 모듈

### E-1. 완전 삭제 (2개 파일)

```
admin-api/src/main/java/com/cryptoments/adminapi/dto/
├── request/DepositSessionSearchRequest.java    ← 삭제
└── response/DepositSessionDetailResponse.java  ← 삭제
```

### E-2. 메서드 제거

**`DepositManagementController.java`**:
```java
// 삭제: GET /api/admin/deposit-sessions
@GetMapping(name = "입금 세션 목록", value = "/deposit-sessions")
public XPage<DepositSessionDetailResponse> getDepositSessions(...) { ... }
```

**`DepositManagementService.java`**:
```java
// 삭제
public XPage<DepositSessionDetailResponse> getDepositSessions(...) { ... }
```

**`DepositSearchMapper.java`**:
```java
// 삭제
@Select("<script>SELECT ... FROM deposit_sessions ...</script>")
XPage<DepositSessionDetailResponse> searchDepositSessions(...)
```

---

## Part F. open-api 모듈

**`DepositController.java`** — 세션 관련 엔드포인트 제거:

1. **의존성 제거**: `DepositSessionRepository depositSessionRepository` 필드 + 생성자 파라미터
2. **엔드포인트 삭제** (6개):
   - `POST /widgets/api/deposit-address` — 세션 생성 기반 주소 할당
   - `POST /widgets/api/deposit-reservations` — 세션 생성
   - `GET /widgets/api/deposit-reservations` — 세션 목록 조회
   - `PUT /widgets/api/deposit-reservations` — 세션 수정
   - `DELETE /widgets/api/deposit-reservations` — 세션 취소
   - `POST /widgets/api/deposit-reservations/complete` — 세션 완료
3. **import 정리**: 세션 관련 모든 import 제거

> **주의**: open-api의 이 엔드포인트들이 위젯에서 사용 중이었다면,
> 위젯 측 호출도 `deposit_reservations` 기반으로 교체해야 함.
> 위젯 연동 전환은 별도 가이드(위젯 리팩토링)에서 처리.

---

## Part G. partner-ui (Vue/TypeScript)

### G-1. 완전 삭제 (2개 파일)

```
partner-ui/src/views/partner/deposits/
├── DepositSessionsView.vue     ← 삭제
└── DepositSessionNewView.vue   ← 삭제
```

### G-2. 라우터에서 라우트 제거

**`router/index.ts`** — 2개 라우트 삭제:
```ts
// 삭제
{ path: 'deposit-sessions', name: 'partner-deposit-sessions', ... },
{ path: 'deposit-sessions/new', name: 'partner-deposit-session-new', ... },
```

### G-3. 사이드바 메뉴 제거

**`constants.ts`**:
```ts
// 삭제
{ label: '입금 세션', path: '/partner/deposit-sessions' },
```

### G-4. deposit.service.ts — 세션 메서드 제거

```ts
// 삭제 (3개 메서드)
getDepositSessions: (params: DepositSessionSearchParams) =>
  api.get<XPage<DepositSessionResponse>>('/api/partner/deposit-sessions', params),

getDepositSession: (id: number) =>
  api.get<DepositSessionResponse>(`/api/partner/deposit-sessions/${id}`),

createDepositSession: (data: CreateDepositSessionRequest) =>
  api.post<DepositSessionResponse>('/api/partner/deposit-sessions', data),
```

- import에서 `DepositSessionResponse`, `DepositSessionSearchParams`, `CreateDepositSessionRequest` 제거

### G-5. deposit.ts (types) — 세션 타입 제거

```ts
// 삭제 (3개 인터페이스)
export interface DepositSessionResponse { ... }
export interface DepositSessionSearchParams { ... }
export interface CreateDepositSessionRequest { ... }

// DepositResponse에서 필드 제거
depositSessionId?: number  // ← 삭제
```

---

## 체크리스트

| # | 항목 | 모듈 | 유형 |
|---|------|------|------|
| A-1 | `DROP TABLE deposit_sessions` | DDL, DB | DDL |
| A-2 | `deposits.deposit_session_id` 컬럼 + 인덱스 제거 | DDL, DB | DDL |
| A-3 | `payment_links.deposit_session_id` 컬럼 제거 | DDL, DB | DDL |
| A-4 | DDL 파일 수정 (v2.0, 테이블 수 40) | DDL 파일 | DDL |
| B-1 | Entity/Repo/Enum/Exception 5개 파일 삭제 | common | Java 삭제 |
| B-2 | `Deposit.java`, `PaymentLink.java` 필드 제거 | common | Java 수정 |
| C | `DepositService.java` 세션 메서드 + 의존성 제거 | core | Java 수정 |
| D-1 | DTO 2개 파일 삭제 | partner-api | Java 삭제 |
| D-2 | Controller/Service/Mapper 세션 엔드포인트 제거 | partner-api | Java 수정 |
| D-3 | UserContextController/Service 세션 조회 제거 | partner-api | Java 수정 |
| D-4 | UserContextMapper deposit_sessions JOIN 변경 | partner-api | Java 수정 |
| D-5 | DepositResponse DTO depositSessionId 제거 | partner-api | Java 수정 |
| E-1 | DTO 2개 파일 삭제 | admin-api | Java 삭제 |
| E-2 | Controller/Service/Mapper 세션 메서드 제거 | admin-api | Java 수정 |
| F | open-api DepositController 세션 엔드포인트 6개 제거 | open-api | Java 수정 |
| G-1 | Vue 페이지 2개 삭제 | partner-ui | Vue 삭제 |
| G-2 | 라우터 라우트 2개 제거 | partner-ui | TS 수정 |
| G-3 | 사이드바 메뉴 "입금 세션" 제거 | partner-ui | TS 수정 |
| G-4 | deposit.service.ts 세션 메서드 3개 제거 | partner-ui | TS 수정 |
| G-5 | deposit.ts 세션 타입 3개 + 필드 1개 제거 | partner-ui | TS 수정 |

## 구현 순서

1. **A-1~A-3** — DDL ALTER + DROP (Cowork에서 로컬 DB 적용)
2. **A-4** — DDL 파일 수정 (Cowork)
3. **B-1** — common 완전 삭제 (5개)
4. **B-2** — common 필드 제거 (2개)
5. **D-1, E-1** — DTO 완전 삭제 (4개)
6. **C** — core DepositService 세션 메서드 제거
7. **D-2~D-5** — partner-api 세션 코드 제거
8. **E-2** — admin-api 세션 코드 제거
9. **F** — open-api 세션 코드 제거
10. **G-1~G-5** — partner-ui 정리
11. **빌드 확인**: `./gradlew :common:compileJava && ./gradlew :core:compileJava && ./gradlew :partner-api:compileJava && ./gradlew :admin-api:compileJava && ./gradlew :open-api:compileJava`

## 주의사항

1. **open-api 위젯 엔드포인트**: 현재 위젯이 `POST /widgets/api/deposit-reservations` 등을 호출 중이라면, 위젯 코드도 `deposit_reservations` 기반으로 교체 필요. 위젯이 아직 미구현이면 무시.
2. **payment_links ↔ partnerUserId**: `PartnerUserContextMapper`의 JOIN 쿼리 변경 시, payment_links에 `partner_user_id` 컬럼이 있는지 확인. 없으면 해당 메서드 자체 제거.
3. **deposits.deposit_session_id 기존 데이터**: 기존 deposit에 session_id가 연결된 건이 있으면 컬럼 DROP 전에 데이터 백업 고려. 현재 테스트 데이터만이므로 바로 DROP 가능.
4. **DepositMethod enum**: `DepositMethod` enum 자체는 유지 (HD_WALLET, EXTERNAL_WALLET, DECIMAL_MATCH — deposits 테이블에서 여전히 사용).
5. **deposit_address_pool**: 소수점 매칭 풀 테이블은 유지 (DECIMAL_MATCH 입금 방식에서 여전히 사용 가능).
