반응형

에디 135

Kafka를 이용한 실패처리 삽질 기록

이번 글에서는 Kafka DeadLetterQueue 관련하여 삽질했던 내용을 기록하는 글 입니다. 요구조건 1. 로직을 수행 중 실패할 경우 Repository에 데이터를 적재 2. 특정 주기마다 실패한 데이터를 처리 ( 실패하면 재처리 ) 결론 바쁘신 분들을 위해 결론부터 말씀드리자면 Kafka를 이용하여 특정 주기마다 데이터를 읽어와 처리하는 방법은 선택하지 않았습니다. 카프카는 실시간 데이터 처리 플랫폼 이유로는 카프카의 성격과는 맞지 않았습니다. 실시간 처리 플랫폼을 특정 주기마다 읽어온다는 것 자체가 어색하였습니다. 또한 다양한 시도를 통해 적합하지 않다고 생각하였습니다. 다양한 시도 RetryTemplate, ReplyTemplate, DeadLetterPublishingRecover 모두 ..

Study/message-queue 2022.06.09

Kotlin (꿀)Tips!

Kotlin은 이미 많은 곳에서 사용하여 기본적인 문법에 대해선 다들 아실 것이라 생각합니다. :) 이미 많은 곳에서 Kotlin을 도입했거나 도입중 일 것입니다. 그리하여 이번 글에서는 Kotlin은 Tip의 관한 내용을 정리해보려합니다. 이 글은 Kotlin 홈페이지에서 Kotlin tips 의 내용을 정리한 글입니다. 좀 더 자세한 내용을 원하신다면 링크를 참조해주세요. 1. Timing Code 메서드 혹은 로직의 실행시간을 측정하려면 기존에는 System 시간을 가져와서 빼거나 StopWatch를 이용해서 start하고 stop하는 불편함을 감수했었습니다. 하지만 kotlin에서 지원하는 measureTimedValue 를 사용한다면 쉽게 실행시간과 반환 값을 구할 수 있습니다. @OptIn(E..

Develop/kotlin 2022.04.18

토스 면접부터 입사 6개월 차 회고

안녕하세요. :) 정말 오랜만에 블로그를 쓰는 것 같네요. ( 3달..? ) 이번 글에서는 토스증권에 합류한지 6개월차 되어 회고하는 내용을 정리해보려합니다. and 매일 학습하여 일주일에 2회 이상 블로그를 쓰는 게 목표였던 제가 블로그를 쉬었던 이유에 대해서도 적어보겠습니다. 토스 채용공고를 보며.. 전 토스에 대한 환상과 두려움이 있었습니다. 가장 눈에 띈 단어는 토양어선! ( 대우가 좋지만 고생을 많이한다는 원양어선과 토스의 합성어 ) 그 당시 전 두살 된 아이를 가진 아빠였기 때문에 가족들과의 시간이 너무 소중했기에 많은 걱정을 하였습니다. 하지만 중소기업을 돌고 있던 저에겐 큰 기회이자 도전이라 생각하여 입사를 결심하게 되었습니다. 면접 준비 면접 준비기간 동안 마음고생을 많이 한 것 같습니다..

MindControl 2022.04.04

Intellij에서 QClass 깨끗히 청소하기

Querydsl, MapStruct를 사용하면서 generated/ 경로 하단에 생기는 class 파일 때문에 삽질한 기억이 있었습니다. 이번 글에서는 class 파일 찌꺼기 파일이 왜 남는지와 깨끗히 청소하는 방법에 대해서 작성해보겠습니다. 💥 이슈사항 MapStruct와 QueryDSL을 사용하는 프로젝트에서 열심히 작업을 마치고 Git Branch를 변경하자 에러 발생! Branch 변경 이전의 파일을 찾고 있는 에러 발생!! 💦 이슈 발생배경 develop에서 각 feature를 생성 후 작업을 진행하고 있었습니다. 변경 전 ( feature/TEST-1 ) BeforeMapper → MapStruct → BeforeMapperImpl 으로 사용중 BeforeMapper → AfterMapper로..

Daily Develop 2022.01.11

[Kotlin] 테스트 코드 쉽게 작성하기 ( KotlinFixture, MockK, LiveTemplates )

개인적으로 테스트 코드는 중요하다고 생각합니다. 하지만 다양한 이유로 테스트 코드는 많이 Skip 됩니다. 시간적 여유가 없을 때 테스트 코드를 위한 노가다 작업이 많을 때 그 외 등등... 이 방법을 백퍼센트 보완하진 못하지만 좀 더 용이하게 작성하기 위해 제가 사용하는 방법을 공유합니다. 목차 MockK KotlinFixture Live Templates 1. MockK Java 진영에는 Mockito가 있다면 Kotlin 진영에서는 Mockk가 있습니다. Mockk는 Java에서 Mock처리하는 것과 동일하게 Kotlin스럽게 Mock을 처리할 수 있도록 도와줍니다. 환경구성 build.gradle.kts testImplementation 'com.ninja-squad:springmockk:{ver..

Study/test 2021.12.27

ThreadPoolTaskExecutor Queue가 full의 처리 정책

ThreadPoolTaskExecutor의 RejectedExecutionHandler 설정에 대해서 간단히 살펴보겠습니다. 이번글에서는 RejectedExcecutionHandler의 정책을 설정하는 기준과 설정 시 어떤 결과값이 나오는지 살펴보겠습니다. RejectedExcutionHandler의 종류 AboryPolicy CallerRunsPolicy DiscardPolicy DiscardOldestPolicy ThreadPoolTaskExecutor 기본 설정 @Configuration public class TestThreadPool { @Bean public TaskExecutor test() { var executor = new ThreadPoolTaskExecutor(); executor...

Daily Develop 2021.12.21

지방대 출신 토스 합격까지!

토스 합격!! 정말 오랜만에 글을 작성하네요. 10월달에 토스합격 후 정신없이 달렸네요. :) 먼저 결론부터 작성하자면 좋은 곳에서 좋은 팀과 좋은 서비스를 만들고 있어 매우 만족하는 상태입니다. ( 아직 한달밖에 안되었지만요.. ㅎ ) 제가 느낀 토스는 모두가 조언을 아끼지 않고 조언을 귀담아 듣고 발전, 성장에 갈증을 느끼는 사람들이 모인 곳이라고 생각합니다. 그리고 모두가 한 마음으로 서비스가 잘되길 바라며 누가 시키지 않고도 스스로 일을 찾아 벌리는(?) 사람들입니다. 그렇기에 일을 즐기고 재밌어하는 사람들입니다. 저도 얼른 회사에 출근해서 제가 벌린(?) 일을 빨리하고 싶네요.. ㅎ 잠시 홍보하자면 토스에서 채용을 적극적으로 진행하고 있어요! 많이 지원해주세요 ㅎㅎ https://toss.im/..

MindControl 2021.12.13

대규모 시스템 설계 - 채팅 시스템 설계

들어가기 전에 가상 면접 사례로 배우는 대규모 시스템 설계 기초 라는 도서 중 12장인 채팅 시스템 설계를 정리한 내용입니다. http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788966263158 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 교보문고 2020년 출간 이후 아마존베스트셀러!아마존 컴퓨터네트워크응용 분야 베스트셀러 1위!《가상 면접으로 배우는 대규모 시스템 설계 기초》는 16가지 실제 시스템 설계 면접 문제와 상세한 답안을 www.kyobobook.co.kr 스터디 그룹에서 공유를 목적으로 작성한 글이기 때문에 이전 글과는 다르게 중요한 내용만 추려 작성하였습니다. ( PPT 방식 ..

Study 2021.12.07

Spring-Kafka Consumer 실패 시 재처리 ( Reply - @SendTo )

들어가기 전에 Consumer를 통해 카프카 클러스터에서 데이터를 Read할 때 모두 정상처리된다면 좋겠지만 그렇치 못한 경우도 있습니다. 그럴 경우 Spring-Kafka에서 재처리를 편리하게 할 수 있도록 Reply(@SendTo), Retry 기능을 제공합니다. 이번 글에서는 재처리 하는 방법에대해서 정리해보겠습니다. 목차 재처리를 해야하는 이유 ReplyTemplate 구성 @SendTo를 사용한 ReplyTemplate 구현 Reply 처리 플로우 1. 재처리를 해야하는 이유 Consumer를 이용해 카프카 클러스터에서 Read 한 후 Repository에 저장할 수도 있고 메일 발송을 할 수도 있고 다양하게 사용할 수 있습니다. 하지만 Repository 서버가 다운된다거나 메일 발송 중 메일..

Study/message-queue 2021.10.15

Spring-Kafka Consumer Offset 관리

들어가기 전에 Consumer를 AutoCommit을 false로 설정하고 사용하고 있습니다. Consumer에서 로직을 완료하고 partition에 commit을 처리하도록 작성하였습니다. 그런데 로직을 처리하던 중 Exception이 발생했고 partition에 commit을 하지 못했습니다. 그렇다면 이 Consumer는 무한 루프에 빠져 데이터를 계속 읽고 Exception을 계속 발생시킬까요? 정답은 NO! 입니다. Consumer 내부에서 Partition Offset과는 별개로 Consumer만을 위한 Offset을 관리하고 있기 때문입니다. Consumer Polling 방식 Consumer는 KafkaMessageListenerContainer에서 새로운 Thread를 생성하여 while..

Study/message-queue 2021.10.14

Spring-Kafka Consumer Validation

모든 코드는 Github에 올려두었습니다. 들어가기 전에 Consumer는 Kafka에 Topic, Partition의 Record를 읽어오는 역할을 합니다. 하지만 Kafka에 잘못된 데이터가 들어오는 경우 Consumer에서는 데이터를 Validation 처리하여 올바른 데이터만 처리해야합니다. 이번 글에서는 Spring-Kafka를 사용하는 Consumer에서 어떻게 Validation 처리를 하는지 작성해보겠습니다. 목차 Validation 방식 Validation 구성 Consumer Validation 구현 Validation 테스트 @KafkaListener ErrorHandler 결론 Validation 방식 Spring-Kafka는 Version 2.2 부터 @KafkaListener의 ..

Study/message-queue 2021.10.12

[엘레강트 오브젝트] 3-7장 인트로스펙션과 캐스팅을 피하세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 인트로스펙션을 피하세요 캐스팅을 피하세요 정리 1. 인트로스펙션을 피하세요 타입 인트로스펙션은 리플렉션이라는 더 포괄적인 용어로 불리는 여러 가지 기법들 중 하나입니다. 리플렉션을 사용하면 메서드, 명령어, 구문, 클래스, 객체, 타입을 변경할 수 있습니다. 리플렉션은 매우 강력한 기법이지만 유지보수를 어렵게 만드는 안좋은 기법입니다. fun size(items: Iterable): Int { if (items is Collection) { return items.size } var size = 0 for (item in..

Study/object 2021.09.27

[엘레강트 오브젝트] 3-6장 부 ctor 밖에서는 new를 사용하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 잘못된 의존성 주입 올바른 의존성 주입 정리 1. 잘못된 의존성 주입 잘못된 의존성 주입은 종종 치명적인 결과를 초래합니다. 코드로 살펴보겠습니다. class Cash( private val dollars: Int ) { fun euro() = Exchange().rate("USD", "EUR") * this.dollars } euro() 메서드 안에서 Excahnge 인스턴스를 생성하고 있습니다. 이 코드의 문제는 '하드코딩된 의존성'입니다. Cash 클래스는 Exchange 클래스에 직업 연결되어 있기 때문에, 의존성..

Study/object 2021.09.26

[엘레강트 오브젝트] 3-5장 절대 getter와 setter를 사용하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 객체 대 자료구조 좋은 의도, 나쁜 결과 접두사에 관한 모든 것 1. 객체 대 자료구조 먼저 getter와 setter를 사용하지 말아야하는 이유를 알아보기 전에 객체와 자료구조에 대해서 짚고 넘어가겠습니다. 자료구조 class Cash( var dollars: Int ) // use val cash = Cash(20) // get val dollars = cash.dollars // set cash.dollars = 30 // print println("dollars:: ${cash.dollars}") 자료구조는 단순한..

Study/object 2021.09.25

[엘레강트 오브젝트] 3-4장 충성스러우면서 불변이거나, 아니면 상수이거나

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 상태와 데이터 가변 객체와 불변 객체 정리 1. 상태와 데이터 이전 2.6 섹션에서 불변성에 다루었습니다. 이번 섹션을 정리하기 전에 다시 한 번 불변성에 대해 명확하게 정리하려고 합니다. 먼저 상태(state)와 데이터(data)에 대해서 명확하게 짚고 넘어가겠습니다. class WebPage( private val uri: URI ) { fun content(): String { // 외부 연동하여 웹페이지의 Content을 읽어 반환 return "" } } 상태: uri 데이터: content() 메서드를 호출하여..

Study/object 2021.09.18
728x90
반응형