CS Student’s SAP&Tech Journey✨

[SAP] Input Checks 데이터 유효성 검증 (2) Foreign Keys 외래키 본문

SAP/데이터 유효성 검사 Input Checks

[SAP] Input Checks 데이터 유효성 검증 (2) Foreign Keys 외래키

인포마틱 2025. 2. 19. 18:30

데이터베이스에서는 테이블 간 관계를 설정하여 데이터의 일관성을 유지하는 것이 중요합니다. SAP의 ABAP Dictionary에서는 Foreign Key(외래키) 를 활용하여 특정 필드가 다른 테이블의 유효한 값을 참조하도록 강제할 수 있습니다. 이를 통해 잘못된 데이터 입력을 방지하고 데이터 무결성을 유지할 수 있습니다.

이번 글에서는 Foreign Key의 개념설정 방법Cardinality(카디널리티) 의 개념까지 자세히 살펴보겠습니다.

 

 

Input Checks 기본개념에 대한 포스팅 보러가기 🔽

 

[SAP] Input Checks 데이터 유효성 검증 (1) 기본 개념

데이터 유효성 검증은 시스템의 신뢰성과 일관성을 유지하기 위해 반드시 수행해야 하는 과정입니다. SAP 시스템에서는 다양한 방법을 통해 사용자가 입력한 데이터가 올바른지 확인할 수 있습

informatik.tistory.com


 

1. Foreign Key란?

Foreign Key(외래키)란 한 테이블의 특정 필드가 다른 테이블의 필드를 참조하도록 설정하는 키를 의미합니다. 이를 통해 두 테이블 간의 관계를 형성하고 데이터 무결성을 보장할 수 있습니다.

👉  Foreign Key Table (외래키 테이블)

  • 외래키(Foreign Key)를 설정하는 테이블
  • 다른 테이블(체크 테이블)의 필드를 참조함

👉  Check Table (체크 테이블)

  • 외래키 테이블이 참조하는 대상 테이블
  • 실제로 데이터가 저장되어 있고, 유효성 검사를 수행하는 테이블

 

2. SBOOK 테이블을 활용한 Foreign Key 확인해보기

SAP 시스템에서는 Foreign Key를 활용하여 예약된 항공편 데이터를 검증하는 대표적인 예제로 SBOOK 테이블이 있습니다.

외래키 테이블 SBOOK과 체크 테이블 SCOUNTER  관계

  • SBOOK (예약된 항공편 정보)
    • CARRID (항공사 코드 - 기본키)
    • COUNTER (항공사별 카운터)
  • SCOUNTER (항공사별 카운터 정보)
    • CARRID (항공사 코드 - 기본키)
    • COUNTNUM (카운터 번호 - 기본키)

 

📌 예제 시나리오

사용자가 SBOOK 테이블에 항공편을 예약할 때, CARRID와 COUNTER 값을 입력한다고 가정합니다.

SBOOK 테이블의 외래키 관계를 확인할 수 있는 Input Help / Check를 보니 COUNTER 필드 값은 SCOUNTER 테이블과 외래키 관계인 것을 확인할 수 있습니다. 따라서 COUNTER는 Check Field 체크필드라고 부르고 값이 들어갈때 유효한지 유효하지 않은지 SCOUNTER 테이블을 통해 확인되는 필드입니다.

 

SBOOK 테이블에 데이터 입력시,

CARRID COUNTER COUNTER 값 존재 여부 항공기 예약 가능 여부
AA 1 존재  가능
AA 8 존재하지 않음  오류 발생

➡️ Foreign Key를 활용하면 SBOOK 테이블의 COUNTER 필드가 SCOUNTER 테이블에 존재하는 값인지 자동으로 검증하여 데이터의 무결성을 보장할 수 있습니다.

 

3. Foreign Key를 예제를 통해 직접 설정해보기

Foreign Key를 설정하려면 ABAP Dictionary(SE11)에서 아래 단계를 따릅니다.

  1. 참조할 테이블과 필드 준비
    •  ⭐참조 테이블 필드와 참조할 테이블 필드는 도메인이 같아야 한다.
  2. Foreign Key 생성
    • 필드 선택 → Foreign Key 설정
    • 참조 테이블과 필드를 입력 후 체크 필드(Check Field) 로 설정
  3. Foreign Key의 유형 결정
    • Cardinality(카디널리티)를 선택하여 테이블 간 관계를 설정합니다.

 

📌ZSTDSCORE_07 테이블에서 Foreign Key 설정

외래키 테이블(Foreign Key Table) 외래키 필드체크 테이블(Check Table) 체크되는 필드
ZSTDSCORE_07 MANDT T000 MANDT
ZSTDSCORE_07 STDNR ZSTUDENT_07 STDNR
ZSTDSCORE_07 SUBJECT ZSTDSUBJECT_07 SUBJECT

ZSTDSCORE_07 → 외래키 테이블 (Foreign Key Table)
ZSTUDENT_07, ZSTDSUBJECT_07 → 체크 테이블 (Check Table)

 

 

1️⃣ Foreign Key 설정을 위한 테이블

1) ZSTDSCORE_07 (학생 성적 테이블) - 외래키 테이블

2) ZSTUDENT_07 (학생 테이블) - 체크 테이블

3) ZSTDSUBJECT_07 (과목 테이블) - 체크 테이블

 

2️⃣ ZSTDSCORE_07 (학생 성적 테이블)  Foreign Key 설정 과정

 

 

📌 어떤 값을 유효성 체크해야 할까? ( = 어떤 필드에 외래키 설정을 해야 할까? )

  • MANDT 클라이언트 : 외래키 체크 대상 ✅
  • STDNR 학번 : 학생 테이블을 통한 외래키 체크 대상 ✅
  • SUBJECT 과목 : 과목 테이블을 통한 외래키 체크 대상 ✅
  • SCORE 성적 : 외래키 체크 대상 아님 ❌

 


1. MANDT(클라이언트) 필드의 외래키 설정 

  • ZSTDSCORE_07의 MANDT 필드를 T000의 MANDT와 연결
  • SAP에서 MANDT 필드는 모든 테이블이 클라이언트 구분을 위해 공통으로 참조하는 필드
  • 따라서 모든 테이블에서 T000을 참조해야 합니다.

➡️ ZSTDSCORE_07에 클라이언트 데이터가 존재하려면, 반드시 T000에 존재하는 MANDT 값이어야 함.

 


2. 학번(STDNR)을 외래키로 설정

  • ZSTDSCORE_07 체크테이블의 STDNR을 ZSTUDENT_07의 STDNR과 연결
  • 체크 테이블: ZSTUDENT_07
  • Foreign Key 설정 시, 테이블 제안이 자동으로 나오지 않음 → COPY 기능 사용

➡️존재하지 않는 학번(STDNR)으로 성적을 입력할 경우, 오류 발생

 

❓  Foreign Key field type

  1. Not Specified (지정되지 않음)
    • 기본적으로 설정되지 않은 상태이며, 외래키 필드로 사용할 수 있음.
    • 주로 스트럭처(Structure)와 외래키(Foreign Key)를 설정할 때 사용됨.
  2. Non-key-fields/candidates (비키 필드/후보 키 필드)
    • 참조하는 테이블의 키 필드가 아닌 필드를 외래키로 설정할 때 사용.
    • 즉, 해당 필드가 기본 키(Primary Key)가 아닐 경우에 사용됨.
  3. Key fields/candidates (키 필드/후보 키 필드)
    • 참조하는 테이블의 주 키(Primary Key) 필드를 외래키로 설정할 때 사용.
    • 즉, 외래키 필드가 기본 키일 경우 해당 옵션을 선택.
  4. Key fields of a text table (텍스트 테이블의 키 필드)
    • 특정 테이블이 텍스트 테이블(Text Table, 설명을 위한 테이블)인 경우 사용.
    • 마스터 테이블의 키 필드와 동일한 키 필드를 포함하는 경우 해당 옵션을 설정.
    • 주로 다국어 지원을 위해 사용되며, 언어 키(Language Key, SPRAS) 필드가 포함됨.

 

 

3. 과목(SUBJECT)을 외래키로 설정

  • ZSTDSCORE_07의 SUBJECT 필드를 ZSTDSUBJECT_07의 SUBJECT과 연결
  • 학생 성적 데이터를 입력할 때, 반드시 해당 과목이 과목 테이블(ZSTDSUBJECT_07)에 존재해야 함.
  • 체크 테이블: ZSTDSUBJECT_07

➡️존재하지 않는 과목으로 성적을 입력할 경우, 오류 발생

 

 

5. Cardinality(카디널리티)란?

Cardinality(카디널리티)는 두 테이블 간 데이터 관계의 형태를 정의하는 속성입니다.

✔ 예제: 학생 테이블과 성적 테이블

  • 학생 테이블(ZSTUDENT_07) 1 : CN 성적 테이블(ZSTDSCORE_07)
    → 한 명의 학생이 여러 개의 성적을 가질 수 있으며, 성적이 없을 수도 있음

 ✔️ T000 (Clients) 테이블의 Cardinality (1:CN)
       ZSTUDENT_07ZSTDSUBJECT_07ZSTDSCORE_07

✔️ ZSTUDENT_07 (학생 테이블)과 ZSTDSCORE_07 (성적 테이블)의 관계 (1:CN)

✔️ ZSTDSUBJECT_07 (과목 테이블)과 ZSTDSCORE_07 (성적 테이블)의 관계 (1:CN)

 

6. Foreign Key의 장점

✅ 데이터 무결성 유지: 존재하지 않는 값을 입력할 수 없음
✅ 자동 데이터 검증: 테이블 간 관계를 통해 입력값을 자동 검증
✅ 데이터 일관성 보장: 참조하는 값이 변경되면 종속된 값도 유지됨