화면설계서: 알림이력
1. 기본 정보
| 항목 |
내용 |
| 버전 |
1.4 |
| 프로세스명 |
UI설계 |
| 화면명 |
알림이력 |
| 화면 ID |
AS_SC0205011 |
| 요구사항 ID |
NSUR-001-001 |
| 화면 유형 |
[v] 조회 [ ] 입력 [ ] 수정 [ ] 삭제 [ ] 출력 |
| 메뉴 경로 |
메인 > 행정지원서비스 > 알림이력 |
2. 화면 목적
로그인한 사용자가 본인에게 발송된 행정지원(ADSS) 알림을 기간·구분으로 조회한다. 목록의 처리 버튼으로 해당 알림을 읽음 처리한 뒤, 연계된 업무 화면으로 이동한다.
3. 화면 구성
3-1. 전체 레이아웃
3-2. 화면 데이터 흐름
4. 영역 A — 검색 필터
구성: 기간 · 구분 (+ 검색).
서버 findMyAsNotiList 고정 정책 (클라이언트 미전달):
recvUnqId = 로그인 사용자 UUID
delYn = N
notiType = ADSS (행정지원 전용 API)
4-1. 필드 정의
| 표시명 |
입력 유형 |
필수 |
기본값 |
API 파라미터 매핑 |
비고 |
| 기간(시작) |
DatePicker |
N |
오늘 − 1개월 (YYYY-MM-DD) |
startDt |
NotiSearchDto.startDt |
| 기간(종료) |
DatePicker |
N |
오늘 (YYYY-MM-DD) |
endDt |
NotiSearchDto.endDt |
| 구분 |
Select |
N |
전체(미선택) |
docSeComCd |
INSTL / FNRS / SEWER / CNFM / PWRK (또는 단축 I/F/S/C/P). 공통코드 ASDOCSE |
4-2. 버튼
| 버튼명 |
동작 |
| 검색 |
영역 A 조건으로 findMyAsNotiList 호출 → 영역 B 갱신 (page=0) |
4-3. 콤보·기본값 주의
| 항목 |
내용 |
| 구분 = 전체 |
docSeComCd 미전달. notiType은 서버가 ADSS로 고정 |
| 구분 옵션 소스 |
공통코드 ASDOCSE (docSeComCd ↔ docSeComNm) |
| 기간 |
UI설계 상세설명: 기본 최근 1개월. startDt/endDt로 전달 |
5. 영역 B — 알림 이력 목록
5-1. 그리드 컬럼
| 표시명 |
Field |
비고 |
| No |
(row index) |
페이지 오프셋 반영 |
| 알림일시 |
regDt |
표시 YYYY-MM-DD HH:mm (응답 yyyy-MM-dd HH:mm:ss) |
| 알림내용 |
notiTtl |
제목 문자열. UI 샘플은 [YYYY-MM-DD] … 접두 |
| 연계업무 |
docSeComNm |
문서구분 공통코드명 (docSeComCd + @CodeName ASDOCSE) |
| 상태 |
(derived) |
Badge 렌더링. 판정 규칙은 §5-1-1 |
| 처리 |
(action) |
상태별 버튼 라벨. 클릭 시 readNoti 후 notiUrl로 이동 (§5-3) |
5-1-1. 상태 UI 케이스 (@common/components Badge)
판정에 사용: notiPrcsCmptnYn, notReadYn, regDt (오늘 기준 경과일).
| 조건 |
라벨 |
Badge |
notiPrcsCmptnYn = Y |
처리완료 |
variant="default" (primary) |
notiPrcsCmptnYn = N 이고 notReadYn = Y 이고 regDt로부터 7일 초과 |
처리지연 |
color="red" |
notiPrcsCmptnYn = N 이고 notReadYn = Y 이고 regDt로부터 7일 이내 |
처리중 |
color="green" |
notiPrcsCmptnYn = N 이고 notReadYn = N 이고 regDt로부터 3일 초과 |
지연 |
color="orange" |
notiPrcsCmptnYn = N 이고 notReadYn = N 이고 regDt로부터 3일 이내 |
미조회 |
color="yellow" |
daysSince(regDt): 오늘 날짜 − regDt 일자 (일 단위)
regDt가 없으면 상태 Badge 표시 전략 TBD (미표시 또는 기본값)
응답에 있으나 그리드에 표시하지 않음:
| Field |
비고 |
notiId |
알림 ID — 행 키 |
recvUnqId |
수신 회원 UUID (서버가 로그인 사용자로 고정) |
senderUnqId |
발신 회원 UUID |
notiType |
알림 종류 (ADSS) |
notiCn |
알림 내용 (목록에서는 서버가 제외할 수 있음) |
notReadYn |
확인 여부 Y/N. 상태 Badge 판정에 사용 (§5-1-1) |
notiUrl |
처리 버튼 이동 URL. 컬럼 미표시 |
notiLnkgUnqNo |
알림연결고유번호 |
docSeComCd |
문서구분 공통코드. 연계업무 표시는 docSeComNm 사용 |
notiIdntyDt |
알림 확인 일시 |
notiIdntyYn |
알림 확인 여부 (notReadYn과 동일 의미). 상태 판정은 notReadYn 사용 |
notiPrcsCmptnYn |
알림 처리 완료 여부. 상태 Badge 판정에 사용 (§5-1-1) |
notiPrcsCmptnDt |
알림 처리 완료 일시 |
5-2. 목록 메타·페이지네이션
| 항목 |
매핑 |
| 건수 / size ▼ |
상단 우측 N개 셀렉트 → Pageable.size |
| page / size |
NotiSearchDto의 PageableParams |
| 페이지 컨트롤 |
Spring Page 표준 (number, totalPages) |
5-3. 행 상호작용
| 동작 |
설명 |
| 처리 버튼 클릭 |
readNoti(notiId)로 읽음 처리 후, 해당 알림에 연계된 URL(notiUrl)로 이동 |
| 행 클릭 |
UI설계에 없음. 처리 버튼만 명시 |
처리 버튼 라벨 (상태 Badge §5-1-1 기준):
| 상태 |
버튼명 |
| 미조회 |
처리하기 |
| 지연 |
처리하기 |
| 처리중 |
처리하기 |
| 처리지연 |
처리하기 |
| 처리완료 |
상세보기 |
notiUrl이 비어 있으면 이동하지 않음 (no-op). 읽음 처리는 notiUrl 유무와 관계없이 호출
- 읽음 처리 성공 후 목록 쿼리(
notiBaseKey)를 invalidate 하여 영역 B 상태를 갱신
6. API/DTO 명세
6-1. 공통
| 항목 |
값 |
| Base prefix |
/cms-service/api/v1/noti (ENDPOINT.CMS_SERVICE.NOTI) |
| 인증 |
로그인 사용자 UUID — 서버 SecurityUtils.getLoggedInUserUnqIdUUID() (클라이언트 미전달) |
| 클라이언트 모듈 |
@/entities/noti — notiService / useFindMyAsNotiList / useReadNoti |
6-2. 로그인한 사용자 행정지원 알림 목록 — findMyAsNotiList
| 기능 |
Method |
URL |
Request DTO |
Response DTO |
API |
| 로그인한 사용자 행정지원 알림 목록 |
GET |
{BASE}/as/my/list |
Query: NotiSearchDto + Pageable |
PageResponse<NotiAsUserResponseDto> |
notiService.findMyAsNotiList / useFindMyAsNotiList |
Request (NotiSearchDto + Pageable)
| 필드 |
필수 |
설명 |
recvUnqId |
N |
수신 회원 UUID. 서버가 로그인 사용자로 덮어씀 |
senderUnqId |
N |
발신 회원 UUID. 본 화면 필터에 없음 |
notiType |
N |
알림 종류. 본 API는 서버가 ADSS로 고정 |
notiTtlKeyword |
N |
알림 제목 키워드. 본 화면 필터에 없음 |
notiCnKeyword |
N |
알림 내용 키워드. 본 화면 필터에 없음 |
notReadYn |
N |
알림 확인 여부 (Y/N). 본 화면 검색 필터에 없음 |
delYn |
N |
삭제 여부. 서버가 N으로 고정 |
startDt |
N |
시작일자 YYYY-MM-DD — 영역 A 기간(시작) |
endDt |
N |
종료일자 YYYY-MM-DD — 영역 A 기간(종료) |
docSeComCd |
N |
문서 구분 공통 코드 (INSTL/FNRS/SEWER/CNFM/PWRK 등) — 영역 A 구분 |
page / size / sort |
N |
Spring Pageable |
Response (NotiAsUserResponseDto)
| 필드 |
타입 |
설명 |
notiId |
number |
알림 ID |
recvUnqId |
string |
수신 회원 UUID |
senderUnqId |
string |
발신 회원 UUID |
notiType |
string |
알림 종류 (ADSS) |
notiTtl |
string |
알림 제목 |
notiCn |
string? |
알림 내용 (목록에서 제외될 수 있음) |
notReadYn |
string? |
알림 확인 여부 (Y/N). 상태 Badge 판정 |
regDt |
string? |
등록 일시 yyyy-MM-dd HH:mm:ss. 상태 Badge 경과일 기준 |
notiUrl |
string? |
알림 URL 주소 |
notiLnkgUnqNo |
string? |
알림연결고유번호 |
docSeComCd |
string? |
문서구분 공통코드 |
docSeComNm |
string? |
문서구분 공통코드명 (ASDOCSE) |
notiIdntyDt |
string? |
알림 확인 일시 yyyy-MM-dd HH:mm:ss |
notiIdntyYn |
string? |
알림 확인 여부 (Y/N) |
notiPrcsCmptnYn |
string? |
알림 처리 완료 여부 (Y/N). 상태 Badge 판정 |
notiPrcsCmptnDt |
string? |
알림 처리 완료 일시 yyyy-MM-dd HH:mm:ss |
6-3. 알림 읽음 처리 — readNoti
| 기능 |
Method |
URL |
Request DTO |
Response DTO |
API |
| 알림 읽음 처리 |
PUT |
{BASE}/{notiId}/read |
Path: notiId (Long) |
Long (알림 ID) |
notiService.readNoti / useReadNoti |
Request
| 필드 |
위치 |
필수 |
설명 |
notiId |
Path |
Y |
알림 ID |
Body 없음.
Response
| 타입 |
설명 |
| number |
읽음 처리된 알림 ID (notiId) |
화면 매핑: 영역 B [처리] 버튼 클릭 시 호출. 성공 시 notiBaseKey invalidate → findMyAsNotiList 재조회.
7. UI 구현 가이드
7-1. 기술 스택·원칙
- UI:
@common/components — DatePicker, Select, Button, DataTable, Pagination, Badge
- 목록:
@tanstack/react-table + useDataTable (기존 my-pbadms-sprt-list 패턴)
- 데이터: React Query
useFindMyAsNotiList(params), useReadNoti()
- 검색 조건·페이지: URL
searchParams 동기화 권장 (useSearchParamsState 스킬)
- 처리 컬럼: 행 클릭이 아니라 버튼 클릭으로
readNoti 후 notiUrl 이동
- 상태 컬럼: §5-1-1 규칙으로
Badge 렌더링 (notiPrcsCmptnYn / notReadYn / regDt)
- 연계업무:
docSeComNm 표시
7-2. 앱·파일 배치
| 구분 |
경로 |
| 라우트 |
app/(main)/(with-base-layout)/noti/page.tsx |
| 페이지 |
pages/noti/ui/noti-list-page.tsx |
| 목록 그리드 |
pages/noti/ui/noti-list.tsx |
| 테이블 컬럼 |
pages/noti/model/noti-table-columns.tsx |
| 상태 판정 |
pages/noti/lib/resolve-noti-status.ts |
| Entity API |
entities/noti/api/noti-service.ts |
| Entity Hook |
entities/noti/api/queries.ts → useFindMyAsNotiList, useReadNoti |
| Entity Model |
entities/noti/model/noti-interface.ts |
화면 레이어(pages/noti)·Entity(findMyAsNotiList, readNoti) 구현 완료.
7-3. 영역별 UI 매핑
| 영역 |
컴포넌트 |
데이터 |
| A |
noti-list-page |
로컬 state → NotiSearchDto |
| B |
DataTable + columns |
useFindMyAsNotiList → content[]. 처리 버튼 → useReadNoti |
7-4. 다이얼로그·라우팅
| 항목 |
내용 |
| 다이얼로그 |
없음 (목록 전용) |
| 목록 라우트 |
/noti |
| 상세 이동 |
처리 버튼 → readNoti(notiId) 후 notiUrl (절대/상대 경로 형식 TBD) |
7-5. 데이터 흐름