분류 전체보기 94

Saga Pattern, MSA에서 다른 서비스의 트랜잭션이 실패된다면

이 글은 Saga Pattern에 대한 내용을 다루는 글입니다. https://microservices.io/patterns/data/saga.html Microservices Pattern: Pattern: Saga Implement transactions using a saga, which is sequence of local transactions microservices.io Saga pattern에 대해서 잘 정리해둔 글입니다. 이 글을 쓰는 이유 최근에 MSA하다가 A 컴포턴트에서 트랜잭션을 마치고, B 컴포넌트에 이벤트를 던져두었더니, B 컴포넌트가 제대로 처리를 못하면 어떻게 해야하나라는 질문을 받았습니다. 그래서 해결책을 찾아보다가 Saga pattern을 알게 되었고, Saga patt..

Web 2024.04.13

스프링 웹플럭스 좀 더 파보기

이 글을 쓰는 목적 코틀린 스프링을 사용하는 이유 코틀린 스프링을 백엔드 개발할때 쓰는 이유를 적은 글을 쓰며 백엔드 개발을 시작할때 최근에 가장 많이 논의되는 언어가 코틀린과 타입스크립트라고 생각을 하고 있는데, 개인적으로는 서로 blog.mayleaf.dev 스프링 MVC, 스프링 웹플럭스 두 생태계가 있는데 MVC는 멀티쓰레드 기반이고, 웹플럭스는 그러면 왜 쓰는걸까요? 오늘은 웹플럭스를 사용 하는 이유를 공유해보고자 이 글을 씁니다. 이 글의 내용 "스프링 웹플럭스" 쓰는 이유가 뭐냐고 물어보면 저는 리액티브 프로그래밍을 하기 위해서 사용한다고 이야기할 것 같습니다. 그래서 리액티브 프로그래밍이 무엇인지, 왜 스프링 웹플럭스를 사용하는지를 적었습니다. 본문 위 그림은 리액티브 선언문에서 발췌해서 ..

Kotlin 2024.03.22

private 함수를 테스트하고 싶을때

이 글을 쓰는 목적 이 글은 private 함수를 테스트하고 싶은 분을 위해 작성된 코드입니다. 이 글에서 다루는 내용 이 글을 테스트 프레임워크를 통해서 private 함수를 테스트하는 내용이 아닙니다. private 함수를 public으로 바꾸기는 애매하고, private 상태로 테스트하자니 테스트 픽스쳐를 다수 만들어서 코드를 짜야할 것 같은 상황에 있는 사람. 그리고 그런 상황으로 인해서 미래 코드의 순 서가 변경되거나 테스트의 순서가 변경될까봐 다른 방법을 찾아보고 있는 분을 위해서 작성하는 글입니다. 본문 우선 이 글을 보고 계신 분이라면 이미 private 함수를 public으로 오픈해보는 방법에 대해서는 고민해보셨을 것 같습니다. 하지만 오픈하지 않으시는 이유가 있다면 해당 클래스에서 은닉..

Kotlin 2024.03.20

테스트 하기 좋은 코드, 좋은 테스트 코드

이 글을 쓰는 이유 좋은 테스트 코드, 테스트하기 좋은 코드에 대해서 고민하다가 든 생각을 공유해보고자 적습니다. 테스트 하기 좋은 코드 1. 블랙박스 테스트할때 비즈니스 로직의 결과를 단언할 수 있는 코드가 테스트 하기 편하다. 비즈니스로직과 persist 작업이 한번에 이뤄지고 "OK"나 Unit 과 같은 결과물만 내놓으면 stubbing으로 내용이 잘 돌아갔음을 증명해야하고, 이렇게 되면 레포지토리 레이어까지 내려가서 테스트해야한다. "버그 없음"은 테스트 코드를 통해서 증명할 수 있는게 없기 때문에, return을 받아서 결과를 볼 수 있도록 되어있는게 편한 것 같다. 파라미터로 넣은 객체를 확인하는 방법도 있지만, 객체는 Immutable하게 유지해주는 편이 좋기 때문에 비즈니스 로직은 묶어서 ..

Kotlin 2024.01.15

IR compiler란?

이 글을 쓰는 이유 코틀린 진영은 지금까지 멀티플랫폼을 노리고 있는 언어입니다. 여러 환경에서 돌아갈 수 있도록 하겠다는 것인데요. JVM뿐만 아니라, WASM, JS, Native Platform등에서 돌아갈 수 있는 언어를 만드려고 하고 있습니다. 하지만 대부분 사람들이 멀티플랫폼에서 돌리려고 하기보다는 JVM 원툴로 사용하고 있기 때문에 그리고 JVM에서 굴러가서 쓰는 사람들이 대부분이기 때문에 멀티플랫폼에 관련된 글을 적어서 이런 시도를 하고 있다! 라는 것을 알리고 싶었습니다. 그래서 IR 컴파일러가 뭔데? IR컴파일러는 Kotlin IR(intermediate representation, 중간표현)으로 컴파일을 해주는 친구입니다. 자바가 바이트코드로 바꾸고 이걸 jvm위에 올려서 굴리는 것처럼..

Kotlin 2024.01.04

Error Stubbing 하기

이 글을 쓰는 목적 이 글은 우리가 일상적으로 사용하던 에러 출력들을 하기 위해서 어떤 함수들이 필요한지를 적어둔 글입니다. 코드를 작성하는 중에는 에러 안에 어떤 내용이 들어가는지 생각하지 않는 경우가 많고, 그냥 구현해버리면 되는 일이기 때문에 넘어가곤 합니다. 이 글을 쓰게 된 것은 코틀린 테스트코드를 작성하다보니, Exception을 넘겨주고 테스트를 하다보니, stubbing을 더 해줘야하는 것을 보고 이런 것들까지 구현해줘야한다는 걸 공유하고 싶어서 작성합니다. Error Stubbing? Webclient에서 받은 응답을 상태코드에 따라서 다르게 처리하도록 작업을 진행하고 있었다. 그러던 도중 함수를 분해해서 구현해두었는데, Webclient까지 목킹하는건 내가 원하던 범위 밖이어서 상태코드..

Kotlin 2023.12.21

MockKInjects 및 Lateinit 사용을 통한 Kotlin 테스트 이슈 해결하기

글을 쓰게 된 이유 이번 블로그 글에서는 Kotlin 테스트를 진행하면서, 특히 MockKInjects를 사용하면서 마주친 이슈를 공유하려 합니다. 이 문제는 테스트 클래스 생성자의 실행과 Injectmock에서 발생하는 버그와 관련이 있습니다. 디버깅하면서 봤던 코드들을 공유하면 다른 분들이 보기에 좋겠다 생각이 들어서 공유하기 위해 글을 씁니다. 문제 상황 MockKInjects를 작업하는 동안 테스트 클래스 생성자를 호출하면 Injectmock와 관련된 오류가 발생하는 걸 봤습니다. 오류 메시지는 다음과 같았습니다: No ParameterResolver registered for parameter [%s] in %s [%s]. injectmocks에 주입해줄 파라미터들을 못찾는 이슈였는데, 저같은 ..

Kotlin 2023.12.13

코틀린 스프링을 사용하는 이유

코틀린 스프링을 백엔드 개발할때 쓰는 이유를 적은 글을 쓰며 백엔드 개발을 시작할때 최근에 가장 많이 논의되는 언어가 코틀린과 타입스크립트라고 생각을 하고 있는데, 개인적으로는 서로의 장단점이 다르다고 느껴져서 이런 글을 적어두고 싶었다.특히 Nest.js에 익숙하신 분들에게 도움이 되길 바라며 글을 쓴다. 글의 접근 방식 이 글은 코틀린과 다른 언어를 많이 비교하면서 진행될 예정이다. 자바랑 비교하게 되는 내용도 있고, 개인적인 경험을 빗대기 위해서 Dart같은 약간 생소할 수 있는 언어도 사용했다. 글의 내용 코틀린에 대한 소개 코틀린의 강점이라고 느껴지는 부분 백엔드 개발에서 코틀린을 쓰는 이유 코틀린이란? 코틀린. 모던 랭귀지의 대표적인 주자중 하나이다. 대표적인 삼대장을 뽑아보라고 하면 Rust..

Kotlin 2023.11.20

코루틴이란?

이 글을 쓰는 내용 이 글은 코루틴이 내부적으로 어떻게 동작하는지 큰 흐름을 작성하였다 이 글을 쓰는 목적 코루틴이 아닌 다른 Async Non-Blocking 프로그래밍을 경험해보신 분이 읽어보면 코루틴도 다 똑같다는 것을 알리고자 썼다. 특히 Node.js의 이벤트루프 개념을 알고 있는 사람이면 더 쉽게 이해하실 수 있을 것 같다. 그리고 그 알고 계신분들 중에서도 코틀린을 쓰는 이유가 있구나라는 생각이 들었으면 해서 이 글을 작성한다. 비동기 프로그래밍이란? 비동기 프로그래밍이 뭐냐고 물어본다면 이전에는 IO바운드, 오래걸리는 CPU 연산등을 메인쓰레드에서 처리하면 쓰레드 멜트다운이 일어나기 때문에 쓰레드 풀에 있는 다른 쓰레드에 작업을 넘기는 프로그래밍 기법이라고 설명했을 것이다. 적어도 Node..

Kotlin 2023.10.23

Unable to load class 'javax.persistence.Entity'.

QueryDsl을 사용하려고 보니 javax에서 persistence 를 찾고 있었다. Spring 6부터는 JDK 17과 함께 jakarta ee를 채택했기 때문에 스프링부트를 통해서 jpa를 사용하려고 하고 있었다면 javax가 없어서 당연히 나타나는 에러라고 생각이 들었다. 인터넷에서 검색해보니 classifier를 gradle에서 명시하는 방법이 있어서 jakarta를 명시해서 문제를 해결했다. 이전 설정 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" 수정 이후 설정 implementation "com.queryds..

Web/Spring 2023.02.05