사전 계층
개념

계층

gabury1고친 사람 github-actions[bot]

계층은 큰 일을 위아래로 갈라 맡깁니다. 위쪽은 아래쪽이 해 주는 일에 기대어 자기 몫만 합니다. 그래서 한 군데를 통째로 갈아 끼워도 나머지는 손대지 않습니다. 인터넷으로 웹 페이지를 받아 오는 길도 이렇게 네 겹으로 나뉘어 있습니다.

쉽고 빠른 이해

계층은 큰 일을 위아래로 나눠 맡긴 뒤 그중 한 덩이를 가리키는 말입니다. 웹 요청이 지나가는 응용·전송·네트워크·링크 네 덩이가 그렇습니다.

한 덩이가 모든 일을 맡으면 어느 한 군데만 바뀌어도 전체를 다시 만들어야 합니다. 나눠 두면 바뀐 계층 하나만 고칩니다.

  1. 계층마다 맡을 일을 하나로 정합니다
  2. 위 계층은 아래 계층에게 정해진 방법으로만 일을 맡깁니다
  3. 아래 계층은 위에서 누가 무엇을 보냈는지 모른 채 자기 일만 합니다

대가는 계층을 지날 때마다 붙는 군더더기입니다. 계층마다 안내 정보를 덧붙이거나 데이터를 옮겨 담으므로 보내는 양과 걸리는 시간이 늘어납니다. 갈아 끼울 일이 없는 작은 프로그램이라면 나누지 않는 편이 낫습니다.

상세

우편으로 편지를 부친다고 해 봅시다. 보내는 사람은 봉투에 주소를 적어 우체통에 넣습니다. 우체국은 그 봉투를 어느 지역 차에 실을지 고릅니다. 기사는 그 차를 몰아 길을 갑니다.

셋은 서로의 일을 모릅니다. 보내는 사람은 어느 길로 가는지 모릅니다. 기사는 봉투 안에 무슨 말이 적혔는지 모릅니다. 각자 아래 단계가 제 일을 해 준다고 믿고 자기 몫만 합니다.

소프트웨어를 이렇게 나눈 것이 계층입니다. 큰 일을 위아래로 갈라 놓고 한 덩이에 한 가지 일만 맡깁니다. 그렇게 나뉜 덩이 하나를 계층이라고 부릅니다. 나눠 놓은 짜임 전체는 계층 구조입니다.

계층이 지키는 두 약속

첫째, 기대는 방향이 한쪽입니다. 위 계층은 아래 계층을 불러 일을 맡기지만 아래 계층은 위에 누가 있는지 모릅니다. 아래가 위를 알기 시작하면 두 계층이 서로를 붙잡게 되어 한쪽만 떼어낼 수 없습니다.

둘째, 만나는 방법이 미리 정해져 있습니다. 위 계층은 아래 계층의 속을 들여다보지 않고 정해진 몇 가지 호출이나 약속된 데이터 모양으로만 말을 겁니다. 이렇게 겉으로 드러낸 약속을 인터페이스라고 합니다.

flowchart TD
    U["위 계층"]
    I["인터페이스"]
    L["아래 계층"]
    U -->|"정해진 인터페이스로만 부른다"| I
    I --> L
    L -.->|"모른다 · 못 부른다"| U

이 둘을 지키면 계층 하나를 통째로 바꿔도 위아래가 멀쩡합니다. 집에 들어오는 선이 유선에서 무선으로 바뀌어도 웹 브라우저 코드는 한 줄도 안 고칩니다. 아래가 어떻게 하는지를 위가 모르게 감추는 이 방식이 추상화입니다.

네트워크의 계층

계층이라는 말을 가장 자주 만나는 데가 네트워크입니다. 프로토콜 하나가 모든 일을 맡지 않습니다. 일을 네 계층으로 나눠 계층마다 프로토콜을 따로 둡니다. 프로토콜은 둘이 데이터를 주고받는 순서와 형식을 정해 둔 규칙입니다.

계층 맡는 일 그 일을 맡는 프로토콜
응용 계층 프로그램끼리 무슨 내용을 주고받을지 정한다 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)
전송 계층 프로그램과 프로그램 사이를 잇고 빠진 것을 챙긴다 TCP(Transmission Control Protocol, 전송 제어 프로토콜)
네트워크 계층 여러 네트워크를 건너 목적지까지 길을 찾는다 IP(Internet Protocol, 인터넷 프로토콜)
링크 계층 바로 옆 장비까지 신호를 실어 나른다 이더넷 · Wi-Fi

웹 요청 하나가 이 넷을 위에서 아래로 지납니다. 이렇게 쌓아 놓은 한 벌이 프로토콜 스택입니다.

위 계층이 만든 데이터는 아래 계층에게 그냥 알맹이입니다. 아래 계층은 그 알맹이를 받아 앞에 자기 몫의 안내 정보를 붙입니다. 이 안내 정보가 헤더이고, 위 것을 아래 것 안에 넣는 이 일을 캡슐화라고 합니다.

flowchart TD
    subgraph L["링크 계층이 만든 프레임"]
        LH["링크 헤더"]
        subgraph N["네트워크 계층이 만든 패킷"]
            NH["네트워크 헤더"]
            subgraph T["전송 계층이 만든 세그먼트"]
                TH["전송 헤더"]
                A["응용 계층이 보낸 데이터"]
            end
        end
    end

그림처럼 헤더가 겹겹이 붙으므로 계층마다 나르는 조각의 이름도 달라집니다.

계층 나르는 조각의 이름
전송 계층 세그먼트
네트워크 계층 패킷
링크 계층 프레임

받는 쪽은 아래에서 위로 올라가며 헤더를 하나씩 떼어 냅니다.

계층을 몇 개로 가를지는 보는 사람에 따라 다릅니다. 일곱으로 가르는 OSI 모델이 교재에 자주 나옵니다. OSI 는 Open Systems Interconnection, 곧 개방형 시스템 상호 연결을 줄인 말입니다. 실무에서는 위 표처럼 넷으로 가르는 방식을 더 씁니다.

소프트웨어 구조의 계층

한 프로그램 안에서도 같은 방식으로 나눕니다. 웹 서비스는 흔히 세 계층으로 가릅니다. 화면과 요청을 받는 계층, 규칙을 따지고 계산하는 계층, 데이터를 읽고 쓰는 계층입니다.

여기서도 기대는 방향은 한쪽입니다. 화면 계층은 계산 계층을 부릅니다. 계산 계층은 저장 계층을 부릅니다. 거꾸로는 부르지 않습니다.

이렇게 짜 두면 저장 방식을 파일에서 데이터베이스로 바꿔도 화면 코드를 안 고칩니다. 계층을 나누는 선은 「무엇이 바뀔 때 같이 바뀌는가」로 긋습니다. 같이 바뀌는 것끼리 한 계층에 두고, 따로 바뀌는 것은 다른 계층으로 보냅니다. 이렇게 짠 구조가 계층형 아키텍처입니다.

계층으로 나누고 치르는 값

계층은 공짜가 아닙니다. 계층을 지날 때마다 헤더가 붙거나 데이터를 다른 모양으로 옮겨 담아야 합니다. 네트워크에서는 보내는 양이 늡니다. 프로그램 안에서는 함수 호출과 객체 변환이 늘어납니다.

건너뛰고 싶은 유혹도 생깁니다. 화면 계층이 계산 계층을 건너뛰고 데이터베이스를 바로 부르면 당장은 코드가 짧아집니다. 대신 나중에 저장 방식을 바꿀 때 화면 코드까지 뒤져야 합니다. 이렇게 정해진 순서를 뛰어넘는 것을 계층 위반이라고 부릅니다.

flowchart TD
    V["화면 계층"]
    C["계산 계층"]
    S["저장 계층"]
    V -->|"부른다"| C
    C -->|"부른다"| S
    V -.->|"건너뜀"| S

감춘 것이 다 감춰지지 않는 문제도 있습니다. 아래 계층이 느려지거나 끊기면 위 계층은 이유를 모른 채 결과만 이상해집니다. 이처럼 감춰 둔 속사정이 위로 배어 나오는 것을 누수 추상화라고 합니다.

그래서 언제나 나누는 것이 답은 아닙니다. 바뀔 일이 없고 한 사람이 다 들여다보는 작은 프로그램이라면 나누지 않는 편이 낫습니다. 갈아 끼울 일이 없으면 값만 치릅니다.

위아래를 말하는 다른 뜻의 계층

계층은 지금까지 본 뜻 말고 상하 관계를 가리킬 때도 쓰입니다. 부모와 자식으로 가지를 친 나무 모양을 계층 구조라고 부르기도 합니다. 앞에서 쓴 계층 구조와 글자만 같고 뜻이 다릅니다. 폴더 안에 폴더가 들어가는 짜임이 그렇습니다.

값이 비싼 저장 장치와 싼 저장 장치를 위아래로 놓고 자주 쓰는 데이터를 위로 올리는 방식도 계층이라 부릅니다. 이쪽은 계층형 저장소라는 이름으로 더 자주 만납니다.

가르는 방법은 하나입니다. 위가 아래에게 일을 맡기면 지금까지 본 계층입니다. 위아래가 그저 크기나 순서를 말하면 상하 관계입니다.

관련 항목

계층으로 나눈 네트워크의 각 겹

물리 계층 · 링크 계층 · 네트워크 계층 · 인터넷 계층 · 전송 계층 · 세션 계층 · 표현 계층 · 응용 계층

계층을 몇 개로 가를지 정한 모델

OSI 모델 · TCP-IP 모델 · 프로토콜 스택 · 네트워크

계층마다 오가는 데이터 단위

프레임 · 패킷 · 세그먼트 · 데이터그램 · 페이로드 · 헤더 · 트레일러

계층 사이를 넘어갈 때 일어나는 처리

캡슐화 · 역캡슐화 · 다중화 · 프레이밍 · 단편화 · MTU

계층으로 나눠 짓는 소프트웨어 구조

계층형 아키텍처 · 3계층 구조 · 헥사고날 아키텍처 · 관심사의 분리 · 의존성 역전 원칙 · 모듈

계층이 기대는 설계 원칙

추상화 · 인터페이스 · 정보 은닉 · 느슨한 결합 · 결합도 · 응집도

계층으로 나누고 치르는 대가

오버헤드 · 지연 · 누수 추상화 · 계층 위반 · 디버깅

상하 관계를 말하는 다른 뜻의 계층

계층 구조 · 계층형 저장소 · 계층형 데이터베이스 · 메모리 계층 · 트리 · 계층형 컴파일

계층을 쌓아 만든 대표 프로토콜

HTTP · TCP · IP · UDP · TLS · 이더넷

다른 이름: layer · 레이어