배경. 배치를 만들던 도중에 Bean으로 등록해놓은 Thread Pool에 Thread가 꽉차서 Queue에 더 이상 Job이 들어갈 수 없다는 예외가 발생했습니다. 예를 들기 위해 테스트 코드를 하나 작성해보겠습니다. class ThreadPoolExecutorTest { @Test fun testThreadPoolQueueCapacity() { val executor = ThreadPoolExecutor( 2, // core pool size 2, // max pool size 0L, // keep alive time TimeUnit.MILLISECONDS, // time unit for keep alive time LinkedBlockingQueue(1) // queue with capacity 1..
2000개 WHERE .. IN 절을 처리하는 과정에서 옵티마이저가 Index를 타지 않고 Table Full Scan을 하는 것을 확인했습니다. 이를 방지하기 위해 여러 고민을 하던 와중 FORCE 인덱스를 발견했는데 이에 대해 소개하고 어떤 상황에 쓰면 좋을지 고민해보는 시간을 가져 보겠습니다. 또한 결론적으로 말씀드리면 결국 이 방법이 아닌 다른 방법을 택했는데 그거에 관해서도 소개 드리겠습니다. 또한 모든 설명은 MySQL 기준입니다. FORCE INDEX? FORCE 인덱스는 Query Hint 중 하나로 특정 인덱스를 강제로 사용하도록 합니다. MySQL에서는 적절한 Index를 사용하지 않으면 성능이 저하될 수 있기 때문에 신중하게 선택하여야 합니다. FORCE INDEX는 다음과 같이 사용..
GC는 안쓰는 인스턴스를 처리하기 전에 반드시 stop the world를 하고 이 순간 모든 애플리케이션 동작이 멈추고 GC는 빠르게 불필요한 인스턴스 메모리를 제거합니다. 실제로 회사에서 인터셉터에서 계속 호출되는 똑같은 형태의 객체가 존재하여 플라이웨이트 패턴을 이용하여 자주 참조되는 인스턴스를 static으로 선언하여 GC 동작이 자주 되는 코드를 개선한 경험이 있었는데요. GC가 자주 호출 되면 그 만큼 stop the world가 자주 발생하여 사용자 입장에서 느껴질 정도로 애플리케이션 동작이 지연될 수 있다고 한 글을 읽어 이러한 개선을 했던 것입니다. (메모리 측면도 물론 고려하여) 그렇다면 stop the world가 길어질 수록 성능이 떨어지기 때문에 GC 튜닝의 최종 숙제는 결국 st..
보통 PK로 Join을 하고 보통 우리는 PK로 많이 데이터베이스를 조회합니다. 이러한 이유는 여러가지가 있지만 그 중 논 클러스터링 인덱스와 클러스터링 인덱스의 차이에서 나오는 경우도 있는데요. MySQL을 기준으로 클러스터링 인덱스와 논 클러스터링 인덱스에 대해 알아보겠습니다. 인덱스 페이지 인덱스 페이지는 인덱스 트리의 각 노드에 해당하며, 데이터베이스 시스템은 인덱스 페이지를 사용하여 테이블에서 특정 행을 찾을 수 있습니다. 인덱스 페이지는 키 값에 대한 데이터 위치 정보를 갖고 있기 때문에, 데이터 베이스는 키 값을 인덱스에서 찾은 다음 그 데이터 위치 정보를 활용하여 테이블에서 행을 찾습니다. 인덱스 페이지는 데이터 베이스 시스템의 메모리 내부에 저장될 수도 있고, 디스크에 저장될 수 도 있습..
Lombok이란? Lombok은 자바에서 제공해주는 라이브러리로 반복적인 코드인 Getter Setter 생성자등을 어노테이션을 기반으로 생성해주며 코드 가독성을 향상시켜줍니다. (물론 어노테이션이 떡칠된 Entity를 보면 적당히 쓰는것도 필요해보입니다.) 어떻게? Lombok은 컴파일 시점에 Annotation Processor를 사용하여 @Getter와 @Setter 같은 어노테이션이 붙은 소스를 읽어들이고 이를 기반으로 새로운 코드를 생성합니다. 순서를 보기 전 미리 알아둬야할 키워드가 있습니다. 추상 구문 트리 컴파일러는 소스 코드를 분석하고 문법에 맞지 않는 부분을 찾아내고 이를 수정하거나 오류를 보고하는데 이 과정에서 소스 코드를구문 분석할 때 생성되는게 추상 구문 트리입니다. 추상 구문 트..
배경 https://golf-dev.tistory.com/53 Redis INCR을 이용한 분산환경에서의 동시성 제어하기 문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save( golf-dev.tistory.com 제 블로그를 많이 읽어보셨다면 익숙한 글 입니다. Redis INCR 동작원리를 이용해서 분산환경에서 Lock을 구현했었는데요. 이 방식이 과연 최선이었는가에 대해서 고민을 해보는 시간을 가져볼 겁니다. 뭐가 문젠데? 요청 프로세스를 다이어그램으로 그려보면 다음과 같습니다. 이미 요청 횟수를 정해놓고 구현했기 때문에 INCR로 두 서버에서 요청수를 co..
대표적으로 필자가 사용하는 언어인 Java와 Kotlin은 compile 방식으로 해석되고 있습니다. 그리고 compiler로 해석된 자바 바이트 코드는 JVM의 interpreter로 기계어로 번역되어 실행되고 있습니다. 그리고 OS 코드영역에 올라가 OS에서 기계어를 읽어 적절한 동작을 합니다. 그렇다면 Java나 Kotlin은 컴파일 방식을 택했고 JVM은 왜 interpreter 방식을 택했을까요? 이 둘의 차이점은 무엇일까요? ⚙️ Compiler compiler는 소스코드를 기계어로 해석합니다. 과정은 다음과 같습니다. 소스 코드 읽기 : 컴파일러는 소스 코드 파일을 읽어들입니다. 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해합니다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을..
개인 프로젝트를 진행하면서 버그를 겪고 해결하면서 공부한 내용을 포스팅 할 예정입니다. 자세한 코드 과정과 도출 과정이 궁금하시다면 Github 를 참고해주세요 Transactional 의 동작방식 먼저 이 문제를 파악하기 전에 동작 방식을 이해해야합니다. Transactional annotation은 AOP 기반으로 동작하고 있습니다. 관리할 프록시가 생성되고 이 객체는 타깃을 감싸 해당 객체의 메소드 호출을 중간에 가로챌 수 있게 합니다. 그 후 메소드 호출 전 후 시작 커밋 롤백 등의 작업을 수행할 수 있게 코드를 주입해주고 이러한 원리 때문에 저희는 쉽게 하나의 요청단위로 묶어 비즈니스 오염 없이 트랜잭션 특징인 ACID를 위반하지 않게할 수 있습니다. 문제 상황 @Aspect @Component..
흔히 대용량 트래픽이 몰리는 서비스의 회사 스택을 보면 webFlux란걸 볼 수 있습니다. 그리고 실제 여러 글들에서 볼 수 있는 퍼포먼스 비교 분석 그래프를 보면 그 차이는 눈에띄게 차이가 납니다. 그렇다면 webFlux란 뭘까요? webFlux는 reactive programming을 지원하는 프레임워크로 비동기를 사용해 대용량 처리를 적은 자원으로 매우 빠르게 동시 처리하는 성능을 보여줍니다. 그렇다면 무조건 좋은 걸까요? 답을 말씀드리자면 그렇진 않습니다. 그렇다면 비동기가 좋은 경우는 어떤 경우일까? 먼저 어떤 경우에 좋은지 알기 위핸 사전 개념인 비동기와 동기 블로킹 논블로킹에 대해 알고 있을 필요가 있습니다. https://golf-dev.tistory.com/24 자바는 Synchroni..
스프링 MVC 구조는 tomcat 엔진에 thread pool을 사용하고 webflux 구조는 netty 엔진의 이벤트 루프를 통해 스레드를 미리 만들어놓은 환경에서 작업을 처리합니다. 이렇게 미리 만들어놓고 쓰는 이유는 스레드를 생성될 때마다 비용이 비싸기 때문에 미리 만들어 놔야 한다고 알고 있을겁니다. 이번 포스팅에서는 그 이유에 대해 알아보도록 하겠습니다. One-To-One multi-threading model 먼저 JVM에서의 다중 Thread 모델은 one to one 모델을 따르고 있습니다. 그렇다면 이 모델은 도데체 무엇이고 thread pool 등장 배경과 무슨 관계 일까요? one to one 모델은 사용자 수준의 thread와 커널 스레드가 1대 1로 연결되어있는 형태를 말합니다...
- Total
- Today
- Yesterday
- 취업
- swarm
- Redis
- 프로젝트
- 취준
- 동시성
- 자바
- IT
- Kotlin
- CS
- Spring
- DB
- 프로그래밍
- 코드
- 인터뷰
- 게시판
- docker
- 취업준비
- 개발
- 면접 준비
- 면접준비
- 코딩
- thread
- java
- 면접
- 백엔드
- DevOps
- JPA
- MySQL
- 개발자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |