반응형

전체 글 169

벌써 8년.. 성장 과정에서 느낀점

벌써 8년차라니.. 시간이 정말 빠르네요. 과거에 저는 고민상담, 피드백 요청을 받던 주니어에서 지금은 해주는 시니어로 성장하고 있습니다. 소수의 몇분과 이야기 해보았을 때 비슷한 고민과 궁금증들이 있었습니다. 해서 이번글에서는 제가 사회생활 겪으면서 느꼈던 점들에 대해서 정리해보겠습니다. 스터디는 어떻게 하나요? 오답은 있지만 정답은 없다. 의견을 내는 것과 선택하는 것은 매우 다르다. 멘탈 관리 주변 동료들에게 배우고 성장하자 무게있는 말은 아끼자 스터디는 어떻게 하나요? 스터디 방향 당장 필요한 기술부터 스터디하였습니다. 내가 사용하지 않는 기술들에 대해서 미리 학습하는 것도 좋지만 당장 내가 사용해야할 것부터 학습한다면 흥미도 생기고 실전에서 바로 써먹을 수 있어 효율이 높았습니다. 회사에서 너무..

MindControl 2022.08.23

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

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

Study/message-queue 2022.06.09

[데이터 중심 어플리케이션 설계] 트랜잭션

이번 글은 데이터 중심 어플리케이션 설계 도서의 트랜잭션의 내용을 정리하였습니다. 들어가기 전에 데이터 시스템의 여러 가지 문제 데이터베이스 포스프퉤어나 하드웨어는 언제라도 실패할 수 있음 애플리케이션은 언제라도 죽을 수 있음 네트워크가 끊기면 애플리케이션과 데이터베이스의 연결이 갑자기 끊기거나 데이터베이스 노드 사이의 통신이 안될 수 있음 여러 클라이언트가 동시에 데이터베이스에 쓰기를 실행해서 다른 클라이언트가 쓴 내용을 덮어쓸 수 있음 클라이언트가 부분적으로만 갱신돼서 비정상적인 데이터를 읽을 수 있음 클라이언트 사이의 경쟁 조건은 예측하지 못한 버그를 유발할 수 있음 트랜잭션이란? 위와 같은 문제를 단순화하는 매커니즘으로 채택 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법 ..

Study 2022.05.12

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

[엘레강트 오브젝트] 4-3장 final이나 abstract이거나

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 잘못된 상속 클래스의 신분 올바른 설계 결론 1. 잘못된 상속 상속은 매우 강력한 기능입니다. 하지만 상속을 잘못 사용한다면 문제를 일으킬 수 있습니다. 문제를 일으키는 원인은 가상 메서드입니다. 코드로 살펴보겠습니다. open class Document { fun length(): Int { return content().length } open fun content(): String { // read document // load byte array return "" } } 위 코드와 같은 Document 클래스가 있..

Study/object 2021.10.13

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

[엘레강트 오브젝트] 4-2장 체크 예외(checked exception)만 던지세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 Checked Exception vs Unchecked Exception 꼭 필요한 경우에만 예외를 잡자 항상 예외를 체이닝하자 단 한번만 복구하자 관전-지향 프로그래밍을 사용하자 하나의 예외 타입만으로도 충분하다 1. Checked Exception vs Unchecked Exception 두 Exception의 차이는 이 글을 참조해주세요. unchecked exception fun length(file: File): Int { if (!file.exists()) throw IllegalArgumentException..

Study/object 2021.10.06
728x90
반응형