만 나이
생일이 지나야 한 살 오릅니다. 올해 − 태어난 해에서, 올해 생일이 아직 안 지났으면 1을 뺍니다. 국제적으로 쓰는 방식이고 2023년 6월부터 법령과 계약의 기본 기준입니다.
브라우저 내부 처리
2023년에 만 나이로 통일됐다고 알려져 있지만, 실제로는 아직 세 가지 나이가 각자 다른 자리에서 쓰입니다. 어디서 어느 것이 기준인지 정리했습니다.
같은 사람이 같은 날에 세 가지 다른 나이를 가집니다. 최대 두 살까지 벌어지므로 서류마다 값이 달라 보이는 것이 정상입니다.
생일이 지나야 한 살 오릅니다. 올해 − 태어난 해에서, 올해 생일이 아직 안 지났으면 1을 뺍니다. 국제적으로 쓰는 방식이고 2023년 6월부터 법령과 계약의 기본 기준입니다.
태어나면 1살이고 해가 바뀌면 오릅니다. 올해 − 태어난 해 + 1입니다. 12월 31일에 태어나면 다음 날 두 살이 되는 방식이라 법에서 빠진 것입니다. 지금은 일상 대화에만 남았습니다.
생일과 무관하게 올해 − 태어난 해입니다. 병역법과 청소년보호법이 이 방식을 씁니다. 통일 대상에서 제외됐기 때문에 아직 살아 있습니다.
값을 직접 확인하려면 만나이 계산기에 생년월일을 넣으면 세 가지가 한 번에 나옵니다.
2023년 6월 28일부터 행정기본법과 민법에 "나이는 만 나이로 센다"는 원칙이 명시됐습니다. 법령이나 계약서에 "몇 세"라고만 적혀 있으면 만 나이로 해석합니다. 이전에는 해석이 갈려 분쟁이 생기던 부분을 정리한 것입니다.
통일된 것은 기본 해석 원칙이지 모든 법이 아니기 때문입니다. 개별 법률이 연 나이를 명시하고 있으면 그 법이 우선합니다. 병역법과 청소년보호법이 대표적이고, 이 둘이 일상에서 가장 자주 마주치는 나이 기준이라 체감상 안 바뀐 것처럼 느껴집니다.
청소년보호법이 연 나이를 쓰기 때문입니다. "19세가 되는 해의 1월 1일부터"가 기준이라 생일과 무관하게 연초에 한꺼번에 자격이 생깁니다. 그래서 12월생이 1월생보다 열한 달 일찍 성인 대우를 받는 구간이 생깁니다.
초등학교 입학은 취학 연령 기준이라 같은 해에 태어난 사람이 같이 들어갑니다. 학년은 나이 계산 방식과 무관하게 출생 연도로 묶이므로 통일과 관계없이 그대로입니다.
만 나이는 생일 당일에 한 살 오릅니다. 다음 날이 아닙니다. 법률상으로는 출생일을 산입해 계산하므로 생일 0시부터 새 나이입니다. 계약이나 자격 요건이 생일에 걸려 있으면 이 하루가 실제로 문제가 됩니다.
윤년에 태어난 사람은 평년에 생일이 없습니다. 관례와 실무는 2월 28일을 생일로 봅니다. 3월 1일로 미루면 그해에 한 살을 늦게 먹는 셈이라 불리해집니다.
앞 6자리만으로는 1900년대와 2000년대 출생을 구분할 수 없습니다. 뒷자리 첫 숫자가 세기를 나타내지만 그 값을 다루는 것 자체가 민감정보 처리에 해당합니다. 나이가 필요하면 생년월일만 받는 편이 안전하고 법적으로도 간단합니다.
나이 말고도 "며칠인가"를 세는 상황이 많은데, 시작일을 포함하는지가 자리마다 다릅니다.
숙박 일수, 근무일, 대회 기간, 교육 이수 시간은 대개 시작일도 하루로 셉니다. 반면 "며칠 남았나"를 묻는 계산은 차이만 셉니다. 3월 1일부터 3월 3일까지는 차이로 2일, 당일 포함으로 3일입니다. 계약서 문구가 어느 쪽인지 먼저 확인하세요.
목표일 당일이 D-DAY, 하루 전이 D-1, 하루 뒤가 D+1입니다. 반대로 "만난 지 며칠"처럼 지난 날을 셀 때는 첫날을 1일째로 봅니다. 그래서 같은 날짜인데 D-DAY이면서 1일째가 됩니다.
납기나 처리 기한이 "영업일 기준"이면 토·일을 뺍니다. 다만 설·추석은 음력이라 해마다 날짜가 바뀌고 대체공휴일 규정도 개정되므로 자동 계산에 넣기 어렵습니다. 계산기의 영업일 기능도 주말만 제외하니 그해 공휴일표와 대조하세요.
1월 31일에 1개월을 더하면 2월 31일이 없으므로 2월 28일이 됩니다. 민법의 기간 계산도 말일에서 자르는 방식입니다. 3월 3일로 넘기는 계산기는 이 규칙을 안 따르는 것이니 계약 기한을 다룰 때 확인이 필요합니다.
가입 연령 제한이나 성인 인증을 구현할 때 나이를 어떻게 저장하고 언제 계산할지가 실제로 문제가 됩니다.
가입 시점의 나이를 숫자로 저장하면 다음 생일에 곧바로 틀린 값이 됩니다. 생년월일을 저장하고 나이는 조회할 때 계산하는 것이 유일하게 맞는 방식입니다. 나이 컬럼이 있는 스키마는 대부분 이 실수의 흔적입니다.
서버가 UTC로 돌면 한국 시간 오전 9시 이전에는 아직 어제입니다. 생일 당일에 조건이 바뀌는 기능이라면 이 아홉 시간 동안 사용자가 한 살 어리게 나옵니다. 나이 판정은 사용자의 지역 시간으로 하거나, 최소한 서비스 기준 시간대를 명시적으로 고정해야 합니다.
서비스 약관에 "만 14세 이상"처럼 만을 명시하면 해석이 갈리지 않습니다. 반대로 청소년 유해 매체를 다룬다면 청소년보호법의 연 나이가 적용되므로 생일이 아니라 출생 연도로 판정해야 합니다. 두 기준이 섞이면 같은 사용자가 화면마다 다른 자격을 갖게 됩니다.
<input type="date">는 브라우저가 지역별 표기와 달력 UI를 알아서 처리하고 값은 항상 YYYY-MM-DD로 옵니다. 직접 만든 세 개의 셀렉트 박스는 2월 31일 같은 값을 막지 못하므로 별도 검증이 필요합니다.
세 가지 나이와 날짜 계산을 한 화면에서 확인하려면 만나이 계산기를 쓰세요. 디데이와 날짜 더하기도 같은 페이지에 있습니다.