반응형

전체 글 169

[kafka] Concurrency 설정 기준 (ConcurrentMessageListenerContainer 사용)

들어가기전에 카프카를 사용하면서 Consumer 설정하는 하던 중 ConcurrentMessageListenerContainer를 선택해서 사용하였으나 Concurrency의 설정 기준 잡기가 모호하여 관련정보를 스터디하며 정리한 글입니다. 모든 소스는 Github에 올려두었습니다. 목차 토픽이 1개인 경우 파티션1, Concurrency1, Call3 파티션2, Concurrency2, Call3 파티션3, Concurrency6, Call6 결론 토픽이 3개인 경우 Concurrency 무조건 많다고 좋은게 아니다. 잘못된 생각 컨슈머에서 Concurrency가 무조건 많으면 많은 Message를 Concurrency 만큼 Listen할 수 있겠구나! 컨슈머에서 Concurrency, 즉 Thread..

Study/message-queue 2021.08.24

[kafka] Message Listeners를 이용한 Consumer 구현

Kotlin으로 Spring-Kafka 의존성을 주입받아 Producer를 구현하는 과정에 대해 정리한 글입니다. 모든 소스는 Github에 올려두었습니다. 목차 Consumer Message Listeners 이용한 구현 Listener 종류 MessageListenerContainers 종류 Committing Offset nack 1. Consumer 컨슈머는 카프카 클러스터( 파티션 )에서 저장된 데이터를 읽어오는 역할을 합니다. 구현 방법은 Message Listeners, @KafkaListener 두 가지로 가능합니다. 이번 글에서는 Message Listeners 를 이용하여 구현한 내용을 정리해보겠습니다. 2. Message Listeners 이용한 구현 Message Listener C..

Study/message-queue 2021.08.23

[엘레강트 오브젝트] 2-5장 퍼블릭 상수(Public Constant)를 사용하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 퍼블릭 상수 결합도 증가 응집도 저하 개선 클래스의 단위를 최소화하자 결론 주관적인 생각 1. 퍼블릭 상수 상수(Constant) 는 public static final 로 선언되며 객체 사이에서 데이터를 공유하기 위해 사용되는 메커니즘입니다. 하지만 객체지향에서는 객체들 간의 어떤 것도 공유해서는 안됩니다. 예제를 통해 살펴보겠습니다. 올바른 예 class Records( private val records: MutableList ) { companion object { private const val EOL = "\r..

Study/object 2021.08.21

[kafka] KafkaTemplate을 이용한 Producer 구현

Kotlin으로 Spring-Kafka 의존성을 주입받아 Producer를 구현하는 과정에 대해 정리한 글입니다. 모든 소스는 Github에 올려두었습니다. 목차 KafkaTemplate 구성 KafkaTemplate 사용하여 Producer 구현 KafkaTemplate 원초적으로 Producer를 통해 Kafka에 Message를 Send하려면 KafkaProducer 인스턴스를 사용하여 send() 메서드를 호출해야합니다. KafkaTemplate은 KafkaProducer 감싸고 있는 인스턴스라고 생각하시면 이해하시기 편합니다. KafkaTemplate.send() 는 내부에서 결국 KafkaProducer 인스턴스의 send()를 호출하고 있습니다. 1. KafkaTemplate 구성 Kafka..

Study/message-queue 2021.08.20

[엘레강트 오브젝트] 2-4장 메서드 이름을 신중하게 선택하세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 빌더는 명사다 조정자는 동사다 빌더와 조정자 혼합하기 Boolean 값을 결과로 반환하는 경우 빌더와 조정자 Type Description Example 빌더 ( Builder ) 뭔가를 만들고 새로운 객체를 반환하는 메서드 반환타임은 절대 void가 될 수 없음 fun pow(base: Int, power: Int): Int fun speed(): Float fun employee(id: Int): Employee fun parsedCell(x: Int, y: Int) 조정자 ( Manipulator ) 객체로 추상화한..

Study/object 2021.08.18

[엘레강트 오브젝트] 2-3장 항상 인터페이스를 사용하세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 항상 인터페이스를 사용하세요..? 너무 비현실적인거 아닌가? 결합한다. 객체들은 서로를 필요로 합니다. 설계 시작단계에서는 객체가 어떤 일을 수행하고 다른 객체에게 어떤 서비스를 제공하는 지를 알아야하기 때문에 결합이 유용합니다. 하지만 시간이 지나면서 객체 사이의 강한 결합도가 심각한 문제가 되곤 합니다. 인터페이스는 상호작용하는 다른 객체를 수정하지 않고도 해당 객체를 수정할 수 있도록 만들 수 있습니다. 객체가 다른 객체와 의사소통하기 위해 따라야하는 계약을 일컫습니다. interface Cash { fun mu..

Study/object 2021.08.17

[Redis] 성능개선 - 캐싱 처리 3가지 방법

들어가기 전에 서비스 배포 전 성능 개선을 하면서 왜 캐싱을 써야했는지 캐싱을 쓰면서 어떤 이슈들이 발생했는지에 대해 작성해보겠습니다. 모든 코드는 Kotlin으로 진행하였으며 Github에 올려두었습니다. 캐싱을 사용했던 이유 서비스를 배포하기 전 성능 테스트를 진행하던 중 특정 API에서 성능이 매우 떨어지고 있었습니다. 5초 이상?! @Service class TempService( val storeRepository: StoreRepository, val categoryRepository: CategoryRepository ) { fun init(storeId: Long): ResInitDTO { // 1. DB에서 특정 상점 데이터 조회 val store: Store = storeReposito..

Develop/spring-data 2021.08.17

[엘레강트 오브젝트] 2-2장 최소한 뭔가는 캡슐화하세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 아무것도 캡슐화하지 않은 클래스 정적 메서드와 동일하며 객체지향 프로그램 관점에서는 잘못된 설계입니다. class Year { fun read() = System.currentTimeMillis() / (1000 * 60 * 60 * 24 * 30 * 12) - 1970 } 예제에서 클래스의 모든 객체는 동일 아무런 상태를 가지고 있지 않으며 행동만을 포함 read() 메서드에서 정적 메서드를 사용 ( 순수한 OOP에서는 정적 메서드를 사용하지 않음 ) 실행으로 부터 인스턴스 생성 고립 생성자에서만 new 연산자를 허..

Study/object 2021.08.16

꾸준함 실천 방법 ( 그로우, Github )

꾸준히 한다는 것은 힘든 일 무언가를 꾸준히 한다는 것은 매우 힘든 일 입니다. 저 또한 목표만 거창하게 세워놓고 실천하지 못한 것들이 있습니다. 자신과의 타협 꾸준히 못하는 가장 큰 문제는 자신에게 있다고 생각합니다. 주어진 일자, 시간에 어떤 것을 실행하고자 할 때 자신과의 타협은 시작합니다. 다른 말로 핑계거리를 찾게 됩니다. 오늘은 피곤하니깐 내일부터 하자 귀찮으니깐 내일부터 하자 오늘은 약속이 있어서 어쩔 수 없어 야근 때문에 힘들어 왜 해야하지? 목표를 실천하면 왜? 크게 달라지나? 힘들다 피곤하다 지친다 이 것 말고도 정말 많은 핑계거리가 머릿속을 가득채우고 자신에게 설득합니다. 오늘은 안해도 괜찮아! 나만의 꾸준히 하는 방법 현재는 가장 뚜렷하게 목표를 실천하는 것은 10개월 되었습니다. ..

MindControl 2021.08.15

[엘레강트 오브젝트] 2-1장 가능하면 적게 캡슐화하세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 이 책에서는 4개 또는 그 이하의 객체를 캡슐화할 것을 권장합니다. 내부에 캡슐화된 객체 전체를 가리켜 객체의 '상태' 또는 ' 식별자' 라고 부릅니다. class Cash( private val digits: Int, private val cents: Int, private val currency: String ) Cash 클래스는 3개의 객체를 캡슐화하고 있습니다. 반대로 3개의 객체가 모여서 Cash 클래스의 객체를 식별할 수 있습니다. 상태 관점으로 바라보는 객체 val CashA = Cash(29, 92, "USD")..

Study/object 2021.08.12

[엘레강트 오브젝트] 1-3장 생성자에 코드를 넣지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 인자에 손대지 말라 인자에 손대는 클래스 먼저 인자에 손대는(?) 코드를 살펴보겠습니다. class Cash( private val dollars: Int ) { constructor(dollars: String): this(Integer.parseInt(dollars)) } 객체 초기화에는 코드가 없어야하고 인자를 건드리면 안됩니다. 필요하다면 인자를 다른 타입의 객체로 감싸거나 가공하지 않은 형식으로 캡슐화해야합니다. 위 코드를 수정한 예시를 살펴보겠습니다. 인자에 손대지 않는 클래스 class Cash( priv..

Study/object 2021.08.11

[엘레강트 오브젝트] 1-2장 생성자 하나를 주 생성자로 만드세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 이 책의 방법론대로 클래스를 작성한다면 메서드 수보다 생성자 수가 많아질 것 입니다. Method Count < Construct Count 이 책에서 권장하는 메서드의 수는 2 ~ 3개이고 생성자는 5 ~ 10 개입니다. 예시를 통해서 자세히 살펴보겠습니다. 먼저 임의의 Cash 클래스를 생성합니다. class Cash( private var dollars: Int ) { } 생성자가 많아질수록 클래스를 더 유연하게 사용할 수 있습니다. Cash(30) Cash("$29.5") Cash(29.5f) Cash(29.5..

Study/object 2021.08.11

[엘레강트 오브젝트] 1-1장 -er로 끝나는 이름을 사용하지 마세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 클래스 먼저 클래스에 대해서 간략하게 알아봅니다. 일반적으로 클래스가 객체를 인스턴스화합니다. 클래스를 객체의 템플릿으로 설명하지만 잘못된 설명입니다. 클래스는 객체의 팩토리이다. 클래스는 객체를 꺼내거나 반환할 수 있는 위치이기 떄문에 클래스를 저장소 또는 웨어하우스라고 불러야 합니다. 객체가 살아있는 생명체라면 클래스는 객체의 어머니 본론 클래스 명 짓기에 대해 살펴보겠습니다. class CashFormatter( val dollars: Int ) { fun format(): String { return Strin..

Study/object 2021.08.10

[kotlin] Querydsl-JPA GroupBy 사용했을 경우 Paging처리 방법

들어가기 전에 Querydsl-JPA를 사용할 때 Query에 GroupBy 절이 포함된다면 fetchCount(), fetchResults() 메서드를 사용할 수 없습니다. 정확히 count() 를 사용할 수 없습니다. 이럴 경우 PageImpl을 사용하여 Paging 처리해야 하는 경우에 대해서 정리해보겠습니다. 모든 소스는 Github에 올려두었습니다. 에러발생 GroupBy절을 포함하고 fetchCount(), fetchResults() 메서드를 사용하면 아래와 같은 에러가 발생합니다. Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 5, column 1 GroupBy를..

Develop/spring-data 2021.08.06

그림으로 이해하는 카프카

들어가기전 카프카를 학습하던 중 카프카 구성에 대한 그림이 머릿속에 잘 들어오지 않아 이번 글을 작성하게 되었습니다. 이 글에 나오는 대부분 이미지는 책(아파치카프카 애플리케이션 프로그래밍 with 자바)을 참조하여 그렸습니다. 카프카란? 카프카는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼입니다. 극단적인 예로 아래와 같은 MSA Service가 있다고 가정합니다. 아키텍처의 복잡도가 매우 높은 것을 한 눈에 알아볼 수 있습니다. 다음 그림은 카프카를 도입하여 아키텍처를 재설계한 그림입니다. 극단적인 예를 들기 위한 아키텍처 그림입니다. 실제로는 무조건 카프카를 쓰기보다 용도에 맞게 사용해야합니다. 이 것 말고도 다양하게 카프카를 사용할 수 있습니다. 다..

Study/message-queue 2021.08.05
728x90
반응형