데이터베이스 설계

  • 개념적 데이터베이스 설계 : 정보 사용의 모델을 개발하는 과정으로 실세계를 바탕으로 추상화 모델을 구축한다.
    • 엔티티-관계 (ER: Entity-Relationship)모델이 주로 사용된다.
  • 물리적 데이터베이스 설계 : 물리적인 저장 장치와 접근 방식을 다룸
  • 엔티티 : 서로 구분이 되며 조직체에서 DB에 나타내려는 객체를 의미
  • 관계 : 두 개 이상의 엔티티들 간의 연관
  • 프로세스 : 관련된 활동
  • 무결성 제약조건 : 데이터의 정확성과 비즈니스 규칙을 의미
데이터베이스 설계의 개요
한 조직체의 운영과 목적을 지원하기 위해 DB를 생성하는 과정이다. 
목적은 모둔 주요 응용과 사용자들이 요구하는 데이터, 관계를 표현하는 것

데이터베이스 설계의 주요단계
- 요구사항 분석, 개념적 설계, DBMS의 선정, 논리적 설계, 물리적 설계, 트랜잭션 설계
  • 요구사항 수집 및 분석 : 기존의 문서 조사, 인터뷰나 설문 → 엔티티, 애트리뷰트, 관계 파악
    • 데이터 처리에 관한 요구사항 → 연산의 종류, 데이터의 양 분석
  • 개념적 설계 : 조직체에서 사용되는 정보의 모델을 구축
    • 사용자의 요구사항 명세로부터 개념적 스키마가 만들어짐
    • ER모델과 같은 높은 추상화 수준의 데이터 모델을 기반으로 구조 명시
    • 엔티티 타입, 애트리뷰트 도메인, 키 애트리뷰트를 결정
  • DBMS 선정 : 기술적, 정치적, 경제적 요인을 검토하여 선정
  • 논리적 설계 : 개념적 스키마에 알고리즘을 적용해 논리적 스키마를 생성, 스키마로 사상하는 과정
  • 물리적 설계 : 응답 시간, 트랜잭션 처리율 등의 성능 기준으로 요구사항을 만족시키는 구조를 결정
  • 트랜잭션 설계 : 완성될 DB에서 동작할 응용 프로그램에 대한 설계를 진행
ER 모델 : 개념적 설계를 위한 모델, 실세계를 엔티티, 애트리뷰트, 관계로 표현함
- 관계 데이터 모델로 사상하기 용이하며 엔티티, 관계, 애트리뷰트 및 카디날리티, 제약조건 등의 구문이 있다.

엔티티
  • 실세계에 독립적으로 존재하며 고유하게 식별이 가능한 객체
  • 생각이나 개념과 같이 추상적인 것도 있다.
  • 엔티티 타입은 동일한 애트리뷰트들을 가진 엔티티들의 틀
  • 엔티티 집합은 동일한 애트리뷰트들을 가진 엔티티들의 모임
  • 엔티티 타입은 내포, 엔티티 집합은 외연에 해당된다.
  • ER 다이어그램에서 직사각형으로 나타냄
  • 강한 엔티티 타입 ; 자신의 키 애트리뷰트를 사용하여 고유하게 엔티티들을 식별할 수 있는 엔티티 타입
  • 약한 엔티티 타입 : 키를 형성하기에 충분한 애트리뷰트들을 갖지 못한 엔티티 타입. 소유 엔티티 타입이 필요하다.
애트리뷰트
  • 하나의 엔티티는 연관 애트리뷰트들의 집합으로 설명된다.
    • 사원 엔티티는 사원번호, 이름, 직책, 급여 등의 애트리뷰트를 갖는다.
  • 애트리뷰트의 도메인은 그 애트리뷰트가 가질 수 있는 모든 값들의 집합으로, 여러 애트리뷰트가 동일한 도메인을 공유할 수 있다.
  • 키 애트리뷰트는 한 엔티티 타입 내에서 각 엔티티를 고유하게 식별한다.
  • 요구사항 명세에서 명사나 형용사로 표현된다.
  • ER 다이어그램에서 타원형
  • 단순 애트리뷰트 : 더 이상 다른 애트리뷰트로 나눌 수 없는 애트리뷰트
  • 복합 애트리뷰트 : 두 개 이상의 애트리뷰트로 이루어진 애트리뷰트. 밀접히 연관된 것을 모아놓은 것이다.
  • 단일 값 애트리뷰트 : 각 엔티티마다 정확히 하나의 값을 갖는 애트리뷰트 (대부분)
  • 다치 애트리뷰트 : 각 엔티티마다 여러 개의 값을 가질 수 있는 애트리뷰트. 이중선 타원으로 표현한다.
  • 저장된 애트리뷰트 : 다른 애트리뷰트와 독립적으로 존재하는 애트리뷰트
  • 유도된 애트리뷰트 : 다른 애트리뷰트의 값으로부터 얻어진 애트리뷰트. 점선 타원으로 표현한다. 
관계와 관계 타입 : 엔티티들 사이에 존재하는 연관, 연결로서 다이아몬드로 표현된다.
차수 : 관계로 연결된 엔티티 타입들의 개수. 2진 관계가 가장 흔하다.
카디날리티 : 하나의 엔티티가 참여할 수 있는 관계의 수를 말한다.
  • 1:1 관계, 1:N 관계, M:N 관계
  • 관계 실선 위에 최솟값과 최댓값이 표시된다. * (아스테리카) 표시는 n을 나타낸다.



ER 스키마를 관계 모델의 릴레이션으로 사상
  • 엔티티 타입과 단일 값 애트리뷰트 
    • 단계1_정규 엔티티 : 각 정규 엔티티 타입에 있던 단순 애트리뷰트를 릴레이션에 포함, 복합 애트리뷰트는 단순 애트리뷰트만 포함
    • 단게2_약한 엔티티 : 약한 엔티티 타입에 있던 단순 애트리뷰트를 릴레이션에 포함, 부분 키와 소유 엔티티의 기본 키를 외래키로 포함시켜 기본 키 구성 
  • 2진 관계 타입 
    • 단계3_2진 1:1관계 : 둘 중 하나의 릴레이션에서 기본 키를 나머지 릴레이션의 외래 키로 포함시키거나 다른 릴레이션을 만들어 포함
    • 단계4_2진 1:N관계 : 1측의 릴레이션 기본 키를 N측의 외래 키로 포함시킨다.
    • 단계5_2진 M:N관계 : 릴레이션을 새로 생성해서 M과 N측의 기본 키를 외래 키로 포함시킨다. 외래 키의 조합이 새로운 릴레이션의 기본 키가 된다.
  • 3진 이상 관계 타입
    • 단계6 : 새로운 릴레이션을 생성하고, 각 참여 릴레이션의 기본 키를 새로운 릴레이션의 외래 키로 포함. 이 외래 키의 조합이 기본 키가 된다.
    • 1:N:N의 경우는 1측의 기본 키를 참조하는 외래 키를 제외한 나머지 외래 키들의 조합이 기본 키가 된다.
  • 다치 애트리뷰트
    • 각 다치 애트리뷰트에 대해 새로운 릴레이션을 생성


INSERT문

  • 기존의 릴레이션에 투플을 삽입
  • 참조되는 릴레이션에 삽입되는 경우 문제 없음.
  • 참조하는 릴레이션에 삽입되는 경우 참조 무결성 제약조건 위배가능
  • INSERT  INTO 릴레이션 (애트리뷰트1, ..., 애트리뷰트n)  VALUES (값1, ..., 값n);
  • 릴레이션에 한 번에 여러 개의 투플들을 삽입하는 경우 WHERE절을 이용해 지정해주면 된다.
DELETE문
  • 한 릴레이션으로부터 한 개 이상의 투플들을 삭제
  • 참조되는 릴레이션은 참조 무결정 제약조건 위배가능
  • 참조하는 릴레이션을 삭제하는 경우 문제 없음
  • DELETE  FROM 릴레이션  WHERE 조건;
UPDATE문
  • 한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정
  • 기본 키나 외래 키에 속하는 애트리뷰트의 값이 수정되면 참조 무결성 제약조건을 위배할 수 있음
  • UPDATE 릴레이션  SET 애트리뷰트 = 값  WHERE 조건;
트리거 : 명시된 이벤트가 발생할 때마다 DBMS가 자동적으로 수행하는, 사용자가 정의하는 문으로 DB의 무결성을 유지하기 위한 일반적이고 강력한 도구이다.
트리거 활성(이벤트) -> 수행되는 조건(컨디션) -> 조건이 참일 때 수행되는 동작 (액션) ☞ 이벤트-조건-동작(ECA)규칙


내포된 SQL (embedded SQL)

  • SQL이 호스트 언어의 완전한 표현력을 갖고 있지 않기 때문에 모든 질의를 표현할 수는 없다.
  • SQL은 조건문과 반복문, 입출력, GUI등의 기능이 미약하다.
  • 따라서 C나 자바를 이용한 프로그램에 SQL문을 삽입하여, DB에 접근하는 부분은 SQL이 맡고 SQL에 없는 기능은 호스트 언어로 작성하는 형태를 내포된 SQL이라고 한다.
  • 데이터 구조의 불일치 문제(impedance mismatch)가 발생할 수 있다.
  • 호스트 변수는 SQL문에 포함된 C프로그램의 변수이다. 둘 사이의 통신을 위해 사용 (EXEC SQL ~)
    • 정적인 SQL문 : C프로그램에 내포된 오나전한 SQL문
    • 동적인 SQL문 : 불완전한 SQL문으로서 일부 또는 전부를 질의가 수행될 때 입력할 수 있다.
  • 커서 : 호스트 언어와 SQL문 사이의 불일치 문제를 해결하기 위해 사용된다. 한 번에 한 투플씩 가져오는 수단이다.
WHENEVER절 : 자동적인 에러 검사와 에러 처리를 위한 구문
- WHENEVER <조건> <동작> 형식으로 사용된다.

SQL 통신 영역 (SQLCA) : C프로그램에 내포된 SQL문에 발생하는 에러들을 사용자에게 알려준다.
오라클 통신 영역 (ORACA) : SQLCA 표준을 오라클에서 확장한 구조체




SQL : 현재 관계 DBMS 시장에서 널리 사용되는 ANSI (미국 표준 기구) 표준 언어

  • 비절차적 언어이므로 원하는 바만 명시, 처리하는 방법은 명시하지 않음
  • 대화식 SQL과 내포된 SQL이 있다.
  • 관계 DBMS는 사용자가 입력한 SQL문을 번역, 요구한 데이터를 찾는데 모든 과정을 담당한다.

데이터 정의어

  • 스키마의 생성 : CREATE (DOMAIN, TABLE, VIEW...)
    • CREATE SCHEMA MY_DB
  • 스키마의 제거 : DROP (DOMAIN, TABLE, VIEW...)
    • DROP SCHEMA MY_DB
  • 릴레이션의 정의에 사용되는 오라클 데이터 타입
    • INT, NUMBER(n, s) : 정수와 소수점
    • CHAR(n), VARCHAR(n) : 문자열과 가변 문자열
  • 제약조건
    • NOT NULL, UNIQUE, CHECK ...
  • 참조 무결성 제약조건
    • ON DELETE NO ACTION
    • ON DELETE CASCADE : 기본 키 삭제시 외래 키도 삭제된다.
    • ON DELETE SET NULL : 참조되는 값 삭제시 참조하는 값을 NULL로 바꾼다.
    • ON DELETE SET DEFAULT : NULL이 아닌 DEFAULT값으로 바꾼다.
    • ON UPDATE NO ACTION

SELECT절
  • 관계 DB에서 정보를 검색하는 SQL문
    • 관계 대수의 실렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것으로 가장 자주 사용된다.
    • SELECT절과 FROM절은 필수적, 나머지는 선택 사항
    SELECT         [DISTINCT] 애트리뷰트(들)
    FROM          릴레이션(들)
    [WHERE        조건
           [중첩 질의]]
    [GROUP BY   애트리뷰트(들)]
    [HAVING      조건]
    [ORDER BY   애트리뷰트(들) [ASC|DESC]];

    • * (아스테리카)를 사용하면 전체에 대해 검색할 수 있다.
    • 보통은 애트리뷰트를 열거해 검색
    • DISTINCT를 사용하면 중복을 제거해 준다.
    • 산술 연산자를 이용할 수 있다.


    WHERE절 : 검색 조건을 명시

    • % (퍼센트 기호)를 이용해 문자열을 비교할 수 있다. 
      • WHERE EMPNAME LIKE '이%'   ☞  '이씨 성을 가진'
    • 부울 연산자 (AND, OR, <>(NOT))를 이용해 조건을 제시할 수 있다.
    • 범위 연산자도 가능
    • 리스트를 사용한 검색이 가능하다.
      • WHERE DNO IN (1, 3)  ☞  '1번 부서나 3번 부서에 소속된'
    • NULL값과의 직접적인 비교는 불가능하다. 
      • IS NULL, IS NOT NULL 등으로 사용가능

    ORDER BY절 :  오름차순(ASC)과 내림차순(DESC)으로 정렬할 때 사용한다. 
    - SELECT절에 명시한 애트리뷰트들을 사용해서 정렬해야 한다.

    AS문 : 서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 있을 때 구분하기 위한 방법
    - EMPLOYEE AS E, DEPARTMENT AS D

    집단 함수
    • DB에서 검색된 여러 투플들의 집단에 적용되는 함수
    • 한 개의 애트리뷰트에 적용되어 단일 값을 반환한다.
    • SELECT절과 HAVING절에만 나타날 수 있음
    • COUNT(*)는 릴레이션의 모든 행들의 총 개수
    • COUNT(애트리뷰트)는 해당 애트리뷰트에서 널값이 아닌 값들의 갯수
    • SUM, AVG, MAX, MIN ..
    그룹화 : GROUP BY절에 사용된 애트리뷰트에 동일한 값을 갖는 투플들이 묶인다.

    HAVING절 : 각 그룹이 만족해야 하는 조건을 명시
    - HAVING절에 나타나는 애트리뷰트는 반드시 GROUP BY절에 나타나거나 집단 함수에 포함되어야 한다.

    집합 연산 : 두 릴레이션이 합집합 호환성을 가져야 적용할 수 있다.
    - UNION(합집합), EXCEPT(차집합), INTERSECT(교집합)


    조인
    • 두 개 이상의 릴레이션으로부터 연관된 투플들을 결합
    • WHERE절에 애트리뷰트들을 비교하는 조인 조건이 포함
    • 조인 조건이 명확해지도록 애트리뷰트 이름 앞에 변수를 사용하는 것이 좋다.
    자체 조인 : 한 릴레이션에 속하는 투플을 동일한 릴레이션에 속하는 투플들과 조인.
    - 릴레이션에 대한 별칭을 두 개 지정해야 한다.


    중첩 질의
    • 질의의 WHERE 또는 FROM절에 다시 SELECT문이 괄호로 묶여 포함되는 것
    • 부질의(subquery)라고 한다.
    • 결과는 크게 세 종류가 있다.
      • 한 개의 스칼라값
      • 한 개의 애트리뷰트로 이루어진 릴레이션 : 외부 질의의 WHERE절에서 IN, ANY, ALL, EXISTS와 같은 연산자를 사용해야 한다.
        1. IN : 한 애트리뷰트가 값들의 집합에 속하는가
        2. ANY : 한 애트리뷰트가 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가
        3. ALL : 한 애트리뷰트가 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가
        4. EXISTS : 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사
      • 여러 애트리뷰트로 이루어진 릴레이션
    • 상관 중첩 질의 : 중첩 질의의 WHERE절에서 외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 참조


    관계 해석 : 원하는 데이터만 명시하고 질의를 어떻게 수행할 것인지는 명시하지 않는 선언적 언어

    관계 대수 : 어떻게 질의를 수행할 것인가를 명시하는 절차적 언어

              -> 상용 관계 DBMS에서 널리 사용되는 SQL의 기초로써 DBMS의 내부 언어로서도 사용된다.


    SQL : 사용자가 관계 DB 릴레이션에 정의, 검색, 갱신, 제약조건 등 여러가지 질의를 수행하기 위한 표준 질의어


    관계 대수의 특징

    • 기존 릴레이션들로부터 새로운 릴레이션을 생성
    • 릴레이션이나 관계 대수식에 연산자를 적용해 복잡한 관계 대수식을 만들 수 있음
    • 기본적인 연산자들의 집합
    • 결과 릴레이션은 또 다른 관계 연산자의 입력으로 사용될 수 있음

    필수적인 관계 연산자 : 실렉션, 프로젝션, 합집합, 차집합, 카티션 곱

    실렉션 연산자 (Selection)
    • δ<조건>릴레이션
    • 단항 연산자로서 릴레이션에서 조건을 만족하는 투플들의 부분 집합을 생성한다.
    • 결과 릴레이션의 차수는 입력 릴레이션의 차수와 같다.
    • 결과 릴레이션의 카디날리티는 항상 기존 릴레이션의 카디날리티보다 작거나 같다.
    • 임의의 애트리뷰트와 상수, 비교 연산자, 부울 연산자를 포함할 수 있다.
    • 중복 투플이 존재할 수 없음
    프로젝션 연산자 (Projection)
    • π<애트리뷰트 리스트>릴레이션
    • 릴레이션에서 애트리뷰트들의 부분 집합을 구한다.
    • 결과 릴레이션은 <애트리뷰트 리스트>에 명시된 애트리뷰트만 갖는다.
    • 중복 투플이 존재할 수 있음
    집합 연산자 : 합집합, 교집합, 차집합이 있으며 입력으로 사용되는 릴레이션은 합집합 호환이어야 한다.

    합집합 연산자 
    • 릴레이션1 ∪ 릴레이션2
    • 중복된 투플들은 제외된다.
    • 결과 릴레이션의 차수는 입력 릴레이션 중 하나의 차수와 같다.
    차집합 연산자
    • 릴레이션1 - 릴레이션2
    • 릴레이션1에는 속하지만 릴레이션2에는 속하지 않는 투플들로 이루어진 릴레이션
    • 결과 릴레이션의 차수는 입력 릴레이션 중 하나의 차수와 같다.
    카티션 곱 연산자 : 릴레이션1 × 릴레이션2 에서 릴레이션 1과 릴레이션2의 투플들의 모든 가능한 조합으로 이루어진 릴레이션이다.


    유도된 연산자 : 교집합, 세타 조인, 동등 조인, 자연 조인, 세미 조인, 디비전

    교집합 연산자
    • 릴레이션1 ∩ 릴레이션2
    • 결과 릴레이션의 차수는 입력 릴레이션 중 하나의 차수와 같다.
    조인 연산자 : 두 개의 릴레이션으로부터 연관된 투플들을 결합하는 연산자

    세타 조인
    • R ⋈<조인조건>S
    • 두 릴레이션 R과 S의 세타 조인의 결과는 두 릴레이션의 차수, 애트리뷰트를 합친 것이다.
    • 조인 조건은 비교 연산자를 이용한다.
    • 세타 조인 결과는 두 릴레이션의 카티션 곱에 조인 조건을 적용한 결과와 같다. 
    동등 조인 : 세타 조인 중에서 비교 연산자가 =인 조인

    자연 조인
    • R ⋈ S
    • 두 릴레이션의 공통된 애트리뷰트에 대해 동등 조인을 수행하고, 결과 릴레이션에 있는 조인 애트리뷰트 중 하나를 제외한 조인
    • 관계 DB에 있어서 대부분의 질의는 실렉션, 프로젝션과 자연 조인으로 표현이 가능하다.
    디비전 연산자
    • R ÷ S
    • 릴레이션 S의 모든 투플 값과 쌍을 이루는 릴레이션 R의 애트리뷰트 값
    • "모든 ~에 대해 ~하는" , "~하지 않는 ~가 없다" 형태의 질의에 사용될 수 있다.

    관계 대수의 한계 : 정렬을 나타낼 수 없고, 데이터베이스를 수정할 수 없으며 중복된 투플을 명시하지 못한다.

    추가된 관계 대수 연산자
    • 집단 함수 : AVG, SUM, MIN, MAX, COUNT
    • 그룹화 : 각 그룹에 대해 집단 함수를 적용
    • 외부 조인 : 상대 릴레이션에서 대응되는 투플을 갖지 못하거나 널값이 들어 있는 투플들을 다루기 위한 조인
    1. 왼쪽 외부 조인 (R ⟕ S) : 왼쪽 릴레이션의 투플을 결과에 모두 포함시키고, 오른쪽 릴레이션에 관련 투플이 없다면 널값으로 채움
    2. 오른쪽 외부 조인 (R ⟖ S) : 오른쪽 릴레이션의 투플을 결과에 모두 포함시키고, 왼쪽 릴레이션에 관련 투플이 없다면 널값으로 채움
    3. 완전 외부 조인 (R ⟗ S) : 양쪽 릴레이션의 투플을 모두 결과에 포함시키고, 양쪽에 관련 투플이 없다면 널값으로 채움 . R ⟗ S = (R ⟕ S) ∪ (R ⟖ S)


    관계 데이터 모델 : 데이터 모델 중 개념이 가장 단순, 가장 널리 사용된다.

    • 모든 데이터를 논리적으로 구성
    • 사용자는 원하는 데이터만 명시, 찾는 방법은 명시하지 않는다
    • 선언적인 질의어를 통한 데이터 접근

    장점 : 집합 테이블을 이용한 간단한 구조의 데이터, 이론이 탄탄하며 응용에 적합하다. 설계와 질의처리도 효율적


    릴레이션(Relation) : 2차원의 테이블

    레코드(Record) : 릴레이션의 각 행

    투플(Tuple) : 레코드의 공식적인 용어

    애트리뷰트(Attribute) : 릴레이션에서 이름을 가진 하나의 열


    도메인(Domain) : 한 애트리뷰트에 나타날 수 있는 값들의 집합

    프로그래밍 언어의 데이터 타입과 비슷한 형태로써 동일한 도메인이 여러 애트리뷰트에서 사용될 수 있다.

    • CREATE DOMAIN EMPNAME CHAR(10)
    • EMPNAME 도메인 : {Jeff, John, Alves, Kim, Osher ...}


    차수(Degree) : 한 릴레이션에 들어있는 애트리뷰트들의 수 (1 이상)

    카디날리티(Cardinality) : 릴레이션의 투플 수 (0 이상)

    널값(Null Value) : '알려지지 않음', '적용할 수 없음'에 사용한다. 0과 공백과는 다르다.



    릴레이션 스키마(Relation Schema) : 릴레이션의 이름, 애트리뷰트들의 집합 -> 내포

    릴레이션을 위한 틀이라고 생각하면 된다.

    •  릴레이션이름(애트리뷰트1, 애트리뷰트2, ... , 애트리뷰트N)

    기본 키 애트리뷰트에 밑줄을 그어 표시한다.


    릴레이션 인스턴스(Relation Instance) : 릴레이션의 어느 시점에 들어 있는 투플들의 집합 -> 외연

    일반적으로 현재의 인스턴스만 저장하고, 시간의 흐름에 따라 계속 변한다.



    관계 데이터베이스 스키마는 하나 이상의 릴레이션 스키마들로 이루어진다.

    • DEPARTMENT (DEPTNO, DEPTNAME, FLOOR)
    • EMPLOYEE (EMPNO, EMPNAME, TITLE, DNO, SALARY)
    관계 데이터베이스 인스턴스는 릴레이션 인스턴스들의 모임으로 이루어진다.

    DEPTNO 

    DEPTNAME 

    FLOOR 

     1

    영업

    기획 

    10 

     3

    개발 


     EMPNO

    EMPNAME 

    TITLE 

    DNO 

    SALARY 

     2106

    김창섭 

    대리 

    2000000 

     3426

    박영권 

    과장 

    2500000 

     3011

    이수민 

    부장 

    3000000 

     1003

    조민희 

    대리 

    2000000 

     3427

    최종철 

    사원 

    1500000 



    릴레이션의 특성

    • 각 릴레이션은 오직 하나의 레코드 타입만 포함한다.
    • 한 애트리뷰트 내의 값들은 모두 같은 유형이며 순서는 중요하지 않다.
    • 동일한 투플이 두 개 이상 존재하지 않으며 순서는 중요하지 않다.


    릴레이션의 키에는 수퍼 키, 후보 키, 기본 키, 대체 키, 외래 키가 있다.

    • 수퍼 키 : 릴레이션 내의 특정 투플을 고유하게 식별하는 하나 이상의 애트리뷰트 집합
    • 후보 키 : 각 투플을 고유하게 식별하는 최소한의 애트리뷰트 집합, 두 개 이상일 경우 복합 키라고 한다.
    • 기본 키 : 릴레이션 후보 키 중에서 설계자 혹은 관리자가 기본 키로 선정, 인위적인 키 애트리뷰트를 추가할 수 있음
    • 대체 키 : 키본 키가 아닌 후보 키
    • 외래 키 : 어떤 릴레이션의 기본 키를 참조하는 애트리뷰트, 관계 DB에서는 관계를 나타낼 때 사용된다.

    데이터 무결성 : 데이터의 정확성, 유효성을 의미한다. 일관된 DB상태를 정의하는 규칙이며 DB가 갱신될 때 DBMS가 자동적으로 조건을 검사한다.
    • 도메인 제약조건 (Domain Constraint)
    각 애트리뷰트 값이 반드시 원자값이어야 하며, 디폴트 값과 CHECK 제약조건을 통해 범위를 지정할 수 있다.
    NOT NULL, CHECK 등이 도메인 제약조건에 해당된다.
    • 키 제약조건 (Key Constraint)
    키 애트리뷰트에 중복된 값이 존재해서는 안된다. UNIQUE 로 설정할 수 있다.


    엔티티 무결성 제약조건 (Entity Integrity Constraint)
    • 기본 키 : 투플들을 식별하기 위해 사용되므로 어떤 애트리뷰트도 널값을 가질 수 없다.
    참조 무결성 제약조건 (Referential Integrity Constraint)
    • 두 릴레이션의 연관된 투플들 사이의 일관성을 유지하는데 사용된다.
    • 외래 키 : 관계 DB에서 릴레이션 사이의 관계들이 다른 릴레이션의 기본 키를 참조하는 것을 기반으로 하기 때문에 중요하다.
    • 릴레이션 R2의 외래 키가 릴레이션 R1의 기본 키를 참조할 때 무결성 제약조건의 성립조건 (하나만 만족해도 성립)
      1. 외래 키 값은 R1의 어떤 투플의 기본 키 값과 같다.
      2. 널 값을 가진다. 단, 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않음

    무결성 제약조건 : DBMS가 각각의 갱신 연산에 대해 필요한 조치를 취한다.
    • 삽입
    기본적으로 참조되는 릴레이션에 새로운 투플 삽입시 위배되지 않음
    하지만 참조되는 릴레이션에 투플 삽입시 기본 키 애트리뷰트의 값에 따라 (도메인, 키, 엔티티 무결성) 제약조건 위배될 수 있음
    참조하는 릴레이션에 새로운 투플 삽입시 (도메인, 키, 엔티티 무결성, 참조 무결성) 제약조건 위배될 수 있음
    제약조건을 위배하는 삽입 연산은 DBMS가 거절함으로써 무결성을 유지한다.
    • 삭제
    참조하는 릴레이션에서 투플 삭제시 제약조건 위배하지 않음
    참조되는 릴레이션에서 투플 삭제시 참조 무결성 제약조건 위배할 수도 있음
    이 경우 DBMS가 제공하는 옵션
    1. 제한 : 연산을 거절 
    2. 연쇄 : 참조하는 릴레이션에서도 해당 투플을 함께 삭제
    3. 널값 : 참조하는 릴레이션의 외래 키에 널값을 삽입
    4. 디폴트값 : 3번에서 널값 대신 디폴트값 삽입
    5. 수정 : 수정은 투플을 삭제하고 삽입하는 과정과 마찬가지다. 키의 종류에 따라 제약조건을 살펴봐야 한다.


    데이터 : HDD에 저장되는 팩트

    정보 : 데이터를 가공해 의미있게 만든 것. (데이터는 프로그램이나 질의를 통해 정보로 변환된다)


    데이터베이스는 조직체의 응용 시스템들이 공유해서 사용하는 운영 데이터들이 구조적으로 통합된 모임이다

    • 데이터베이스 스키마 : 전체적인 데이터베이스의 구조로 내포라고 한다.

    DEPARTMENT ( DEPTNO, DEPTNAME, FLOOR)

    • 데이터베이스 상태 : 특정 시점의 데이터베이스의 내용으로 외연이라고 한다.

    DEPTNO

    DEPTNAME 

    FLOOR 

    영업

    2

    기획

    3

    개발


    스키마는 잘 바뀌지 않는 반면, 상태는 시간이 지남에 따라 계속해서 바뀐다.


    데이터베이스는 데이터베이스와 시스템 카탈로그(데이터 사전)으로 구분할 수 있다.

    시스템 카탈로그는 데이터베이스의 스키마 정보를 저장한다.



    데이터베이스 관리 시스템(DBMS) : 데이터베이스를 정의하고, 질의어를 지원하고, 리포트를 생성하는 등의 작업을 수행하는 소프트웨어이다.

    데이터베이스 언어라는 특별한 프로그래밍 언어를 한 개 이상 제공한다. SQL은 사실상 표준 데이터베이스 언어.

    DBMS는 주기억 장치에 적재되어 실행되는데, 원하는 정보를 찾기 위해 중앙 처리 장치가 사용된다.

    • DBMS는 동시성 문제를 관리해준다. (사용자가 데이터에 동시에 접근했을 때)
    • DBMS는 운영체제와 응용 소프트웨어 사이에서 돌아가는 시스템 소프트웨어이다.
    • 트랜잭션(Transaction, 업무처리 단위)로 나누어 데이터를 백업하고 복원할 수 있다.
    • 데이터의 중복을 줄이거나 제어하며 일관성을 유지한다.
    • 특정 레코드에게 고유한 값을 줌으로써 데이터의 정확성을 유지하는 데이터 무결성을 지원한다.
    • 프로그램에 영향을 주지 않으면서 데이터베이스의 구조를 변경할 수 있음 >> 프로그램-데이터 독립성
    데이터베이스 시스템을 쓰기 전에는 주로 파일 시스템으로 데이터를 관리했다.
    하지만 데이터가 중복되고, 보안 조치나 백업기능이 없으며 응용 프로그램에 의존도가 높고, 동시성 제어가 되지 않는 등의 이유로 현재는 거의 쓰이지 않는다.
    또한 데이터 값이 바뀌었을 때 모든 프로그램을 하나하나 바꿔주어야 하므로 데이터의 불일치 현상이 나타난다. (일관성 ↓)

    DBMS 선정시 고려 사항
    • 기술적 요인 : 데이터 모델, 사용자 인터페이스, 프로그래밍 언어, 응용 개발도구 등
    • 경제적 요인 : 소프트웨어/하드웨어 구입 비용, 유지보수 비용, 직원들의 교육 지원

    DBMS의 단점 : 데이터를 공유하다보니 프라이버시 보장이 안된다. 또한 투자비용에 비해 관리할 데이터가 많지 않다면 적자로 이어질 수 있다.



    데이터 모델 : 데이터베이스의 구조를 기술하는데 사용되는 개념으로 세 가지 모델이 존재한다.

    1. 고수준 또는 개념적 데이터 모델 : 사람이 인식하는 것과 유사하게 데이터베이스의 논리적 구조를 명시. ex) 엔티티-관계(ER) 모델
    2. 표현(구현) 데이터 모델 : 사용자가 인식하는 것을 중심으로 하되, 저장되는 방법은 기계적. ex) 네트워크 데이터 모델, 관계 데이터 모델
    3. 저수준 또는 물리적 데이터 모델 : 데이터베이스에 데이터가 저장되는지를 명시.
    • 계층 DBMS : 트리 구조를 갖는 모델을 사용한 DBMS로써, 빠른 속도와 높은 효율을 제공할 때가 있지만 레코드들이 링크로 연결되어 있어 레코드 구조를 변경하기가 힘들다. 즉, 일대다 구조는 잘 처리하는 반면, 다대다 구조는 잘 처리하지 못한다.
    • 객체 지향 DBMS : 객체 지향 프로그래밍을 기반으로 하는 모델. 데이터를 그룹화하고 복잡한 객체를 이해하기 용이하다.
    • 전용 DBMS : 범용 데이터베이스 시스템에 맞지 않는 특정 프로그램을 위한 DBMS. 


    데이터 언어

    • 데이터 정의어(DDL) : 데이터베이스 스키마를 정의할 때 사용하는 언어 
    • 데이터 조작어(DML) : 데이터 레코드를 조작하기 위한 언어로써 절차적 언어와 비절차적 언어가 있다.
    • 데이터 제어어(DCL) : 데이터베이스의 트랜잭션(작업)을 명시하거나 액세스 권한을 설정한다.

    절차적 언어는 데이터를 가져오는 과정까지 관여하는 것이고, 비절차적 언어는 찾고자하는 데이터만 명시하는 것이다. (SQL은 비절차적 언어)

    데이터 조작어는 대화식으로 입력되어 수행되거나, 고급 프로그래밍 언어로 작성된 프로그램에 내포되어 사용된다.



    데이터베이스 사용자

    • 데이터베이스 관리자(DBA) : 조직의 여러 요구를 만족시키기 위해 DB스키마의 일관성을 유지하는 사람
    • 오퍼레이터 : DBMS의 전산실 관리자
    • 응용 프로그래머 : 데이터베이스 위에서 인터페이스를 구현하는 사람
    • 최종 사용자 : 데이터베이스를 사용하는 사람


    ANSI/ SPARC 아키텍처 : 현재 대부분의 상용 DBMS 구현에서 사용되는 일반적인 아키텍처. 세 가지 단계로 이루어진다.

    1. 외부 단계 : 데이터베이스의 각 사용자가 갖는 뷰. 동일한 개념 단계에서도 다수의 서로 다른 뷰가 나타난다.
    2. 개념 단계 : 데이터베이스의 사용자 공동체의 뷰. 조직체 전체에 대한 스키마를 포함하며 하나의 DB에 하나의 개념 스키마가 존재한다.
    3. 내부 단계 : 데이터베이스의 물리적 뷰. 물리적인 데이터 구조에 관한 스키마이다. 실질적인 저장을 표현하는 단계
    DBMS는 내부단계를 보여주지 않고, 사용자에게 필요한 외부단계를 보여준다.
    또한 DBMS는 세 단계 간에 맵핑(mapping)을 통해 질의를 변환한다.
    • 외부/개념 사상 : 외부 단계의 뷰를 사용해서 입력된 사용자의 질의를 개념 단계의 스키마를 사용한 질의로 변환
    • 개념/내부 사상 : 이를 다시 내부 단계의 스키마로 변환하여 디스크의 데이터베이스를 접근

    데이터 독립성 : 상위 단계의 스키마 정의에 영향을 주지 않으면서 어떤 단계의 스키마 정의를 변경하는 것
    • 논리적 데이터 독립성 : 개념 스키마가 변하더라도 외부 스키마가 변하지 않는 것
    • 물리적 데이터 독립성 : 내부 스키마가 변하더라도 개념 스키마가 변하지 않는 것

    * ODBC(Open Database Connectivity) : Microsoft사의 데이터베이스 API이다. 

    개발자가 DB간 공통적으로 사용할 수 있는 API만 알게 되면 여러 회사의 DB에 접근할 수 있다.


    데이터베이스 시스템 구조는 중앙 집중식과 분산식으로 나눌 수 있다.

    • 중앙 집중식 DBMS : 하나의 중앙 컴퓨터 시스템에서 데이터베이스 시스템을 운영
    • 분산 DBMS : 데이터베이스 시스템이 네트워크를 통해 여러 컴퓨터에 나누어져 있는 형태.
    중앙 집중식 DBMS는 사용자가 많을 경우 트래픽이 초과될 위험이 있기 때문에 분산 DBMS시스템이 유리하다.
    이는 또한 경제적인 면에서 하나의 고가 컴퓨터보다 여러 대의 저가 컴퓨터가 유리하다.


    피렌체와 이탈리아에서 보내는 마지막 날의 시작은 두오모 성당을 들어가면서였다.

    두오모 성당은 겉에 비해서 내부는 꽤나 단촐했다. 이미 바티칸 성당을 갔다왔기 때문일까, 내부에서 그다지 감흥을 느끼지는 못했다.

    지하는 과거 교황들의 무덤과 중세 쓰였던 도구들을 전시하는 용도로 사용되고 있었다. 그냥 이런 공간이 있었구나, 싶은 정도였다.

    그렇게 박물관도 구경하고, 예배당도 갔다오며 통합이용권을 알뜰하게 이용했다.


    박물관은 돔의 구조와 성당에 전시되있던 진품 등을 볼 수 있고, 예배당에서는 천장에 그려진 훌륭한 금빛 그림을 볼 수 있다.

    참고로 굳이 통합이용권을 구매하지 않더라도 종탑은 내부에서 이용권을 따로 구매할 수 있다.

    성당 내부도 지하가 아니라면 무료입장이 가능하니, 이곳에서는 종탑과 성당 내부정도만 구경해도 충분할 듯 하다.


    그 후 다비드상이 있다는 아카데미아 미술관으로 향했다.

    다만 사람이 너무 많고, 특별전이 있어서 가격이 더 비쌌기 때문에 이곳은 포기하기로 했다.

    지금 와서도 그닥 후회는 없는 느낌. 여행 내내 지쳐있었기 때문일까?


    그 대신 베키오 다리에서 보석시장을 구경하고, 시내에서 가죽제품을 보며 시간을 때웠다.

    베키오 다리는 희안하게도 다리 전체가 보석이나 귀중품을 판매하는 가게로 가득했다. 



    리 베키오 다리가 보인다



    이탈리아의 젤라또는 확실히 쫀득쫀득하다


    시내 가죽시장은 대부분이 비슷비슷한 느낌이었다. 특색은 그다지 없고, 약간은 가짜 느낌이 나는 조잡한 물품이 많았다.

    특히 지갑, 핸드백류가 많았는데 이곳은 그냥 둘러보는 느낌으로 다니는 걸 추천한다.

    구매하고 싶다면 거리 판매상보다는 입점해있는 가게에서 직접 가죽을 만져보고 구매하자.

    확실히 일반 가죽과는 다른 질감을 느낄 수 있다.


    다음은 잘츠부르크로 향한다. 오스트리아는 국제사회에서 비교적 조용한 국가여서 그런지, 크게 아는 바가 없다.

    관광지에 대해서도 많이 아는 바가 없지만 이때까지는 몰랐다. 오스트리아가 내 인생국가가 될 줄은..

    로마의 날씨가 여름이었다면 피렌체의 날씨는 가을이었다.

    시원한 바람, 쾌적한 온도와 적당한 습도가 힘들었던 로마에서의 날들을 힐링해주는 듯 했다.

    마침 일정도 피렌체를 둘러보기에 충분한 시간이었기에 한층 여유롭게 여행할 수 있었다.

    하지만 시간이 많았던 만큼, 로마를 방불케하는 엄청난 관광객의 숫자 때문에 관광지 하나하나에서 오래 기다려야 했다.


    조식먹을 시간도 지날 만큼 느긋하게 일어나서 두오모 성당으로 향했다.

    로마는 모든 것이 큰 도시였다. 길도 크고, 건축물들도 크고, 광장도 상당히 많고.

    이에 반해 피렌체는 조밀조밀하고 거리를 걷다가 갑자기 관광지가 툭 튀어나오는 느낌이었다.

    실제로 두오모 성당이 그랬다. 분명 숙소에서 얼마 걷지도 않아서 골목 밖으로 나가니 거대한 성당이 자리하고 있었다.

    괜히 세계 3대 성당 중 하나가 아니라고 생각될 정도로 압도적인 외관이었다.



    흰 대리석에 푸른 대리석과 녹색 대리석 줄무늬들이 들어가있어 절묘하게 세련된 미가 돋보였다


    다만 한 가지 문제는 두오모 성당에 사람이 너무나도 많았다는 점이다.

    두오모 성당은 통합티켓으로 주변의 관광지까지 다 들어가볼 수 있는데, 사람이 많은 주요 장소는 성당입구와 종탑이다.

    사실 돔으로 올라가는 부분은 성수기의 경우 사전예약을 통해서만 이용할 수 있기 때문에 구경도 못했다.

    오전 10시 반쯤 갔는데 성당입구 줄은 최소 두시간 반, 종탑 줄은 한시간 반 정도 수준이었다. 

    통합권 이용시간이 48시간이였기 때문에 오늘은 일단 종탑만 오르기로 했다.


    계단이 무려 430개에 달하는 종탑은 밑에서 봤을 때는 성당 자체의 위엄에 가려져서인지 그렇게 인상적이진 않았다.

    하지만 10분에 걸쳐 계단을 다 오르고 난 후 탑 꼭대기에 섰을 때의 시원한 바람과 보람은 이루 말할 수 없을 정도였다.

    쓰고 있던 모자가 날라갈 만큼 강하게 부는 바람은 더운 몸을 시원하게 감싸주었고, 피렌체의 전경이 한눈에 내려다보이는 경치에는 감탄할 수 밖에 없었다.

    그중 바로 옆에있는 두오모 성당을 내려다보는 경치가 가장 아름다웠다.

    비록 돔은 올라가보지 못했지만, 돔까지 한 눈에 보이는 종탑은 그 아쉬움을 달래주고도 남았다.



    피렌체에서의 날씨는 너무나 맑고 시원했다



    이후 우피치로 향했다. 이곳 역시 수많은 인파로 북적댔고, 오후 세시에 예약을 해뒀음에도 불구하고 입장하는데 대략 30분 정도가 걸렸다. 

    대략 두시간 반 정도의 시간을 보냈는데, 우피치 미술관은 자세히 들여다보며 돌아보지 않는 이상 다 둘러보기에 적당한 시간이었던듯 싶다.

    우피치 미술관은 원래 메디치 가문의 궁전으로 사용되었다고 한다. 보티첼리와 미켈란젤로, 라파엘로 등 거장의 작품을 만나볼 수 있었다.


    저녁은 피렌체에서 유명하다는 티본스테이크와 해산물 파스타를 먹었다.

    로마에서 왜 그렇게 과소비를 했을까.. 우리는 티본스테이크 1.1kg을 네명이서 나눠먹어야만 했다. (2인 1스테이크 한 수준)

    장정 네명이서 거의 뼈까지 먹을 기세로 티본을 뜯었는데, 맛은 확실히 좋았다.

    이탈리아에서 해산물 파스타 역시 항상 맛있는 메뉴다.



    곁들여진 샐러드와 토마토도 제법 어울리는 맛이다


    이제 야경을 보러 미켈란젤로 언덕으로 갈 시점이었다.

    피렌체서는 로마의 교통권이 통하지 않기 때문에, 90분 이용권을 끊어야만 했다.

    하지만 이게 왠걸.. 피렌체는 로마에서보다 교통권을 더욱 팔지 않는 것이었다. 주변에 있는 잡화상점과 Tabacchi를 죄다 찾아봤지만 헛수고였다.

    그래도 버스를 타면 기사가 교통권을 판다기에 조금 더 비싸게라도 사서 가자는 생각으로 버스를 탔지만! 티켓이 다 팔렸다는 버스기사의 대답.

    피렌체에서 표 검사를 자주한다는 이야기를 들었기 때문에 무임승차는 곤란하고, 일단 내리고보니 심지어 배차간격도 한 시간인 버스였다. 12번 버스!!!

    우여곡절 끝에 자동화기기에서 30분 동안 사투를 벌이며 교통권을 끊고, 미켈란젤로 언덕에 도착하니 벌써 노을이 지나간 시점이었다 (...)



    오죽했으면 버스티켓 인증샷을..


    피렌체의 야경은 끝내준다! 이런 느낌보다는 잔잔하게 물 흐르듯 지나가는 일상과 같았다.

    미켈란젤로 언덕의 분위기도 다들 맥주한잔 하며 즉석연주를 즐기는 느낌이었다.



    그 때는 잘 몰랐지만, 되돌아보면 소중한 추억 중 하나

    어제 남부투어에 이어 연속으로 아침에 투어를 나가게 되었다. 바로 바티칸 반일투어였다.

    남부투어를 워낙 알차게 보냈던 만큼, 바티칸 투어도 기대가 높았다.

    자전거나라 김혜진 가이드님의 리딩하에 30명 정도가 한 팀이 되어 출발했는데, 일찍 간 덕에 8시에 바로 입장할 수 있었다.



    바티칸을 상징하는 문양은 성 베드로가 받은 천국의 열쇠이다.


    사실 이전까지 종교적으로나 세계사적으로 바티칸시국에 대해 아는바가 없었다.

    가이드는 우리의 수준을 이미 알고있다는 듯, 기초적인 부분부터 차근차근 설명해주기 시작했다.

    바티칸은 세계에서 가장 작은 나라, 교황이 통치하는 신권 국가, 카톨릭교의 성지이다부터 시작해서 미켈란젤로와 라파엘로, 율리우Ⅱ세 교황에 대한 이야기와 그들이 바티칸에 어떤 흔적을 남겼는지 등등.. 한시간 정도 바티칸 입구쪽에서 설명을 듣고 9시 반쯤 본격적으로 투어를 시작했다.


    피냐의 정원을 지나 벨베레데의 팔각정원에 들어가면 유명한 조각상들을 많이 볼 수 있다.

    가장 인상적이었던 작품은 『라오콘 군상』이었다.

    포세이돈의 저주를 받아 두 아들과 함께 독사에 물리는 장면을 생생하게 묘사한 이 작품은 발굴 당시 오른쪽 팔이 떨어진 채로 발견되었다.

    당시 수많은 조각가들은 원래 팔의 모양이 하늘을 향해 뻗어있을 것이라고 주장했지만, 신의 조각가 미켈란젤로만이 유일하게 팔이 뒤쪽으로 꺾여있을 것이라고 주장하였다.

    그리고 후에 발견된 뒤로 꺾여있는 형태의 모양. 나중에 발견된만큼 이 부분은 조금 더 부식되어 있다.



    사실 미켈란젤로가 만들었다는 설도 있다.


    뮤즈의 방에서 벨베레데의 토르소를 보고 네로의 욕조를 거쳐 융단의 방으로 갔다.

    사람이 워낙 많았기 때문에 파도풀을 타고 앞으로 이동하는 느낌이었다. 

    이쪽은 크게 유명한 작품도 없고, 작품들이 방마다 비슷비슷하게 전시되어 있다. 


    지도의 방까지 다 통과하고 나면 라파엘로의 방으로 갈 수 있다. 총 4개의 방으로 구성되어 있는 이곳의 핵심은 뭐니뭐니해도 <서명의 방>에 있는 『아테네 학당』.

    이 작품만 10분이 넘게 설명을 들을 정도로 고대의 유명한 사람들이 많이 그려져 있다.

    이곳에 오면 한번쯤 해본다는 바티칸 입장권 인증샷도 하고.



    천장화를 보고 감명을 받은 라파엘로는 작품이 완성된 후 미켈란젤로(가운데 탁자)를 그려넣었다고 한다.


    그리고 마침내 도착한 시스티나 성당. 우리나라에서 천지창조로 더 잘 알려져있는 『천장화』가 그려져있는 곳이다.

    사실 천지창조는 천장화의 일부분이라고 볼 수 있는데, 창세기에서 하느님이 아담을 만든 다음 코로 숨을 불어넣어 생명체로 만드는 장면을 미켈란젤로가 손끝으로 표현한 장면이다. 이 부분은 천장화의 수많은 그림들 중 가운데에 위치하고 있다.

    아쉽게도 작품의 보존을 위해 사진의 촬영은 금지되어 있다. 하지만 기념품샵에 가면 퍼즐과 프린팅으로 만나볼 수 있다.


    바티칸 시국의 정점은 성 베드로 대성당이었다.

    모든 것이 변하지 않는 물질로 이루어졌으며(금과 대리석 등) 베르니니가 심혈을 기울여 만든 역작들, 미켈란젤로의 돔과 피에타, 라파엘로의 유작까지 투어의 대미를 완벽하게 장식할만한 장소였다. 성당의 구조와 작품들의 설명을 듣는것만 해도 시간이 훌쩍 가버릴 정도였으니.

    이렇게 성 베드로 대성당까지 한바퀴를 모두 둘러보는 것으로 투어를 마무리하게 되었다.

    아침부터 부지런히 이동해서 다 둘러보니 한시가 넘어 있었다.

    반일 만으로는 설명들은게 너무나도 부족하고, 놓친게 많았지만 그래서 더욱 아쉽고 다음에 또 오고픈 생각이 든 투어가 아니었나 싶다.


    이렇게해서 바티칸 투어와 함께 이탈리아 로마에서의 일정도 모두 마치게 되었다.

    로마에서 보낸 3박 4일은 감탄과 경외심이 가득한 나날의 연속이었다.

    아무리 소매치기가 많고, 아무리 무더운 태양이 내리쬐어도 이 곳 로마를 찾는 관광객들이 끊이지 않는 이유가 아니었나 싶다.

    어딜 둘러봐도 유적지같고 셀 수 없이 많은 조각상이 있으며 쿨한 시민들과 인상적인 음식까지.

    지나치면서 만난 사람들과 가이드들, 우리 넷의 인간관계에 있어서도 배운 점이 많았던 좋은 추억이었다.


    이제 열차를 타고 피렌체로 향한다.

    우리는 로마에서 유로자전거투어를 두 개 신청했다. 남부 당일투어와 바티칸 반일투어로, 어쩌면 가장 인기가 많은 투어들 중 하나였지 싶다.

    오늘 할 투어는 남부투어. 아침 7시 30분이라는 이른 시간임에도 불구하고 생각보다 많은 인원이 나와주었다.

    결과적으로 자전거투어는 생각보다 인기도 많고 가이드도 좋으며, 내용까지 알찬 그야말로 단비같은 패키지였다.

    남부의 기후와 그로부터 파생된 문화들과 음식, 지형까지 대부분의 지식을 가이드로부터 들었는데 확실히 아는만큼 보인다고.

    이 문화에 접근하는 마음가짐이 평소와는 다르게 느껴졌다.


    처음에 향한 곳은 폼페이 유적이었다. 약 2000년 전 베수비오 화산이 폭발하면서 한순간에 잿더미가 되어버린 이 도시는 무엇보다 뜨거웠다!

    저 멀리서 베수비오 화산이 터져버린게 아닌가 싶을 정도로 엄청난 열기였다. 이래서 남부의 태양이 유명하구나, 하는 생각도 들었고.

    폼페이 유적은 여러개의 입구가 있는데, 우리 투어는 Marina 입구로 들어가 공중목욕탕을 둘러보며 본격적으로 시작되었다.


    공중목욕탕은 탈의실, 샤워실, 목욕실까지 세 부분으로 나뉘어져 지금의 대중목욕탕과 크게 다를 다 없는 현대적인 구조로 설계되어 있었다.

    우리 역시 그 순서대로 입장했는데, 진행할수록 고대 로마인의 지혜에 감탄할 수 밖에 없었다.

    고대의 샤워실은 뜨거운 물을 데우고 나오는 수증기로 몸을 미리 적시는 구조였는데, 천장에 수증기가 닿아 떨어지게 되는 물방울도 천장을 타고 흘러내리게끔 정교하게 설계되어 있었다. 그뿐이랴, 해가 뜨고 짐에 따라 보이는 음각의 벽면 장식까지. 



    샤워실에서 물이 분수처럼 나오던 곳. 고대 로마인들은 여기 둘러서서 이야기를 주고받았다고 한다.


    이후 각종 가게가 위치해있던 장소로 향했다. 여기서 인상적이었던 가게는 바로 생선가게였다.

    이 더운 남부에서 생선가게? 라고 생각할 수 있지만, 폼페이는 과거 배가 정박했던 흔적이 있는 만큼 수위가 높은 곳이었다.

    생선가게는 벽면에 남아있는 생선 그림과 중앙에 있는 수조에서 그 흔적을 찾아볼 수 있었다.

    그 당시에 생선을 신선하게 유지하기 위해 설치했다고 하는 수조는 지금은 원형으로 박힌 기둥으로 남아 있었다.


    다음에 향한 곳은 폼페이 유적의 하이라이트, 최후의 날이 남긴 그 당시의 사람들이었다.

    역사의 그 날 불었던 평소와는 다른 풍향과 엄청난 잿더미의 양은 당시 생활하던 로마의 삶을 그대로 전해주었다.

    개인적으로 이탈리아와 남부에서 가장 기대했던 부분이었다. 고대인들의 표정까지 보존되어 있다니, 이보다 호기심이 생기는 곳이 없었다.

    그 부분은 가까이에서 보지는 못하고, 식기와 생활용품 등의 유적과 함께 철창속에 전시되어 있었다.



    코를 막고 괴로워하는 고대 로마인이 보이는 듯 하다.


    하지만 생각과는 다르게 표정까지는 섬세하게 보이지 않았다. 하지만 여기 말고도 인간 유적은 폼페이 전체에 전시되어 있다고 한다.

    폼페이에 살던 고대 로마인들은 사치스럽기로 유명했다고 한다. 후대에게 경각심을 보여주기 위해 신이 이 유적을 남긴 것이 아닐까.


    그렇게 약간은 아쉬운 짧은 시간을 보내고, 해안도시인 포지타노로 향했다.

    가는 길은 내셔널 지오그래픽이 선정한 죽기전 가봐야 할 장소에서 1위를 차지한 아말피 해안도로였다.

    왜 1위를 차지했는지 너무나 잘 알 수 있었다. 사진으로 다 옮기지 못할 정도로 드넓은 바다가 펼쳐져 있고, 깎아지르듯 만들어진 수많은 절벽과 산.

    그 끝에 보이는 해안도시와 여유를 즐기는 사람들의 모습까지, 그야말로 압도적인 경치였다.



    잠시 멈춰 먹었던 시원한 수박과 납작복숭아는 평생 잊지 못할 기억일 것이다.



    먼길을 달려 도착한 포지타노는 레몬으로 유명한 도시였다.

    여기서는 마지막 코스인 페리를 타기까지 90분 정도 자유시간을 가질 수 있었는데, 각종 레몬관련 군것질을 할 수 있었다.

    레몬향이 은은하게 맴돌던 시원한 레몬맥주, 새콤달콤하고 차가운 레몬샤베트를 먹었다.



    뜨거운 열기와 어울리는 포지타노만의 특산품이 아닌가 싶다. 


    이후 페리를 타고 총 12개의 해안도시 중 나머지 11개의 도시를 구경하며 투어가 마무리되었다.

    페리를 타고 맞는 시원한 바람과 가이드의 선곡이 잘 어울리며 여행을 한층 아름답게 만들어 주었다.

    더운 날씨임에도 불구하고 열심히 여행자들을 이끌며 고생한 강재원 가이드님에게 뒤늦은 감사를 전합니다.

    + Recent posts