코드 테이블이란 무엇인가?

문승기·2025년 6월 2일
0

1. 코드 테이블이란?

코드 테이블은 시스템 전반에서 자주 사용되는 역할, 상태, 부서와 같은 공통된 값들을 하나의 테이블로 표준화하여 관리하는 것이다.
이를 사용하면 여러 테이블에서 동일한 기준으로 데이터를 관리할 수 있어서 데이터의 일관성과 효율성이 높아진다.

주요 특징은 다음과 같다.

  • 각 값에 대한 코드(code), 표시 이름(code_label), 설명(description)을 함께 관리한다.
  • 상위 코드(upper_code)를 통해 계층 구조를 표현할 수 있다.
  • 외래키(FK)를 명시적으로 걸지 않아도 코드 값만으로 논리적 연결이 가능하다.

2. 사용자 테이블에서 코드 테이블 활용 방법

사용자 테이블 설계 예시는 다음과 같다.

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    role_code VARCHAR(20),        -- ROLE 코드 참조
    unit_code VARCHAR(20),        -- ORG 코드 참조
    status_code VARCHAR(20)       -- TSTAT 코드 참조
);
  • role_code는 ROLE_01 (파트너), ROLE_03 (변호사) 등의 값을 사용한다.
  • unit_code는 ORG_01_01 (민사 1팀) 형식으로 저장된다.
  • status_code는 TSTAT_01 (확인 대기), TSTAT_05 (결재 완료)와 같은 상태 코드이다.

이 방식으로 외래키를 명시적으로 연결하지 않고도 논리적으로 연관성을 유지할 수 있다.


3. SQL 쿼리 예시와 상황 설명

예시 1. 변호사 역할을 가진 사용자만 조회하기

상황 설명
사용자 테이블에서 role_code가 'ROLE_03'인 사용자만 조회합니다.
이는 JOIN 없이도 필터링할 수 있는 가장 기본적인 형태입니다.

SELECT user_id, name, email
FROM users
WHERE role_code = 'ROLE_03';

결과 예시

user_idnameemail
102김민수mins.kim@example.com
105이한결hanlee@example.com

예시 2. 민사 1팀에 소속된 사용자만 조회하기

상황 설명
특정 부서(예: ORG_01_01 = 민사 1팀)에 소속된 사용자만 조회하고자 할 때 사용합니다.

SELECT user_id, name, email
FROM users
WHERE unit_code = 'ORG_01_01';

결과 예시

user_idnameemail
103박지수jisoo.park@example.com
109송가람karam.song@example.com

예시 3. 결재 대기 상태인 사용자만 조회하기

상황 설명
결재 프로세스에서 결재 대기 상태(TSTAT_04)인 사용자만 필터링할 때 사용합니다.

SELECT user_id, name, status_code
FROM users
WHERE status_code = 'TSTAT_04';

결과 예시

user_idnamestatus_code
101홍길동TSTAT_04
110유재석TSTAT_04

예시 4. 역할별 사용자 수 집계하기 (코드 기준)

상황 설명
역할 코드 기준으로 사용자 수를 집계하고자 할 때 사용합니다.
이 경우 code_label 없이 role_code만 출력됩니다.

SELECT role_code, COUNT(*) AS 사용자수
FROM users
GROUP BY role_code;

결과 예시

role_code사용자수
ROLE_012
ROLE_022
ROLE_033
ROLE_041

※ 사람이 이해할 수 있는 역할명으로 보려면 9번 예시의 JOIN 방식 사용 권장


예시 5. 상태가 TSTAT_01 또는 TSTAT_02인 사용자 조회

상황 설명
업무 상태가 ‘확인 대기’ 또는 ‘확인 완료’인 사용자들을 필터링합니다.

SELECT user_id, name, status_code
FROM users
WHERE status_code IN ('TSTAT_01', 'TSTAT_02');

결과 예시

user_idnamestatus_code
104김도현TSTAT_01
107장하나TSTAT_02
111박해진TSTAT_01

예시 6. 변호사 역할을 가진 사용자 목록과 역할명을 함께 출력

상황 설명

사용자 테이블에는 ROLE_03과 같은 코드만 저장되어 있으므로, 관리자가 해당 코드가 실제로 무엇을 의미하는지(예: 변호사)를 알기 어렵다.
INNER JOIN을 통해 code_label을 가져오면 사람이 읽을 수 있는 명칭을 함께 조회할 수 있다.

SQL 쿼리

SELECT 
    u.user_id, 
    u.name, 
    u.email, 
    c.code_label AS 역할명
FROM users u
INNER JOIN code c ON u.role_code = c.code
WHERE c.code = 'ROLE_03';

INNER JOIN 사용 이유
→ 코드가 존재하는 사용자만 보여주면 되므로, 매칭되는 행만 반환하는 INNER JOIN이 적합하다.


예시 7. 사용자 목록 전체를 조회하면서 부서명을 함께 출력

상황 설명

부서 코드만으로는 사람이 이해하기 어렵기 때문에 부서명을 함께 출력해야 한다.
단, 부서가 아직 지정되지 않은 사용자도 함께 출력하고 싶다면 LEFT JOIN을 사용해야 한다.

SQL 쿼리

SELECT 
    u.user_id, 
    u.name, 
    u.email, 
    c.code_label AS 부서명
FROM users u
LEFT JOIN code c ON u.unit_code = c.code
WHERE c.upper_code LIKE 'ORG%';

LEFT JOIN 사용 이유
→ 부서가 없는 사용자도 누락 없이 보여주기 위해 왼쪽 테이블(users)의 모든 행을 유지하는 LEFT JOIN이 적합하다.


예시 8. 사용자 상태가 '결재 완료'인 사용자와 상태명을 함께 조회

상황 설명

status_code는 내부적으로 TSTAT_05라는 코드로 저장되어 있으므로, 이를 사람이 이해할 수 있도록 ‘결재 완료’라는 이름을 함께 출력해야 한다.

SQL 쿼리

SELECT 
    u.user_id, 
    u.name, 
    c.code_label AS 상태명
FROM users u
INNER JOIN code c ON u.status_code = c.code
WHERE c.code = 'TSTAT_05';

INNER JOIN 사용 이유
→ 해당 코드와 정확히 일치하는 사용자만 필터링할 때는 INNER JOIN이 가장 적절하다.


예시 9. 역할별 사용자 수를 역할명 기준으로 집계

상황 설명

역할 코드를 기준으로 사용자 수를 집계하는데, 코드값이 아닌 역할명을 보여주기 위해 JOIN을 사용한다.

SQL 쿼리

SELECT 
    c.code_label AS 역할명, 
    COUNT(*) AS 사용자수
FROM users u
INNER JOIN code c ON u.role_code = c.code
WHERE c.upper_code = 'ROLE'
GROUP BY c.code_label;

INNER JOIN 사용 이유
→ 사용자와 역할 코드가 정확히 매칭되는 데이터만 통계에 포함되므로 INNER JOIN을 사용한다.


예시 10. 상태가 '확인 완료'인 사용자 목록에 상태명을 함께 출력

상황 설명

사용자 상태 코드가 TSTAT_02인 경우, 해당 사용자의 상태명을 ‘확인 완료’로 변환하여 함께 출력하기 위해 JOIN이 필요하다.

SQL 쿼리

SELECT 
    u.user_id, 
    u.name, 
    c.code_label AS 상태명
FROM users u
INNER JOIN code c ON u.status_code = c.code
WHERE c.code = 'TSTAT_02';

INNER JOIN 사용 이유
→ 정확히 해당 상태에 해당하는 사용자만 보여줘야 하므로 INNER JOIN이 적합하다.


JOIN 예시 요약 정리

예시 번호조인 기준조인 방식사용 이유
6role_codeINNER JOIN특정 역할을 가진 사용자만 보기 위해 (변호사 코드와 일치하는 사용자)
7unit_codeLEFT JOIN부서명이 없는 사용자도 모두 출력해야 하므로 (NULL 허용)
8status_codeINNER JOIN결재 완료 상태와 정확히 매칭되는 사용자만 필요함
9role_codeINNER JOIN역할명 기준으로 집계할 때 매칭되는 사용자만 대상으로 해야 함
10status_codeINNER JOIN확인 완료 상태 사용자만 필터링할 경우, 불필요한 데이터 제외 위해 사용

4. JOIN이란 무엇인가?

SQL의 JOIN은 두 개 이상의 테이블을 연결하여 하나의 결과로 보여주는 기능이다. 사용자 테이블과 코드 테이블을 연결하면 사람이 이해할 수 있는 명칭(code_label)을 함께 보여줄 수 있다.

JOIN 방식 비교

JOIN 방식설명
INNER JOIN양쪽 테이블에 모두 존재하는 행만 결과로 반환 (정확히 매칭되는 경우에만)
LEFT JOIN왼쪽 테이블의 모든 행을 포함하며, 오른쪽 테이블에 값이 없으면 NULL 표시

INNER JOIN 예시

  • 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.

출처 : 혼공스터디 SQL

LEFT JOIN (LEFT OUTER JOIN) 예시

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 값이 출력되는 조인

출처 : 혼공스터디 SQL


5. 장점 및 기대 효과

항목설명
일관성 유지동일한 분류값을 중앙에서 관리하여 로직 간 불일치 방지
유지보수 편의성코드 값 추가/수정/삭제 시, DB만 변경하면 화면 및 로직 수정 최소화
유연한 계층 구조upper_code를 이용한 그룹/서브그룹 계층화 가능
드롭다운 자동 구성프론트에서 코드 그룹별로 값 호출하여 자동 구성 가능

profile
AI 모델을 개발하여 이를 활용한 서비스를 개발하고 운영하는 개발자가 되기 위해 꾸준히 노력하겠습니다!

0개의 댓글