자바는 객체지향 언어이다.
즉 가상머신 내에 존재하는 것은 객체들로 이루어져 있다.
물론 객체를 만들기 위한 클래스들도 있다.
그렇기 때문에 객체가 필요하다면 클래스의 형태를 보고 언제든지 만들어 낼 수 있다.
컴파일 후 생성된 .class 파일은 클래스의 모든 정보를 담게 된다.
이 .class의 바이트는 가상머신에 Class 클래스의 형태로 로딩 되어진다.
그리고 로딩된 클래스의 정보를 보고 객체를 만들게 된다.
요구사항을 객체로 캡슐화 할 수 있으며 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을수 있다.
사용자의 요청을 객체화하고 그 객체만 있으면 해당 커맨드가 어떤 작업을 수행했는지 알 수 있다.
그렇기 때문에 요청 내역을 큐에 저장하거나 로그로 기록할 수 있으며 작업 취소 기능도 지원 가능하다.
커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구사항을 캡슐화한다.
이렇게 하기 위해 행동과 리시버를 한 객체에 집어넣고 메소드 하나만 외부에 공개하는 방법을 사용한다.
커맨드 패턴은 행위 패턴 카테고리에 속하며 행동을 캡슐화하여 미리 요청을 가지고 있다가 요청할 때 사용할 수 있도록 한다.
따라서 요청과 수행의 관계가 느슨하여 SOLID의 DIP(The Dependency Inversion Priciple)를 따른다.
리소스를 수정하지 않는 메소드들(OPTIONS, GET, HEAD 등)을 Safe하다고 말한다.
대부분의 경우 Idempotent하면 Safe하다.
물론 예외도 있는데 DELETE는 Idempotent 하지만 리소스를 변경하므로 Safe하지 않다.
HEAD 는 Response-Body 없이 Header만 얻기 위해 사용한다.
OPTIONS 는 해당 리소스에 대해 가능한 Operation이 무엇인지 응답을 얻기 위해 사용한다.
만약 OPTIONS에 대한 응답이 온다면 response Allow 에 가능한 Operation을 사용해야한다.
f(x) = f(f(x))
다시 말해 몇 번이고 같은 연산을 반복해도 같은 값이 나온다는 것이다.
예를 들어 클라이언트가 POST /dogs를 요청하였다.
그런데 Time Out(408)발생했다.
이 상황에서 클라이언트는 요청이 전달되었으나 네트워크가 끊어졌는지
아니면 요청조차 전달이 되지 않았는지 알 수 없다.
이 때 클라이언트가 사용한 HTTP 함수가 Idempotent하다면 다시 요청해도 상관 없다.
Whty? 항상 같은 결과를 만들기 때문이다.
그러나 POST는 Idempotent 하지 않다.
동시성은 싱글 코어에서 멀티 쓰레드를 동작시키기 위한 방식이다.
멀티 쓰레드란 멀티 태스킹을 위해 여러 개의 쓰레드가 번갈아가면서 실행되는 성질을 말한다.
동시성을 이용한 싱글 코어의 멀티 태스킹은
각 쓰레드들이 병렬적으로 실행되는 것처럼 보이지만
사실은 번갈아가면서 조금씩 실행되고 있는 것이다.
즉 동시에 실행되는 것처럼 보이는 것이다.
독립적으로 실행하는 프로세스들을 구성한다.
한 번에 여러 개를 다루는 것과 관련있다.
1명이 5개의 작업을 빠른 시간에 이것 저것 실행한다.
I/O Bound
ex) 마우스, 키보드, 디스플레이, 디스크