Skip to content

fix: 예약이 있는 회의실을 지울 때 그 예약이 정리되지 않는 문제 수정 - #1237

Open
wantaekchoi wants to merge 1 commit into
eGovFramework:mainfrom
wantaekchoi:fix/mtgplace-delete-guard
Open

fix: 예약이 있는 회의실을 지울 때 그 예약이 정리되지 않는 문제 수정#1237
wantaekchoi wants to merge 1 commit into
eGovFramework:mainfrom
wantaekchoi:fix/mtgplace-delete-guard

Conversation

@wantaekchoi

Copy link
Copy Markdown
Contributor

수정 사유 Reason for modification

  • 버그수정 Bug fixes
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

회의실을 지워도 사라지는 것은 방 한 행뿐입니다. 같은 핸들러가 첨부파일은 정리하는데 예약만 정리하지 않습니다. 정리 책임을 이미 지고 있으면서 한쪽만 빠진 셈입니다.

매퍼 여덟 방언의 예약 삭제문은 예약 아이디를 요구하므로 방 아이디로 예약을 지우는 SQL 자체가 없습니다.

배포한 DDL이 무엇이냐에 따라 결과가 달라집니다.

참조 무결성 지금 일어나는 일
걸려 있는 방언 삭제 자체가 실패해 사용자가 오류 화면을 봅니다
걸려 있지 않은 방언 예약이 남습니다. 예약 조회가 회의실을 기준 테이블로 삼으므로 화면에서는 보이지 않습니다

어느 쪽으로 가든 바람직하지 않습니다.

AS-IS

egovMtgPlaceManageService.deleteMtgPlaceManage(mtgPlaceManageVO);
return "forward:/uss/ion/mtg/selectMtgPlaceManageList.do";

TO-BE

// 예약이 남아 있으면 회의실을 삭제하지 않는다.
if (egovMtgPlaceManageService.selectMtgPlaceResveCnt(mtgPlaceManageVO) > 0) {
    model.addAttribute("mtgPlaceResveExist", "true");
    return "forward:/uss/ion/mtg/selectMtgPlaceManageList.do";
}

egovMtgPlaceManageService.deleteMtgPlaceManage(mtgPlaceManageVO);
return "forward:/uss/ion/mtg/selectMtgPlaceManageList.do";

영향 범위

예약이 없는 회의실은 종전과 똑같이 지워집니다. 예약이 남아 있는 회의실을 지우려 할 때만 동작이 달라집니다. 그때는 오류 화면이나 조용한 잔존 대신 안내가 뜹니다.

방 아이디로 예약 건수를 세는 조회가 없어 여덟 방언에 같은 문장을 하나씩 넣었습니다.

<select id="selectMtgPlaceResveCnt" parameterType="egovframework.com.uss.ion.mtg.service.MtgPlaceManageVO" resultType="int">
    SELECT count(resve_id) from COMTNMTGPLACERESVE WHERE MTGRUM_ID = #{mtgPlaceId}
</select>

방언 문법 차이가 없어 여덟 파일이 같은 내용이고 각 파일 끝에 붙여 기존 문장과 줄이 겹치지 않습니다. DAO·서비스 배관은 같은 클래스의 기존 중복확인 조회와 같은 모양으로 맞췄습니다.

연쇄 삭제라는 선택지도 있습니다. 되돌릴 수 없는 삭제여서 이쪽을 골랐습니다. 메인테이너께서 연쇄 삭제를 원하신다면 그 방향으로 다시 내겠습니다.

한글·영문 메시지 키를 하나씩 추가했고 목록 화면에는 알림을 넣었습니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

EgovMtgPlaceManageControllerDeleteTest 2건을 추가했습니다. 서비스와 파일 서비스를 Proxy로 세우고 예약 건수를 달리하며 예약이 있을 때는 삭제가 호출되지 않고 없을 때는 호출되는지 확인합니다. 스프링 컨텍스트나 DB 없이 돌아갑니다.

수정 전(RED, 가드만 되돌려 실행)

[ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.133 s <<< FAILURE! -- in egovframework.com.uss.ion.mtg.web.EgovMtgPlaceManageControllerDeleteTest
[ERROR]   EgovMtgPlaceManageControllerDeleteTest.deleteMtgPlaceIsRefusedWhenRoomStillHasReservation:75 예약이 남아 있으면 회의실을 지우지 않아야 한다 ==> expected: <false> but was: <true>

수정 후(GREEN)

[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.127 s -- in egovframework.com.uss.ion.mtg.web.EgovMtgPlaceManageControllerDeleteTest
[INFO] BUILD SUCCESS

커밋에 pom 변경은 넣지 않았습니다. <skipTests>true</skipTests>를 잠시 풀고 받은 출력입니다.

테스트 브라우저 Test Browser

  • Chrome
  • Firefox
  • Edge
  • Safari
  • Opera
  • Internet Explorer
  • 기타 Others

해당 없음

테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video

해당 없음

회의실 삭제는 방 한 행만 지운다. 같은 핸들러가 첨부파일은 정리하는데 예약만
정리하지 않는다. 매퍼 여덟 방언의 예약 삭제문은 예약 아이디를 요구하므로 방
아이디로 예약을 지우는 SQL 자체가 없다.

결과는 배포한 DDL에 따라 갈린다. 참조 무결성이 걸린 방언에서는 삭제 자체가 실패해
사용자가 오류 화면을 본다. 걸리지 않은 방언에서는 예약이 남는데, 예약 조회가
회의실을 기준 테이블로 삼으므로 화면에서는 보이지 않는다. 어느 쪽도 좋은 결과가
아니다.

예약이 남아 있으면 삭제하지 않고 화면에 알리도록 했다. 방 아이디로 예약 건수를
세는 조회가 없어 여덟 방언에 같은 문장을 하나씩 넣었다. 기존 중복확인 조회와 같은
배관이다.

연쇄 삭제로 가는 방법도 있다. 되돌릴 수 없는 삭제라 이쪽을 택했고, 메인테이너가
연쇄 삭제를 원하신다면 그쪽으로 다시 내겠다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant