객체지향 프로그래밍 패러다임 대표 프로그래밍 패러다임으로 절차지향 프로그래밍 객체지향 프로그래밍 함수형 프로그래밍 3가지가 있다. 이 중 절차지향은 시대에 뒤떨어져 있고, 함수형은 일부 비지니스에서 활용되고 있으나 객체지향을 대체하기에는 한계가 있다. 객체지향 프로그래밍이 현시점에 가장 대중적인 프로그래밍 패러다임인 것이 확실하다. 2.1 객체지향이란 무엇인가? 개발자라면 캡슐화, 추상화, 상속, 다형성 이라는 객체지향의 4가지 특성에 대해 알고 있을 것이다. 하지만 객체지향의 개념은 그 이상을 포함한다. 이제부터 각 개념에 대해 자세히 알아보겠다. 2.1.1 객체지향 프로그래밍과 객체지향 프로그래밍 언어 객체지향 프로그래밍에는 클래스와 객체라는 기본적이지만 매우 중요한 두 가지 개념이 있다. Java,..
디자인 패턴의 아름다움 - 왕정 지음 간략 목차 chapter 1 _ 고품질 코드 문제 정의 및 기준 7가지 (유지 보수성, 가독성, 확장성, 간결성, 유연성, 재사용성, 테스트 용이성) chapter 2 _ 객체지향 프로그래밍 패러다임 (캡슐화, 추상화, 상속, 다형성 등) chapter 3 _ 설계 원칙 (SRP, OCP 등) chapter 4 _ 코딩 규칙 (변수명, 주석 등) chapter 5 _ 리팩토링 기법 chapter 6 _ 생성 디자인 패턴 chapter 7 _ 구조 디자인 패턴 chapter 8 _ 행동 디자인 패턴 책의 목적 고품질의 코드를 작성할 수 있도록 돕는다. Chater 1 _ 개요 코드 설계 방법론을 배우기 전에 '고품질의 코드란 무엇인가' 같은 코드 품질과 관련되어 확실히..
스트림즈DSL 라이브러리 추가 kafka-streams를 추가한다. 강의에선 사용하는 버전이 2.5.0이라 해당 버전으로 하였지만 자신이 사용하는 버전에 맞게 설치하면 된다. 필터링 스트림즈 애플리케이션 위처럼 filter() 메서드를 이용하여 stream_log 토픽에서 들어온 메시지 키 또는 값에 대하여 원하는 조건에 맞게 처리하도록 할 수 있다. filter() 메서드는 스트림즈DSL에서 사용 가능한 필터링 스트림즈 프로세서이다. 예로 간단하게 로그의 value 문자열의 길이가 일정길이 이상인 경우만 값을 취하는 필터링 코드를 작성할 수 있다. 코드 private static String APPLICATION_NAME = "streams-filter-application"; private stati..
카프카 스트림즈 카프카에서 공식적으로 지원하는 라이브러리로, 토픽에 적재된 데이터를 실시간으로 변환하여 다른 토픽에 적재하는 라이브러리이다. 스트림즈 애플리케이션 또는 카프카 브로커의 장애가 발생하더라도 Exactly Once를 보장할 수 있도록 장애 허용 시스템 (fault tolerant system)을 가지고 있어서 데이터 처리 안정성이 매우 뛰어나다. 만약 토픽에 있는 데이터를 실시간 스트림 처리 필요가 있다면 스트림즈 애플리케이션을 개발하는 것을 1순위로 고려하는 것이 좋다! 프로듀서와 컨슈머를 조합하지 않고 스트림즈를 사용하는 이유 스트림 데이터 처리에 있어 필요한 다양한 기능을 스트림즈 DSL로 제공하기 때문이다. 이에 필요한 프로세서 API를 사용하여 쉽게 코드로 구현이 가능하다는 장점이 ..
변수를 비공개로 정의하는 이유는? 남들이 변수에 의존하지 않게 만들고 싶어서이다. 충동, 변덕 등으로 변수 타입이나 구현을 마음대로 바꾸고 싶어서이다. 그렇다면 왜 많은 프로그래머는 조회/수정 함수를 당연하게 public 공개 함수를 통해 비공개 변수를 외부에 노출할까? 자료 추상화 첫번째 예제 2차원 점을 표현하는 두 클래스를 비교해보자. 하나는 구현을 외부에 노출하고, 하나는 구현을 완전히 숨긴다. class Point { var x: Double = 0.0 var y: Double = 0.0 } --- interface Point { fun getX(): Double fun getY(): Double fun setCartesian(x: Double, y: Double) fun getR(): Doub..
코드를 딱 열었을 때 코드가 깔끔하고 일관적이며 꼼꼼하다고 감탄하며 질서정연하다고 탄복하며 모듈을 읽으며 두눈이 휘둥그래지는 전문가가 잤다는 인상을 심어주는 코드가 되었으면 좋겠다. 코드가 술에 취해 짜놓은 듯 어수선해 보인다면 프로젝트의 다른 측면도 똑같이 무성의한 태도로 처리했을거라 생각할 것이다. 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야한다. 코드 형식을 맞추기 위해 간단한 규칙을 정하고 그 규칙을 따라야 한다. 팀이라면 팀이 합의하여 규칙을 정하고 그 규칙을 모두가 따라야 한다. 규칙을 자동으로 적용하는 도구도 활용한다. 코드 형식은 중요하다. 적절한 행 길이를 유지하라 (세로 형식 맞추기) 대부분의 자바 소스 파일의 크기는 어느 정도일까? JUnit, FitNesses, Time and..
멱등성이란? 전달 신뢰성으로 여러번 연산을 수행하더라도 동일한 결과를 나타내는 것을 뜻한다. 따라서 이러한 멱등성 프로듀서는 동일한 데이터를 여러번 전송해도 카프카 클러스터에 단 한번만 저장되게 된다. 반면에, 기본 프로듀서의 동작 방식은 적어도 한번 전달(at least once delivery)를 지원한다. 여기서 적어도 한번 전달이란 프로듀서가 클러스터에 데이터를 전송하여 저장할 때 적어도 한번 이상 데이터를 적재할 수 있고 데이터가 유실되지 않음을 의미한다. 하지만 두 번 이상 적재할 가능성이 있으므로 데이터의 중복이 발생할 수 있다. 메시지 전달에는 아래와 같이 3가지의 경우가 존재한다. at least once: 적어도 한번 이상 전달 at most once: 최대 한번 전달 exactly o..
주석 나쁜 코드에 주석을 달지 마라. 새로 짜라. 주석은 필요악이다. 우리는 코드로 의도를 표현하지 못해서, 그러니깐 실패를 만회하기 위해 주석을 사용하는 것이다. 주석은 언제나 실패를 의미한다. 주석 없이는 코드로 자신을 표현할 방법을 찾지 못해 할 수 없이 주석을 사용한다. 따라서 주석은 반겨 맞을 것이 아니다. 주석을 엄격하게 관리해야 한다고도 한다. 그 의견도 맞지만, 코드를 깔끔하게 정리하고 표현력을 강화하는 방향으로, 그래서 애초에 주석이 필요없는 방향으로 에너지를 쏟아야 한다. 부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다. 부정확한 주석은 독자를 현혹하고 오도한다. 진실은 한곳에만 존재한다. 그것이 바로 코드다. 코드만이 자기가 하는일을 진실되게 말한다. 코드만이 정확한 정보를 제공하..
컨슈머 애플리케이션 컨슈머가 poll()하는 코드 코드 실행 후 아래와 같이 프로듀서에서 메시지를 보내면 앱 실행 화면에서 응답을 확인할 수 있다. 실행중인 애플리케이션의 로그를 통해서도 확인이 가능하다. 동기 오프셋 커밋 컨슈머 poll() 메소드가 호출된 이후에 commitSync() 메소드를 호출함으로써 오프셋 커밋을 명시적으로 수행할 수 있다. commitSync()는 poll()로 받은 가장 마지막 오프셋을 기준으로 커밋을 하게 된다. 참고로, 동기 오프셋 커밋을 사용하는 경우 모든 레코드의 처리가 끝난 이후 commitSync()를 호출해야한다. 프로듀서에서 메시지를 보내면 정상적으로 메시지가 출력되고 커밋이 이뤄지게 된다. 오프셋 값은 kafka-consumer-groups 명령어로 특정 그..
참고사항 이 책의 저자는 객체지향 기본 설계 원칙(SOLID)를 정의한 사람이다. "이 책에서의 교훈이 절대적인 진리"다. 라고 저자는 말한다. (오브젝트 진영에서) 1장. 깨끗한 코드 프로그래밍이란, 기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업이다. 따라서 코드를 자동으로 생성하는 시대가 다가오면서 프로그래머가 필요 없어질 것이란 말은 헛소리이다. 요구사항을 애매모하게 줘도 우리의 의도를 정확히 꽤뚫어 프로그램을 완벽하게 실행하는 기계는 불가능하다. 궁극적으로 코드는 요구사항을 표현하는 언어이다. 나쁜 코드를 짜는 이유는 상사의 기한에 대한 쪼임, 업무에 대한 지겨움, 업무가 밀려서 등등 다양한 이유가 있다. 하지만 이러한 코드로 인해 얽히고 설킨 코드를 '해독'해서 코드를 더해가야 하며 이..
컨슈머 프로듀서가 전송한 데이터는 브로커에 적재된다. 컨슈머는 이 적재된 데이터를 사용하기 위해 브로커로부터 데이터를 가져와서 필요한 처리를 담당한다. 예를 들어 마케팅 문자를 고객에게 보내는 기능이 있다면 컨슈머는 토픽으로부터 쌓여있는 고객 데이터를 가져와서 문자 발송 처리를 진행하게 된다. 컨슈머 내부 구조 Fetcher: 리더 파티션으로부터 레코드들을 미리 가져와서 대기하는 역할 poll(): Fetcher에 (이미)있는 레코드들을 리턴한다. ConsumerRecords: 처리하고자 하는 레코드들의 모음이다. 이때 처리된 레코드는 커밋으로 체크된다. 이 레코드에는 오프셋이 포함되어 있으므로 읽은 위치를 확인할 수 있게 된다. 따라서, 처리를 완료한 레코드에 대해서는 commit을 수행하여 처리한 레..
프로듀서 애플리케이션 개발 위 코드를 실행 시키면 실제 test 토픽에 testMessage 레코드가 쌓인것을 확인할 수 있다. 메시지 키를 가진 레코드를 전송하는 프로듀서 키값을 같이 확인하기 위해 --property옵션을 같이 넣어서 실행시켜준다. 키값 없이 보냈던 메시지의 키는 null로 나오고 그 외의 경우 같이 출력되는 것을 확인할 수 있다. 레코드에 파티션 번호를 지정하여 전송하는 프로듀서 파티션을 직접 지정하고 싶다면 토픽이름, 파티션 번호, 메시지 키, 메시지 값을 차례로 입력하여 보내면 된다. 특정 파티션 (3번)에 메시지를 보내고 컨슈머에서 해당 파티션의 메시지를 읽을 수 있다. 커스텀 파티셔너를 가지는 프로듀서 config에서 PARTITIONER_CLASS_CONFIG에 직접 작성한..
- Total
- Today
- Yesterday