면접을 위한 CS 전공지식 노트를 읽고

Hyun·2023년 7월 17일
0

공부한거 정리

목록 보기
10/20
post-thumbnail

면접을 위한 CS 전공지식 노트를 읽고

  • 책을 읽으며 중요하다고 생각되는 내용들과 부족한 내용들을 보충하여 정리하였다.

정리한 Chapter

  • 1장 디자인 패턴과 프로그래밍 패러다임
  • 2장 네트워크

디자인 패턴과 프로그래밍 패러다임

  • 디자인 패턴이란

    • 프로그램을 설계할 때 자주 발생했던 문제점들에 적용할 수 있는 해결방법

    • 객체 간의 상호 관계등을 패턴화하여 정리


라이브러리와 프레임워크

  • 라이브러리

    • 공통으로 사용될 수 있는 특정한 기능들의 모듈화

    • 폴더명, 파일명과 같은 규칙이 없고 프로그래머가 자유롭게 직접 컨트롤한다.

  • 프레임워크

    • 공통으로 사용될 수 있는 특정한 기능들의 모듈화

    • 폴더명, 파일명과 같은 규칙이 존재하며, 프레임워크 개발자가 구현한 서브 클래스를 사용한다.

    • 프로그래머의 코드가 프레임워크의 지배를 받는다.


싱글톤 패턴

  • 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }
}

  • 클래스별로 인스턴스를 한번만 생성하기 때문에 인스턴스 생성 비용이 줄어든다.

  • 클래스들이 강하게 결합하여 의존성이 높아지고, 테스트가 어려워진다.

    • DIP 위반

    • OCP 위반 가능성 높음

    • 의존하는 객체들을 Mock 객체로 대체하기 어려워 테스트가 어렵다.


팩토리 패턴

  • 객체 생성 부분을 떼어내 추상화한 패턴

  • 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정

 public abstract class PizzaStore{

	abstract Pizza createPizza(String type); //Pizza 인스턴스를 만드는 일은 팩토리 역할을 하는 메소드에서 맡아 처리

 }
 
  public class NYPizzaStore extends PizzaStore{

	@Override

	public Pizza createPizza(String type){

		Pizza pizza = null;

		if(type.equals("cheese")) pizza = new NYStyleCheesePizza();

		if(type.equals("peper")) pizza = new NYStylePepperoniPizza();

		if(type.equals("clam")) pizza = new NYStyleClamPizza();

		if(type.equals("veggie")) pizza = new NYStyleVeggiePizza();

		return pizza;

	}

 } 
 
  public class ChicagoPizzaStore extends PizzaStore{

	@Override

	public Pizza createPizza(String type){

		Pizza pizza = null;

		if(type.equals("cheese")) pizza = new ChicagoStyleCheesePizza();

		if(type.equals("peper")) pizza = new ChicagoStylePepperoniPizza();

		if(type.equals("clam")) pizza = new ChicagoStyleClamPizza();

		if(type.equals("veggie")) pizza = new ChicagoStyleVeggiePizza();

		return pizza;

	}

 } 

 public class PizzaTestDrive {

	public static void main(String[] args) {

		PizzaStore nyStore = new NYPizzaStore();

		PizzaStore chicagoStore = new ChicagoPizzaStore();

		
		Pizza nySytpePizza = nyStore.createPizza("cheese");

	}
 } 


  • 상위 클래스와 하위 클래스가 분리되어 느슨한 결합을 가진다.

    • PizzaStore nyStore = new NYPizzaStore();

    • 상위 클래스는 인스턴스 생성 방식을 전혀 모른다.

  • 객체 생성 로직이 따로 분리되어 있어 유지 보수성 증가

전략 패턴

  • 객체의 행위를 바꾸고 싶은 경우, 직접 수정하지 않고 전략 이라는 캡슐화한 알고리즘을 바꿔 행위를 교체하는 패턴
public interface MovableStrategy {
    public void move();
}

public class RailLoadStrategy implements MovableStrategy{
    public void move(){
        System.out.println("선로를 통해 이동");
    }
}

public class LoadStrategy implements MovableStrategy{
    public void move() {
        System.out.println("도로를 통해 이동");
    }
}

전략 패턴


public class Moving {
    private MovableStrategy movableStrategy;

    public void move(){
        movableStrategy.move();
    }

    public void setMovableStrategy(MovableStrategy movableStrategy){
        this.movableStrategy = movableStrategy;
    }
}

public class Bus extends Moving{

}

public class Train extends Moving{

}

운송 수단


public class Client {
    public static void main(String args[]){
        Moving train = new Train();
        Moving bus = new Bus();

        /*
            기존의 기차와 버스의 이동 방식
            1) 기차 - 선로
            2) 버스 - 도로
         */
        train.setMovableStrategy(new RailLoadStrategy());
        bus.setMovableStrategy(new LoadStrategy());

        train.move();
        bus.move();

        /*
            선로를 따라 움직이는 버스가 개발
         */
        bus.setMovableStrategy(new RailLoadStrategy());
        bus.move();
    }
}

클라이언트 구현

  • 이를 통해 OCP 를 지킬 수 있다.

옵저버 패턴

  • 객체의 상태 변화를 관찰한다.

  • 객체의 상태 변화가 감지되면 옵저버들에게 변화를 알려준다.

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

class Topic implements Subject {
    private List<Observer> observers;
    private String message; 

    public Topic() {
        this.observers = new ArrayList<>();
        this.message = "";
    }

    @Override
    public void register(Observer obj) {
        if (!observers.contains(obj)) observers.add(obj); 
    }

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj); 
    }

    @Override
    public void notifyObservers() {   
        this.observers.forEach(Observer::update); 
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    } 
    
    public void postMessage(String msg) {
        System.out.println("Message sended to Topic: " + msg);
        this.message = msg; 
        notifyObservers();
    }
}

객체

  • 옵저버들을 관리한다.
  • 객체의 변화 발생 시, 옵저버들에게 알림

interface Observer {
    public void update(); 
}

class TopicSubscriber implements Observer {
    private String name;
    private Subject topic;

    public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
    }

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this); 
        System.out.println(name + ":: got message >> " + msg); 
    } 
}

옵저버


public class HelloWorld { 
    public static void main(String[] args) {
        Topic topic = new Topic(); 
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c); 
   
        topic.postMessage("amumu is op champion!!"); 
    }
}
/*
Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!
*/ 

클라이언트


프록시 패턴

  • 대상 객체에 접근하기 전, 대리 객체(프록시 객체)가 접근에 대한 흐름을 가로챈다.

    • 프록시 객체에서 추가적인 로직을 수행한다.
  • 프록시 객체는 대상 객체 앞단의 인터페이스 역할을 하게 된다.

  • 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있다.

public interface Image {
    public void displayImage();
}

public class Real_Image implements Image {
	private String fileName;
    
    public Real_Image(String fileName) {
    	this.fileName = fileName;
    }
    
    private void loadFromDisk(String fileName) {
    	System.out.println("로딩: " + fileName);
    }
    
    @Override
    public void displayImage() {
        System.out.println("보여주기: " + fileName);
    }
}

public class Proxy_Image implements Image {
    private String fileName;
    private Real_Image realImage;
    
    public Proxy_Image(String fileName) {
    	this.fileName = fileName;
    }
    
    @Override
    public void displayImage() {
    	if (realImage == null) {
        	realImage = new Real_Image(fileName);
        }
        realImage.displayImage();
    }
}

public class Client {
    public static void main(String args[]) {
        Image image1 = new Proxy_Image("test1.jpg);
        Image image2 = new Proxy_Image("test2.jpg);
        
        image1.displayImage();
        image2.displayImage();
    }
}

프록시 서버

  • 클라이언트가 오리진 서버가 제공하는 서비스 접근 시, 프록시 서버를 먼저 거쳐 오리진 서버로 들어오는 방식

  • 대표적으로 nginx 가 있다.

    • Load Balancing 수행

    • Caching

      • 오리진 서버의 응답에서 수신한 콘텐츠를 캐싱해, 매번 동일한 콘텐츠를 오리진 서버에 연결해 가져올 필요없이 캐싱된 콘텐츠를 클라이언트에게 응답한다.
    • SSL Termination

      • SSL 연결을 처리 및 해독하는 SSL 끝점 역할을 수행
    • DDOS 공격 완화

      • 단일 IP 주소 당 연결 수를 설정하여 액세스를 제한할 수 있다.

      • 클라이언트 위치와 User-Agent, Referer 기반으로 액세스 차단 및 제한할 수 있다.


CDN

  • Content Delivery Network (Content Distribution Network)

    • 콘텐츠 전송 네트워크
  • 사용자가 오리진 서버와 멀리 떨어져 있는 경우, 동영상 이미지와 같은 대용량 파일을 로드할 때 많은 시간이 걸린다.

  • 지리적으로 사용자와 가까운 CDN 서버에 콘텐츠를 저장한 뒤, 사용자에게 보다 빠르게 콘텐츠를 제공하여 대기 시간 및 통신 지연 시간을 줄인다.

  • 장점

    • 페이지 로드 시간 단축

    • 오리진 서버의 대역폭 비용 절감

    • 콘텐츠 가용성 상승

      • 오리진 서버의 로드를 줄이고, 하나 이상의 CDN 서버의 장애 시 다른 CDN 서버로 서비스를 대체 가능
    • 보안 강화

      • DDos 와 같은 가짜 트래픽이 CDN 서버로 분산되므로, 오리진 서버에 미치는 영향을 줄인다.
  • CDN 동작 방식

    • 지리적으로 멀리 떨어진 웹 사이트 방문자가 사이트에 정적 웹 콘텐츠를 처음 요청한다.

    • 요청이 오리진 서버에 도달한다.

    • 오리진 서버는 웹 사이트 방문자와, 방문자와 지리적으로 가장 가까운 CDN POP(접속 지점)에 응답을 보낸다.

    • CDN POP 서버는 응답을 캐싱된 파일로 저장한다.

    • 이후, 해당 위치에 있는 방문자들이 동일한 요청을 하면, 오리진 서버가 아닌 CDN POP 서버가 응답을 보낸다.


이터레이터 패턴

  • 이터레이터를 사용하여 컬렉션 요소들에 접근하는 디자인 패턴

    • 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다.
  • 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공한다.

  • 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들수 있다.

const mp = new Map() 
mp.set('a', 1)
mp.set('b', 2)
mp.set('cccc', 3) 
const st = new Set() 
st.add(1)
st.add(2)
st.add(3) 
const a = []
for(let i = 0; i < 10; i++)a.push(i)

for(let aa of a) console.log(aa)
for(let a of mp) console.log(a)
for(let a of st) console.log(a) 
/* 
1
2
3
4
...

[ 'a', 1 ]
[ 'b', 2 ]
[ 'c', 3 ]

1
2
3
*/

array, map, set 상관없이 for 문으로 순회한다.

  • for 문이 이터레이터 프로토콜이 된다.

MVC 패턴

  • 애플리케이션 구성 요소를 Model, View, Controller 로 구분

    • 각각의 구성 요소에만 집중해서 개발할 수 있다.

    • 재사용성과 확장성 증가

  • 단순하다.

  • 뷰와 모델 사이의 의존성이 높다.

  • 컨트롤러
    • HTTP 요청을 받아 파라미터를 검증
    • 비즈니스 로직 호출
    • 뷰에 전달할 결과 데이터를 조회해 모델에 담음
      • 모델과 뷰를 잇는 다리 역할
    • 모델과 뷰의 생명주기 관리

  • 모델
    • 뷰에 출력할 데이터를 담는 통
    • 모델 덕분에 뷰는 비즈니스 로직을 몰라도 화면 렌더링 가능

    • 모델에 담겨있는 데이터를 사용해 화면을 렌더링

  • 동작 방식

    • 사용자의 Action 이 컨트롤러로 들어온다.

    • 컨트롤러는 사용자의 Action 을 확인하고 모델을 업데이트한다.

    • 컨트롤러는 화면을 렌더링할 뷰를 선택하여 모델을 넘겨준다.

    • 뷰는 모델을 이용하며 화면을 렌더링한다.


MVP 패턴

  • 애플리케이션 구성 요소를 Model, View, Presenter 로 구분

  • Presenter 와 뷰가 1대1 관계이다.

  • 뷰와 모델 사이의 의존성이 없다.

  • 뷰와 Presenter 사이의 의존성이 높다.

  • Presenter
    • 뷰에서 요청한 정보로 모델을 가공하여 뷰에 전달한다.

  • 동작 방식

    • 사용자의 Action 이 뷰를 통해 들어온다.

    • 뷰는 Presenter 에 데이터를 요청한다.

    • Presenter 는 모델에게 데이터를 요청한다.

    • 모델은 Presenter 에게 요청받은 데이터를 응답한다.

    • Presenter 는 뷰에게 데이터를 응답한다.

    • 뷰는 Presenter 가 응답한 데이터를 이용해 화면을 렌더링한다.


MVVM 패턴

  • 애플리케이션 구성 요소를 Model, View, View Model 로 구분

  • 뷰 모델과 뷰가 1대 N 관계이다.

  • 각 부분들이 모두 독립적이다.

  • 뷰 모델의 설계가 쉽지 않다.

  • View Model
    • 뷰를 표현하기 위해 만든 뷰를 위한 모델
    • 뷰를 나타내기 위한 데이터 처리를 한다.

  • 동작 방식

    • 사용자들의 Action 이 뷰를 통해 들어온다.

    • 뷰에 Action 이 들어오면 Command 패턴으로 뷰 모델에 Action 을 전달한다.

    • 뷰 모델은 모델에게 데이터를 요청한다.

    • 모델은 뷰 모델에게 요청받은 데이터를 응답한다.

    • 뷰 모델은 응답 받은 데이터를 가공하여 저장한다.

    • 뷰는 뷰 모델과 Data Binding 하여 화면을 나타낸다.


커맨드 패턴

  • 내부 동작을 위한 모든 정보를 하나의 객체로 캡슐화한다.

    • 유사한 동작을 하나의 객체로 묶어 실행하는 행위 패턴
  • 인테페이스에 대한 구현체를 런타임에 의존성 주입하면서 실행하는 점이 전략패턴과 유사하다.

  • 전략 패턴과의 차이점

    • 커맨드 패턴은 무엇을 할지에 집중한다.

      • 어떤 동작을 할 지는 리시버가 결정한다.

      • 커맨드 패턴은 인터페이스의 규약이 강하지 않다.

      • 피자를 요리한다 , 파스타를 요리한다

    • 전략 패턴은 어떻게 할지에 집중한다.

      • 정해진 무엇을 하는데 필요한 알고리즘을 확장가능하게 만든 디자인 패턴이다.

      • 어떻게 를 메소드의 파라미터로 넘겨준다.

      • 리시버가 존재하지 않는다.

      • 피자를 오븐으로 굽는다, 피자를 화덕으로 굽는다


프로그래밍 패러다임

  • 프로그래밍의 관점을 갖게 해주는 개발 방법론

  • 대표적으로 절차지향, 객체지향, 함수형 프로그래밍이 있다.


함수형 프로그래밍

  • "프로그램은 함수로 이루어져 있다" 는 관점

  • 순수함수들을 블록처럼 쌓아 로직을 구현한다.

    • 순수함수
      • 동일한 입력에 대해 항상 같은 값을 반환하는 함수
      • 외부의 상태를 변경하지 않는다.
  • 고차함수를 통해 재사용성을 높인다.

    • 고차함수

      • 함수를 인자로 받을 수 있고, 함수를 반환할 수 있는 함수
    • 일급객체

      • 변수에 할당 가능

      • 다른 함수의 인자로서 전달 가능

      • 다른 함수의 결과로서 반환 가능


객체지향 프로그래밍

  • "프로그램은 객체들의 상호작용이다" 라는 관점

  • 특징

    • 추상화 : 복잡한 자료, 모듈로부터 핵심적인 개념, 기능을 간추려 내는 것

    • 캡슐화 : 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화

    • 상속성 : 부모 클래스의 특성을 하위 클래스가 이어 받아, 부모의 특성을 재사용하고 확장 할 수 있는 것

    • 다형성 : 동일한 메시지를 전송하더라도, 실제 어떤 메서드가 실행될 것인지는 메시지 수신 객체의 클래스가 무엇이냐에 따라 달라지는 것

      • 오버로딩

        • 매개변수 타입, 개수가 다르면 같은 이름을 가진 메서드를 여러개 만들 수 있는 것

        • 컴파일 중에 발생하는 정적 다형성

      • (메서드) 오버라이딩

        • 부모 클래스와 자식 클래스의 메서드 시그니처가 동일한 경우, 부모 클래스의 구현을 자식 클래스의 새로운 구현으로 대체하는 것

        • 런타임 중에 발생하는 동적 다형성

  • SOLID 설계 원칙

    • SRP : Single Responsibility Principle

      • 단일 책임 원칙

      • 모든 클래스는 하나의 책임만을 가져야 한다.

    • OCP : Open Closed Principle

      • 개방-폐쇄 원칙

      • 확장에는 열려 있고 수정에는 닫혀 있어야 한다.

    • LSP : Liskov Substitution Principle

      • 리스코프 치환 원칙

      • 부모 클래스를 자식 클래스로 대체하더라도 시스템이 문제없이 동작할 것임을 보장해야 한다.

    • ISP : Interface Segregation Principle

      • 인터페이스 분리 원칙

      • 하나의 일반적인 인터페이스가 아니라, 구체적인 여러개의 인터페이스를 만들어야 한다.

    • DIP : Dependency Inversion Principle

      • 의존성 역전 원칙

      • 상위 수준 클래스는 하위 수준 클래스가 아니라 추상화에 의존해야 한다.


절차형 프로그래밍

  • 프로그램의 진행 방식대로 코드를 구현

  • 실행속도가 빠르다.

  • 모듈화하기 어렵고, 유지보수성이 떨어진다.


네트워크

  • 컴퓨터 등의 장치들이 통신 기술을 이용하여 구축하는 연결망

  • 노드와 링크가 서로 연결되어 있거나 단절되어 있는 집합체

    • 노드 : 서버, 라우터, 스위치 같은 네트워크 장치

    • 링크 : 유선, 무선 연결


처리량 (Throughput)

  • 네트워크 연결을 통해 전달되는 단위 시간당 데이터 양

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


  • 단위 : bps (bits per second)

네트워크 토폴로지

  • 트리 토폴로지

    • 노드의 추가, 삭제가 쉽다.

    • 상위 노드에 트래픽이 집중되면 하위 노드에 영향을 줄 수 있다.


  • 버스 토폴로지

    • 중앙 통신 회선 하나에 여러개의 노드가 연결되어 있다.

    • LAN (근거리 통신망) 에서 사용한다.

    • 설치 비용이 적고 노드의 추가, 삭제가 쉽다.


  • 스타 토폴로지

    • 중앙에 있는 노드에 모두 연결되어 있다.

    • 노드 추가, 삭제가 쉽다.

    • 특정 노드의 장애를 쉽게 발견하고 처리할 수 있다.

    • 중앙 노드의 장애 발생 시, 전체 네트워크를 사용할 수 없다.

    • 설치 비용이 고가이다.


  • 링형 토폴로지

    • 고리처럼 하나의 연속된 길을 통해 통신한다.

    • 네트워크 구성 변경이 어렵고, 회선 장애 발생 시 전체 네트워크가 영향을 받는다.

    • 데이터간의 충돌이 발생하지 않는다.


  • 메시 토폴로지

    • 한 장치에 장애가 발생해도 네트워크를 계속 사용할 수 있다.

    • 네트워크 구성 변경이 어렵다.

    • 구축 비용 및 운용 비용이 많이 든다.


네트워크 분류

  • LAN (Local Area Network)

    • 근거리 통신망

    • 전송 속도 ↑, 혼잡도 ↓

  • MAN (Metropolitan Area Network)

    • 지역 네트워크

    • 전송속도 중간, 혼잡도 중간

  • WAN (Wide Area Network)

    • 광역 네트워크 (국가)

    • 전송 속도 ↓, 혼잡도 ↑


네트워크 성능 분석 명령어

  • ping

    • 네트워크 상태를 확인하려는 대상 노드를 향해 일정 크기의 패킷 전송

    • ICMP 프로토콜을 통해 동작

      • ICMP 프로토콜 미지원 시 ping 테스트 불가


  • netstat

    • network status 의 약자로 네트워크의 상태를 보여주는 명령어

    • 내부 IP, 외부 IP, 포트 번호, 연결 상태를 나타낸다.


  • nslookup

    • 인터넷 DNS (도메인 이름 서버) 관련 조회를 할 수 있는 명령어

    • 도메인을 입력하면 해당 도메인의 IP 주소를 출력


  • tracert

    • trace route

    • 특정 호스트에 도달할 때까지 통과하는 경로와 지연 시간을 추적하는 명령어

    • ICMP 프로토콜을 통해 동작


TCP/IP 4계층 모델

  • 네트워크에서 사용하는 프로토콜의 집합을 설명하기 위한 모델


  • 다른 모델로는 OSI 7계층 모델이 있다.


  • 계층 구조로, 특정 계층의 변경이 다른 계층에 영향을 주지 않는다.
    • 유연한 설계

애플리케이션 계층

  • 응용 프로그램이 사용되는 프로토콜 계층

    • 사람들에게 실질적인 서비스 제공
  • FTP

    • File Transfer Protocol

    • 하나의 호스트에서 다른 호스트로 파일을 복사하기 위한 프로토콜

    • 평문 전송을 수행하므로, 보안상 좋지 않다.

  • SSH

    • Secure Shell

    • 네트워크 상의 다른 PC나 서버에 로그인, 원격 명령 실행, 파일 전송등을 수행할 수 있는 프로토콜

    • 암호화를 통해 데이터를 전달한다. (평문 x)

    • 22번 포트 사용

  • SMTP

    • Simple Mail Transfer Protocol

    • 인터넷 연결을 통하여 이메일을 보낼 때 사용되는 프로토콜

  • DNS

    • Domain Name System

    • 입력한 도메인 이름을 실제 네트워크상에서 사용하는 IP 주소로 변환한다.


DNS

  1. 브라우저에서 원하는 도메인을 검색하면, ISP 의 DNS 서버에게 도메인 주소에 해당하는 IP 주소를 요청한다.
    캐시 데이터가 있다면 바로 8번으로 이동한다.
  2. 루트 DNS 서버에게 어디로 가야할지 물어본다.
  3. 루트 서버는 다음 목적지인 TLD DNS 서버 주소를 안내한다.
  4. TLD DNS 서버에게 어디로 가야할지 물어본다.
  5. TLD DNS 서버는 다음 목적지인 Authoritative DNS 서버 주소를 안내한다.
  6. Authoritative DNS 서버에게 찾는 도메인의 실제 IP 주소를 물어본다.
  7. Authoritative DNS 서버는 실제 IP 주소를 알려주고, ISP DNS 서버는 이를 캐시에 저장한다.
  8. ISP DNS 서버는 IP 주소를 브라우저에게 안내한다.

  • 루트 DNS 서버

    • ICANN 이 직접 관리하는 서버로, TLD DNS 서버 IP들을 저장하고 안내한다.
  • TLD DNS 서버

    • Top Level Domain (최상위 도메인) 서버

    • 도메인 등록 기관이 관리하는 서버

    • Authoritative DNS 서버들의 IP를 저장하고 안내한다.

  • Authoritative DNS 서버

    • 실제 개인 도메인 IP 주소의 관계가 기록되는 서버

      • 실제 IP 주소의 권한을 가진 서버
    • 일반적으로는 도메인 판매 업체들의 네임 서버를 의미

  • Recursive DNS 서버

    • 인터넷 사용자가 가장 먼저 접근하는 DNS 서버

    • 한 번 알아낸 도메인 - IP 주소 관계를 캐싱하는 서버

    • ISP DNS 서버, 구글 DNS 서버, Public DNS 서버 등이 있다.


전송 계층

  • 송신자와 수신자를 연결하는 통신 서비스 제공

    • 연결지향 데이터 스트림 지원

    • 신뢰성

    • 흐름제어

  • TCP

    • 연결지향 프로토콜

    • 패킷 사이 순서를 보장한다.

    • 신뢰성 ↑

    • 가상 회선 패킷 교환 방식

      • 모든 패킷은 가상 회선을 따라 이동

      • 각 패킷이 전송된 순서대로 도착하는 방식


  • UDP

    • 패킷 사이 순서 보장 x

    • 수신 여부 확인 x

    • 단순하게 데이터만 전달

    • 데이터그램 패킷 교환 방식

      • 각 패킷이 최적의 경로를 선택하여 독립적으로 이동

      • 전송 순서대로 도착하지 않을 수 있다.


TCP 3-way handshake

  • 클라이언트와 서버가 통신할 때 수행
    • 이를 통해 신뢰성 확보

  • ISN
    • Initial Sequence Numbers
    • TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀸스 번호
  • SYN
    • 연결 요청 플래그
    • 자신의 ISN 을 보낸다.
  • ACK
    • 응답 플래그
    • 상대의 ISN + 1 을 보낸다.

TCP 4-way handshake

  • 클라이언트와 서버가 연결을 해제할 때 수행

  • FIN
    • 연결 종료 플래그
  • TIME_WAIT
    • 서버 측에서, FIN 플래그 이전에 전송한 패킷이 지연되어 FIN 플래그보다 늦게 도착할 수 있다.
    • 이러한 현상을 대비하여, 클라이언트 측에서 FIN 플래그를 받더라도 일정시간 세션을 남겨놓고 지연된 패킷을 기다린다.

인터넷 계층

  • 네트워크 패킷을 IP 주소로 지정된 목적지로 전송하기 위해 사용되는 계층

  • IP

    • Internet Protocol

    • 데이터 패킷이 올바른 대상에 도착할 수 있도록, 데이터 패킷을 라우팅하고 주소를 지정하는 프로토콜

  • ARP

    • Address Resolution Protocol

    • IP 주소를 물리 주소인 MAC 주소로 변환하는 프로토콜

  • ICMP

    • Internet Control Message Protocol

    • 데이터가 대상에 도달하는지와 도달 시간이 적절한지를 확인하는 프로토콜

    • 네트워크의 오류 보고 및 테스트 용도


링크 계층

  • 전선, 광섬유, 무선 등으로 실질적으로 데이터를 전달하는 계층

  • 무선 LAN, 유선 LAN 과 같은 물리 계층


유선 LAN

  • IEEE 802.3 프로토콜

  • 이더넷

    • 전 이중화 통신
      • 양쪽 장치가 동시에 송수신 가능
  • CSMA/CD

    • Carrier Sense Multiple Access/Collision Detection

무선 LAN

  • IEEE 802.11 프로토콜

  • 반 이중화 통신

    • 양쪽 장치가 송수신을 할 수 있으나, 동시에는 불가능
  • CSMA/CD

    • Carrier Sense Multiple Access/Collison Avoidance
  • 주파수를 통해 무선 통신망 구축

    • 2.4 GHz

      • 장애물에 강하다.

      • 전파 간섭이 자주 일어난다.

    • 5 GHz

      • 속도가 빠르다.

      • 채널이 많다.


계층 간 데이터 이동

  • 왼쪽
    • request 의 캡슐화


  • 오른쪽
    • request 의 비캡슐화

  • 각 계층에서는 계층의 헤더를 붙이거나 제거한다.

네트워크 기기

각 기기는 하위계층을 처리할 수 있지만, 반대는 불가능하다.

  • 애플리케이션 계층을 처리하는 기기

    • L7 스위치

      • 로드 밸런서

      • URL, 서버, 캐시, 쿠키들을 기반으로 트래픽 분산

  • 인터넷 계층을 처리하는 기기

    • 라우터 (L3 스위치)

      • 여러개의 네트워크를 연결, 분할, 구분

      • 데이터 패킷 이동 경로가 최소가 되도록 패킷 포워딩

  • 데이터 링크 계층을 처리하는 기기

    • L2 스위치

      • IP 주소 이해 불가

      • MAC 주소 테이블 관리

        • 패킷의 MAC 주소를 읽어 스위칭

        • 만약 테이블에 없다면 전체에 전달 (broadcast)

  • 물리 계층을 처리하는 기기

    • NIC

      • LAN 카드

      • 장치를 구분하기 위한 고유 식별번호인 MAC 주소가 있다.

      • 네트워크 구성을 위해 사용

    • AP (Access Point)

      • 패킷을 복사한다.

      • AP에 유선 LAN을 연결하면, 다른 장치에서 무선 LAN을 사용하여 네트워크 연결가능


ARP

  • Address Resolution Protocol

  • 네트워크 장치간의 통신은 MAC 주소를 기반으로 이루어진다.

  • ARP를 통해 IP 주소를 MAC 주소로 변환한다.

  • RARP 는 MAC 주소를 IP 주소로 역변환한다.


  • System A141.23.56.23 IP 와 통신을 하고 싶다면
  • 해당 IP의 MAC 주소를 얻기위해 ARP Request Packet 을 브로드 캐스팅
    • 만약 자신의 IP 주소가 아니라면 ARP Request Packet 폐기
    • 만약 자신의 IP 주소가 맞다면 (System B) 자신의 MAC 주소를 담은 ARP Reply PacketSystem A 에게 1대1로 전달
  • System ASystem B 의 MAC 주소를 알게 되었으니 통신할 수 있다.

IP 주소 체계

  • IPv4

    • 32 비트를 8비트 단위로 점을 찍어 표기

    • 255.45.67.89

  • IPv6

    • 128 비트를 16비트 단위로 점을 찍어 표기

    • 2001:0DB8:AC10:FE01:0000:0000:0000:0000

    • 2001:0DB8:AC10:FE01::

      • 연속되는 0은 :: 으로 생략가능

DHCP

  • Dynamic Host Configuration Protocol

  • IP 주소와 각종 통신 매개변수들을 동적으로 할당하는 네트워크 관리 프로토콜

  • DHCP 서버가 클라이언트에게 IP 주소를 임대한다.

    • 클라이언트는 IP 주소를 할당 받은 이후, 인터넷 사용이 가능하다.

    • 대부분의 가정용 네트워크에서 사용


NAT

  • Network Address Translation

  • 패킷의 IP 주소 정보를 수정하여 다른 IP 주소로 매핑

  • IPv4 주소 체계로는 주소가 부족하여 도입

    • NAT 로 공인 IP와 사설 IP를 나눠 많은 주소를 처리

여러개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속


HTTP

  • Hyper Text Transfer Protocol

  • 애플리케이션 계층의 프로토콜로, 웹 서비스 통신에 사용

  • HTTP/1.0

    • 한 연결당 하나의 요청
      • 매 요청마다 TCP 3-way handshake 하므로, RTT 증가
        • RTT: 패킷 왕복 시간

  • HTTP/1.1
    • 한번 TCP 연결 후, keep-alive 옵션으로 여러개의 파일 송수신
    • HOL Blocking 발생
      • Head of Line Blocking
      • 같은 큐에 있는 패킷이 첫 번째 패킷에 의해 지연된다.

  • HTTP/2
    • 멀티 플렉싱을 지원
      • 여러개의 스트림을 사용해 송수신
    • 단일 연결으로도 병렬의 송수신이 가능하다.
      • HOL Blocking 해결

HTTPS

  • 신뢰계층인 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP 요청

  • 통신을 암호화한다.


출처

면접을 위한 CS 전공지식 노트 (주홍철 님)


스프링에서의 제어의 역전 예시 (Hudi 님)
https://hudi.blog/inversion-of-control/


싱글톤 코드 (보스독 님)
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/


팩토리 패턴 코드 (램쥐뱅 님)
https://jusungpark.tistory.com/14


전략 패턴 코드 (victolee 님)
https://victorydntmd.tistory.com/292


프록시 패턴 코드 (코딩팩토리 님)
https://coding-factory.tistory.com/711


Nginx 의 기능 (꾸준함 님)
https://jaimemin.tistory.com/2121#google_vignette


CDN (AWS 문서)
https://aws.amazon.com/ko/what-is/cdn/


이터레이터 패턴의 특징 (램쥐뱅 님)
https://jusungpark.tistory.com/25


MVC 패턴의 특징 (김영한 님)
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1 (스프링 MVC 1편)


MVC, MVP, MVVP 패턴 (버미 님)
https://beomy.tistory.com/43


커맨드 패턴과 전략 패턴 비교 (이민준 님)
https://minjoon950425.tistory.com/210


일급객체와 고차함수 정의 (thyoondev 님)
https://velog.io/@thyoondev/%EA%B3%A0%EC%B0%A8-%ED%95%A8%EC%88%98higher-order-function%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC


상속성 (ktword)
http://www.ktword.co.kr/test/view/view.php?m_temp1=2300


네트워크 토폴로지 그림 (하이라인닷넷 님)
https://m.blog.naver.com/hilineisp/10169694570


netstat 명령어 (STAFF Heo 남)
https://m.blog.naver.com/heosj95/221350509878


nslookup 명령어 (lesstif)
https://www.lesstif.com/system-admin/nslookup-20775988.html


tracert 명령어 (류명운 님)
https://myeonguni.tistory.com/642


FTP 프로토콜 (피망 IT 님)
https://peemangit.tistory.com/66


SSH 프로토콜 (GonnabeAlright 님)
https://velog.io/@ragnarok_code/SSH-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0


SMTP 프로토콜 (June Moon 님)
https://nordvpn.com/ko/blog/smtp-protocol/


DNS (gentlysallim 님)
https://gentlysallim.com/dns%EB%9E%80-%EB%AD%90%EA%B3%A0-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%9E%80-%EB%AD%94%EC%A7%80-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/#
패킷 교환 방식 그림 (ChocoPeanut 님)
https://copycode.tistory.com/33


IP 프로토콜 (CloudFlare)
https://www.cloudflare.com/ko-kr/learning/network-layer/internet-protocol/


ICMP 프로토콜 (Fortinet)
https://www.fortinet.com/kr/resources/cyberglossary/internet-control-message-protocol-icmp


ARP 프로토콜 그림 (jeaha 님)
https://jeaha.dev/148


ARP 과정 (코딩팩토리 님)
https://coding-factory.tistory.com/720

3개의 댓글

comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

1개의 답글