Skip to content

fix: getFullAge 가 외국인등록번호 세대코드 5~8 을 인식하지 못해 0 을 돌려주던 문제 수정 - #415

Open
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:fix/string-full-age-foreigner-codes
Open

fix: getFullAge 가 외국인등록번호 세대코드 5~8 을 인식하지 못해 0 을 돌려주던 문제 수정#415
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:fix/string-full-age-foreigner-codes

Conversation

@comghost

Copy link
Copy Markdown

수정 사유 Reason for modification

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

수정된 소스 내용 Modified source

문제

EgovDateUtil.getFullAge(socialNo, keyDate) 는 7번째 자리(세대코드)로 출생 세기를 정하는데 0·9, 1·2, 3·4 만 알고
외국인등록번호의 5·6(1900년대)·7·8(2000년대)은 모릅니다.
그래서 외국인의 만 나이는 언제나 0 입니다.

같은 이유로 잘못된 입력(null, 짧은 문자열, 숫자가 아닌 세대코드)도 전부 0 을 돌려줘, 호출자는 "0세"와 "계산 실패"를
구분할 수 없습니다.
#251 이 이 0 반환을 characterization 테스트로 고정해 두어(현재 동작의 명세화) 의도된 동작처럼
보이지만, 외국인등록번호를 처리하는 사업에서는 잘못된 나이가 조용히 저장되는 결함입니다. 이 PR 은 그 테스트를 새 계약으로 바꿉니다.

수정

입력 이전 이후
세대코드 5·6 (1900년대 외국인) 0 정상 계산
세대코드 7·8 (2000년대 외국인) 0 정상 계산
socialNo/keyDatenull 이거나 짧음 0 IllegalArgumentException
세대코드가 0~9 밖(구분자 - 포함 형식 등) 0 IllegalArgumentException
생년월일 자리에 숫자가 아닌 문자 NumberFormatException 그대로(IllegalArgumentException 의 하위)
세대코드 0·9, 1·2, 3·4 의 정상 입력 계산 그대로(생일 경과 여부에 따른 -1 포함)

getCurrentFullAge(socialNo)getFullAge 에 위임하므로 같은 규칙을 따릅니다.

호환성

  • 정상 입력의 결과는 바뀌지 않습니다. 기존 characterization 테스트(#-4-1, #-4-3)가 그대로 통과합니다.
  • 바뀌는 것은 두 가지입니다. (1) 외국인등록번호에서 0 대신 실제 나이가 나오고, (2) 해석할 수 없는 입력은 0 대신
    예외입니다. 0 을 "계산 불가" 신호로 쓰던 호출자가 있다면 IllegalArgumentException 을 잡도록 바꿔야 하므로 릴리스
    노트에 계약 변경으로 적어 주시면 좋겠습니다.
  • 구분자가 포함된 형식(770101-1234567)은 이전에도 0 을 돌려줬을 뿐 지원된 적이 없으며, 이제는 예외로 드러납니다.

JUnit 테스트 JUnit tests

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

EgovDateUtilTest 갱신(0 반환 characterization 2건 → 외국인 코드 4케이스·예외 6케이스·위임 검증), fdl.string 모듈 전건 통과.

환경 기본 로케일(Locale) 모듈 실행 건수 결과
Windows ko_KR 62 Tests run: 62, Failures: 0, Errors: 0, Skipped: 0
Linux (Ubuntu 22.04 / OpenJDK 17) C.UTF-8 62 Tests run: 62, Failures: 0, Errors: 0, Skipped: 0
구분 내용
결함 회귀 세대코드 5·6 → 1980년생은 2020-01-01 기준 40세, 7 → 2005년생 15세, 8 → 2007-12-31생은 2020-06-30 기준 12세(생일 전 -1)
예외 계약 keyDate null · socialNo null · 6자리 · 구분자 포함 · 세대코드 자리에 영문자 · 생년월일 자리에 영문자 → 전부 IllegalArgumentException
위임 getCurrentFullAge 가 현재 일자로 getFullAge 에 넘긴 값과 같고, 1980년생 외국인은 40세 이상
불변 확인 기존 세기 접두(#-4-1)·생일 경계(#-4-3) 테스트 무변경 통과

수동 확인: 현재 main(cc2b332) 위에서 fdl.string 모듈 빌드·테스트가 통과함을 Windows 와 Linux 에서 확인했습니다.

테스트 브라우저 Test Browser

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

해당 없음 — 라이브러리 내부 수정입니다.

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

해당 없음 — 위 JUnit 테스트 결과로 갈음합니다.


base: eGovFramework:main @ cc2b332 (2026-09-10 fetch 기준, #366~#379 머지 후) · 단일 커밋

EgovDateUtil.getFullAge(socialNo, keyDate) 는 7번째 자리(세대코드)로 출생 세기를
정하는데 0·9, 1·2, 3·4 만 알고 외국인등록번호의 5·6(1900년대)과 7·8(2000년대)은
모른다. 그래서 외국인의 만 나이는 언제나 0 이 되고, 잘못된 입력(null·짧은 문자열·
숫자 아닌 세대코드)도 똑같이 0 이라 호출자는 "0세"와 "계산 실패"를 구분할 수 없다.

- 세대코드 5·6 은 1900년대, 7·8 은 2000년대로 계산한다
- null 이거나 짧은 인자, 0~9 밖의 세대코드, 숫자가 아닌 자리는 0 대신
  IllegalArgumentException 으로 알린다. getCurrentFullAge 도 같은 규칙을 따른다
- 정상 입력의 계산식(생일 경과 여부에 따른 -1)은 그대로다

EgovDateUtilTest 갱신 — 0 반환을 고정하던 characterization 테스트를 세대코드 5~8 의
정상 계산과 잘못된 입력의 예외 단언으로 바꾸고, getCurrentFullAge 는 현재 일자로
getFullAge 에 위임한 값과 같은지 확인한다.
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