TCP와 UDP 모두 네트워크의 전송 계층에서 사용하는 프로토콜로 데이터를 보내기 위해 사용됩니다.
TCP는 신뢰성 있는 데이터 전송을 지원하는 연결 지향형 프로토콜입니다. 일반적으로 TCP와 IP가 함께 사용되는데, IP가 데이터의 전송을 처리한다면 TCP는 패킷 추적 및 관리를 하게 됩니다. 연결 지향형인 TCP는 3-way handshaking이라는 과정을 통해 연결 후 통신을 시작하는데, 흐름 제어와 혼잡 제어를 지원하며 데이터의 순서를 보장합니다.
UDP는 비연결형 프로토콜로써, 인터넷상에서 서로 정보를 주고받을 때 정보를 보낸다는 신호나 받는다는 신호 절차를 거치지 않고 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜입니다. TCP와는 다르게 연결 설정이 없으며, 혼잡 제어를 하지 않기 때문에 TCP보다 전송 속도가 빠릅니다. 그러나 데이터 전송에 대한 보장을 하지 않기 때문에 패킷 손실이 발생할 수 있습니다.
배열은 입력된 데이터들이 메모리 공간 속에서 연속적으로 저장되어 있는 자료 구조입니다. 메모리 상에서 연속적으로 저장되어 있는 특징 때문에 index를 통한 접근이 용이하여 데이터 탐색 시 유리합니다. 또한 배열의 크기는 처음 생성할 때 정하며 이후에는 변경할 수 없습니다.
링크드리스트는 메모리 상에서 각각 떨어져 있는 데이터인 노드들이 저장된 데이터 값과 다음 데이터가 있는 메모리 주소를 가지고 있는 자료구조입니다. 배열과는 다르게 메모리를 연속적으로 사용하지 않기 때문에 데이터 탐색 시에는 순차적으로 접근해야 하는 면에서 불리할 수도 있지만 노드가 연결된 구조이기 때문에 삽입과 삭제에 용이합니다.
배열은 컴파일 과정에서 메모리가 할당되는 정적 메모리이며 스택 영역에 메모리가 할당되는 반면 연결 리스트는 런타임 환경에서 메모리가 할당되는 동적 메모리 할당이며 힙 영역에 할당됩니다.
SRP - 단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.
OCP - 개방-폐쇄 원칙 : 확장에는 열려있고, 수정에는 닫혀있어야 한다.
LSP - 리스코프 치환 원칙 : 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
ISP - 인터페이스 분리 원칙 : 인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다.) SRP와 같은 문제에 대한 두 가지 다른 해결책이다.
DIP - 의존관계 역전 원칙 : 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라. DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.
클라이언트가 서버에 요청을 하면 DispatcherServlet이 요청을 가로챈다.
요청을 가로챈 DispatcherServlet은 HandlerMapping에게 어떤 컨트롤러에게 요청을 위임하면 좋을지 물어본다.
(HandlerMapping은 @Controller로 등록한 것들을 스캔해서 찾아 놓았다.)
요청에 매핑된 Controller가 있다면 @RequestMapping을 통하여 요청을 처리할 메서드에 도달한다.
(이는 HandlerAdapter가 책임진다.)
Controller에서는 해당 요청을 처리할 Service에게 비즈니스 로직을 위임한다.
Service에서는 DB 접근이 필요할 경우 DB 처리를 DAO에게 위임한다.
DAO는 데이터 정보를 받아 Service에게 돌려준다.
(결과로 받은 Entity 객체를 가지고 Response에 필요한 DTO 객체로 변환한다.)
모든 비즈니스 로직을 끝낸 Service가 결과물을 Controller에 넘긴다.
결과물을 받은 Controller는 필요에 따라 Model 객체에 결과물을 넣거나, View 정보를 담아 DispatcherServlet에게 보낸다.
DispatcherServlet은 ViewResolver에게 받은 뷰에 대한 정보를 넘긴다.
10.ViewResolver는 해당 View를 찾아 DispatcherServlet에게 알려준다.
(serffix, prefix를 붙여주는 것도 ViewResolver에서 수행한다.)
12.DispatcherServlet이 클라이언트에게 렌더링된 View를 응답한다.
JVM은 크게 네가지 구성요소로 볼 수 있습니다.
Class Loader, Execution Engine, Runtime Data Area, GC 입니다.
첫번째로 Class Loader는 자바 바이트 코드를 실행할 때 class 객체를 메모리 상에 로드하는 요소입니다.
Execution Engine은 클래스 로더에 의해 메모리에 로드된 바이트 코드를 실행하는 요소입니다.
JVM의 메모리 영역은 메소드 영역, 힙 영역, 스택 영역이 있는데 메소드 영역에는 전역변수와 static 변수를 저장하며 이 영역의 데이터는 프로그램의 시작부터 종료까지 메모리에 남아있습니다. JVM이 동작해서 클래스가 로딩될 때 생성됩니다.
스택 영역에는 지역변수와 매개변수 데이터 값이 저장되며 메소드가 호출될 때 메모리가 할당되고 종료되면 메모리가 해제됩니다. 컴파일 타임 시 데이터가 할당됩니다.