Skip to content

Conversation

ParkJunGyu26
Copy link
Contributor

수정 사유 Reason for modification

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

MySQL에서 SYSDATE() 함수는 호출되는 시점의 시간을 반환하여, 단일 SQL문 내에서도 지연이 발생할 경우 타임스탬프가 다르게 기록될 수 있는 잠재적인 데이터 불일치 문제를 가지고 있습니다.

이를 문장의 시작 시간을 기준으로 일관된 타임스탬프를 반환하는 NOW() 함수로 변경하여 데이터 정합성을 보장하도록 수정합니다.

근거 자료: MySQL 공식 문서

image

이러한 동작 방식의 차이는 MySQL 8.4 공식 레퍼런스 문서에도 명시되어 있습니다.

Reference: [MySQL 8.4 Manual / Date and Time Functions]

NOW() returns a constant time that indicates the time at which the statement began to execute. (...) This differs from the behavior for SYSDATE(), which returns the exact time at which it executes.

공식 문서 예제:

mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
+---------------------+----------+---------------------+

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
+---------------------+----------+---------------------+

수정된 소스 내용 Modified source

  1. EgovBoard_SQL_mysql.xml

    • insertBoardArticle, deleteBoardArticle 등 여러 쿼리에서 사용되던 SYSDATE()NOW()로 모두 변경하여 일관성을 확보했습니다.
  2. BbsTimestampConsistencyTest.java (신규 테스트)

    • MySQL의 SYSDATE()NOW()가 단일 SQL문 내에서 어떻게 다르게 동작하는지 명확하게 증명하는 JUnit 테스트 코드를 추가했습니다.

JUnit 테스트 JUnit tests

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

테스트 결과 및 증명

공식 문서의 예제와 동일한 원리를 JUnit 테스트로 증명했습니다. 단일 SQL문 내에서 1초의 지연(SLEEP(1))을 두고 각 함수의 반환값을 비교한 결과, SYSDATE()는 시간이 변경되고 NOW()는 시간이 고정됨을 확인했습니다.

테스트 실행 결과 로그:

--- SYSDATE() 테스트 ---
첫번째 시간: 2025-09-28T05:25:10
두번째 시간: 2025-09-28T05:25:11
✅ 결론: SYSDATE()는 일관성을 지키지 못함.

--- NOW() 테스트 ---
첫번째 시간: 2025-09-28T05:25:12
두번째 시간: 2025-09-28T05:25:12
✅ 결론: NOW()는 일관성을 지킴.

테스트 환경 정보

테스트는 Docker를 사용한 임시 MySQL 8.0 데이터베이스 환경에서 진행했습니다.


테스트 브라우저 Test Browser

이번 수정은 백엔드 로직 개선에 해당하므로 브라우저 테스트는 진행하지 않았습니다.

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

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

image

이전 커밋의 타임스탬프 일관성 보장 정책을 프로젝트 내 다른 MySQL Mapper 파일에도 동일하게 적용합니다.

- EgovFile_SQL_mysql.xml
- EgovBBSMaster_SQL_mysql.xml
- EgovBBSUse_SQL_mysql.xml
- EgovIndvdlSchdulManage_SQL_mysql.xml
- EgovMberManage_SQL_mysql.xml
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