[CS] 프로그래밍 패러다임 / 네트워크 기초

Nakjoo·2023년 1월 3일
0

CS

목록 보기
3/20

1. 프로그래밍 패러다임

프로그래밍 패러다임(programming paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론이다.

예를 들어 객체 지향 프로그래밍은 프로그래머들이 프로그램을 상호 작용하는 객체들의 집합으로 볼 수 있게 하는 반면에, 함수형 프로그래밍은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 해준다.

프로그래밍 패러다임은 크게 선언형, 명령형으로 나누며, 선언형은 함수형이라는 하위 집합을 갖는다. 또한 명령형은 다시 객체지향, 절차지향으로 나눈다.

1.1. 선언형과 함수형 프로그래밍

선언형 프로그래밍(declarative programming)이란 '무엇을' 풀어내는가에 집중하는 패러다임이며, "프로그램은 함수로 이루어진 것이다."라는 명제가 담겨 있는 패러다임이기도 하다. 함수형 프로그래밍(functional programming)은 선언형 패러다임의 일종이다.

1.1.1. 순수 함수

출력이 입력에만 의존하는 것을 의미한다.

1.1.2. 고차 함수

함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것을 말한다.

일급 객체
이때 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져하 아며 그 특징은 다음과 같다.

  • 변수나 메서드에 함수를 할당할 수 있다.
  • 함수 안에 함수를 매개변수로 담을 수 있다.
  • 함수가 함수를 반환할 수 있다.

참고로 함수형 프로그래밍은 이외에도 커링, 불변성 등 많은 특징이 있다.

1.2. 객체지향 프로그래밍

객체지향 프로그래밍(OOP, Object-Oriented Programming)은 객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식을 말한다. 설계에 많은 시간이 소요되며 처리 속도가 다른 플그래밍 패러다임에 비해 상대적으로 느리다.

1.2.1. 객체지향 프로그래밍의 특징

객체지향 프로그래밍은 추상화, 캡슐화, 상속성, 다형성이라는 특징이 있다.

추상화
추상화(abstraction)란 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 의미한다.

캡슐화
캡슐화(encapsulation)는 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것을 말한다.

상속성
상속성(inheritance)은 상위 클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가, 확장하는 것을 말한다. 코드의 재사용 측면, 계층적인 관계 생성, 유지 보수성 측면에서 중요하다.

다형성
다형성(polymorphism)은 하나의 메서드나 클래스가 다양한 방법으로 동작하는 것을 말한다. 대표적으로 오버로딩, 오버라이딩이 있다.

1.2.2. 오버로딩

오버로딩(overloading)은 같은 이름을 가진 메서드를 여러 개 두는 것을 말한다. 메서드의 타입, 매개변수의 유형, 개수 등으로 여러 개를 둘 수 있으며 컴파일 중에 발생하는 '정적'다형성이다.

class Person {
	
    public void eat(String a) {
    	System.out.println("I eat" + a);
    }
    
    public void eat(String a, String b) {
    	System.out.println("I eat" + a + " and " + b);
    }
}

public class CalculateArea {
	public static void main(String[] args) {
    	Person a = new Person();
        a.eat("apple");
        a.eat("tomato", "phodo");
    }
}
/*
I eat apple
I eat tomato and phodo
*/

앞에 코드를 보면 매개변수의 개수에 따라 다른 함수가 호출되는 것을 알 수 있따.

1.2.3. 오버라이딩

오버라이딩은(overriding)은 주로 메서드 오버라이딩(method overriding)을 말하며 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의하는 것을 의미한다.

이는 런타임 중에 발생하는 '동적'다형성이다.

class Animal {
	public void bark() {
    	System.out.println("mumu! mumu!);
    }
}

class Dog extends Animal {
	@Override
    public void bark() {
    	System.ot.println("wal!!! wal!!!");
    }
}

public class Main {
	public static void main(String[] args) {
    	Dog d = new Dog();
        d.bark();
    }
}
/*
wal!!! wal!!!
*/

앞의 코드를 보면 부모 클래스는 mumu! mumu!로 짖게 만들었지만 자식 클래스에서 wal!!! wal!!!로 짖게 만들었더니 자식 클래스 기반으로 메서드가 재정의됨을 알 수 있따.

1.2.4. 설계 원칙

객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜주어야 한다. S는 단일 책임 원칙, O는 개방-폐쇄 원칙, L은 리스코프 치환 원칙, I는 인터페이스 분리 원칙, D는 의존 역전 원칙을 의미한다.

단일 책임 원칙
단일 책임 원칙(SRP, Single Responsibility Principle)은 모든 클래스는 각각 하나의 책임만 가져야 하는 원칙이다. 예를 들어 A라는 로직이 존재한다면 어떠한 클래스는 A에 관한 클래여야 하고 이를 수정한다고 했을 때에도 A와 관련된 수정이어야 한다.

개방-폐쇄 원칙
개방-폐쇄 원칙(OCP, Open Closed Principle)은 유지 보수 사항이 생긴다면 코드를 쉽게 확장할 수 있도록 하고 수정할 때는 닫혀 있어야 하는 원칙이다. 즉, 기존의 코드는 잘 변경하지 않으면서도 확장은 쉽게 할 수 있어야 한다.

리스코프 지환 원칙
리스코프 치환 원칙(LSP, Liskov Substitution Principle)은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 하는 것을 의미한다. 클래스는 상속이 되기 마련이고 부모, 자식이라는 계층 관계가 만들어진다. 이때 부모 객체에 자식 객체를 넣어도 시스템이 문제 없이 돌아가게 만드는 것을 말한다. 즉, 범석 객체가 홍철 객체의 자식 계층일 때 범석 객체를 홍철 객체와 바꿔도 문제가 없어야 하는 것을 말한다.

인터페이스 분리 원칙
인터페이스 분리 원칙(ISP, Interface Segregation Principle)은 하나의 일반적인 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 하는 원칙을 말한다.

의존 역전 원칙
의존 역전 원칙(DIP, Dependency Inversion Principle)은 자신보다 변하기 쉬운 것에 의존하던 것을 추상화 된 인터페이스나 상위 클래스에 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 윈칙을 말한다. 예를 들어 타이어를 갈아끼울 수 있는 틀을 만들어 놓은 후 다양한 타이어를 교체할 수 있어야 한다. 즉, 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 한다.

1.3. 절차형 프로그래밍

절차형 프로그래밍은 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있다. 일이 진행되는 방식으로 그저 코드를 구현하기만 하면 되기 때문에 코드의 가독성이 좋으며 실행 속도가 빠르다. 그렇기 때문에 계산이 많은 작업 등에 쓰인다. 대표적으로 포트란(fortran)을 이용한 대기 과학 관련 연산 작업, 머신 러닝의 배치 작업이 있다. 단점으로는 모듈화하기가 어렵고 유지 보수성이 떨어진다는 점이 있다.

1.4. 패러다임의 혼합

이렇게 여러 가지의 프로그래밍 패러다임을 알아보았다. 그렇다면 어떠한 패러다임이 가장 좋을까? 답은 "그런 것은 없다."라는 것이다. 비즈니스 로직이나 서비스의 특징을 고려해서 패러다임을 정하는 것이 좋다. 하나의 패러다임을 기반으로 통일하여 서비스를 구축하는 것도 좋은 생각이지만 여러 패러다임을 조합하여 상황과 맥락에 따라 패러다임 간의 장점만 취해 개발하는 것이 좋다. 예를 들어 백엔드 머신 러닝 파이프라인 거래 관련 로직이 있다면 머신 러닝 파이프라인은 절차지향형 패러다임, 거래 관련 로직은 함수형 프로그래밍을 적용하는 것이 좋다.

2. 네트워크의 기초

네트워크란 노드(node)와 링크(link)가 서로 연결되어 있으며 리소스를 공유하는 집합을 의미한다.

여기서 노드란 서버, 라우터, 스위치 등 네트워크 장치를 의미하고 링크는 유선 또는 무선을 의미한다.

2.1. 처리량과 지연 시간

네트워크를 구축할 때는 '좋은' 네트워크로 만드는 것이 중요하다. 좋은 네트워크란 많은 처리량을 처리할 수 있으며 지연 시간이 짧고 장애 빈고가 적으며 좋은 보안을 갖춘 네트워크를 말한다.

2.1.1. 처리량

처리량(throughput)이란 링크를 통해 전달되는 단위 시간당 데이터 양을 말한다.

단위로는 bps(bits per second)를 쓴다. 초당 전송 또는 수신되는 비트 수라는 의미다.

처리량은 사용자들이 많이 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 영향을 받는다.

대역폭
주어진 시간 동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수

2.1.2. 지연 시간

지연 시간(latency)이란 요청이 처리되는 시간을 말하며 어떤 메시지가 두 장치 사이를 왕복하는 데 걸린 시간을 말한다.

지연 시간은 매체 타입(무선, 유선), 패킷 크기, 라우터의 패킷 처리 시간에 영향을 받는다.

2.2. 네트워크 토폴로지와 병목 현상

2.2.1. 네트워크 토폴로지

네트워크를 설계할 때 고려하는 네트워크 토폴로지를 알아보겠다. 네트워크 토폴로지(network topology)는 노드와 링크가 어떻게 배치되어 있는지에 대한 방식이자 연결 형태를 의미한다.

트리 토폴로지
트리(tree) 토폴로지는 계층형 토폴로지라고 하며 트리 형태로 배치한 네트워크 구성을 말한다.

노드의 추가, 삭제가 쉬우며 특정 노드에 트래픽이 집중될 때 하위 노드에 영향을 끼칠 수 있다.

버스 토폴로지
버스(bus) 토폴로지는 중앙 통신 회선 하나에 여러 개의 노드가 연결되어 공유하는 네트워크 구성을 말하며 근거리 통신망(LAN)에서 사용한다.

설치 비용이 적고 신뢰성이 우수하며 중앙 통신 회선에 노드를 추가하거나 삭제하기 쉽다. 그러나 스푸핑이 가능한 문제점이 있다.

스푸핑
스푸핑은 LAN상에서 송신부의 패킷을 송신과 관련 없는 다른 호스트에 가지 않도록 하는 스위칭 기능을 마비시키거나 속여서 특정 노드에 해당 패킷이 오도록 처리하는 것을 말한다.

스타 토폴로지
스타(star, 성형) 토폴로지는 중앙에 있는 노드에 모두 연결된 네트워크 구성을 말한다.

노드를 추가하거나 에러를 탐지하기 쉽고 패킷의 충돌 발생 가능성이 적다. 또한, 어떠한 노드에 장애가 발생해도 쉽게 에러를 발견할 수 있으며 장애 노드가 중앙 노드가 아닐 경우 다른 노드에 영향을 끼치는 것이 적다. 하지만 중앙 노드에 장애가 발생하면 전체 네트워크를 사용할 수 없고 설치 비용이 고가이다.

링형 토폴로지
링형(ring) 토폴로지는 각각의 노드가 양 옆의 두 노드와 연결하여 전체적으로 고리처럼 하나의 연속되 길을 통해 통신을 하는 망 구성 방식이다.

데이터는 노드에서 노드로 이동을 하게 되며, 각각의 노드는 고리 모양의 길을 통해 패킷을 처리한다.

노드 수가 등가되어도 네트워크상의 손실이 거의 없고 충돌이 발생되는 가능성이 적고 노드의 고장 발견을 쉽게 찾을 수 있다. 하지만 네트워크 구성 변경이 어렵고 회선에 장애가 발생하면 전체 네트워크에 영향을 크게 끼치는 단점이 있다.

메시 토폴로지
메시(mesh) 토폴로지는 망형 토폴로지라고도 하며 그물망처럼 연결되어 있는 구조이다.

한 단말 장치에 장애가 발생해도 여러 개의 경로가 존재하므로 네트워크를 계속 사용할 수 있고 트래픽도 분산 처리가 가능하다. 하지만 노드의 추가가 어렵고 구축 비용과 운용 비용이 고가인 단점이 있다.

2.2.2. 병목 현상

전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상을 말한다. 서비스에서 이벤트를 열었을 때 트래픽이 많이 생기고 그 트래픽을 잘 관리하지 못하면 병목 현상이 생겨 사용자는 웹 사이트로 들어가지 못한다.

2.3. 네트워크 분류

LAN
LAN은 근거리 통신망을 의미하며 같은 건물이나 캠퍼스 같은 좁은 공간에서 운영된다. 전송속도가 빠르고 혼잡하지 않다.

MAN
MAN은 대도시 지역 네트워크를 나타내며 도시 같은 넓은 지역에서 운영된다. 전송 속도는 평균이며 LAN보다는 더 많이 혼잡하다.

WAN
WAN은 광역 네트워크를 위미하며 국가 또는 대륙 같은 더 넓은 지역에서 운영한다. 전송 속도는 낮으며 MAN보다 더 혼잡하다.

2.4. 네트워크 성능 분석 명령어

애플리케이션 코드 상에는 전혀 문제가 없는데 사용자가 서비스로부터 데이터를 가져오지 못하는 상황이 발생하기도 한다. 이는 네트워크 병목 현상일 가능성이 있다.

병목 현상의 주된 원인

  • 네트워크 대역폭
  • 네트워크 토폴로지
  • 서버 CPU, 메모리 사용량
  • 비효율적인 네트워크 구성

2.4.1. 명령어

ping
ping(Packet INternet Groper)은 네트워크 상태를 확인하려는 대상 노드를 향해 일정 크기의 패킷을 전송하는 명령어이다. 이를 통해 해당 노드의 패킷 수신 상태와 도달하기까지 시간 등을 알 수 있으며 해당 노드까지 네트워크가 잘 연결되어 있는지 확인할 수 있다. ping은 TCP/IP 프로토콜 중에 ICMP 프로토콜을 통해 동작하며, 이 때문에 ICMP 프로토콜을 지운하지 않는 기기를 대상으로는 실행할 수 없거나 네트워크 정책상 ICMP나 traceroue를 차단하는 대상의 경우 ping 테스팅을 불가능하다.

netstat
netstat 명령어는 접속되어 있는 서비스들의 네트워크 상태를 표시하는 데 사용되며 네트워크 접속, 라우팅 테이블, 네트워크 프로토콜 등 리스트를 보여준다. 주로 서비스의 포트가 열려 있는지 확일할 때 쓴다.

nslookup
nslookup은 DNS에 관련된 내용을 확인하기 위해 쓴느 명령어이다. 특정 도메인에 매핑된 IP를 확인하기 위해 사용한다.

tracert
위도우에서는 tracert이고 리눅스에서는 traceroute라는 명령어로 구동된다. 목적지 노드까지 네트워크 경로를 확인할 때 사용하는 명령어이다. 목적지 노드까지 구간들 중 어느 구간에서 응답 시간이 느려지는지 등을 확일할 수 있다.

이외에도 ftp를 통해 대형 파일을 전송하여 테스팅하거나 tcpdump를 통해 노드로 오고가는 패킷을 캡처하는 등의 명령어가 있으며 네트워크 분석 프로그램으로는 wireshark, netmon이 있다.

2.5. 네트워크 프로토콜 표준화

네트워크 프로토콜이란 다르 장치들끼리 데이터를 주고받기 위해 설정된 공통된 인터페이스를 말한다. 이러한 프로토콜은 기업이나 개인이 발표해서 정하는 것이 아니라 IEEE 또는 IETF라는 표준화 단체가 이를 정한다.

IEEE802.3은 유선 LAN 프로토콜로, 유선으로 LAN을 구축할 때 쓰이는 프로토콜이다. 이를 통해 만든 기업이 다른 장치라도 서로 데이터를 수신할 수 있다.

'서로 약속된' 인터페이스인 HTTP라는 프로토콜을 통해 노드들은 웹 서비스를 기반으로 데이터를 주고받을 수 있다.

0개의 댓글