Skip to content

이지표 2주차 학습일지

이지표 edited this page Jul 8, 2024 · 3 revisions

왜 로거을 사용해야 할까?

  • 유연성: 로깅 프레임워크는 다양한 출력 대상(콘솔, 파일, 데이터베이스 등)을 지원한다.
  • 로그 레벨: 로깅은 여러 레벨(ERROR, WARN, INFO, DEBUG 등)을 제공하여 중요도에 따라 로그를 필터링 할 수 있다.
  • 성능: 로깅은 필요에 따라 로그를 활성화/비활성화할 수 있어 성능에 유리하다.
  • 포맷팅: 시간, 클래스명, 메서드명 등의 메타 정보를 자동으로 포함할 수 있다.
  • 쓰레드 안정성: 대부분의 로깅 프레임워크는 멀티 쓰레드 환경에서 안전하다.

왜 SLF4J 로거를 사용할까?

  • 로깅 구현체(Logback, Log4j, Java Util Logging)를 쉽게 교체할 수 있다.
  • 문자열 연결 연산을 지연시켜 성능을 향상시킨다.
  • favicon.ico는 요청하지 않았는데 왜 요청이 들어올까?
  • favicon은 웹 브라우저의 주소 표시줄, 탭, 북마크 등을 표시하는 작은 아이콘이다.
  • 대부분의 현대 웹 브라우저는 웹 페이지를 접속할 때 자동으로 favicon.ico를 요청한다.
  • 정상적인 동작이며, 오류가 아니다.

JDK 1.1: Many To One

  • CPU Core가 하나인 환경에서 설계된 쓰레드
  • 멀티 코어 환경에서는 장점을 살리지 못해 사용되고 있지 않음

JDK 1.3 ~: One To One

  • 유저 스레드 생성시 커널 스레드와 1대1 방식으로 매핑
  • 자바에서는 OS스레드를 Wrapping하고, 이를 플랫폼 스레드라 함

Spring MVC

  • Spring MVC는 thread per request model
  • 요청 당 하나의 커널 스레드를 생성하여 멀티스레드로 처리하는 구조
  • OS 스레드는 생성, 관리 비용이 비싸 스레드 풀을 둠

Project Loom

  • Java에서 처리량이 높고 가벼운 동시성 모델을 지원하기 위한 프로젝트
  • OS대신 JVM에 의존하는 유저 레벨 스레드를 사용
  • 기존 플랫폼 스레드보다 효율적이고 가벼운 경량 스레드(Fiber)를 추가하는 목표

Fiber

  • Fiber는 JVM 인스턴스로 생성 및 관리됨
  • 메모리 사용량 측면에서 커널 스레드보다 훨씬 가볍기에 컨텍스트 스위칭 비용이 월등하게 적음
  • JDK 21: Virtual Thread
  • Fiber라는 별도의 기능으로 개발되었으나, 기존 스레드 문법과 호환될 수 있는 형태로 발전
  • Virtual Thread는 N:1로 Carrier Thread랑 매핑되고, Carrier Thread는 OS Thread와 매핑되는 구조
  • 플랫폼 스레드와 다르게 리소스가 매우 작기에, 리소스 회수를 임의로 하지 않고 GC에 위임

java.util.concurrent 패키지

동시성(concurreny)과 병렬 처리(parallelism)

동시성은 무엇일까? 동시성은 여러 작업이 독립적으로 실행되는 것을 의미한다. 병렬 처리는 동시에 여러 작업이 실행되는 것을 의미한다.

왜 java.util.concurrent 패키지를 사용해야할까?

  • concurrent 패키지는 복잡한 동시성 문제를 다르기 위한 고수준 추상화를 제공한다.
  • 패키지의 클래스들은 내부적으로 최적화되어 있어, 수동으로 구현한 것 보다 더 나은 성능을 제공한다.
  • thread safe를 제공한다.
  • ExecutorService, Future, CompletableFuture등 다양한 동시성 프로그래밍 도구를 제공한다.

고수준 추상화는 무엇을 의미할까?

복잡한 시스템이나 개념을 단순화하여 더 쉽게 이해하고 사용할 수 있게 만드는 것을 의미한다. 개발자가 직접 스레드를 생성하고 관리하는 대신, 인터페이스를 통해 병렬 작업을 수행 할 수 있게 한다.

thread safe가 무엇을 의미할까?

여러 스레드가 동시에 같은 코드나 데이터에 접근할 때 발생하는 문제를 방지하고, 정확하게 동작하도록 보장하는 특성이다. thread safe한 코드는 여러 스레드의 동시 접근으로 인한 데이터 손상이나 불일치를 방지한다.

synchronized키워드를 사용하지 않고, concurrent패키지를 사용하는 이유는?

synchronized키워드를 사용해도 thread safe를 확보할 수 있지만, concurrent패키지를 사용하면 아래와 같은 장점을 가질 수 있다.

  • synchronized는 메서드나 블록 전체를 잠그지만, concurrent패키지의 도구는 더욱 세밀한 수준의 동기화를 제공한다.
  • concurrent패키지는 단순 동기화 이상의 ExecutorService나 Future와 같은 고수준의 추상화를 제공한다.
  • concurrent패키지를 사용하면 코드가 명확해지고 유지 보수가 쉬워진다.

MIME 타입이란?

  • MIME타입은 인터넷에서 다양한 종류의 데이터를 식별하고 처리하기 위한 표준화된 방법이다.
  • “타입/서브타입”형식으로 구성된다. ex) “text/html”, “image/jpeg”
  • 웹 브라우저가 콘텐츠를 올바르게 표시하도록 한다.
  • HTTP 헤더에 Content-Type필드에서 사용된다.

HTTP Response 구조

  • 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라고 하기도 한다.

HTTP Request 구조

  • 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의 크기를 지정한다.

Class.getResource()

  • 클래스 기준으로 상대적인 위치의 리소스를 가져온다.
  • 절대 위치로 지정하기 위해서는 맨 앞에 “/”로 시작하면 된다.

ClassLoader.getResource()

  • 항상 절대 경로 기준으로 리소스를 가져온다.

스레드에서 처리하는 작업은 철저히 예외처리를 하자

  • 스레드 pool사이즈를 10으로 설정했는데, 예외가 터지자 11, 12번 스레드가 새로 생겼다.
  • 스레드에 예외처리를 하지 않으면, 작업을 완료하지 못하고 종료된다.
  • 활성 스레드 수가 코어 스레드 수보다 적으면 새 스레드를 생성한다.
  • 스레드가 종료되고, 새로 생성되는 과정이 반복되면 성능 저하가 일어난다.

CR(Carriage Return)과 LF(Line Feed)

  • 타자기로 글을 쓰다가 종이 끝까지 썼을 때 줄 바꿈을 해야 했다.
  • 이때 커서가 해당 라인의 제일 앞쪽으로 이동하는 것을 CR이라고 한다.
  • 줄 바꿈을 LF라고 한다.

HTTP의 역사

최초의 HTTP - HTTP/0.9

  • HTTP는 연결 지향적인 특성을 지녀 UDP에 비해 안정적이고 신뢰있는 통신을 제공하는 TCP/IP 프로토콜 기반으로 만들어졌다.
  • 이미지는 처리할 수 없고, 다룰 수 있는 HTML만을 가져오도록 설계되어 있다.
  • 헤더없이 GET메서드만 존재한다.
  • 상태코드가 없기에 문제가 발생하면 특정 html파일에 오류와 관련된 설명과 함께 보내졌다.
  • 서버와 클라이언트 간의 연결은 모든 요청 후에 닫힌다.
  • HTTP/0.9 스펙

HTTP/ 1.0

  • 웹이 인기를 끌자, HTTP/0.9사양에 만족하지 못한 사용자, 브라우저, 웹 서버 벤더들이 HTTP에 여러 기능을 추가했다.
  • 표준이 없기에 혼란의 시대가 왔다.
  • 스펙을 표준화 시키기 위한 HTTP-WG이라는 조직이 탄생되었다.
  • HTTP/1.0 스펙인 RFC1946가 발표되었다.
    • 헤더 (기본적인 HTTP 메서드와 요청/응답 헤더 추가)
    • 응답 코드 (요청에 대한 성공/실패 여부를 담은 정보)
    • 다양한 파일 형식 지원 (Content-Type)
    • 조건부 요청
    • 콘텐츠 인코딩(압축)
    • 단기 커넥션 (Request&Response당 Connection 연결)
  • Short-lived Connections
    • 데이터 전송에 대한 무결성을 만족하기 위해서 연결 기반 TCP 표준에 의존하게 된다.
    • 이때 매 요청/응답마다 TCP 커넥션을 맺어야하는 Short-lived Connections 문제가 발생한다.
    • 성능상 큰 손해를 본다.

HTTP/1.1

  • 1.0버전이 나오지 얼마 되지 않아 1.1버전이 발표되었고, 지금까지 널리 사용되고 있다.
  • Persistence connection
    • Persistence connection이란 이름으로 한 번 연결을 맺으면 지정한 timeout동안 지속적으로 연결을 유지한다.
  • Pipelining
    • 클라이언트가 여러 요청을 보내면 응답될 때까지 기다리지 않고 모든 요청을 동시에 보낸다.
    • 서버는 요청이 들어오는 순서대로 처리후 응답되어야 한다.
    • 이러한 문제 때문에 한 요청이 오래걸리면 다른 요청도 지연이 생기는 Head Of Line Blocking 현상이 발생한다.

CopyOnWriteArrayList

  • java.util.concurrent패키지에서 제공하는 클래스이며, 읽기 작업이 많은 경우 적합한 컬렉션이다.
  • 쓰기 작업이 일어날 때마다 내부 배열을 복사하여 동기화 처리를 한다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally