Post

ABAP - Foreign Key와 CDS View의 Association

ABAP - Foreign Key와 CDS View의 Association

키워드

  • ADT (Abap Development Tool): 이클립스(Eclipse) 기반의 ABAP 개발 도구
  • CDS (Core Data Service): 차세대 데이터 모델링 기술
  • Primary Key & Foreign Key: 주키와 외래키
  • Association: CDS 뷰 간의 관계 정의 (JOIN보다 똑똑함!)
  • Cardinality: 관계의 수 (1:1, 1:N 등)

1. 테이블 간의 관계성 (Relationship Between Database)

관계형 데이터베이스(RDB)를 이해하기 위해 가장 쉬운 예시인 ‘직원’‘부서’를 고려해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
직원 테이블 {
    직원 ID (PK),
    이름,
    부서 ID,  <-- 여기에 "D01"이라고 적혀있다면?
    전화번호,
    주소
}

부서 테이블 {
    부서 ID (PK), <-- 실제 "D01"에 대한 정보는 여기 있다.
    부서명,
    부서 전화번호
}

위 구조를 보면, 직원 테이블도 ‘부서 ID’를 가지고 있고 부서 테이블도 ‘부서 ID’를 가지고 있다. 사람 눈에는 “아, 이 직원이 이 부서 소속이구나”라고 바로 보이지만, 컴퓨터는 우리가 명시해주지 않으면 두 ID가 같은 의미인지 모른다. 따라서 우리는 “이 두 테이블은 관계가 있어!” 라고 명시해 줄 필요가 있다.

관계의 종류 (Cardinality)

직원과 부서의 관계는 상황에 따라 다르게 정의될 수 있다. CDS에서는 [min..max] 형태로 표현한다.

  1. [1..1] (One to One): 한 직원은 무조건 하나의 부서에만 속한다.
  2. [0..1] (Zero to One): 한 직원은 부서가 있을 수도, 없을 수도(대기발령 등) 있다.
  3. [0..*] (Zero to Many): 한 직원이 여러 부서에 속할 수도 있다. (겸직 등)

내가 원하는 비즈니스 로직에 맞춰 이 관계를 CDS로 어떻게 표현하는지 알아보자.


2. CDS (Core Data Service) 란?

기존 SE11에서 만들던 View보다 훨씬 강력한 차세대 View다.

  • ADT (ABAP Development Tool): 예전 SE80 대신 사용하는 이클립스(Eclipse) 환경을 말한다. CDS는 여기서만 만들 수 있다.
  • DDL (Data Definition Language): CDS를 정의할 때 쓰는 언어다. SQL과 거의 비슷한데 조금 더 강력한 기능을 제공한다.

“복잡한 로직을 DB에서 미리 처리해서 가져오자!” (Code Pushdown)


3. Foreign Key vs Association

이 두 가지는 “관계를 맺는다”는 점은 같지만, 사용 목적과 방향이 다르다.

① Foreign Key (외래키)

“데이터가 진짜인지 검사하는 용도”다. (데이터 무결성)

예를 들어, 직원 테이블에 부서 ID = 'Z99'라고 입력하려고 할 때, 실제 부서 테이블에 Z99라는 부서가 없으면 저장을 막아야 한다. 이때 “직원 테이블(Foreign Key Table)”“부서 테이블(Check Table)”을 참조하여 유효성을 검사한다.

CDS Table Definition에서의 구현 (예시)

1
2
3
4
5
6
7
8
9
10
11
define table zb30depment {
  key client   : abap.clnt not null;
  key id       : /lrn/department_id not null;
  
  /* Foreign Key 설정 */
  @AbapCatalog.foreignKey.screenCheck : true
  head_id      : zb30_employee_id
    with foreign key [0..1] zb30employ  // <-- zb30employ 테이블을 찔러본다!
      where client = zb30depment.client
        and employee_id = zb30depment.head_id;
}

설명: 부서 테이블의 head_id(부서장) 필드는 아무나 들어갈 수 없다. 반드시 zb30employ(직원) 테이블에 존재하는 ID여야 한다는 제약(Constraint)을 건 것이다.


② Association (어소시에이션)

“정보를 연결해서 가져오는 용도”다. (JOIN의 진화형)

기존 SQL의 JOIN과 비슷하지만, 가장 큰 차이점은 “On-Demand (필요할 때만)” 실행된다는 점이다. Association을 정의해두면, 누군가 그 정보를 요청하기 전까지는 DB를 건드리지 않는다. (성능상 이득!)

CDS View에서의 구현 (예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
define view entity ZB30_R_DEPARTMENT as select from zb30depment

    // 1. 부서(Department) 직원(Employee) 관계 정의
    // "하나의 부서에는 여러 명의 직원(*)이 있을 수 있다."
    association [0..*] to ZB30_R_EMPLOYEE as _Employee
        on $projection.Id = _Employee.DepartmentId

    // 2. 부서장(Head)과의 관계
    // "부서장은 0명 또는 1명이다."
    association [0..1] to ZB30_R_EMPLOYEE as _Head
        on $projection.HeadId = _Head.EmployeeId
{
    key id       as Id,
    description  as Description,
    head_id      as HeadId,
    
    /* Association 공개 (Make Associations Public) */
    _Employee,
    _Head
}

코드 해석

1
2
association [0..*] to ZB30_R_EMPLOYEE as _Employee
    on $projection.Id = _Employee.DepartmentId
  • association to 대상뷰: “나랑 쟤랑 관계가 있어!” 라고 선언.
  • as _Employee: 연결된 뷰의 별명(Alias). 보통 언더바(_)로 시작하는 것이 관례다.
  • on $projection.Id: $projection지금 내가 정의하고 있는 뷰(부서)를 뜻한다. 즉, “내 ID랑…”
  • = _Employee.DepartmentId: “…직원 뷰의 부서 ID가 같은 애들을 연결할 거야!”

4. 요약 및 차이점

구분Foreign Key (외래키)Association (관계)
목적데이터 유효성 검증 (Validation)데이터 조회 및 탐색 (Navigation)
방향단방향 (검사하는 쪽 → 검사받는 쪽)양방향 가능 (주로 단방향으로 정의 후 사용)
키 필드 여부반드시 Check Table의 Key 필드와 연결Key 필드가 아니어도 연결 가능 (자유로움)
비유“이 데이터 가짜 아니야? 신분증 검사해봐!”“이 데이터랑 관련된 다른 정보도 보고 싶어? 저쪽으로 가봐!”

association & foreign key

결론적으로 Foreign Key는 데이터가 깨지지 않게 지켜주는 문지기이고, Association은 데이터를 쉽게 찾아갈 수 있게 해주는 지도(Map)라고 이해하면 쉽다.

This post is licensed under CC BY 4.0 by the author.