반응형

에디 135

[엘레강트 오브젝트] 3-3장 인자의 값으로 NULL을 절대 허용하지 마세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 객체를 존중하라 NULL Object를 이용하라 외부 영향 1. 객체를 존중하라 객체는 목표를 가지고 역할을 수행하고 있습니다. 하지만 객체의 인자값에 NULL을 허용한다면 객체가 역할을 수행하는 것을 무시하는 행위가 됩니다. // NULL 허용 fun find(mask: String?): Iterable { // 경로 탐색 // mask가 null일 경우 모든 파일 검색 // mask를 이용한 파일 검색 } // NULL 허용하지 않는 경우 fun find(mask: String): Iterable fun findAll..

Study/object 2021.09.17

[엘레강트 오브젝트] 3-2장 정적 메서드를 사용하지 마세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 정적 메서드 vs 객체 선언형 스타일 vs 명령형 스타일 유틸리티 클래스 싱글톤 패턴 함수형 프로그래밍 조합 가능한 데코레이터 주관적인 생각 1. 정적 메서드 vs 객체 정적메서드는 어플리케이션이 실행될 때 메모리에 올라가기 때문에 새로운 클래스를 생성하지 않고 빠르게 실행할 수 있습니다. class WebPage { companion object { fun read(url: String): String { // HTTP 요청 생성 // UTF-8 문자열로 변환 return "" } } } // use val html =..

Study/object 2021.09.15

[엘레강트 오브젝트] 2-7장 문서를 작성하는 대신 테스트를 만드세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 문서를 작성할 수 밖에 없는 이유 코드는 깔끔하게 작성하라 단위 테스트를 추가하라 주관적인 생각 1. 문서를 작성할 수 밖에 없는 이유 코드를 이해하는 데 있어 추리(?)를 하게 되거나 복잡하게 작성했을 때 반드시 문서를 작성하게 됩니다. 문서를 작성해야만 하는 코드 class Study { // study를 시작한다. fun a() {} // study를 종료한다. fun b() {} } 위 코드에서 주석이 없다면 a(), b() 메서드가 하는 역할을 알아내려면 모든 로직을 분석해야합니다. 유지보수 최악!! 2. 코드는..

Study/object 2021.09.01

[엘레강트 오브젝트] 2-6장 불변 객체로 만드세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 불변이란? 식별자 가변성(Identity Mutability) 실패 원자성(Failure Atomicity) 시간적 결합(Temporal Coupling) 부수효과 제거(Side effect-free) NULL 참조 없애기 스레드 안정성 더 작고 더 단순한 객체 주관적인 생각 1. 불변이란? Immutable, 즉 변경할 수 없음을 의미합니다. 예시로 살펴보겠습니다. 가변 객체 먼저 가변 객체는 내부 속성값을 변경이 가능한 객체입니다. // 가변 객체 class Cash( private var dollars: Int ) ..

Study/object 2021.08.31

[kafka] @KafkaListener를 이용한 Consumer 구현

Kotlin으로 Spring-Kafka 의존성을 주입받아 Producer를 구현하는 과정에 대해 정리한 글입니다. 모든 소스는 Github에 올려두었습니다. 목차 Consumer KafkaListener Annotation 설정 KafkaListener Annotation 사용방법 Simple POJO Listeners 파티션 할당 특정 파티션 InitialOffset 설정 수동 확인 ( Manual Acknowledgment ) Consumer Record Metadata Batch Listeners GroupId 1. Consumer 컨슈머는 카프카 클러스터( 파티션 )에서 저장된 데이터를 읽어오는 역할을 합니다. 구현 방법은 Message Listeners, @KafkaListener 두 가지로 가..

Study/message-queue 2021.08.26

[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

[엘레강트 오브젝트] 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

[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

꾸준함 실천 방법 ( 그로우, 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-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

[Kotlin] Spring-Batch QuerydslPagingItemReader 개선편

들어가기 전에 Spring-Batch 에서 Chunk 개념을 이용하려면 ItemReader를 사용합니다. ItemWriter에서 ItemReader에서 사용한 쿼리에 영향을 미치는 상태값을 변경할 경우가 있습니다. 이와 같은 경우 필요한 기능을 정리한 글입니다. ItemReader를 사용한 Query ItemReader는 Query에 offset과 limit을 사용합니다. // 1 select id, address, name from person where state = 'STUDY' limit 5 // 2 select id, address, name from person where state = 'STUDY' offset 5 limit 5 // 3 select id, address, name from ..

728x90
반응형