728x90

Spring 14

WebFlux 에서 ResponseBody 에 Mono, Flux 를 사용하는 이유

최근 Reactive Programming 에 조금씩 관심을 기울여서 보고 있는데 강의를 보다가 하나 궁금한점이 생겼다. 아래 코드를 보면 Flux, Mono Type 으로 Return 하거나 RequestBody 에서 부터 받아서 사용하는데 이게 도대체 무슨차이지? 라는 생각이 들었다. Kotlin Coroutine 이나 JavaScript 의 Promise Model 을 공부하면서 느낀건 결국 Reactive 세상에서 가장 중요한건 아래의 두가지라는 생각이 들었다. Thread 의 Blocking 을 최소화 하는 코드를 작성해라. Lazily 하게 값이 evaluate 되어야 한다. 위의 두가지가 제일 중요하기에 Fully Non-Blocking 이라고 불리는 Web-Flux 에서 Response 에..

Spring 2022.08.11

어떻게 Service Layer 간 Transaction Session 을 공유할 수 있을까?

Spring 의 Transaction 을 사용하다 보면 이런 생각이 든적이 있을 것이다. 어떻게 Propagation 정책이 동작하는거지? Code 가 Generate 될때 Inline 함수처럼 해당 함수로 들어가는건 아닐 것 같은데? 어떻게 같은 Session 을 공유하는 걸까? 라는 생각이 들 것이다. 아래의 코드를 한번 보자. 김영한님의 스프링 DB 1편 강좌의 예시 코드 중 하나이다. public void updateMoney(Connection conn, String memberId, int money) throws SQLException { String sql = "update member set money = ? where member_id = ?"; PreparedStatement pstm..

Spring 2022.06.06

Spring-Cloud-Sleuth 비동기 요청시 서버간 TraceId 보존하는 방법

방법을 찾게 된 계기 Java 나 Kotlin 에서는 ThreadLocal 을 이용가능하다. 주로 Logback 의 MDC 에서도 이 ThreadLocal 을 이용해서 하나의 스레드내에서 동작하는 특정 값을 로깅하기 위해 이용한다. Slueth 또한 MDC 를 이용하는데 MDC 에 traceId 와 spanId 를 저장한다. traceId 를 어떻게 Thread 에서만이 아닌 서로 다른 서버에서도 똑같은 값으로 주어 좀 더 흐름을 찾기 쉽게 만들까? 라는 고민을 하다가 아래와 같이 삽질을 하게 되었다. 예시 백문이 불여일타라고 예시코드로 시작해보자. 일단 ThreadPoolTaskExecutor 를 테스트를 위해서 대충 만들어보자. 이제 Async 에서는 위의 ThreadPoolTaskExecutor 를..

Spring 2022.04.27

오늘자 삽질 - Spring Kafka

회사에서 Spring Kafka 를 연동하던 중에 Local 에서 콘솔로 Topic 에 직접 Message 를 쏘니 잘 안되는 상황이 발생했다. 그래서 처음에는 아 key-serializer 와 value-serializer 가 잘못 설정되어 있나? 라는 생각을 했다. 사실 내가 짠 코드가 아니여서 코드를 디버깅 좀 해보다가 처음에는 KafkaRecord 에 자꾸 코드에서 DeserializerException 을 넣길래 아니 이게 key-value deserializer 가 잘못되어 있는거 아니야? 하고 빼고 하니깐 Default Serializer 인 StringDeserializer 로 값이 넘어와서 잘 보였다. 하지만 Object 로 Mapping 되지 않았다. 그래서 궁금해서 ErrorHandl..

Spring 2022.04.13

기존에 있던 Object 를 Bean 으로 등록하는 방법

Spring Bean 은 MetaData 정보를 가지고 저장되는데 해당 정보를 나타내는 클래스는 BeanDefinition 이다. 가지고 있는 MetaData 정보는 아래와 같다. - package-qualified Class Name - IoC Container 내에서의 Spring Bean 동작 요소 (LifeCycle, Scope, etc..) - 의존성을 지니고 있는 다른 Bean 과의 관계 - 새롭게 만들어질 Bean 에 적용될 Configuration 정보들 (Hibernate Connection Pool Size 과 같은 것들) 즉, IoC Container 에서 해당 Bean 을 어떻게 생성해야 할지 정보를 적어 놓는 것이다. 부가적으로 ApplicationContext 에서는 사용자가 생..

Spring 2022.04.05

[JPA] Transactional read only 일때 성능상 이점

회사에서 @Transacational(readOnly = true) 일때 어떤 성능점 이점이 있을까? 라는 것을 생각해보았다. 기본적으로 무거운 Dirty Check 등을 안한다의 지식을 알고 있었는데, 근데 Dirty Check 는 왜 무거운데? 그리고 Snapshot 비교는? 등등 너무 궁금한 점이 많아져서 코드를 직접 분석하기로 했다. 일단 첫번째 코드는 isReadOnly 에 대한 분석인데, 설명을 간략하게 설명하면 아래와 같다. 이걸 read-only transaction 으로 optimize 할건지에 대한 여부를 알려주는 flag 라고 생각하면 된다. 참고로 어떻게 현재 트랜잭션에서 readOnly 여부를 알려주는 코드는 아래에 있다. 우리가 @Transactional(readOnly=true..

Spring 2022.03.21

Kotlin Spring 에서 Required = false 대신 ?(nullable) 을 사용가능한 이유

회사 코드를 짜다가 문득 생각이 하나 들었는데 Java 에서 @RequestParam(Required = false) 대신 Optional Long id 이런식으로 사용하면 동일하게 작동할 수 있다는 사실을 알고 있었다. 이것이 가능한 이유는 Spring Framework 의 RequestParamArgumentResolver 코드에 아래와 같은 코드가 존재한다. 여기서 중요한건 parameter.nestedIfOptional 인데 해당 Type 이 옵셔널인지 확인해주는 코드이다. 그래서 코틀린에서도 ?(nullable-type) 을 통해서 충분히 가능하지 않을까 생각하고 동일 위치에 디버그를 찍어보았다. 위의 디버깅 결과가 결론을 말해주는데 즉, 코틀린에서는 required = false 를 사용할 이..

Spring 2022.03.17

Hibernate 1 차 Cache 에 대해서 알아보자

Hibernate 에서는 데이터베이스의 부하를 줄이기 위해서 1차 캐시를 이용한다. 1차 캐시란 Transaction 내에서 작동하는 캐시를 뜻한다. 이 글은 위의 1차 캐시가 어떻게 작동하는지 알기에 본다고 생각하고, Hibernate 의 코드를 분석하는데만 신경을 쓸 것이다. 코드는 매우 간단합니다. @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } @Transactional public void test() { User user = new Us..

Spring 2022.03.10

MySQL 으로 형태소 분석기 없는 자동완성만들기

오늘은 간단하게 형태소 분석기 까지는 필요없는 자동완성 기능을 만들때 빠르게 만들 수 있는 방법을 해보려고 한다. 실제로 회사에도 적용한 방법이다 :) Ngram-Parser 를 택한 이유 일단 MySQL 에 ngram parser 를 이용한 방법인데 ngram parser 를 선택한 이유는 아래와 같았다. 첫째, 자동완성으로 검색되야 할 데이터 들이 MySQL 에서 관리되야 할 대상들이였다. -> 사실 NoSQL 로 가져가면 대표적으로 ES 형태소 분석 parser 나 빠른 검색등이 가능하다고 알려져 있으나 내 조건은 위와 같았다. 두번째, 딱히 ES 를 이것만을 사용하자고 추가하기에는 자원의 낭비이다. -> 굳이 MySQL 로도 가능한데 얼마 차이 안나는 성능때문에? 의문이다. 그리고 ROW 수가 적..

Spring 2022.02.24

Spring 에서 왜 Private Method 는 Cglib Proxy 에 포함이 되지않을까?

Spring 면접 하면 잘 등장하는 단골 질문 중 하나이다. 이 개념을 이해하기 위해서는 일단 Proxy 디자인 패턴에 대해서 간단하게 짚고 넘어가야 한다. 우리가 흔히 볼 수 있는 Server-Client 형태는 아래와 같다. Client 는 Server 에 요청을 보내고, Server 는 요청을 처리한다. 만약 객체 세상으로 가져온다고 했을때는 아래 그림처럼 A 객체가 B 객체에게 협력을 요청하는 것일 수 있다. 근데 만약 B 객체는 너무나 은밀한 친구라 중간에 누군가 자신이 한것처럼 대신 행동을 하는 척 해줬으면 좋겠다 라고 해보자. 그렇다면 A 객체는 B 객체와 이야기 하는것 같지만 사실은 대리자가 대신 해주고 있는 것으로 객체를 설계 해주어야 할 것이다. 위와 같은 설계가 될 것 이다. 하지만 ..

Spring 2022.02.22
728x90