분류 전체보기 359

SQL - LEFT OUTER JOIN 쿼리 Split 하기!

지난번 커버링 인덱스를 적용한 쿼리를 추가 개선한 이야기이다. 커버링 인덱스 적용 - https://jaehoney.tistory.com/333 지난번 조회 Latency가 너무 커서 커버링인덱스를 조회해서 2~3배, 최대 10배 효율적으로 개선을 할 수 있었다. 문제는 Latency는 큰 문제가 없음에도 TPS가 너무 안나왔다. HTTP 트랜잭션이 0.3s~0.4s 정도인 반면 TPS가 10.8 밖에 안나왔다. 결과를 먼저 소개하자면 LeftOuterJoin 구을 Split해서 TPS를 10.8에서 107.7로 개선했다. 아래는 문제 재현을 위해 임의로 구성한 환경에서 테스트를 진행한 부분이다. 기존 코드 먼저 기존 코드를 보자. @Repository public class ArticleReposito..

Database/SQL 2024.02.27

Spring Webflux란 무엇인가?! - 3. Spring Webflux 이해하기!

해당 포스팅은 Netty, Reactor를 넘어서 Spring Webflux에 대한 자세히 다룬다. Spring Reactive Stack 1편에서 봤던 Spring Reactive Stack을 다시 살펴보고 넘어가자. WebFluxAutoConfiguration WebFluxAutoConfiguration은 SpringWebflux 사용을 위한 필수적인 AutoConfiguration이다. 아래 코드를 보자. @AutoConfiguration(after = { ReactiveWebServerFactoryAutoConfiguration.class, CodecsAutoConfiguration.class, ReactiveMultipartAutoConfiguration.class, ValidationAutoC..

Spring Webflux란 무엇인가?! - 2. Reactor 이해하기!

이번 포스팅에서는 Project Reactor의 사용 방법에 대해 다룬다. Project Reactor 아래 포스팅에서 ReactiveProgramming에 대해 설명했고, Reactive Stream과 Project Reactor에 대해서도 간단하게 설명했었다. https://jaehoney.tistory.com/359 개념 자체가 생소하다면 해당 포스팅(이전 편)을 참고하시길 추천한다. Reactive Stream을 이해하고 있다면 굳이 보지 않아도 괜찮다. 첫 번째로 살펴볼 것은 Subscribe이다. Subscribe Mono와 Flux가 구현하는 CorePublisher 인터페이스이다. public interface CorePublisher extends Publisher { void subsc..

Spring Webflux란 무엇인가?! - 1. Netty 이해하기!

Reactive Programming with Spring Boot 아래는 Spring 공식문서에 나와있는 Spring MVC와 Spring Webflux에 대한 설명이다. Spring MVC는 동기 블로킹 기반의 서블릿 API와 request-per-thread 모델을 제공하고, Spring Webflux는 대량의 동시 커넥션이 가능한 Non-Blocking 웹 프레임워크이다. 해당 부분을 조금 더 풀어서 알아보자. Spring Webflux Spring MVC는 request-per-thread 모델이기 때문에 만약 1만개 이상의 요청이 동시에 들어온다면 쓰레드가 부족하게 된다. Spring Webflux는 쓰레드를 가능한 최소한으로 사용하는 모델과 리액티브 프로그래밍 라이브러리를 제공한다고 생각하면..

자바 NIO 간략하게 알아보기!

Java NIO 자바에서 InputStream, OutputStream과 같이 *Stream으로 통신하는 모델을 Java IO 모델이라고 한다. 패키지는 java.io.*에 속한다. 자바 NIO란 New Input/Output의 약자이다. 아래는 Java IO와 Java NIO의 차이이다. 구분 IO NIO 입출력 방식 Stream Channel 데이터 단위 Byte, Character Buffer 데이터 흐름 단방향 양방향 논블로킹 지원 X O 가장 큰 차이는 Java IO는 Stream 기반, NIO는 Channel 기반으로 동작한다. NIO는 java.nio.* 패키지에 속한다. NIO는 아래와 같이 Buffer를 통해 데이터를 읽거나 써서 파일과 통신한다. Java NIO의 모든 IO는 Chann..

Language/Java 2024.01.22

첫 회사에서의 2년 회고 및 이직

최근 이직을 하게 되어서 나름의 생각 정리와 궁금해하실 분들을 위해 공유하는 목적으로 글을 쓰게 되었다. 2년의 업무를 하며 회사 2년 동안 많은 업무를 했다. 너무 다양한 업무를 해서 어디서부터 적어야 할 지 모르겠다.. (정말 많다.) 그래서 그냥 가장 잘한 것과 가장 못한 것을 기록하기로 했다. 가장 잘한 것 업무나 프로젝트와 해결한 문제 중 소개하고 싶은 것들이 많이 있다. 그렇지만 내가 가장 크게 기여한 부분은 좋은 영향이라고 생각한다. 영향력은 크게 두 가지로 나눌 수 있었다. 1. 문화적 영향력 팀원 분들께서도 내가 기술 블로그를 꾸준히 작성하고, 업무 외 시간에 공부하는 것을 너무 잘 알고 있다. 출근도 1시간 30분 ~ 2시간 정도 일찍 와서 학습했다. 유연 근무제이지만 2년 동안 9-6..

Etc./개발 일기 2024.01.03

Axon Framework로 Orchestration-based Saga 구현하기!

해당 포스팅은 아래 강의 내용의 예시 코드를 포함하고 있습니다.https://fastcampus.co.kr/courses/216427강의 코드를 따라하면서 재해석한 부분으로 이해해주시면 감사하겠습니다~Axon Framework란?Axon Framework의 Document의 설명을 보면 첫줄은 아래와 같다.Axon Framework is a framework for building evolutionary, message-driven microservice systems based on the principles of Domain-Driven Design (DDD), Command-Query Responsibility Separation (CQRS), and Event Sourcing.직역해보면 Axon ..

Server/Spring MSA 2023.12.26

Hibernate ORM 공식문서 읽어보기!

Spring JPA 기반에서 개발하다보면 아래 라이브러리를 사용하게 된다. Jakarta Persistence API Hibernate ORM Spring Data JPA Jakrta Persistence API는 명세에 해당한다. 실제 구현하는 기술은 Hibernate ORM에 있다. 해당 포스팅에서는 Hibernate ORM에 대해 공식문서를 읽고 학습 테스트를 진행하면서 알아두면 좋을 내용에 대해 소개한다. Hibernate ORM Hibernate ORM에서 소개하는 목표는 아래와 같다. Hibernate’s design goal is to relieve the developer from 95% of common data persistence-related programming tasks by e..

Server/Spring JPA 2023.12.19

QueryDsl에서 Index Hint 사용하기!

MySQL 5.7을 사용하는 프로젝트의 QueryDSL 동적 쿼리에서 특정 경우에 인덱스를 안타는 문제가 발생했다. 운영 중인 서비스에서 커버링인덱스를 탈 수 있는 상황에서는 인덱스를 선택했지만, 인덱스에 없는 컬럼 정렬 등에서 PK를 타서 쿼리가 밀리는 현상이 자주 생겼다. 그래서 Index Hint를 QueryDsl에서 사용할 수 있도록 조치가 필요했다. 아래는 해당 처리를 위해 길을 떠나면서 얻게된 방법들이다. 1. JPASQLQuery querydsl-jpa는 JPASQLQuery라는 것을 제공한다. 아래는 해당 클래스의 설명이다. JPASQLQuery is an SQLQuery implementation that uses JPA Native SQL functionality to execute q..

Server/Spring JPA 2023.12.08

Spring 공식 문서 정독 후 몰랐던 것 정리!

최근에 Spring 기술을 정확하게 모른다는 생각이 들었다. 그래서 Spring에 대해 더 자세히 알고 사용하고 싶고 더 깊은 레벨로 문제를 해결하고 싶어서 공식 문서를 정독하기로 했다. 아래는 Spring 공식 문서를 정독하여 얻은 지식을 기록한 것이다. 공유보다는 기록이 목적이라 가독성이 매우 좋지 않다. 새롭게 알게 되었거나 리마인드할 필요가 있는 것 정리 빈은 정적 팩토리 메서드로도 생성할 수 있다. 빈은 2개 이상의 이름을 가질 수 있다. @Bean 애노테이션을 사용할 경우 name 옵션을 ,로 연결하면 된다. 지연 초기화를 사용하면 특수한 경우 성능을 Safe 할 수 있다. (DI도 지연이 가능하다.) final class는 프록시를 생성할 수 없다. (final method가 있어서도 안된다..

Etc./개발 일기 2023.12.02