디자인 패턴이란
프로그램을 설계할 때 자주 발생했던 문제점들에 적용할 수 있는 해결방법
객체 간의 상호 관계등을 패턴화하여 정리
라이브러리
공통으로 사용될 수 있는 특정한 기능들의 모듈화
폴더명, 파일명과 같은 규칙이 없고 프로그래머가 자유롭게 직접 컨트롤한다.
프레임워크
공통으로 사용될 수 있는 특정한 기능들의 모듈화
폴더명, 파일명과 같은 규칙이 존재하며, 프레임워크 개발자가 구현한 서브 클래스를 사용한다.
프로그래머의 코드가 프레임워크의 지배를 받는다.
애플리케이션 제어의 책임이 프로그래머에서 프레임워크로 위임된다.
제어의 역전
스프링에서의 제어의 역전
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();
}
}
클라이언트 구현
객체의 상태 변화를 관찰한다.
객체의 상태 변화가 감지되면 옵저버들에게 변화를 알려준다.
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
DDOS 공격 완화
단일 IP 주소 당 연결 수를 설정하여 액세스를 제한할 수 있다.
클라이언트 위치와 User-Agent
, Referer
기반으로 액세스 차단 및 제한할 수 있다.
Content Delivery Network (Content Distribution Network)
사용자가 오리진 서버와 멀리 떨어져 있는 경우, 동영상 이미지와 같은 대용량 파일을 로드할 때 많은 시간이 걸린다.
지리적으로 사용자와 가까운 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
문이 이터레이터 프로토콜이 된다.
애플리케이션 구성 요소를 Model, View, Controller 로 구분
각각의 구성 요소에만 집중해서 개발할 수 있다.
재사용성과 확장성 증가
단순하다.
뷰와 모델 사이의 의존성이 높다.
- 컨트롤러
- HTTP 요청을 받아 파라미터를 검증
- 비즈니스 로직 호출
- 뷰에 전달할 결과 데이터를 조회해 모델에 담음
- 모델과 뷰를 잇는 다리 역할
- 모델과 뷰의 생명주기 관리
- 모델
- 뷰에 출력할 데이터를 담는 통
- 모델 덕분에 뷰는 비즈니스 로직을 몰라도 화면 렌더링 가능
- 뷰
- 모델에 담겨있는 데이터를 사용해 화면을 렌더링
동작 방식
사용자의 Action
이 컨트롤러로 들어온다.
컨트롤러는 사용자의 Action
을 확인하고 모델을 업데이트한다.
컨트롤러는 화면을 렌더링할 뷰를 선택하여 모델을 넘겨준다.
뷰는 모델을 이용하며 화면을 렌더링한다.
애플리케이션 구성 요소를 Model, View, Presenter 로 구분
Presenter 와 뷰가 1대1 관계이다.
뷰와 모델 사이의 의존성이 없다.
뷰와 Presenter 사이의 의존성이 높다.
- Presenter
- 뷰에서 요청한 정보로 모델을 가공하여 뷰에 전달한다.
동작 방식
사용자의 Action
이 뷰를 통해 들어온다.
뷰는 Presenter 에 데이터를 요청한다.
Presenter 는 모델에게 데이터를 요청한다.
모델은 Presenter 에게 요청받은 데이터를 응답한다.
Presenter 는 뷰에게 데이터를 응답한다.
뷰는 Presenter 가 응답한 데이터를 이용해 화면을 렌더링한다.
애플리케이션 구성 요소를 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
의존성 역전 원칙
상위 수준 클래스는 하위 수준 클래스가 아니라 추상화에 의존해야 한다.
프로그램의 진행 방식대로 코드를 구현
실행속도가 빠르다.
모듈화하기 어렵고, 유지보수성이 떨어진다.
컴퓨터 등의 장치들이 통신 기술을 이용하여 구축하는 연결망
노드와 링크가 서로 연결되어 있거나 단절되어 있는 집합체
노드 : 서버, 라우터, 스위치 같은 네트워크 장치
링크 : 유선, 무선 연결
대역폭 (Bandwidth) : 주어진 시간동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수
트리 토폴로지
노드의 추가, 삭제가 쉽다.
상위 노드에 트래픽이 집중되면 하위 노드에 영향을 줄 수 있다.
버스 토폴로지
중앙 통신 회선 하나에 여러개의 노드가 연결되어 있다.
LAN (근거리 통신망) 에서 사용한다.
설치 비용이 적고 노드의 추가, 삭제가 쉽다.
스타 토폴로지
중앙에 있는 노드에 모두 연결되어 있다.
노드 추가, 삭제가 쉽다.
특정 노드의 장애를 쉽게 발견하고 처리할 수 있다.
중앙 노드의 장애 발생 시, 전체 네트워크를 사용할 수 없다.
설치 비용이 고가이다.
링형 토폴로지
고리처럼 하나의 연속된 길을 통해 통신한다.
네트워크 구성 변경이 어렵고, 회선 장애 발생 시 전체 네트워크가 영향을 받는다.
데이터간의 충돌이 발생하지 않는다.
메시 토폴로지
한 장치에 장애가 발생해도 네트워크를 계속 사용할 수 있다.
네트워크 구성 변경이 어렵다.
구축 비용 및 운용 비용이 많이 든다.
LAN (Local Area Network)
근거리 통신망
전송 속도 ↑, 혼잡도 ↓
MAN (Metropolitan Area Network)
지역 네트워크
전송속도 중간, 혼잡도 중간
WAN (Wide Area Network)
광역 네트워크 (국가)
전송 속도 ↓, 혼잡도 ↑
ping
네트워크 상태를 확인하려는 대상 노드를 향해 일정 크기의 패킷 전송
ICMP 프로토콜을 통해 동작
ping
테스트 불가netstat
network status 의 약자로 네트워크의 상태를 보여주는 명령어
내부 IP, 외부 IP, 포트 번호, 연결 상태를 나타낸다.
nslookup
인터넷 DNS (도메인 이름 서버) 관련 조회를 할 수 있는 명령어
도메인을 입력하면 해당 도메인의 IP 주소를 출력
tracert
trace route
특정 호스트에 도달할 때까지 통과하는 경로와 지연 시간을 추적하는 명령어
ICMP 프로토콜을 통해 동작
응용 프로그램이 사용되는 프로토콜 계층
FTP
File Transfer Protocol
하나의 호스트에서 다른 호스트로 파일을 복사하기 위한 프로토콜
평문 전송을 수행하므로, 보안상 좋지 않다.
SSH
Secure Shell
네트워크 상의 다른 PC나 서버에 로그인, 원격 명령 실행, 파일 전송등을 수행할 수 있는 프로토콜
암호화를 통해 데이터를 전달한다. (평문 x)
22번 포트 사용
SMTP
Simple Mail Transfer Protocol
인터넷 연결을 통하여 이메일을 보낼 때 사용되는 프로토콜
DNS
Domain Name System
입력한 도메인 이름을 실제 네트워크상에서 사용하는 IP 주소로 변환한다.
- 브라우저에서 원하는 도메인을 검색하면, ISP 의 DNS 서버에게 도메인 주소에 해당하는 IP 주소를 요청한다.
캐시 데이터가 있다면 바로 8번으로 이동한다.- 루트 DNS 서버에게 어디로 가야할지 물어본다.
- 루트 서버는 다음 목적지인 TLD DNS 서버 주소를 안내한다.
- TLD DNS 서버에게 어디로 가야할지 물어본다.
- TLD DNS 서버는 다음 목적지인 Authoritative DNS 서버 주소를 안내한다.
- Authoritative DNS 서버에게 찾는 도메인의 실제 IP 주소를 물어본다.
- Authoritative DNS 서버는 실제 IP 주소를 알려주고, ISP DNS 서버는 이를 캐시에 저장한다.
- ISP DNS 서버는 IP 주소를 브라우저에게 안내한다.
루트 DNS 서버
TLD DNS 서버
Top Level Domain (최상위 도메인) 서버
도메인 등록 기관이 관리하는 서버
Authoritative DNS 서버들의 IP를 저장하고 안내한다.
Authoritative DNS 서버
실제 개인 도메인 IP 주소의 관계가 기록되는 서버
일반적으로는 도메인 판매 업체들의 네임 서버를 의미
Recursive DNS 서버
인터넷 사용자가 가장 먼저 접근하는 DNS 서버
한 번 알아낸 도메인 - IP 주소 관계를 캐싱하는 서버
ISP DNS 서버, 구글 DNS 서버, Public DNS 서버 등이 있다.
송신자와 수신자를 연결하는 통신 서비스 제공
연결지향 데이터 스트림 지원
신뢰성
흐름제어
TCP
연결지향 프로토콜
패킷 사이 순서를 보장한다.
신뢰성 ↑
가상 회선 패킷 교환 방식
모든 패킷은 가상 회선을 따라 이동
각 패킷이 전송된 순서대로 도착하는 방식
UDP
패킷 사이 순서 보장 x
수신 여부 확인 x
단순하게 데이터만 전달
데이터그램 패킷 교환 방식
각 패킷이 최적의 경로를 선택하여 독립적으로 이동
전송 순서대로 도착하지 않을 수 있다.
- ISN
- Initial Sequence Numbers
- TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀸스 번호
- SYN
- 연결 요청 플래그
- 자신의 ISN 을 보낸다.
- ACK
- 응답 플래그
- 상대의
ISN + 1
을 보낸다.
- FIN
- 연결 종료 플래그
- TIME_WAIT
- 서버 측에서, FIN 플래그 이전에 전송한 패킷이 지연되어 FIN 플래그보다 늦게 도착할 수 있다.
- 이러한 현상을 대비하여, 클라이언트 측에서 FIN 플래그를 받더라도 일정시간 세션을 남겨놓고 지연된 패킷을 기다린다.
네트워크 패킷을 IP 주소로 지정된 목적지로 전송하기 위해 사용되는 계층
IP
Internet Protocol
데이터 패킷이 올바른 대상에 도착할 수 있도록, 데이터 패킷을 라우팅하고 주소를 지정하는 프로토콜
ARP
Address Resolution Protocol
IP 주소를 물리 주소인 MAC 주소로 변환하는 프로토콜
ICMP
Internet Control Message Protocol
데이터가 대상에 도달하는지와 도달 시간이 적절한지를 확인하는 프로토콜
네트워크의 오류 보고 및 테스트 용도
전선, 광섬유, 무선 등으로 실질적으로 데이터를 전달하는 계층
무선 LAN, 유선 LAN 과 같은 물리 계층
IEEE 802.3 프로토콜
이더넷
CSMA/CD
IEEE 802.11 프로토콜
반 이중화 통신
CSMA/CD
주파수를 통해 무선 통신망 구축
2.4 GHz
장애물에 강하다.
전파 간섭이 자주 일어난다.
5 GHz
속도가 빠르다.
채널이 많다.
- 왼쪽
- request 의 캡슐화
- 오른쪽
- request 의 비캡슐화
각 기기는 하위계층을 처리할 수 있지만, 반대는 불가능하다.
애플리케이션 계층을 처리하는 기기
L7 스위치
로드 밸런서
URL, 서버, 캐시, 쿠키들을 기반으로 트래픽 분산
인터넷 계층을 처리하는 기기
라우터 (L3 스위치)
여러개의 네트워크를 연결, 분할, 구분
데이터 패킷 이동 경로가 최소가 되도록 패킷 포워딩
데이터 링크 계층을 처리하는 기기
L2 스위치
IP 주소 이해 불가
MAC 주소 테이블 관리
패킷의 MAC 주소를 읽어 스위칭
만약 테이블에 없다면 전체에 전달 (broadcast)
물리 계층을 처리하는 기기
NIC
LAN 카드
장치를 구분하기 위한 고유 식별번호인 MAC 주소가 있다.
네트워크 구성을 위해 사용
AP (Access Point)
패킷을 복사한다.
AP에 유선 LAN을 연결하면, 다른 장치에서 무선 LAN을 사용하여 네트워크 연결가능
Address Resolution Protocol
네트워크 장치간의 통신은 MAC 주소를 기반으로 이루어진다.
ARP를 통해 IP 주소를 MAC 주소로 변환한다.
RARP 는 MAC 주소를 IP 주소로 역변환한다.
System A
가141.23.56.23
IP 와 통신을 하고 싶다면- 해당 IP의 MAC 주소를 얻기위해
ARP Request Packet
을 브로드 캐스팅
- 만약 자신의 IP 주소가 아니라면
ARP Request Packet
폐기- 만약 자신의 IP 주소가 맞다면 (
System B
) 자신의 MAC 주소를 담은ARP Reply Packet
을System A
에게 1대1로 전달System A
는System B
의 MAC 주소를 알게 되었으니 통신할 수 있다.
IPv4
32 비트를 8비트 단위로 점을 찍어 표기
255.45.67.89
IPv6
128 비트를 16비트 단위로 점을 찍어 표기
2001:0DB8:AC10:FE01:0000:0000:0000:0000
2001:0DB8:AC10:FE01::
::
으로 생략가능Dynamic Host Configuration Protocol
IP 주소와 각종 통신 매개변수들을 동적으로 할당하는 네트워크 관리 프로토콜
DHCP 서버가 클라이언트에게 IP 주소를 임대한다.
클라이언트는 IP 주소를 할당 받은 이후, 인터넷 사용이 가능하다.
대부분의 가정용 네트워크에서 사용
Network Address Translation
패킷의 IP 주소 정보를 수정하여 다른 IP 주소로 매핑
IPv4 주소 체계로는 주소가 부족하여 도입
여러개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속
Hyper Text Transfer Protocol
애플리케이션 계층의 프로토콜로, 웹 서비스 통신에 사용
HTTP/1.0
- 한 연결당 하나의 요청
- 매 요청마다 TCP 3-way handshake 하므로, RTT 증가
- RTT: 패킷 왕복 시간
- 한번 TCP 연결 후,
keep-alive
옵션으로 여러개의 파일 송수신- HOL Blocking 발생
- Head of Line Blocking
- 같은 큐에 있는 패킷이 첫 번째 패킷에 의해 지연된다.
- 멀티 플렉싱을 지원
- 여러개의 스트림을 사용해 송수신
- 단일 연결으로도 병렬의 송수신이 가능하다.
- HOL Blocking 해결
신뢰계층인 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
항상 좋은 글 감사합니다.