반응형

Study 76

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

[엘레강트 오브젝트] 3-1장 5개 이하의 public 메서드만 노출하세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 작은 객체 정의 작은 객체 정의 우아하고 유지보수가 가능하고 응집력이 높고 테스트하기가 용이한 객체는 작은 객체입니다. 작은 객체에 대한 자세한 정의는 적은 public메서드를 갖는 것입니다. 하나의 객체가 하나의 public 메서드와 20개의 private 메서드를 갖는다면 이 객체는 작은 객체로 분류합니다. 이 책에서 주장하는 public 메서드의 개수는 5개 이하로 주장하고 있습니다. ( 하지만 정확하게 5개로 주장하지 않는다 대체로 이정도? ) public private 큰 객체 10 0 작은 객체 1 20 클래스..

Study/object 2021.09.14

[엘레강트 오브젝트] 2-9장 인터페이스를 짧게 유지하고 스마트(smart)를 사용하세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 인터페이스를 정의하는 방법 스마트 클래스 나중에 배울 데코레이터 1. 인터페이스를 정의하는 방법 인터페이스는 구현자에게 너무 많은 것을 요구하면 안됩니다. // Bad interface.. interface Exchange { fun rate(target: String): Float fun rate(source: String, target: String): Float } 위 코드는 나쁜 설계의 인터페이스입니다. 구현자에게 동일한 기능을 수행하는 rate() 메서드에서 속성값만 다르게 구현하라고 강요하고 있습니다. 이럴 경..

Study/object 2021.09.07

[엘레강트 오브젝트] 2-8장 모의 객체(Mock) 대신 페이크 객체(Fake)를 사용하세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 Mock은 Bad Practice Fake 객체 사용 정리 1. Mock은 Bad Practice TDD 관련 블로그, 영상을 살펴본다면 Mock 방식은 매우 위험한 방식이라고 소개합니다. 이유는 너무 간편하게 사용할 수 있어 남용하기 편하기 때문입니다. Mock이 많아진다면 그만큼 객체 간 강한 결합력을 가지고 있다는 말입니다. 이 책에서도 Mock에 대해서는 비판적이게 평가하고 있습니다. 예제를 통해 살펴보겠습니다. class Cash( private val exChange: Exchange, private val c..

Study/object 2021.09.05

Spring-Kafka Lifecycle

이번 글에서는 Spring-Kafka의 Lifecycle에 대해서 작성해보겠습니다. 목차 Lifecycle Lifecycle Management 주의사항 1. Lifecycle @KafkaListener는 Application Context 안에 Bean이 아닙니다. @KafkaListener는 KafkaListenerEndpointRegistry에서 Bean으로 등록이 됩니다. 등록된 Bean은 framework에 의해 자동으로 선언되고 Container의 Lifecycle을 관리합니다. 등록된 Bean은 설정값 autoStartup이 true인 것을 자동으로 시작합니다. Listener Container들은 SmartLifeCycle을 Implement하고 있습니다. 그리고 autoStartup 기본..

Study/message-queue 2021.09.04

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

[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

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

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

Study/object 2021.08.16
728x90
반응형