OSI 7 Layer Model은 70-80년대 ISO 표준 국제 기구에서 OSI Model (Open Systems Interconnection Reference Model)이라는 정식 명칙으로 만들어진 고~~~대의 통신 모델입니다. 수십년이 지난 지금도 표준모델로써의 역할을 활발히 하고 있지요.

 

그런데 왜? 이 고대의 표준모델을 가지고 왔느냐?

  • 추상화의 이해
    • 요즘 추상화를 통해서 의존도를 줄이는 개발방법론들 아키텍쳐들( DDD, Clean Architecture등) 이 쏟아져 나오고 있죠. 이 추상화 기법들이 OSI의 기본 개념들로부터 이해하면 좀더 쉬운 이해가 될수있습니다.
    • OSI는 인프라부터 응용영역까지 어떻게 추상화하여 단순화해 나아가고 하위 계측에 대한 의존도를 줄이는지는 아주 적절히 표현하고 있습니다.
    • DDD와 Clean Architecture의 기본개념도 의존도의 방향에 대해 강하게 어필하는것 처럼 OSI도 의존도에 대한 계측과 방향이 중요합니다.
    • 지난 수십년간의 tcp, upd, http등의 구현물들을 보면 추상화에 대한 수많은 기법들을 손쉽게 배울 수 있습니다.
  • 통신 패러다임의 이해
    • 요즘 MSA의 등장으로 HTTP가 통신의 기본처럼 되었지만 사실은 HTTP의 하위 layer가 존재하고 http는 이 하위 레이어들의 구현으로 이루어 진다는걸 알면 보안, 압축, 퍼포먼스등에 좀더 빠르게 대응이 가능합니다.
    • TLS( Transport Layer Security, 이전글 참조 SSL(Secure Sockets Layer) vs TLS(Transport Layer Security))라는 개념을 접했을떄 우리는 TLS가 Transport Layer에 위치해 있구나 TCP, UDP등에 적용되는 기술이구나 Session과 Application 기능은 구현되어 있지 않겠구나 .... 바로 추축 할 수 있습니다. 
    • 수많은 하드웨어 규격 ( RS232, RJ45, BLE, E1/CAS 등)은 Data Link Layer Protocol을 만족하면 되고 Application 측면에서 하드웨어들을 사용하면 (BLE, RS232 등)을 사용할때는 Applicaiton Layer, 최소 Network Layer, Transport Layer만 이해하면 가능하고... OSI를 통하여 상호 커뮤니케이션이 가능합니다.

 

 

위의 그림은 정말 OSI 7 Layer를 잘 표현해 준 그림인 듯합니다. 

각각의 layer는 하위 layer로 구현되고 다른 layer는 관심사가 아닙니다. 표준 protocol만 잘 지키면 여타 다른 layer의 의존도를 회기적으로 끈어 낼수있지요. 

 

개발자 답게 코드로 이해 합시다.

 

FTP를 예를 들어보자.

 

FTP의 기능을 2가지로 정의해 보자.

* 파일전송

* 파일수신

 

FTP는 단순히 파일을 전송하고 수신하는 일을 하고 이를 구현하기 위하여 TCP또는 UDP layer를 사용하며 TCP, UDP의 구현방식에는 관심이 없다.

fn ftp::send(file_path){
	let data = read_file();
    
    let handle = tcp::connect(address);
	let data = read_file();
    tcp::send(data);
    tcp::close(handle)
}

위의 코드에서 FTP는 "tcp::"함수들의 구현/변경에는 관심이 없다. 위의 코드만으로 구현이 끝난상황이다. 

 

여기서 tcp::send() 를 구현해 보자. 

fn tcp::send(data : array){
    loop{
    	let packet = slice_packet(data);
        ip:send_packet(packet)
    }
}

여기서도 TCP 프로토콜은 ip:send_packet()함수의 구현/변경에는 또한 관심이 없다.

 

!!! 어??? 그럼 tcp:send를 테스트하기 위해서는 ftp::send()가 구현되기를 기다려야하나? 어라? HTTP에서도 쓴다네?

아~~ tcp를 많은 상위 layer에서 어떻게 쓰이는지 모르고 "상위 layer의 구현 또한 관심이 없으므로 unit test을 잘 만들어서 품질을 보장하자"가 TDD의 기본 개념이지 않을까 싶다.

 

상위 layer가 없으므로 unit test를 만들어 나가면서 구현을 해 나아가는것이다.

[#test]
fn test_send_zero_sized(){
}

[#test]
fn test_send_packet_sized(){
}

[#test]
fn test_send_long_sized(){
}

 

급하게 마무리한 감이 있는데 .. ㅠ.ㅠ 점차 채워가겠습니다. ^^

 

+ Recent posts