코드 테이블은 시스템 전반에서 자주 사용되는 역할, 상태, 부서와 같은 공통된 값들을 하나의 테이블로 표준화하여 관리하는 것이다.
이를 사용하면 여러 테이블에서 동일한 기준으로 데이터를 관리할 수 있어서 데이터의 일관성과 효율성이 높아진다.
code
), 표시 이름(code_label
), 설명(description
)을 함께 관리한다.upper_code
)를 통해 계층 구조를 표현할 수 있다.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 (결재 완료)와 같은 상태 코드이다.이 방식으로 외래키를 명시적으로 연결하지 않고도 논리적으로 연관성을 유지할 수 있다.
상황 설명
사용자 테이블에서 role_code
가 'ROLE_03'인 사용자만 조회합니다.
이는 JOIN 없이도 필터링할 수 있는 가장 기본적인 형태입니다.
SELECT user_id, name, email
FROM users
WHERE role_code = 'ROLE_03';
결과 예시
user_id | name | |
---|---|---|
102 | 김민수 | mins.kim@example.com |
105 | 이한결 | hanlee@example.com |
상황 설명
특정 부서(예: ORG_01_01 = 민사 1팀)에 소속된 사용자만 조회하고자 할 때 사용합니다.
SELECT user_id, name, email
FROM users
WHERE unit_code = 'ORG_01_01';
결과 예시
user_id | name | |
---|---|---|
103 | 박지수 | jisoo.park@example.com |
109 | 송가람 | karam.song@example.com |
상황 설명
결재 프로세스에서 결재 대기 상태(TSTAT_04)인 사용자만 필터링할 때 사용합니다.
SELECT user_id, name, status_code
FROM users
WHERE status_code = 'TSTAT_04';
결과 예시
user_id | name | status_code |
---|---|---|
101 | 홍길동 | TSTAT_04 |
110 | 유재석 | TSTAT_04 |
상황 설명
역할 코드 기준으로 사용자 수를 집계하고자 할 때 사용합니다.
이 경우 code_label
없이 role_code
만 출력됩니다.
SELECT role_code, COUNT(*) AS 사용자수
FROM users
GROUP BY role_code;
결과 예시
role_code | 사용자수 |
---|---|
ROLE_01 | 2 |
ROLE_02 | 2 |
ROLE_03 | 3 |
ROLE_04 | 1 |
※ 사람이 이해할 수 있는 역할명으로 보려면 9번 예시의 JOIN 방식 사용 권장
상황 설명
업무 상태가 ‘확인 대기’ 또는 ‘확인 완료’인 사용자들을 필터링합니다.
SELECT user_id, name, status_code
FROM users
WHERE status_code IN ('TSTAT_01', 'TSTAT_02');
결과 예시
user_id | name | status_code |
---|---|---|
104 | 김도현 | TSTAT_01 |
107 | 장하나 | TSTAT_02 |
111 | 박해진 | TSTAT_01 |
사용자 테이블에는 ROLE_03
과 같은 코드만 저장되어 있으므로, 관리자가 해당 코드가 실제로 무엇을 의미하는지(예: 변호사)를 알기 어렵다.
INNER JOIN을 통해 code_label
을 가져오면 사람이 읽을 수 있는 명칭을 함께 조회할 수 있다.
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이 적합하다.
부서 코드만으로는 사람이 이해하기 어렵기 때문에 부서명을 함께 출력해야 한다.
단, 부서가 아직 지정되지 않은 사용자도 함께 출력하고 싶다면 LEFT JOIN을 사용해야 한다.
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이 적합하다.
status_code는 내부적으로 TSTAT_05
라는 코드로 저장되어 있으므로, 이를 사람이 이해할 수 있도록 ‘결재 완료’라는 이름을 함께 출력해야 한다.
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이 가장 적절하다.
역할 코드를 기준으로 사용자 수를 집계하는데, 코드값이 아닌 역할명을 보여주기 위해 JOIN을 사용한다.
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을 사용한다.
사용자 상태 코드가 TSTAT_02
인 경우, 해당 사용자의 상태명을 ‘확인 완료’로 변환하여 함께 출력하기 위해 JOIN이 필요하다.
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이 적합하다.
예시 번호 | 조인 기준 | 조인 방식 | 사용 이유 |
---|---|---|---|
6 | role_code | INNER JOIN | 특정 역할을 가진 사용자만 보기 위해 (변호사 코드와 일치하는 사용자) |
7 | unit_code | LEFT JOIN | 부서명이 없는 사용자도 모두 출력해야 하므로 (NULL 허용) |
8 | status_code | INNER JOIN | 결재 완료 상태와 정확히 매칭되는 사용자만 필요함 |
9 | role_code | INNER JOIN | 역할명 기준으로 집계할 때 매칭되는 사용자만 대상으로 해야 함 |
10 | status_code | INNER JOIN | 확인 완료 상태 사용자만 필터링할 경우, 불필요한 데이터 제외 위해 사용 |
SQL의 JOIN은 두 개 이상의 테이블을 연결하여 하나의 결과로 보여주는 기능이다. 사용자 테이블과 코드 테이블을 연결하면 사람이 이해할 수 있는 명칭(code_label
)을 함께 보여줄 수 있다.
JOIN 방식 | 설명 |
---|---|
INNER JOIN | 양쪽 테이블에 모두 존재하는 행만 결과로 반환 (정확히 매칭되는 경우에만) |
LEFT JOIN | 왼쪽 테이블의 모든 행을 포함하며, 오른쪽 테이블에 값이 없으면 NULL 표시 |
출처 : 혼공스터디 SQL
출처 : 혼공스터디 SQL
항목 | 설명 |
---|---|
일관성 유지 | 동일한 분류값을 중앙에서 관리하여 로직 간 불일치 방지 |
유지보수 편의성 | 코드 값 추가/수정/삭제 시, DB만 변경하면 화면 및 로직 수정 최소화 |
유연한 계층 구조 | upper_code 를 이용한 그룹/서브그룹 계층화 가능 |
드롭다운 자동 구성 | 프론트에서 코드 그룹별로 값 호출하여 자동 구성 가능 |