[MySQL] 만나이 계산 SQL

Mineru·2022년 9월 9일
0

요구사항

DB 설계를 하다보면 이런 경우가 생긴다.

  • 생년월일을 입력 받는다.
  • 모든 사용자들 중 연령대 별로 끊어서 통계를 내야 한다.

과거 해결 방법

여러 가지 선택지가 있겠지만, 바로 머리속으로 떠오르는 방법은

생년월일 바로 입력 받아서 나이를 디비에 넣자

라고 쉽게들 생각하는 것 같다.

이렇게 하면 일단 세가지 문제점이 있다.

  1. 칼럼 중복 : 생년월일을 받아내는 이유는 나이를 알아내기 위함인데, 나이라는 정보를 아는데 필요한 정보가 중복이 되어 들어가게 된다.
  2. 리소스 낭비 : 관점에 따라서는 리소스 낭비라고 볼 수 있고 그렇지 않다고 생각할 수 있다. 내가 리소스 낭비라고 생각하는 이유는 만나이는 날짜가 지나면 매일 바뀔 수 있는 부분이다. 따라서 스케줄러로 매일 날짜를 체크하고 오늘 만나이가 갱신되는 사용자는 나이를 업데이트를 해줘야 한다.
  3. 오차 발생 가능성 : 리로스 낭비에서 말한 스케줄러 동작 과정에서 다른 스케줄러가 동작하게 되면, 나이에 대한 오차가 생길 수 있다.

하지만 대부분의 경우라면 빠르게 제품을 만들어야 하다보니 가장 쉬고 빠른 방법을 선택하기 마련이다.

나는 오차가 발생 가능성을 두고 싶지 않기 때문에 시스템이 동작할 때 오차 없이 계산이 되도록 하는 방식을 적용하기 위해 고민을 하고 싶다.

현재 해결 방법

그럼 테이블에 칼럼을 추가하지 않고 어떻게 현재 만나이를 계산 할 수 있을까?

SELECT TRUNCATE((TO_DAYS(NOW()) - TO_DAYS('2022-01-01')) / 365, 0)

2022-01-01 대신에 사용자의 생년월일을 입력하면 원하는 만나이를 계산할 수 있다.

글을 쓴 이유

글을 쓴 이유가 이 글과는 연관성이 없어보일순 있지만, 최근에 주변 개발자들의 한탄하는 얘기를 들으면서 든 생각이다.

오늘 만들어서 다음달에 사라질 기능을 위해 왜 테이블 설계를 정교하게 짜야해?
그냥 JSON 직렬화해서 필드 하나에 넣고 나중에 필요할 때 그때 나누면 안돼?

아무리 일정이 바빠도 이렇게 하는건 나는 시간 낭비인 것처럼 보인다.
물론 빨리 업무를 진행하기 위해서 이렇게 할 수도 있고 이게 유도리 있는 사람이라고 할 순 있겠지만 개인적으로는 엔지니어로 살아가기 위해서는 나는 엔지니어링 정신을 현실에 있는 어려움 때문에 놓치는 것은 엔지니어로의 삶을 포기하고 코드 몽키로 남겠다는 의지로 받아들어진다.

그래서 코드 몽키로 남지 않았으면 하는 생각에 그분에게는 진심 어린 조언을 하고 말았다.

profile
Daily Coding

0개의 댓글