본문 바로가기

분류 전체보기

(333)
[Reactive stack] Spring data R2DBC 커넥션 유지 방법 재 가공한 글을 medium에서도 읽을 수 있습니다. 이전 글 https://dlwnsdud205.tistory.com/359 을 읽고오시면 더 이해하기 쉽습니다. [Reactive stack] R2DBC with mysql 삽질기 최근 진행하고있는 프로젝트를 MVC에서 Web flux로 변경함에 따라 DB 통신기술또한 비동기로 변경해야 했습니다. 때문에, 더이상 Spring data jpa 를 사용할 수 없었고 Database와 비동기로 통신할 수 있는 dlwnsdud205.tistory.com webflux와 spring data r2dbc 를 사용하면서 다음과 같은 의문이 들었습니다. 스프링 문서에는 R2DBC에서도 선언적 트랜잭션을 지원한다고 나와있는데, webflux에서 이게 어떻게 가능한거지?..
[Reactive stack] R2DBC with mysql 삽질기 재 가공한 글을 medium에서도 읽을 수 있습니다. 최근 진행하고있는 프로젝트를 MVC에서 Web flux로 변경함에 따라 DB 통신기술또한 비동기로 변경해야 했습니다. 때문에, 더이상 Spring data jpa 를 사용할 수 없었고 Database와 비동기로 통신할 수 있는 기술이 무엇이 있는지 찾아보게 되었습니다. 제가 찾은 기술은 크게 2가지 였는데요, 1. Hibernate Reactive 2. R2DBC Hibernate Reactive는 기존의 ORM기능을 전부 활용할 수 있다는 장점이 있지만 다음과 같은 이유때문에 저는 R2DBC를 선택했습니다. 1. Spring에서 지원하지않음. 2. 트랜잭션 범위가 하나의 스레드로 국한되며 선언적 트랜잭션을 사용할 수 없음. 3. 기존 도메인이 굉장..
[Java] Json 기본 생성자 없이 역직렬화 하기 개발을 하다보면, 아래와 같은 예외로그를 심심치 않게 마주할 수 있습니다. 위 예외는 역직렬화 과정중에 기본 생성자를 찾을 수 없어서 발생하는 예외 인데요, Spring Boot Web 2.X 이후부터는 설정이 추가되어서 기본 생성자 없이 역직렬화가 가능하지만, 간혹가다 Spring Boot Web 에서 등록해주는 ObjectMapper를 사용하기 힘들때가 있습니다. 생성자에 @JsonCreator를 매핑하거나, 파라미터에 @JsonProperty를 전부 매핑해주면 쉽게 해결이 가능하지만.. 관리포인트가 한군데 더 생기며, 후술할 방식에 비해서 보일러 플레이트가 늘어나기 때문에 선호하는 방식은 아닙니다. 스프링과 같이 기본생성자를 통해 역직렬화를 하기 위해선 어떻게 해야할까요? Jackson에서는 Jac..
[끄적끄적] E2E(API) 테스트 자동화 도입기 (운영환경과 비슷한 환경에서 API 사용자 입장에서 종단까지 테스트 한다는 의미로 E2E 테스트와 API 테스트를 혼용해서 사용하고 있습니다.) 최근, 테스트의 중요성을 깨닫게된후 TDD나 ATDD 방법론에 따라 개발을 진행하고 테스트 커버리지를 도입하는등 더 안정적인 서비스를 구축하기 위해서 노력을 기울이고 있습니다. 실제로, 이러한 방법론을 적용하니, 목표 커버리지 70%를 훨씬 넘는 수치를 달성하고 꼼꼼한 테스트를 작성했다는 생각을 하기도 했었습니다. 그렇다면, 이러한 노력이 (QA 단계에서) 적은 버그로 이어졌을까요? 창피하게도 여전히 버그는 발생했고, 심지어 꼼꼼히 테스트를 하고 버그가 발생하지 않을것 이라 예상한 API에서도 버그가 발생했었습니다. 문제의 원인은 다음과 같은 예측하지 못한 여러..
[Redis] Sentinel failover 테스트 최근에 Redis HA 를 공부하다가, 다음과 같은 의문이 들었습니다. "sentinel구조에서 master 노드가 다운되었을때, failover 과정중 들어오는 데이터들은 어떻게 되지???" 검색을 해봐도 원하는 내용이 설명되어 있는 자료를 찾기 힘들어서 직접 테스트 해보기로 결심했습니다. 구성 구성은 아래와 같습니다. redis-server version : 7.2.1 lettuce core : 6.2.4 monitoring : redis-stat 아래 더보기를 여시면 sentinel 구성파일을 다운받을 수 있습니다. 혹시나 따라하실분은 아래 파일을 다운받아서 사용하시면 될것 같습니다. 더보기 처음에는 편하게 docker로 구성했는데, sentinel에서 master-node ip를 응답하는 과정에서..
[Redis] Cluster 환경에서 Transaction 에러 해결하기 Redis는 기본적으로 원자적으로 동작하지만, 사용하기에 따라 갱신손실의 문제등 정합성이 맞지 않는 문제가 발생할 수 있습니다. 저장하는 구조를 변경해, Redis에서 제공하는 자료구조로 해결할 수 있다면 최고겠지만 그렇지 않다면, Redis에서 제공하는 트랜잭션을 사용해야합니다. 트랜잭션 관련 내용은 다음 글에 설명되어 있습니다. https://dlwnsdud205.tistory.com/354 [Redis] Transaction으로 갱신손실 문제 해결하기 갱신손실 문제 예시 Redis는 기본적으로 원자적으로 동작하지만, 사용에 따라 여러가지 문제가 발생할 수 있다. (단, 레디스에서 제공하는 원자적으로 동작하는 set ... get 등의 메소드를 활용할 수 dlwnsdud205.tistory.com 그..
[Redis] Transaction으로 갱신손실 문제 해결하기 갱신손실 문제 예시 Redis는 기본적으로 원자적으로 동작하지만, 사용에 따라 여러가지 문제가 발생할 수 있습니다. (단, 이 글에서는 레디스에서 제공하는 원자적으로 동작하는 set ... get 등의 메소드를 활용할 수 없는 상황이라 가정하겠습니다.) 아래표는 조회하고 업데이트하는 예시입니다. 이 트랜잭션의 결과는 어떻게 될까요? redis client 1 redis client 2 1 GET 1 -> 1 이 조회됨. 2 GET 1 -> 1 이 조회됨 3 도메인 조건 확인 도메인 조건 확인 4 SET 1 3 5 SET 1 4 실제로 실행해보면, redis client 1 에서 업데이트한 3은 사라진것을 알 수 있습니다. Redis의 각 명령이 원자적으로 동작한다는것이 클라이언트의 요청 sequence도..
[회고] 디프만 13기를 마치며 - 서버 개발자 13기에 지원하다 개발을 처음 시작할때는 적은 노력으로 높은 학습률을 얻을 수 있었는데, 시간이 갈수록 공부를 해도 실력이 늘고있다는 느낌을 받을 수 없었습니다. 이렇게 슬럼프에 빠진채, 선배의 추천과 함께, 다른 사람은 어떻게 공부하고 있는지 궁금했고, 동아리를 통해 슬럼프를 극복하려고 했던거 같아요. 특히, 디프만은 현업 개발자와 사이드 프로젝트를 함께 할 수 있다는 장점 외에도 만드는 프로덕트의 질이 높아서 가장 가고싶었던 동아리 였습니다. 그렇게 떨리는 마음으로 디프만에 지원했고 서류 합격 이라는 결과를 얻을 수 있었습니다. 서류에는 "내가 어떻게 협업을 해왔는지" 를 주제로 하드 스킬, 소프트 스킬을 모두 보여주려고 노력했던거 같아요. 13기 면접 면접은 2:2 로 진행되었는데, 편안한 분위기 ..