분류 전체보기 364

Spring - Curcuit Breaker 이해하기!

Spring CloudSpring Cloud는 안정적인 Micro Service Architecture를 만들고 외부 환경에 대해 신경을 할애하지 않고 내부 로직에만 집중할 수 있게 도와주는 라이브러리이다.Spring Cloud에서 지원하는 기능 중 Curcuit breaker에 대해 다룬다.Circuit breakerCircuit breaker는 전기 회로의 차단기와 같은 역할을 하는 디자인 패턴을 말한다. 즉, CurcuitBreaker는 기술이 아닌 패턴을 말한다. 주요 목적은 다음과 같다.외부의 장애를 격리하고 시스템 안정성을 유지할 수 있다.장애 복구 시간을 확보할 수 있다.특정 서비스의 과부하나 장애가 발생했을 때 복구가 될 때까지 추가적인 요청을 차단해서 시스템의 안정성을 유지한다.그래서 R..

Server/Spring MSA 2024.06.08

빠른 기능 오픈 vs 견고한 프로덕트 - feat. 일단 출시.. 코드 품질은 집착인가?

최근에 이직을 하고 업무를 하면서 가장 큰 고민이 있다. 코드 리뷰할 때 특히 고민되는 부분이다.개발을 하면서 아래의 선택 중 어떤 것을 선택할 지에 대한 문제이다.우선 기능이 돌아가게만 만들어서 빠르게 오픈하고 점진적으로 개선한다.초기에 프로젝트 설계나 테스트 코드 등에 자원을 할당한다.현재까지의 나의 업무로 보면은 2번을 선택해왔다.철저한 테스트와 코드 아키텍처가 추후 유지보수 작업 공수를 줄이고, 견고하고 유연한 서비스가 회사와 서비스에 대한 이미지나 사용자 경험을 증대시킨다고 생각했기 때문이다.요즘 핫하다는 회사나 일을 잘한다는 팀은 1번을 선호하는 것 같기도 하다. 실제로 충분히 합리적이라고 생각한다.사업 vs 서비스사업 담당자의 추구기능 추가기능 변경할인, 프로모션 등서비스 운영자의 추구리팩토..

Etc./개발 일기 2024.05.19

[Kotlin] - 적절한 Scope Function 선택하기!

Kotlin 표준 라이브러리에서 객체의 컨텍스트 안에서 특정 블록의 코드를 실행하는 것이 목적인 함수가 포함되어 있다. Kotlin에서는 Scope Functions을 제공하고 목적에 맞게 선택하는 것을 권장한다.나는 대부분 만능에 가까운 let을 사용했고, Scope Function을 선택하는 기준을 모르고 있었다. 해당 포스팅은 공식문서 기반으로 Scope Function을 선택하는 기준에 대한 내용이다.Spec다음은 각 Scope Function에 대해 정리한 것이다.Function참조 객체반환값확장함수 여부letitLambda resultYrunthisLambda resultYrun-Lambda resultN: 객체 Context 밖에서 실행된다.withthisLambda resultN: 객체 C..

Language/Kotlin 2024.05.06

Reactive Streams를 테스트하는 방법 (reactor-test 라이브러리)

Reactive Programming을 사용할 때 Project Reactor를 주로 사용한다.Reactor는 비동기로 동작하기 때문에 일반적인 테스트 방식으로 검증하기 어렵다. 그래서 Reactor-test 라이브러리를 제공한다.Dependency우선 예시 동작을 위해서 아래와 같은 Dependency를 추가해야한다.testImplementation 'io.projectreactor:reactor-test:3.6.5'Reactive Streams 테스트가 어려운 이유1. 강제 동기화아래 테스트 코드를 보자.@Testvoid test() { // given var expected = IntStream.range(0, 10).boxed() .collect(Collectors.toLi..

Server/JUnit, Spock 2024.05.04

[Kotlin] 코루틴 - CoroutineScope 이해하기!

모든 Coroutine은 AbstractCoroutine을 상속한다.public abstract class AbstractCoroutine( parentContext: CoroutineContext, initParentJob: Boolean, active: Boolean) : JobSupport(active), Job, Continuation, CoroutineScope { ... }아래는 Coroutine의 특징이다.Coroutine은 Job, Continuation, CoroutinScope를 구현한다.CoroutineScope: Coroutine builder로 자식 Coroutine을 생성하고 관리다음으로 CoroutineScope에 대해 알아보자.CoroutineScopeCoro..

Language/Kotlin 2024.04.20

[Kotlin] 코루틴 - CoroutineContext 이해하기!

코루틴코루틴(Coroutine)은 Co(함께, 서로) + routine(규칙적 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 작업의 집합을 의미한다.왜 Koroutine이 아니라 Coroutine인지 의아할 수 있는데 코루틴은 코틀린만의 것이 아니다. Python, C#, Go, Javascript 등 다양한 언어에서 지원하는 개념이다.JS의 async, await도 동일한 개념이고 코루틴은 프로그래밍 초창기부터 존재하던 개념이다.Kotlin Coroutines코틀린에서는 코루틴을 위한 공식 라이브러리(kotlinx.coroutines)를 지원한다.아래는 Kotlin Coroutines의 특징이다.동시성을 위한 기능을 제공Async Non-blocking으로 동작하는 코드를 동기 방식으로..

Language/Kotlin 2024.04.14

[Kotlin] 코루틴 - suspend 키워드 이해해보기!

코루틴코루틴(Coroutine)은 Co(함께, 서로) + routine(규칙적 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 작업의 집합을 의미한다.왜 Koroutine이 아니라 Coroutine인지 의아할 수 있는데 코루틴은 코틀린만의 것이 아니다. Python, C#, Go, Javascript 등 다양한 언어에서 지원하는 개념이다.JS의 async, await도 코루틴의 일부이며, 코루틴은 프로그래밍 초창기부터 존재하던 개념이다.vs Thread코루틴은 경량 쓰레드라고 부른다.아래는 여러 개의 쓰레드로 여러 개의 작업을 실행하는 방식이다.코루틴은 작업 하나하나에 Thread를 할당하는 것이 아니라 Object를 할당한다.쓰레드가 Object를 스위칭함으로써 Context Swichi..

Language/Kotlin 2024.04.02

Connection Pool Deadlock 해결하기! (feat. REQUIRES_NEW)

해당 포스팅은 서비스를 오픈하면서 겪었던 이슈와 해결에 대해 공유한다.아래 코드 및 내용은 예시를 위해 만든 프로젝트이다!송금 서비스송금 서비스에서 은행 API를 호출해서 송금을 한다고 가정해보자.아래는 예시를 위한 코드이다.@Service@RequiredArgsConstructorpublic class TransferService { private final TransferRepository transferRepository; private final BankingRequestRepository bankingRequestRepository; private final BankingApiAdaptor bankingApiAdaptor; @Transactional public voi..

Server/Spring JPA 2024.03.30

무지성 byte[] 사용하지 않기! (feat. Apache Commons Email)

포스팅 제목을 무지성byte[] 사용하지 않기라고 했는데 불필요하게 전체 byte[] 할당하지 않기라고 봐주면 좋을 것 같다.해당 포스팅에서는 서비스 운영 중 byte[]로 인해 심각한 문제가 생겼고, 오픈소스 기여까지 하게된 내용을 작성한다.TPS가 심각하게 낮음메일 파일(약 20MB)을 읽어서 파일의 내용 중 일부를 화면에 노출하는 기능을 개발했다.그런데 POD 1대의 TPS가 1.7 정도밖에 나오지 않았다.전체 HTTP 트랜잭션은 5.42초였다.그래서 아래와 같이 각 로직의 수행 시간을 측정해봤다.그 결과 parse 로직이 3787ms가 걸린다는 것을 알 수 있었다.parseparse()의 경우 외부 라이브러리(apache-commons-email)의 로직만을 담고 있었다. 상세한 확인으로 아래 부..

Language/Java 2024.03.24

FixtureMonkey 적용 검토해보기!

새로운 팀에서 테스트를 위한 객체를 생성하는 패턴이나 라이브러리가 필요하게 되었다. 팀원 분이 FixtureMonkey를 추천해주셔서 POC를 진행하게 되었다.FixtureMonkeyFixtureMonkey는 Naver에서 만든 테스트 객체를 쉽게 생성하고 조작할 수 있도록 도와주는 Java 및 Kotlin 라이브러리이다.FixtureMonkey는 한국어 docs를 지원한다. 오픈소스 중에 볼륨도 작은 편이라 한번 읽어보는 것도 추천드린다. 포스팅 내용은 요약 및 검토 정도로 봐주면 좋을 것 같다.https://naver.github.io/fixture-monkey/v1-0-0-kor/docs/introduction이전에 사용하지 않았던 이유FixtureMonkey는 2년 전에 한번 봤었고 적용한다는 블..

Server/JUnit, Spock 2024.03.23