Server 121

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는 쓰레드를 가능한 최소한으로 사용하는 모델과 리액티브 프로그래밍 라이브러리를 제공한다고 생각하면..

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

해당 포스팅은 아래 강의 내용의 예시 코드를 포함하고 있습니다.https://fastcampus.co.kr/dev_online_projectmsa강의 코드를 따라하면서 작성한 부분으로 이해해주시면 감사하겠습니다.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.직역해보면..

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

JPA - OSIV 제대로 이해하기!

OSIV(Open Session In View) OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 개방하는 기능이다. 이를 사용하면 트랜잭션이 종료되어도 영속성 컨텍스트가 관리될 수 있다. 여기까지는 사실 다 아는 내용이고 OSIV의 동작 원리에 대해 알아보자. OpenInView Spring 환경에서 보통 아래의 property로 OSIV 설정에 접근한다. spring.jpa.open-in-view 아래는 JpaWebConfiguration 클래스의 애노테이션이다. open-in-view 속성에 따라 해당 Configuration이 등록된다는 것을 알 수 있다. 이를 통해 알 수 있는 놀라운 사실은 'Spring JPA도 웹과 연관이 있다.'는 것이다. JpaProperties..

Server/Spring JPA 2023.11.19

Spring에서의 Proxy, AOP 동작원리 이해하기!

지난번 Spring AOP를 적용하면서 생겼던 문제에 대해 소개했다. https://jaehoney.tistory.com/375 이번 포스팅에서는 실무보다는 기본 개념에 대해 집중적으로 알아보자. 해당 포스팅은 김영한님의 스프링 핵심 원리 - 고급편의 프록시 관련 내용을 정리한 것이며, 프록시와 AOP의 동작의 기본 개념이라고 보면 된다. 프록시 패턴 프록시 패턴에서는 프록시가 너무 많이 생기는 문제가 있다. 아래는 GOF 프록시 패턴의 예시이다. 예로 들면 Repository 1개마다 전부 프록시 클래스를 생성해야 한다. 프록시를 적용할 클래스가 100개라면 100개의 프록시를 적용하는 코드를 만들어야 한다. 즉, 단일 책임 원칙에 어긋나고 기능 변경 시 다수의 클래스에 변경이 전파된다. 이 문제를 해..

Server/Spring 2023.11.16

Hibernate @Where 애노테이션이 동작하지 않는 이유!

@Where 애노테이션이 동작하지 않는 이유실무에서 Learning 테이블 레코드를 일괄 수정 시 인덱스를 타지 않는 문제가 발생했다.이유는 @Where(clause = "del_flag = 'N'")을 했는데, QueryDsl을 사용한 조회에서는 해당 조건을 수행하지 않아서 인덱스를 탈 수 없었다.요즘 Hibernate 및 JPA에 대한 관심이 부쩍 늘어서 이 문제에 접근해보면 경험치를 얻을 수 있을 것 같아서 디버깅해봤다.문제 파악다른 코드에 대한 영향 없이 확인해야 하기 때문에 새로 프로젝트를 만들었다.아래의 JPA Entity를 만들었다.@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Where(clause = "name = 'v..

Server/Spring JPA 2023.11.05

Spring의 Servlet에 X-Forwarded-For 헤더가 왜 안들어올까?!

아래는 실무 중에 만난 이슈와 해결 과정에 대해 다룬다.정확한 원인과 해결 방법보다는 풀어나간 과정에 집중되어 있다.원인과 해결 방안이 궁금한 분은 가장 아래로 내리시면 될 것 같습니다!헤더에 X-Forwarded-For이 안들어오는 문제 발견아래는 공통 라이브러리의 코드의 일부 코드를 요약한 것이다.public class HeaderUtil { static public HeaderInfo initHeaderInfo(HttpServletRequest request){ return HeaderInfo.builder() .token(request.getHeader(HeaderInfo.JWT_HEADER)) .clientIp(request..

Server/Spring 2023.10.26

Accept 헤더가 포함된 REST API에서 에러를 내려주는 방법!

이번 포스팅은 회사에서 메일 원문 다운로드 API를 개발하면서 생긴 이슈에 대해 공유한다. 이해하기 쉽도록 메일 원문 대신 첨부 파일로 재해석해서 작성했다. 요즘은 파일 스토리지로 외부 인프라를 많이 사용해서 직접 설계해야 되는 상황이 드물긴 하다. 파일 접근 게시판의 첨부파일 기능을 생각해보자. 메타 데이터에는 빨간 네모와 같이 파일명과 확장자, 파일 사이즈, 다운로드 경로 등이 저장될 것이다. 다운로드를 클릭하면 실제 파일 스토리지에 접근해서 파일을 Binary 형태로 가져올 것이다. 게시판을 노출하기 위해서 메타 데이터를 가져올 때 파일 정보까지 모두 가져오면 오버헤드가 발생할 것이다. 그래서 2개의 End-point로 분리했다. Accept REST API에서는 url에 자원에 대한 경로를 지정한..

Server/Spring 2023.10.20