IoC에서 어떻게 빈이 생성되는가
이때 설명하기 쉽게 BookChallengeApplication을 시작점으로 하겠습니다. @SpringBootApplication public class BookChallengeApplication { public static void main(String[] args) { SpringApplication.run(BookChallengeApp...
이때 설명하기 쉽게 BookChallengeApplication을 시작점으로 하겠습니다. @SpringBootApplication public class BookChallengeApplication { public static void main(String[] args) { SpringApplication.run(BookChallengeApp...
문제 사항 1. 책 조회 페이징 API (TPS 4.3) 책 조회에 대한 페이징 API를 구현한 뒤, Ngrinder를 통해 TPS를 확인해보니 4.3 으로 매우 낮은 상태였습니다. 책 ID(클러스터 인덱스)로 조회했을 때 최대 TPS는 약 230에 비해 현저히 낮은 상태였습니다. 이 문제점을 개선하기 위해 다음과 같은 과정을 진행했습니다. 테스...
0. 실행 환경 SpringBoot 3.3.2 MySQL 8.1 (Docker 이용) Mac OS 1. DockerCompose 구성 Docker Compose 파일은 MySQL 마스터와 슬레이브 인스턴스를 설정합니다. version: '3' services: mysql-master: image: mysql:8.0 ...
스레드로컬이 뭔가요? ThreadLocal은 멀티 스레드 환경에서 각각의 스레드가 별도의 변수를 저장하고 사용할 수 있습니다. 스레드 로컬은 어떻게 구현되어 있나요? 단계별로 설명해보세요 1단계 구현 ThreadLocal<T>를 구현하려고 할 때 Thread.currentThread()를 키로 사용하는 ConcurrentHashMap...
클라이언트에서 처음 Swagger 페이지를 GET 요청했을 때 흐름을 적었습니다. DispatcherServlet 요청 흐름 클라이언트의 요청은 서블릿 컨테이너에서 필터들을 지나 스프링 컨텍스트내 DispatcherServlet이 가장 먼저 요청을 받습니다. DispatcherServlet의 doService 메소드에서 웹 요청 처리가 진...
스레드를 직접 구현해서 사용할 때 문제점 스레드 생성 비용으로 인한 성능 문제 : 스레드 생성하는 작업은 시스템 콜을 통해 처리되며, 이는 OS 커널 레벨에서 메모리 할당등이 일어나기 때문에 성능이 느립니다. 또한, 새로운 스레드가 생성되면 운영체제의 스케줄러는 이 스레드를 관리하고 ...
컬렉션 프레임워크는 원자적인 연산이 아니고 여러 연산이 들어가 있기 때문에 멀티 스레드 상황에서 문제가 생깁니다. 따라서 동시성 컬렉션을 만들기 위해 여러가지 도입을 했습니다. 프록시 도입 ArrayList, LinkedList, HashSet, HashMap 등의 코드도 모두 복사해서 synchronized 기능을 추가한다는 것은 매우 비효율적입...
생산자 소비자 문제란 생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중 하나로, 여러 스레드가 동시에 데이터를 생산하고 소비하는 과정에서 발생합니다. 생산자란, 데이터를 생성하는 역할을 하며, 파일에서 데이터를 읽어오거나 네트워크에서 데이터를 받아와 버퍼에 저장하는 역할을 하는 스레드입니다. 소비자란, 생성된 데이터를 ...
메모리 가시성이란 멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지 알 수 없는 문제를 메모리 가시성(memory visibility)이라 합니다. 문제점 예시 예를들어, 아래 코드는 메모리 가시성 문제 때문에 work 스레드는 여전히 동작합니다. public class VolatileMain{ public sta...
스레드를 생성하는 방법 2가지 Thread 상속 Thread 클래스를 상속하고, 스레드가 실행할 코드를 run 메소드에 재정의합니다. 그리고나서 Thread를 상속한 클래스의 객체를 생성하고 start() 메소드를 호출합니다. start()를 호출하면 스레드가 만들어지고 해당 스레드에서 run 메소드를 실행합니다. Runnable 구현 Run...