[project] 신청 행 단일화 및 수정 시 아이콘 유실 수정 - #452
Conversation
수정 신청을 반복할 때마다 tb_project_edit_request에 행이 계속 쌓여 신청자 한 명이 조회할 데이터가 기하급수적으로 늘어났다. 재사용 대상을 PENDING에서 전체 상태로 넓혀, 이전 상태와 무관하게 기존 행을 덮어쓰도록 바꿨다. 승인 전 신규 신청도 신청자당 하나만 유지한다. 거절 이력은 남지 않지만 조회 로직이 최신 1건만 사용하고 있어 실제 동작에는 영향이 없다.
There was a problem hiding this comment.
Overview
- 프로젝트 수정/신규 신청 로직을 변경해 프로젝트당 신청 행 1개, 승인 전 신규 신청은 신청자당 1개만 유지하도록 했습니다.
- 기존 행을 상태와 무관하게 재사용·덮어쓰고, 관련 리포지토리 쿼리도 그에 맞게 조정했습니다.
Intent
- 반복적인 신청/거절/재신청으로
tb_project_edit_request행이 누적되는 문제를 방지하려는 의도로 보입니다. - 조회 성능 개선과 데이터 간결성 확보가 목적입니다.
Risk
- 중간~높음
- 기존 운영 DB에 중복된 신청 행이 남아 있으면 단건 조회 시
NonUniqueResultException이 발생할 수 있어, 배포 전 데이터 정리가 필요합니다. - 과거 거절 이력이 기존 행에 덮어써지는 구조로 바뀌어, 감사/이력 보존이 필요한 경우 별도 설계가 필요합니다.
- 테스트는 추가되어 있지만, 운영 데이터 상태와 기존 화면/쿼리가 최신 1건 전제로 동작하는지 확인이 필요합니다.
0 inline comment(s)
iconKey를 보내지 않으면 null로 덮어써 승인 시 아이콘이 소실됐다. 응답에는 iconUrl만 있어 클라이언트가 되돌려 보낼 키를 알 수 없는 구조라, 이름만 고쳐도 아이콘이 사라졌다. 요청에 값이 없으면 기존 값을 유지하도록 바꾸고, 응답에 iconKey를 추가해 클라이언트가 현재 키를 확인할 수 있게 했다. 학생 신청과 어드민 수정 API 모두에 적용했으며 deploymentUrl도 동일하게 처리한다. 공개 조회 응답에는 내부 키를 노출하지 않는다.
|
클라이언트(projects·admin) 반영 관점에서 확인해 봤는데, 아이콘 유실이 아직 남는 경로가 있어 공유드립니다. 1. 어드민 수정 API(
|
리뷰에서 지적된 네 가지를 반영했다. - datagsm-web의 어드민 수정 API가 누락되어 여전히 전체 덮어쓰기였다 - 신청 행이 없는 첫 수정과, 어드민이 원본을 직접 바꾼 경우를 위해 기준을 신청 행이 아닌 원본 프로젝트의 현재 값으로 바꿨다 - 신규 신청을 신청자당 하나로 묶으면 다른 프로젝트를 신청할 때 기존 신청이 대체되고 값까지 승계되므로 제한을 없앴다 - 생략은 유지, 빈 문자열은 삭제로 iconKey와 deploymentUrl 규칙을 통일했다. deploymentUrl의 @pattern에 빈 문자열을 허용한다
개요
프로젝트 수정과 관련한 두 가지 문제를 해결했습니다. 수정 신청 행이 무한히 쌓이던 문제와, 수정 시 아이콘이 사라지던 문제입니다.
본문
1. 수정 신청 행 누적
수정 신청을 반복하면
REJECTED/ACCEPTED행이 그대로 남아 누적됐습니다. 자신의 프로젝트를 한 번에 모두 조회하는 구조라, 수정·거절을 반복할수록 읽어야 할 행이 늘어납니다. 참여자·리포지토리·기술스택 컬렉션까지 행마다 따라붙어 증가폭이 큽니다.재사용 대상을 전체 상태로 넓혀 프로젝트당 1행으로 고정했습니다.
재사용 방식이라 과거 거절 사유는 남지 않습니다. 다만
QueryMyProjectServiceImpl이 이미 프로젝트당 최신 1건만 사용하고 있어 화면 동작에는 변화가 없습니다.2. 수정 시 아이콘·배포 URL 유실
iconKey를 보내지 않으면null로 덮어쓰고, 승인 시applySnapshot이 이를tb_project에 반영해 아이콘이 실제로 사라졌습니다. 응답에는iconUrl만 있고iconKey가 없어, 클라이언트가 되돌려 보낼 값을 알 수 없는 구조였습니다.생략하면 유지, 빈 문자열이면 삭제로 규칙을 통일했습니다.
null""기준값은 원본 프로젝트의 현재 값입니다. 신청 행을 기준으로 삼으면 신청 행이 없는 첫 수정에서 값이 비고, 그 사이 어드민이 원본을 바꿨을 때 과거 값으로 되돌아갑니다.
적용 범위는 학생 신청 API,
datagsm-web어드민 수정 API,datagsm-openapi수정 API 세 곳이며deploymentUrl도 동일합니다.deploymentUrl은@Pattern을^$|^https?://.*로 완화해 빈 문자열을 허용합니다.응답에
iconKey를 추가해 클라이언트가 현재 키를 확인할 수 있게 했습니다. 공개 조회(PublicProjectResDto)는 무인증이고 쓰기 경로가 없어 제외했습니다.검증
전체 테스트 800개 통과. 아래 케이스를 추가했습니다.
신청 행 단일화
PENDING으로 되돌리고 거절 정보를 비우는지아이콘·배포 URL 유지
프론트 영향
iconKey필드가 추가됩니다 (MyProjectResDto,ProjectEditRequestResDto,ProjectResDto)iconKey·deploymentUrl을 생략하면 기존 값이 유지됩니다""를 보내면 됩니다배포 시 주의
조회가 단건으로 바뀌어, 기존 DB에 같은 프로젝트를 가리키는 수정 신청 행이 여러 개면
NonUniqueResultException이 발생합니다. 운영에 데이터가 쌓여 있다면 배포 전 최신 1건만 남기는 정리가 필요합니다. 정리 SQL은 로컬docs/db-migration.md에 정리해 두었습니다.