전문가칼럼

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

재미있는 DB 이야기 ‘60갑자와 쿼리’

전문가칼럼
DBMS별 분류
DB일반
작성자
dataonair
작성일
2014-12-30 00:00
조회
14801




◎ 연재기사 ◎


물탱크 구조로 알아본 오라클의 블록 옵션 ‘PCTFREE와 PCTUSED’


이산가족 찾기 생방송을 통해 배우는 DB 원리


개발자에게 맞는 DB 공부방법 찾기: 물리적 분류와 논리적 분류 그리고 인덱스


데이터베이스 인덱스의 오해와 진실


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (상)


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (하)


누구도 알려주지 않았던 ‘오라클 인덱스 생성도’의 비밀


누구도 알려주지 않았던 ‘오라클 쿼리 작성의 비법’


퀴리 최적화 및 튜닝을 위한 오라클 공정쿼리 작성법


만능 쿼리와 한 방 쿼리


오라클 옵티마이저 ‘CBO와 RBO’ 이해하기


재미있는 DB 이야기 ‘60갑자와 쿼리’


그림으로 배우는 ‘오라클 조인의 방식’ 이야기


반드시 알아야 하는 오라클 힌트절 7가지


오라클 플랜을 보는 법


개발자들의 영원한 숙제 ‘NULL 이야기’


알면 유용한 오라클 기능 ‘GATHER_PLAN_STATISTICS’


알면 유용한 오라클 기능들


오라클 DICTIONARY를 활용한 DB툴 프로그램 ‘FreeSQL’


이제는 말할 수 있다: 주식 자동매매 프로그램(상)


이제는 말할 수 있다: 주식 자동매매 프로그램(하)


개발자들이 자주 접하는 오라클 에러 메세지


재미있는 DB 이야기 ‘사라진 날짜를 찾아라’


오라클 랜덤 함수와 사용자 정의 함수


그림으로 배우는 ‘공정쿼리와 인덱스 생성도’


이병국의 개발자를 위한 DB 이야기: 디폴트 세팅의 함정과 오라클 파라미터


재미있는 DB 이야기 ‘놀라운 마방진의 세계’


오라클 운반 최소 단위 BLOCK


이병국의 개발자를 위한 DB 이야기: 이세돌과 알파고의 세기의 대결


이병국의 개발자를 위한 DB 이야기(30회) : DB 엔지니어의 가볍게 읽는 세상 이야기


이병국의 개발자를 위한 DB 이야기: 튜닝(31회) : 개발자를 위한 DB 튜닝 실전(1편)


이병국의 개발자를 위한 DB 이야기: 튜닝(32회) : 개발자를 위한 튜닝 실전(2편)


이병국의 개발자를 위한 DB 이야기: 튜닝(33회) : 개발자를 위한 튜닝 실전(3편)


이병국의 개발자를 위한 DB 이야기: 튜닝(34회) : 개발자를 위한 DB 튜닝 실전(4편)


이병국의 개발자를 위한 DB 이야기: 튜닝(35회) : 개발자를 위한 튜닝 실전(5편)


이병국의 개발자를 위한 DB 이야기: 페이징 처리에 대한 이해 (36회)


보기 좋은 떡이 먹기도 좋다 - 좋은 쿼리 좋은 성능


테이블의 수직분할과 수평분할에 대한 이해


DB 성능 제고를 위한 채번의 이해와 방식별 장단점 비교


이병국의 개발자를 위한 DB 이야기: 마지막회 : ‘개발자를 위한 DB 이야기’ 연재를 마치며



이병국의 개발자를 위한 DB 이야기: 쿼리 (12회)

재미있는 DB 이야기 ‘60갑자와 쿼리’



이병국 andongcn@dreamwiz.com 프리랜서 DB 엔지니어로서 동아제약 전산실에서 SW 개발 업무를 시작으로 프리랜서 개발자로 독립해 활동하던 중 우연한 기회에 DB와 인연을 맺게 됐다. 현재 삼성생명 전산 운영팀에서 쿼리 성능을 개선하는 DB 튜닝과 IOA 업무를 맡고 있다. 개발자 출신의 DB 엔지니어로 활동하면서 개발자에게 DB 관련 지식이 꼭 필요함을 절감했다. ‘정보의 불균형이 시장 왜곡을 가져온다’는 ‘레몬시장이론’은 중고차 거래에서 흔히 나타나기 쉽다. 좋은 차와 나쁜 차를 아는 중개인과 모르는 구매자 사이에는 정보의 비대칭 때문에 구매자가 손해를 볼 수 있다. 구매자도 차에 대해 기본적인 지식을 알고 있어야, 정보의 균형이 맞으므로 서로 손해를 보지 않고 합리적인 가격에 차를 거래할 수 있다. 마찬가지로 개발자들도 DB에 대해 기본적인 지식을 습득해 정보의 균형을 맞추면, DB 엔지니어와 협업이 더 쉬워지고 한 단계 더 발전한 자신의 모습을 발견할 것이다.



성공과 실패의 경험을 나누자, 용기와 희망을 나누자
개발업무를 시작으로 IT계에 입문했던 필자가 10년 가까이 DB 엔지니어로서 활동하면서
얻은 경험과 지식을 나누고자 한다. DB를 자주 접하는 SW 개발자뿐 아니라,
DB 전문가를 꿈꾸는 대학생에서 DB 분야에 입문한 지 1~2년 된 기 입문자가
쉽게 이해할 수 있도록 비유를 통해 쉽게 접근해볼 계획이다.
물론 전문가들이라도 다시 한번 개념을 정립하는 의미에서 필요한 내용이 될 수 있다.
전체적으로 DB의 기본 원리와 개념을 이해하고 테이블, 인덱스, 쿼리, 튜닝, 플랜 등
개발자들이 알아야 하는 DB 전분야에 대해 쉽게 이해하도록 설명하겠다.
DB 기술서적이나 번역서보다는 조금 더 부드럽게 접근할 계획이다.
그렇다고 흔히 서점에서 만날 수 있는 개발자 위주의 SQL 소개서도 아니다.
이 연재는 시리즈로 나갈 것이다. 연재를 끝까지 읽는 독자라면, 준전문가 수준의 DB 원리를 아는 것을 목표로 한다.

이번 연재에서는 10천간 12지지와 60갑자(甲子)에 대한 내용을 살펴 본다. 60갑자에 대한 오라클 쿼리 구현 방법에 대해서도 설명한다. 지난주 개인적인 이유로 병원에 입원하면서, 이번 연재에 대해 신경 쓸 겨를이 없었다. 이번 연재는 DB 외적인 주제로 설명하면서 DB와 연관시켜 볼 것이다. 편한 마음으로 준비한 연재이므로 부담 없이 봐 줬으면 좋겠다.



60갑자에 대한 기억

며칠 전, 2015학년 대입 수능시험이 끝났다. 필자는 학력고사 세대였다. 그 당시에는 암기 과목이 많아서 뭐든지 잘 외우는 사람이 유리했다. 특히 국사 과목에서 국사연표 외우기는 누구에게나 고역이었다. 2017학년도 수능부터는 국사 과목이 필수가 된다고 하니 감회가 새롭다. 누구에게나 쉽게 외우는 방법이 있겠지만, 아래는 필자가 외웠던 일부 방법들이다.

- 백고무신: 한강을 차지한 삼국의 순서(백제 → 고구려 → 신라)
- 태정태세 문단세 / 예성연중 인명선 / 광인 효현숙 경영 / 정순헌철 고순: 조선 왕조 계보
- 신기병제 / 병신운강임 / 갑거방동 청갑 / 삼을아 독대러을: 조선후기에 일어난 중요한 사건들

연상법을 통한 암기 방법 또는 그냥 운율에 따라 무작정 외우는 방법 등 다양하다. 국사는 외우는 과목이 아니라 흐름을 타면서 이해하는 과목이라지만, 실제로 이해하는 것에도 한계는 있다. 특히나 연표는 더더욱 그렇다. 병인양요, 신미양요, 임오군란, 갑신정변, 갑오개혁, 을사늑약 등의 연도를 무작정 어떻게 기억할 것인가 몇 번 보면 자연스럽게 외울 수 있는 사람도 있겠지만, 이 모든 연도를 외운다는 것은 힘든 일임에 분명하다.

오늘은 60갑자 원리를 통해 더 쉽게 이해하고 외우는 방법을 설명하고자 한다. 또한 60갑자에 대한 원리를 오라클 쿼리로 구현해 보려 한다.



10천간과 12지지

우리의 선조들은 불과 1세기 전까지 서기(기원후)를 사용하지 않고 60갑자를 사용했다. 우리가 서기에 익숙하듯 선조들은 60갑자에 익숙했다. 선조들은 오랫동안 60갑자를 자연스럽게 사용하였다. 지금은 예전처럼 흔하게 사용하지는 않지만, 생활 구석 구석에 아직도 많이 남아 있다. 60갑자 원리를 이해하려면 먼저 10천간과 12지지에 대해서 알아야 한다.

10천간: 갑(甲) 을(乙) 병(丙) 정(丁) 무(戊) 기(己) 경(庚) 신(辛) 임(壬) 계(癸)

10천간이라고도 하고 10간이라고도 한다. 여기서 천은 하늘을 의미한다. 천간은 음양과 오행, 계절 방위, 색상 등 다양한 의미로도 표현되는데, 사주나 성명학에서 많이 이용되고 있다.

12지지: 자(子) 축(丑) 인(寅) 묘(卯) 진(辰) 사(巳) 오(午) 미(未) 신(申) 유(酉) 술(戌) 해(亥)

12지지 또는 12지라고도 한다. 여기서 지는 땅을 의미한다. 10천간과 마찬가지로 12지지도 동물, 계절, 방위, 음양, 오행, 월 등 다양한 의미로도 표현되어 생활에서 밀접하게 이용되고 있다. 10천간과 12지지를 간지라고도 한다.

10천간 + 12지지 = 간지

갑(甲)은 10천간 중에서 으뜸이다. IT 업계에서나 혹은 계약서 상에서 흔히 접하는 ‘갑’이라는 말도 여기에서 비롯된 것이다. 자(子)는 12지지 중에서 으뜸이다. 10천간과 12지지를 상하로 짝을 맞추어 만든 것이 갑자(甲子)에서 계해(癸亥)까지 60갑자다. 10과 12의 최소 공배수는 60이라는 것을 우리는 이미 알고 있다. 갑자(甲子)가 한번 순환하면 회갑(回甲) 혹은 환갑(還甲)이라고 한다. 우리 나이로 61세다. 여기서 한 살 더 나아 간다는 의미로 62살은 진갑(進甲)이라고 한다. 회갑, 환갑, 진갑을 헷갈려 하는 사람도 간혹 있다. 이번 기회에 확실하게 이해하자.

column_img_1591.jpg

<그림 1> 10천간과 12지지 결합방법

여기에서 우리는 다음과 같은 규칙을 발견할 수 있다.

10천간의 홀수 번째는 12지지의 홀수 번째와 결합한다.
10천간의 짝수 번째는 12지지의 짝수 번째와 결합한다.

10×12= 120개의 경우의 수가 있지만, 위와 같은 이유로 60개의 경우의 수만 있는 것이다. 즉 120갑자가 아닌 60갑자다. 60갑자에는 오로지 홀홀이거나 짝짝인 경우만 존재한다. 그런 의미에서 아래와 같은 경우는 절대 존재하지 않는다.

갑축년(홀짝), 기인년(짝홀) 등
아래 그림은 60갑자 도표다. 가로축은 10천간이고 세로축은 12지지다.

column_img_1592.jpg

<그림 2> 60갑자 도표
갑자(1)부터 계해(60)까지 60갑자가 표시되어 있다. 대각선 방향으로 진행하며 짝짝 혹은 홀홀 위치에만 숫자가 적혀 있음을 알 수 있다. 짝홀 혹은 홀짝 위치에는 X 표시가 되어 있으며, 이 위치는 60갑자에 해당되지 않는다. 대각선 방향으로 진행하다가 세로벽 끝을 만나면 한 칸 더 진행 후에 좌측 처음부터 다시 대각선 방향으로 진행한다. 만약 가로벽을 만나면 한 칸 더 진행 후에 상단 처음부터 다시 대각선 방향으로 진행한다. 이러한 원리는 마방진의 규칙과 유사하다.

column_img_1593.jpg

<그림 3> 마방진



60갑자에서 규칙 찾기

우리는 일상 생활에서 10진수를 가장 많이 사용한다. 연도나 숫자 체계가 그렇다. 대부분의 사람들은 10진수를 가장 합리적이라고 생각한다. 솔직히 이공계를 전공한 필자의 생각은 그렇지 않다고 생각한다. 어떤 진수를 사용함에 있어서 좋고 나쁨은 없고, 단지 익숙함의 차이가 아닐까

컴퓨터는 on/off 기능이 필요하므로 2진수를 사용했고, 사람은 손가락이 10개여서 10진수를 가장 많이 사용했다. 만약 손가락이 12개였다면 12진수를 많이 사용하고 있을지도 모를 일이다. 우리는 10진수 외에도 다른 진수도 사용하고 있다. 주변에서 12진수, 60진수를 쉽게 찾아 볼 수 있다. 시계의 시간과 달력의 월이 12진수이며 시계의 분, 초가 60진수다.

우리가 현재 사용하고 있는 서기는 10진수다. 60갑자는 10천간과 12지지의 최소공배수인 60진수다. 60년 주기로 반복된다. 서기와 10천간은 동일한 10진수를 사용하고 있으며, 모든 숫자의 나머지는 0~9 사이에 존재한다. 그렇다면 10천간에 고유한(나머지) 숫자를 부여할 수 있을 것이다. 마찬가지로 12지지는 12진수다. 모든 숫자의 나머지는 0~11 사이에 존재한다. 12지지에 고유한(나머지) 숫자를 부여할 수 있다.

column_img_1594.jpg

<그림 4> 10천간과 12지지의 고유한 숫자

10천간은 10진수로서 고유한 숫자를 부여할 수 있는데 숫자 4부터 시작한다.
12지지는 12진수로서 고유한 숫자를 부여할 수 있는데 숫자 4부터 시작한다.

그렇다면 10천간과 12지지의 고유한 숫자에는 어떤 의미가 있을까

갑신정변(1884), 갑오개혁(1894), 임진왜란(1592), 임오군란(1882)을 예로 들어 보자.

갑신정변(1884)을 10으로 나눌 때 나머지가 4이므로 10천간 중에서 갑에 해당한다.
갑오개혁(1894)을 10으로 나눌 때 나머지가 4이므로 10천간 중에서 갑에 해당한다.
임진왜란(1592)을 10으로 나눌 때 나머지가 2이므로 10천간 중에서 임에 해당한다.
임오군란(1882)을 10으로 나눌 때 나머지가 2이므로 10천간 중에서 임에 해당한다.

갑신정변(1884)을 12로 나눌 때 나머지가 0 이므로 12지지 중에서 신에 해당한다.
갑오개혁(1894)을 12로 나눌 때 나머지가 10 이므로 12지지 중에서 오에 해당한다.
임진왜란(1592)을 12로 나눌 때 나머지가 8 이므로 12지지 중에서 진에 해당한다.
임오군란(1882)을 12로 나눌 때 나머지가 10 이므로 12지지 중에서 오에 해당한다.

결론적으로 60갑자의 첫 번째 글자는 10천간을 의미하며, 연도를 10으로 나눈 나머지 값은 10천간 위치를 가리킨다. 60갑자의 두 번째 글자는 12지지를 의미하며, 년도를 12로 나눈 나머지 값은 12지지 위치를 가리킨다.

그렇다면 올해(2014) 태어난 아이들의 60갑자는 어떻게 될까

2014/10= 4(나머지) → 10천간의 갑에 해당한다.
2014/12= 10(나머지) → 12지지의 오에 해당한다.

그러므로 2014년생 아이들은 갑오년 생이 된다.

과거에는 1갑, 즉 60년이 돌아 오는 해의 생일을 환갑이라 하여 장수를 기념해 크게 잔치를 벌였다. 요즘 시골에서 60대는 마을 청년회에서 활동한다고 한다. 노인정에 가더라도 막내라서 이런 저런 잔심부름 하는 처지라 하니, 장수의 기준이 바뀌어도 크게 바뀐 것 같다. 문명이 발전하여 삼천갑자 ‘동방삭’ 익살꾼처럼 18만년간 살 수 있는 그런 날이 올 수도 있겠다.



10천간과 12지지 그리고 오라클 쿼리

혹시나 싶어서 인터넷을 검색하니 60갑자와 관련된 쿼리가 1개 검색되었다. 수십 라인에 해당하는 다소 복잡한 쿼리였다. 우리는 위에서 60갑자의 원리를 이해했으므로 아래와 같이 몇 줄이면 충분하게 SQL로 구현할 수 있다. 아래 쿼리는 서기 1년부터 2014까지의 갑자를 조회하는 쿼리다.

column_img_1595.jpg

<그림 5> 60갑자에 대한 SQL문

오늘 연재 내용을 복습하는 차원에서 아래의 국사 연표를 완성해 보기 바란다.

column_img_1596.jpg

<그림 6> 국사연표 완성하기

이제 더 이상 60갑자는 어렵고 부담스러운 존재가 아니다. 이 연재를 통해 생활 속에서 선조들의 지혜를 얻는 계기가 되었으면 한다. 우리의 선조들은 60갑자에 단순한 시간의 수치 개념만 담은 것이 아니라, 음양오행의 원리도 포함하고 있어서 지혜로운 선조들의 정신 세계도 엿볼 수 있다.

오늘 연재를 통해 우리는 60갑자에 대해 보다 더 자세히 이해하게 되었다. 다음 연재에서는 오라클 조인 방식 및 플랜에 대해 자세히 알아볼 예정이다.



용기를 갖자
오라클 DB뿐 아니라 대부분의 DB 구성 알고리즘은 어느 날 ‘하늘에서 뚝 떨어져 새로 만들어진 것’이 아니라
실생활에서 이용되는 혹은 이미 상식 수준에서 인지되는 그런 보편적인 원리를 바탕으로
만들어졌으므로 쉽게 접근하고 이해할 수 있다. 서두에서 말했듯이 ‘레몬시장이론’을
상기하며 DB를 지레짐작으로 어려워하지 말고 용기를 내고 하나씩 터득해 나가기를 바란다.
이 글은 DB 전문가 수준의 이해를 요구하지는 않는다. 단지 DB에 대해서 더 친숙하고
더 쉽게 이해하고 접근하길 바랄 뿐이다. 이 글을 읽으면서 궁금하거나 의문 나는
점이 있으면, 댓글을 달아주실 것을 적극 바란다. 아무리 어렵고 힘든 일이더라고
‘관계’와 ‘소통’으로 풀어나갈 수 있음을 다시 한 번 믿으며….


[지난 문제의 정답과 풀이]

원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제



지난 연재에 출제한 ‘원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제’에 대한 정답과 해설은 아래와 같다. 문제를 풀면서 DB 원리를 하나씩 배우고 이해할 수 있다.



column_img_1597.jpg

[이번 호 문제]

원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제



각 연재의 말미에 간단하면서도 재미있고 생각해 보는 문제를 출제하려 한다. 모든 문제는 DB의 원리를 이해할 수 있는 문제로 출제할 예정이다. 문제를 풀면서 DB 원리를 하나씩 배우고 이해할 수 있다. 정답과 그에 대한 설명은 다음 연재에서 한다.



column_img_1598.jpg