-
Notifications
You must be signed in to change notification settings - Fork 0
이지표 2주차 학습일지
이지표 edited this page Jul 8, 2024
·
3 revisions
- 유연성: 로깅 프레임워크는 다양한 출력 대상(콘솔, 파일, 데이터베이스 등)을 지원한다.
- 로그 레벨: 로깅은 여러 레벨(ERROR, WARN, INFO, DEBUG 등)을 제공하여 중요도에 따라 로그를 필터링 할 수 있다.
- 성능: 로깅은 필요에 따라 로그를 활성화/비활성화할 수 있어 성능에 유리하다.
- 포맷팅: 시간, 클래스명, 메서드명 등의 메타 정보를 자동으로 포함할 수 있다.
- 쓰레드 안정성: 대부분의 로깅 프레임워크는 멀티 쓰레드 환경에서 안전하다.
- 로깅 구현체(Logback, Log4j, Java Util Logging)를 쉽게 교체할 수 있다.
- 문자열 연결 연산을 지연시켜 성능을 향상시킨다.
- favicon.ico는 요청하지 않았는데 왜 요청이 들어올까?
- favicon은 웹 브라우저의 주소 표시줄, 탭, 북마크 등을 표시하는 작은 아이콘이다.
- 대부분의 현대 웹 브라우저는 웹 페이지를 접속할 때 자동으로 favicon.ico를 요청한다.
- 정상적인 동작이며, 오류가 아니다.
- CPU Core가 하나인 환경에서 설계된 쓰레드
- 멀티 코어 환경에서는 장점을 살리지 못해 사용되고 있지 않음
- 유저 스레드 생성시 커널 스레드와 1대1 방식으로 매핑
- 자바에서는 OS스레드를 Wrapping하고, 이를 플랫폼 스레드라 함
- Spring MVC는 thread per request model
- 요청 당 하나의 커널 스레드를 생성하여 멀티스레드로 처리하는 구조
- OS 스레드는 생성, 관리 비용이 비싸 스레드 풀을 둠
- Java에서 처리량이 높고 가벼운 동시성 모델을 지원하기 위한 프로젝트
- OS대신 JVM에 의존하는 유저 레벨 스레드를 사용
- 기존 플랫폼 스레드보다 효율적이고 가벼운 경량 스레드(Fiber)를 추가하는 목표
- Fiber는 JVM 인스턴스로 생성 및 관리됨
- 메모리 사용량 측면에서 커널 스레드보다 훨씬 가볍기에 컨텍스트 스위칭 비용이 월등하게 적음
- JDK 21: Virtual Thread
- Fiber라는 별도의 기능으로 개발되었으나, 기존 스레드 문법과 호환될 수 있는 형태로 발전
- Virtual Thread는 N:1로 Carrier Thread랑 매핑되고, Carrier Thread는 OS Thread와 매핑되는 구조
- 플랫폼 스레드와 다르게 리소스가 매우 작기에, 리소스 회수를 임의로 하지 않고 GC에 위임
동시성은 무엇일까? 동시성은 여러 작업이 독립적으로 실행되는 것을 의미한다. 병렬 처리는 동시에 여러 작업이 실행되는 것을 의미한다.
- concurrent 패키지는 복잡한 동시성 문제를 다르기 위한 고수준 추상화를 제공한다.
- 패키지의 클래스들은 내부적으로 최적화되어 있어, 수동으로 구현한 것 보다 더 나은 성능을 제공한다.
- thread safe를 제공한다.
- ExecutorService, Future, CompletableFuture등 다양한 동시성 프로그래밍 도구를 제공한다.
복잡한 시스템이나 개념을 단순화하여 더 쉽게 이해하고 사용할 수 있게 만드는 것을 의미한다. 개발자가 직접 스레드를 생성하고 관리하는 대신, 인터페이스를 통해 병렬 작업을 수행 할 수 있게 한다.
여러 스레드가 동시에 같은 코드나 데이터에 접근할 때 발생하는 문제를 방지하고, 정확하게 동작하도록 보장하는 특성이다. thread safe한 코드는 여러 스레드의 동시 접근으로 인한 데이터 손상이나 불일치를 방지한다.
synchronized키워드를 사용해도 thread safe를 확보할 수 있지만, concurrent패키지를 사용하면 아래와 같은 장점을 가질 수 있다.
- synchronized는 메서드나 블록 전체를 잠그지만, concurrent패키지의 도구는 더욱 세밀한 수준의 동기화를 제공한다.
- concurrent패키지는 단순 동기화 이상의 ExecutorService나 Future와 같은 고수준의 추상화를 제공한다.
- concurrent패키지를 사용하면 코드가 명확해지고 유지 보수가 쉬워진다.
- MIME타입은 인터넷에서 다양한 종류의 데이터를 식별하고 처리하기 위한 표준화된 방법이다.
- “타입/서브타입”형식으로 구성된다. ex) “text/html”, “image/jpeg”
- 웹 브라우저가 콘텐츠를 올바르게 표시하도록 한다.
- HTTP 헤더에 Content-Type필드에서 사용된다.
- 3부분으로 구성되며, 각 부분은 Status Line, HTTP Headers, Message Body로 구성된다.
- Status Line: Response의 상태를 간략하게 나타내는 부분이다.
- HTTP Version: HTTP 버전을 나타낸다.
- Status Code: 응답 상태를 숫자로 나타낸다.
- Statues Text: 응답 상태를 사람이 알 수 있게 간단하게 설명해주는 부분이다.
- HTTP/1.1 200 OK
- HTTP Headers: 클라이언트의 응답과 응답을 보낸 서버에 대해 자세히 알아보는 데 사용할 수 있는 정보가 있다.
- HTTP Headers 뒤에는 빈줄이 배치되어 Message Body과 구분한다.
- Message Body: 메시지의 본문이 들어있다.
- 편의상 response body라고 하기도 한다.
- 3부분으로 구성되며, 각 부분은 Request Line, HTTP Headers, Message Body로 구성된다.
- Request Line: 요청의 첫 줄로, 요청의 기본 정보를 나타낸다.
- Method: 요청 방식을 나타낸다 (GET, POST, PUT, DELETE 등).
- Request-URI: 요청하는 리소스의 경로를 나타낸다.
- HTTP Version: 사용하는 HTTP 프로토콜의 버전을 나타낸다.
- 예: GET /index.html HTTP/1.1
- HTTP Headers: 요청에 대한 추가 정보를 제공한다.
- 각 헤더는 이름과 값의 쌍으로 구성된다.
- 여러 줄에 걸쳐 다양한 헤더 정보를 포함할 수 있다.
- 헤더 섹션의 끝은 빈 줄로 표시되어 Message Body와 구분된다.
- 예: Host: www.example.com User-Agent: Mozilla/5.0 Accept:
- text/html,application/xhtml+xml Accept-Language: en-US,en;q=0.5
- Message Body: 요청과 함께 서버로 전송되는 데이터를 포함한다.
- GET 요청의 경우 일반적으로 비어있다.
- POST나 PUT 요청의 경우 폼 데이터나 JSON 등의 데이터를 포함할 수 있다.
- Content-Type 헤더를 통해 body의 데이터 형식을 지정한다.
- Content-Length 헤더를 통해 body의 크기를 지정한다.
- 클래스 기준으로 상대적인 위치의 리소스를 가져온다.
- 절대 위치로 지정하기 위해서는 맨 앞에 “/”로 시작하면 된다.
- 항상 절대 경로 기준으로 리소스를 가져온다.
- 스레드 pool사이즈를 10으로 설정했는데, 예외가 터지자 11, 12번 스레드가 새로 생겼다.
- 스레드에 예외처리를 하지 않으면, 작업을 완료하지 못하고 종료된다.
- 활성 스레드 수가 코어 스레드 수보다 적으면 새 스레드를 생성한다.
- 스레드가 종료되고, 새로 생성되는 과정이 반복되면 성능 저하가 일어난다.
- 타자기로 글을 쓰다가 종이 끝까지 썼을 때 줄 바꿈을 해야 했다.
- 이때 커서가 해당 라인의 제일 앞쪽으로 이동하는 것을 CR이라고 한다.
- 줄 바꿈을 LF라고 한다.
- HTTP는 연결 지향적인 특성을 지녀 UDP에 비해 안정적이고 신뢰있는 통신을 제공하는 TCP/IP 프로토콜 기반으로 만들어졌다.
- 이미지는 처리할 수 없고, 다룰 수 있는 HTML만을 가져오도록 설계되어 있다.
- 헤더없이 GET메서드만 존재한다.
- 상태코드가 없기에 문제가 발생하면 특정 html파일에 오류와 관련된 설명과 함께 보내졌다.
- 서버와 클라이언트 간의 연결은 모든 요청 후에 닫힌다.
- HTTP/0.9 스펙
- 웹이 인기를 끌자, HTTP/0.9사양에 만족하지 못한 사용자, 브라우저, 웹 서버 벤더들이 HTTP에 여러 기능을 추가했다.
- 표준이 없기에 혼란의 시대가 왔다.
- 스펙을 표준화 시키기 위한 HTTP-WG이라는 조직이 탄생되었다.
- HTTP/1.0 스펙인 RFC1946가 발표되었다.
- 헤더 (기본적인 HTTP 메서드와 요청/응답 헤더 추가)
- 응답 코드 (요청에 대한 성공/실패 여부를 담은 정보)
- 다양한 파일 형식 지원 (Content-Type)
- 조건부 요청
- 콘텐츠 인코딩(압축)
- 단기 커넥션 (Request&Response당 Connection 연결)
- Short-lived Connections
- 데이터 전송에 대한 무결성을 만족하기 위해서 연결 기반 TCP 표준에 의존하게 된다.
- 이때 매 요청/응답마다 TCP 커넥션을 맺어야하는 Short-lived Connections 문제가 발생한다.
- 성능상 큰 손해를 본다.
- 1.0버전이 나오지 얼마 되지 않아 1.1버전이 발표되었고, 지금까지 널리 사용되고 있다.
- Persistence connection
- Persistence connection이란 이름으로 한 번 연결을 맺으면 지정한 timeout동안 지속적으로 연결을 유지한다.
- Pipelining
- 클라이언트가 여러 요청을 보내면 응답될 때까지 기다리지 않고 모든 요청을 동시에 보낸다.
- 서버는 요청이 들어오는 순서대로 처리후 응답되어야 한다.
- 이러한 문제 때문에 한 요청이 오래걸리면 다른 요청도 지연이 생기는 Head Of Line Blocking 현상이 발생한다.
- java.util.concurrent패키지에서 제공하는 클래스이며, 읽기 작업이 많은 경우 적합한 컬렉션이다.
- 쓰기 작업이 일어날 때마다 내부 배열을 복사하여 동기화 처리를 한다.