분류 전체보기
-
@Async, 생각보다 까다롭다.Java & Kotlin 2021. 11. 1. 00:53
1) 서론 요즘 @Async를 어느 때보다 많이 사용하고 있습니다. 사실 그동안 간단하게 애노테이션과 thread pool 설정만 하면 된다고 생각했습니다. 하지만 실제로 사용할 때 예상하는 것과 다른 흐름으로 동작하고, 은근히 까다롭다는 것을 느꼈습니다. 제가 사용하며 만난 문제점과 해결 과정을 기록합니다. 2) 문제의 코드 전체적인 콘셉트는 간단합니다. 파싱 해온 데이터를 원하는 방향으로 가공합니다. 이때 이름, 가격을 나눠서 가공하고 비동기 처리합니다. public class MainClas { public void trimAndAddWines(List names, List prices) { log.info("\n === trimAndAddWines() 시작 ==="); // @Async wineN..
-
인터페이스의 default, static 메소드Java & Kotlin 2021. 10. 6. 00:37
1) 서론 창피하지만, 최근 이펙티브 자바를 읽으며 인터페이스에 default, static 메서드가 된다는 것을 알았습니다. JDK 17이 나오는 시점에서 JDK 8 조차 제대로 업데이트되지 않은 채 "그게 돼?" 라는 충격에 빠졌습니다. 그래서 이번 기회에 해당 메서드들이 왜 만들어졌고, 어떻게 사용되는지 공부해봤습니다. 2) default / static 메서드 원래 인터페이스는 추상 메서드만 사용 가능했었습니다. 여기서 추상메서드란 구현부가 없는, 아직 완성되지 않은 메서드인데요. 왜 추상메서드만 허용을 했었는가에 대한 명확한 설명은 없지만, 오라클 공식문서를 참고하면 오라클이 인터페이스를 어떻게 바라보고 있는지 조금은 알 수 있습니다. 오라클 공식문서에서는 인터페이스를 자동차 산업의 표준이 되는..
-
Kafka 클러스터 메세지 발행 및 문제 해결Kafka 2021. 10. 4. 01:46
1) 서론 단순 공부 및 테스트 위해 local 환경에서 broker 4 + zookeeper 3개의 서버를 사용합니다. 깊이 있는 설정은 배제하고, 전체적인 흐름 파악에 집중했습니다. 이 글에서는 카프카 클러스터의 설정 방법은 설명하지 않습니다. 궁금하신 분들은 아래 글을 참고해주세요. Kafka 클러스터 구성 및 장애 해결 Zookeeper 클러스터 및 컨트롤러 선출 전체적인 구조입니다. 꼭 8082 포트가 controller가 되는건 아닙니다. 단순 예시입니다. 2) 설정 최소한의 설정만 합니다. producer / consumer.properties (동일) // 연결할 broker 주소들 bootstrap.servers=localhost:8081,localhost:8082,localhost:80..
-
과거의 나에게...(와인 검색 서비스 회고)Java & Kotlin 2021. 10. 2. 01:39
1) 서론 이 글은 약 1년 전, 학생 때 만든 "와인 검색 서비스"의 회고(변명) 글입니다. 머릿속으로 대략 생각하면서 작성했습니다. 조만간 시간이 나면, 실제로 리팩토링 진행해볼 예정입니다. 저는 이상하게 새로 무언가를 만드는 것보다, 리팩토링을 통해서 더 좋은 코드와 성능 향상에 관심이 많습니다. 당시에 만든 서비스와 글은 아래와 같습니다. https://yeon-kr.tistory.com/131?category=868421 전체적인 내용(변명)은 "그때는 그게 최선이었다. 그것밖에 몰랐다"라고 할 수 있을 듯합니다... 과거의 나야... 제발 무전받아... 그렇게 하는 거 아니야... 2) 와인 검색 서비스... 패기는 좋았다! 사용된 기술 스프링 프레임워크 (boot X) JSP + JavaSc..
-
Zookeeper 클러스터 및 컨트롤러 선출Kafka 2021. 9. 19. 01:47
1) 서론 간단하게 zookeeper 3개의 서버를 실행시켜 클러스터로 만듭니다. 그리고 zookeeper에 등록되는 컨트롤러 브로커의 장애 발생 시 어떻게 되는지 살펴봅니다. +) 공부하는 입장에서 작성하는 "Hello World" 수준의 글입니다. 내용에 잘 못된 점이 있다면, 언제든지 댓글 남겨주세요! 2) Zookeeper zookeeper는 분산 애플리케이션들의 관리를 도와주는 역할을 합니다. 개발자로 하여금 비즈니스 로직에만 집중할 수 있게 하고, 클라이언트(kafka) 관리는 zookeeper가 대신해줍니다. 만약 zookeeper가 관리해주지 않는다면, 거대한 클러스터 애플리케이션의 설정과 동기화 등을 직접 관리해야 할 겁니다. kafka와 연동하여 서비스할 때 아래의 동작을 하게 됩니다...
-
Kafka 클러스터 구성 및 장애 해결Kafka 2021. 9. 12. 20:44
1) 서론 주키퍼(zookeeper) 1개 + 카프카(kafka) 3개 구성의 클러스터를 구성합니다. 학습에 목적을 두고 있기 때문에 최대한 간단한 클러스터를 구성했습니다. 이를 통해 카프카, 주키퍼의 설정 방식을 공부합니다. +) 학습과정의 블로그이므로, 오류는 댓글로 남겨주시면 감사히 수정하겠습니다! 2) Zookeeper 1대의 주키퍼 서버를 사용한다면, 더 설정할 것은 없습니다. 아래의 명령어를 통해 주키퍼를 먼저 실행합니다. $ bin/zookeeper-server-start config/zookeeper.properties or $ brew services start zookeeper 3) Kafka 카프카 브로커의 클러스터를 구성합니다. 우선, config/server.properties를 ..
-
첫 stackoverflow 질문을 남기다.Contribution 2021. 9. 2. 01:02
Kafka 관련하여 2주 정도 고민을 하고, 아무리 검색을 해봐도 답을 찾지 못했습니다. 그래서... 이 참에 처음으로 stackoverflow에 질문을 남겨봤습니다. 그리고 느낀 점을 간략히 기록합니다. 질문글 https://stackoverflow.com/questions/68987866/kafka-consumer-classnotfoundexception 1) 영어 저는 제가 영어를 잘하는 줄 알았습니다(?) 나름 캐나다에서 옷도 열심히 팔아봤고, 친구들도 사귀면서 문제없다고 생각했는데요... 막상 질문을 남기려고 영어를 작성하다 보니 헷갈리는 표현도 많고, 불필요하게 길어지기도 했습니다. 아무래도 축약할 수 있는 표현에 부족하기에 설명을 위한 문장이 길어졌습니다. 특히 말할 때는 문제가 없더라도, ..
-
(Kafka) 객체를 JSON 타입으로 넘겨보자Kafka 2021. 9. 1. 17:22
1) 서론 Kafka는 메시지 브로커를 이용해 서로 다른 프로젝트 사이에 메시지를 주고받을 수 있습니다. 이를 통해 비동기적인 처리를 할 수 있는데요. 메시지를 넘겨줄 때 int, string 등 타입을 지정해서 넘기는 것이 가장 간단한 방법입니다. 하지만 이러한 방식은 하나의 데이터 객체를 가지고 있더라도, 각각의 타입을 가진 직렬화 방식을 사용해야 합니다. 즉 개수도 많아지고, 어떤 목적으로 메시지를 전달하는지 명확히 파악하기 어렵다고 생각합니다. 그래서 모든 메세지 전달을 JSON 타입으로 통일하여 전달하고, 직렬화에 필요한 객체의 정의 방법을 기록합니다. 그리고 해당 과정에서 발생한 오류를 기록합니다. 아직 코린이 입니다. 혹시나 더 좋은 방법이나, 틀린점이 있다면 알려주세요. 2) 목적 사용자가..