프로그래밍풀스택 개발자

SQL에서 제약 조건(constraints)이란 무엇이며, 어떤 종류의 제약이 있으며, 어떻게 애플리케이션 논리에서 오류를 피하는 데 도움이 되는가? 사용 사례를 들어보세요.

Hintsage AI 어시스턴트로 면접 통과

답변

**제약 조건(constraints)**은 값의 유효성을 자동으로 검증하기 위해 열이나 테이블에 적용되는 무결성 제한입니다. 이들은 다음을 가능하게 합니다:

  • 잘못된 입력으로부터 데이터를 보호;
  • 일부 애플리케이션 로직을 데이터베이스로 이전(더 안전하고 빠름);
  • 삽입, 업데이트 또는 삭제 시 조건을 자동으로 확인.

주요 제약 조건의 종류:

  • PRIMARY KEY — 고유 식별자로, 중복 및 NULL을 금지.
  • UNIQUE — 한 열에서의 값 중복을 금지.
  • FOREIGN KEY — 참조 무결성, 다른 테이블과의 관계.
  • CHECK — 임의 표현식 검증.
  • NOT NULL — 열에서 NULL 값 금지.

예:

CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- 외래 키 price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );

함정 질문

"유일 키(UNIQUE)가 자동으로 NULL-SAFE하며, 열에 NULL 값을 여러 개 포함할 수 없는가?"

사실, 대부분의 DBMS(예: PostgreSQL, MySQL)에서 UNIQUE 제약은 NULL 값을 여러 행에서 허용합니다. NULL은 "알 수 없음"으로 간주되기 때문입니다. 이는 종종 눈에 띄지 않는 빈 값의 중복을 초래합니다.

예:
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- 통과

주제의 미세한 사항을 모르는 경우 실제 오류 예시


이야기

애플리케이션이 이메일로 등록을 허용했으나, 열은 UNIQUE였으나 NOT NULL이 아니어서 NULL 이메일을 가진 사용자 10명이 생겼고, 이로 인해 외부 서비스와의 통합에 문제가 발생했습니다.


이야기

티켓 주문 시스템에서 지급 테이블에 FOREIGN KEY를 추가하는 것을 잊어서, 어떤 주문과도 연결되지 않은 결제가 생겨 사용자 환불에 문제가 발생했습니다.


이야기

할인에 대한 CHECK 제약 조건: discount > 0. 0에 대한 경계 조건이 잊혀졌습니다. 결과적으로 시스템은 0보다 큰 할인만 수용하고, 할인 없음(0)은 비즈니스 논리를 망가뜨렸습니다.