분류 전체보기 (225) 썸네일형 리스트형 반정규화를 통한 조회 성능 개선 프로젝트에서 게시글 페이징 조회 시 게시글 데이터 뿐만 아니라 게시글의 좋아요, 댓글, 북마크 수를 함께 반환해야 했다. 따라서 게시글과 연관된 좋아요/댓글/북마크 엔티티를 함께 조회하면서 N+1 문제가 발생했다. N+1 문제를 해결한 과정은 다음과 같다.1. 페치 조인가장 대표적인 N+1 문제 해결 방안으로 패치 조인이 있다. 그러나 일대다, 다대다 관계인 컬렉션 페치 조인은 주의할 점이 있다. 바로 offset, limit 등의 키워드를 통한 페이징 처리가 DB에서 이뤄지지 않고, 조인 결과 전체가 메모리로 로드되고 애플리케이션 단에서 페이징 처리가 이뤄진다는 점이다. 그 이유는, 컬렉션 페치 조인 시 데이터 수가 의도치 않게 증가하게 되기 때문이다. 예를 들어, 게시글 1에 좋아요가 2개, 게시글 .. 자바의 동기화 메커니즘(volatile, synchronized, Lock(ReentrantLock), Atomic/CAS, 동기화 컬렉션) volatile멀티스레드 환경에서 한 스레드가 변경한 값을 다른 스레드가 제대로 볼 수 있는지에 대한 문제를 메모리 가시성이라고 한다. 즉, 메모리에 변경한 값이 보이는가, 보이지 않는가의 문제이다. 메모리 가시성 문제는 캐시 메모리로 인해 발생한다. CPU 입장에서 메인 메모리는 거리도 멀고 속도도 상대적으로 느리다. CPU 연산은 매우 빠르기 때문에 CPU 연산의 빠른 성능을 따라가려면, CPU와 가까이 있으며 매우 빠른 메모리가 필요하다. 이것이 캐시 메모리이다. 캐시 메모리는 메인 메모리보다 CPU와 가까이 있으면서 속도도 더 빠르다. 현대의 대부분의 CPU는 각 코어마다 캐시 메모리를 갖는다. (참고로 여러 코어가 공유하는 캐시 메모리도 있다.) 예를 들어, 다음 그림처럼 main 스레드가 CP.. 자바에서의 모니터(synchronized, wait() & notify(), Condition)와 생산자-소비자 문제 동기화여러 스레드가 동시에 공유 자원에 접근할 때, 접근 순서에 따라 결과 값이 달라지는 현상을 경쟁 상태(race condition)이라 한다. 이런 문제를 방지하고 데이터의 일관성과 무결성을 보장하기 위해 각 스레드가 공유 자원에 접근할 때 동시에 접근하지 못하도록 접근 순서를 제어하는 것을 동기화라고 한다. 그리고 이때 데이터 일관성을 보장하기 위해 하나의 프로세스만 접근해야 하는 영역을 임계 영역(critical section)이라 한다. 따라서 동기화는 경쟁 상태를 방지하고 여러 스레드가 임계 영역에 안전하게 접근할 수 있도록 실행 순서를 조정하는 것이다. 대표적인 동기화 기법으로 뮤텍스, 세마포어, 모니터가 있다.뮤텍스(Mutex)뮤텍스는 임계 영역에 하나의 스레드만 접근하도록 한다. 그리고 .. @Async, @Scheduled의 스레드에 대해 비동기 작업을 위한 스레드스프링은 비동기 작업을 위한 TaskExecutor라는 인터페이스를 제공한다. 스프링의 TaskExecutor 인터페이스는 자바의 Executor 인터페이스와 동일하다. 그리고 스프링이 제공하는 TaskExecutor의 구현체는 다음과 같다.SyncTaskExecutorSimpleAsyncTaskExecutorConcurrentTaskExecutorThreadPoolTaskExecutorDefaultManagedTaskExecutor...@EnableAsync의 JavaDoc을 살펴보면 다음과 같이 설명되어 있다.By default, Spring will be searching for an associated thread pool definition:* either a uniqu.. ExecutorService의 스레드 풀 관리 ExecutorService의 스레드 풀 관리ExecutorService의 기본 구현체인 ThreadPoolExecutor의 생성자는 다음 속성들을 사용한다.corePoolSize: 스레드 풀에서 관리되는 기본 스레드 수maximumPoolSize: 스레드 풀에서 관리되는 최대 스레드 수keepAliveTime, TimeUnit unit: 기본 스레드 수를 초과해서 만들어진 초과 스레드가 생존할 수 있는 대기 시간, 이 시간 동안 처리하는 작업이 없으면 초과 스레드는 제거된다.BlockingQueue workQueue: 작업을 보관할 블로킹 큐corePoolSize와 maximumPoolSize의 차이를 알아보기 위해 다음 예제를 살펴보자. printState() 메서드는 스레드 풀 관련 정보를 확인하기.. ExecutorService의 우아한 종료 만약 고객의 주문을 처리하는 서버를 운영중인데, 서버를 재시작해야 한다고 가정해보자. 이때 고객의 주문을 처리하고 있는 도중에 갑자기 재시작하면 해당 고객의 주문이 제대로 진행되지 못할 것이다. 따라서 새로운 주문 요청은 막고, 이미 진행중인 주문은 모두 완료한 후에 서버를 재시작하는 것이 가장 이상적이다. 이처럼 서비스를 안정적으로 종료하는 것도 매우 중요하다. 이렇게 문제 없이 우아하게 종료하는 방식을 graceful shutdown이라고 한다.ExecutorService의 종료 메서드ExecutorService의 종료 관련 메서드는 다음과 같다.서비스 종료void shutdown()새로운 작업을 받지 않고, 이미 제출된 작업을 모두 완료한 후에 종료한다.논블로킹 메서드이다. 즉, 이 메서드를 호출.. Executor 프레임워크(ExecutorService, Callable, Future) 스레드 풀의 필요성스레드 풀을 사용하면 스레드를 재사용할 수 있어서, 스레드 생성 시간을 절약할 수 있다. 또한 생성되는 최대 스레드 수가 제한되어 무분별하게 스레드가 생성되어 자원을 낭비하는 것을 막을 수 있다. 스레드 풀을 직접 구현하려면 다음과 같은 것들을 고려해야 하기 때문에 매우 까다롭다.스레드가 처리할 작업이 없으면 스레드의 상태를 WAITING 상태로 관리하고, 작업 요청이 오면 RUNNABLE 상태로 변경해야 한다.어떤 생산자가 작업을 만들고, 스레드 풀에 있는 스레드가 소비자가 된다. 따라서 생산자-소비자 문제를 고려해야 한다.자바가 제공하는 Executor 프레임워크는 스레드 풀과 스레드를 관리해주며, Runnable의 문제점과 생산자-소비자 문제까지 해결해준다. 실무에서는 스레드를 직.. [프로그래머스] 등대 https://school.programmers.co.kr/learn/courses/30/lessons/133500?language=java 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr트리간선이 n-1개이고, 모든 등대가 서로 다른 등대로 이동 가능하다.즉, 사이클이 생길 수 없다. 따라서 트리로 바라볼 수 있고 dfs, bfs 같은 트리 순회 방법을 사용할 수 있다.그리디임의의 한 점을 루트 노드라고 생각하여, dfs를 진행한다고 가정하자. 가장 아래인 리프 노드는 불이 켜질 필요가 없다. 즉, dfs를 진행하며 가장 아래인 리프 노드까지 내려간 뒤, 리.. 이전 1 2 3 4 5 ··· 29 다음