# 함수 명세: `withDdsEndUserContext` (#617) > **상태**: Draft · **분류**: 복잡 — 연결 풀 보안 경계 ## 책임 한 DB 작업을 정확히 하나의 local DDS END USER Context 안에서 실행하고, 어떤 종료 경로에서도 Context를 해제한다. ## 시그니처 `(DdsPrincipal, SqlWork) -> T` ## 입력 - `DdsPrincipal`: 게시된 DDS END USER 이름, lookup key 참조, 사용자 ID, 게시 version. - `SqlWork`: 보호 객체를 읽거나 쓰는 제한된 Tool DB 작업. ## 알고리즘 1. `DdsPrincipal`이 활성·게시 완료 상태인지 확인한다. 2. 공용 연결을 획득하고 서비스 database-access token을 얻는다. 3. local END USER 이름과 lookup key로 DDS Context를 부착한다. 4. `SqlWork`를 실행한다. Repository는 Context 설정/해제를 직접 호출할 수 없다. 5. 성공·실패·취소·시간초과와 무관하게 `finally`에서 Context를 해제한다. 6. 해제 실패는 연결을 풀에 반환하지 않고 폐기한다. ## 보안 불변식 - 하나의 Tool DB 작업에는 하나의 DDS END USER만 존재한다. - 이전 Tool의 Context가 다음 Tool에 남아서는 안 된다. - Context 부착 이전과 해제 이후에는 보호 SQL을 실행하지 않는다. - local END USER의 DATA ROLE은 payload로 임의 추가하지 않고, 게시된 DDS DDL에서만 얻는다. ## 스파이크 확인 동일 풀 연결에서 사용자 A → B → A와 동시 요청을 실행해 `ORA_END_USER_CONTEXT.username`, 행, 컬럼이 각각 맞는지 확인한다.