본문 바로가기

전체 글246

새로운 곳에서, 한 달의 회고와 그 동안 묶인 이런저런 생각들 새로운 팀에 합류한지 벌써 1달이 지났다. 시간 참 빨리 지난다. 아직 20대 중반 밖에 안되었는데, 진심 너무 빨리 간다.. 개발을 공부하며 관심있던 도메인인 인증과, 결제 중 결제 도메인으로 백엔드 개발 커리어를 이어가게 되었다. 혼자 공부하며 적용했던 결제와는 다르게, 실제 이루어지는 결제는 체계적인 프로세스를 통해 이루어진다는 사실을 실감하는 중이다. 온라인, 오프라인 결제든, VAN 사를 꼭 거쳐야 하는데, 이 작업을 처음으로 코딩해봤다. 구현하는 과정은 정말 고난의 연속이었다. 핵심적으로 공부했던 부분은 HTTP 통신을 통해 JSON 을 내려주는 API 개발에 대한 과정을 심도 있게 공부했는데, 네트워크 4계층인 TCP/IP 통신을 통해 구현하는 것이 낯설기도 했고, object 단위보다 lo.. 2023. 7. 7.
[TCP Socket 통신] Okio 라이브러리를 이용한 kotlin socket 통신 io stream 과 socket 을 이용한 tcp 통신은 java 를 처음 공부할 때, 간단하게 멀티 스레드 채팅 정도의 예제로 이해하며 넘어갔다.. 웬만한 클라이언트 - 서버 간의 통신은 http 로 이루어지므로 이를 더 깊게 파며 공부했었다. 이번에 이직한 회사에서 본격적으로 맡게 된 첫 과제는 TCP 전문 통신을 구축하는 것이다. 소켓 통신을 구현하는데, java socket api 를 이용하여 순수 구현할 수 있지만, kotlin 에서는 okio 라는 통신 전용 라이브러리가 있다고 해서 이를 한번 사용해서 전문 통신을 위한 소켓 클라이언트 초석을 구현해봤다. 잘 해보지 않은 socket 통신을 이해하고 구현하며 이틀간 많이 고통 받았고, 그 과정에서 좀 더 편리한 kotlin okio 라이브러리.. 2023. 6. 24.
[CI-CD 구축] AWS EC2, Docker 를 이용한 Spring Boot 자동 배포 인프라 구축은 참 쉽지 않다. 인프라 공부는 더더욱 어려운 것 같다. 무엇보다 실습을 하려면 비용이 참 많이 든다. 하지만, 원활한 개발을 위해서는 자동 배포를 구축해야지만, 서비스 개발에만 집중할 수 있다. 그래서 백엔드 개발자는 서버 개발 능력 이외에, 어느 정도 인프라 구축 및 환경에 대한 개념을 기본적으로 탑재해야 된다고 생각한다. 이번에 사이드 프로젝트 기획 및 인프라 구축을 해야될 일이 생겼다. 어떻게 최대한 쉽고 빠르게 구축할지 고민을 해뵜다. 이 전에는 jar 파일을 그대로 실행하기 위해 AWS EC2 인스턴스에 고대로 로컬과 비슷한 환경을 구성해 놓고, yaml 도 그대로 넣어놓고, 무중단 배포를 시도했다. Ubuntu 서버에서 할게 참 많았다. 도커를 공부하고, 사용해보면서 EC2 에 .. 2023. 6. 18.
첫 이직 최근, 이직을 했다. 결제 카드 단말기, 포스 등 클라우드 포스 아이템으로 B2B 사업을 하는 스타트업이다. 꽤 짧은 기간 안에 이직을 하게 되었다. 이전 회사에서 5개월 만의 이직을 하는 것이니 말이다. (사실 상 경력이 아닌 신입 포지션이라 봐도 무방하다..ㅎㅎ) 한번 하고자 하는 일은 끝을 보자는 성격이기에, 백엔드 개발자가 되기로 마음 먹고 공부를 하며, 언젠가 끝까지 올라가보자 하는 욕구가 생겼다. 매일 그에 부합하는 환경과 상황을 찾아간다고 생각을 한다. 새롭게 합류하게 된 이 곳은, 꿈 꾸던 백엔드 개발 환경에 근접하다. PR merge 를 위한 충분한 승인 조건, 코드 리뷰, 사용하는 언어의 철학에 맞는 충분한 고민과 그를 녹여낸 결과물, 확장성 있는 아키텍처를 구축하기 위한 고민의 흔적들.. 2023. 6. 12.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 4-4장 스프링 카프카 스프링 카프카 스프링 프레임워크에서 카프카를 추상화하여 효과적으로 사용할 수 있게 만든 라이브러리 카프카 클라이언트에서 활용하는 여러 가지 패턴을 미리 제공함. 스프링 카프카 프로듀서 스프링 카프카 프로듀서는 카프카 템플릿 (Kafka Template) 이라는 클래스를 사용 카프카 템플릿은 프로듀서 팩토리 (Producer Factory) 클래스를 통해 생성 방법 스프링 카프카의 기본 제공 템플릿 application.yml 파일에 옵션을 지정하고 사용 사용자가 직접 카프카 템플릿을 프로듀서 팩토리로 생성 프로듀서 팩토리를 통해 만든 카프카 템플릿을 스프링 빈으로 등록 후 사용 프로듀서에 필요한 각종 옵션을 선언 후 사용 가능 스프링 카프카 애플리케이션 내부에 다양한 프로듀서 인스턴스를 생성하고 싶다면 .. 2023. 6. 6.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 4-3장 카프카 컨슈머 카프카 컨슈머 멀티 스레드 컨슈머 파티션을 여러 개 운영하는 경우, 데이터를 병렬 처리하기 위해서는 파티션, 컨슈머 개수를 동일하게 맞춰야 한다. 토픽의 파티션은 1개 이상으로 이루어짐 1개의 파티션은 1개 컨슈머가 할당되어 데이터 처리 파티션 개수가 n개라면, 동일 컨슈머 그룹으로 묶인 컨슈머 스레드를 최대 n개 운영 가능 n개의 스레드를 가진 1개의 프로세스를 운영 1개의 스레드를 가진 프로세스를 n개 운영 어떤 방식으로 운영할지는 개발자의 선택 공식적으로 지원하는 라이브러리인 자바는 멀티 스레드를 지원하므로, 자바 애플리케이션을 개발한다면, 멀티 스레드로 동작하는 멀티 스레드를 개발하고 적용하면 좋다. 멀티 스레드 컨슈머 운영 중 고려 사항 하나의 컨슈머 스레드에서 예외 상황 (OOM 등등) 이 터.. 2023. 5. 18.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 4-2장 카프카 프로듀서 카프카 프로듀서 카프카 프로듀서는 토픽에 데이터를 저장하는 첫 단계! acks 옵션 프로듀서의 옵션으로 acks 옵션 프로듀서가 전송한 데이터를 클러스터에 얼마나 신뢰성 있게 저장할 지 지정 가능 옵션에 따라 성능이 달라질 수 있다. acks = 0 프로듀서가 리더 파티션으로 데이터를 전송했을 때 리더 파티션으로 데이터가 저장되었는지 확인 하지 않는다 리더 파티션은 데이터가 저장된 이후, 몇 번째 오프셋에 저장되었는지 return 이 경우에는 데이터가 저장된 여부에 따른 응답을 받지 않음. 프로듀서는 데이터 전송 실패시, 재시도할 수 있게, retries 옵션 설정 가능 하지만 acks = 0 일 경우, 데이터 전송을 무조건 성공으로 간주, 해당 옵션은 무의미하다. 프로듀서와 브로커 사이의 네트워크 오류.. 2023. 5. 7.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 4-1장 토픽과 파티션 토픽과 파티션 토픽이 사라지면 카프카 파이프 라인은 동작하지 않음. 적정 파티션 개수 토픽의 파티션의 개수는 카프카 성능과 밀접한 관계가 있다. 파티션의 개수를 적절하게 설정하고 운영하자. 파티션 개수를 정할 때 고려할 점 데이터 처리량 메시지 키 사용 여부 브로커와 컨슈머의 영향도 파일 시스템을 사용하는 카프카는, 파티션의 수 만큼 파일에 접근한다. 운영체제 특성 상 프로세스 당 접근 가능한 파일 개수가 정해져 있다. 브로커가 접근하는 파일 개수를 안정적으로 유지하고 싶을 경우는, 카프카 브로커의 수를 늘리면 된다. 데이터 처리 속도를 올리자 컨슈머의 처리량 늘리기 컨슈머가 실행되는 서버를 스케일업 GC 튜닝 컨슈머는 (S3, 하둡, 오라클 등등) 의 시스템과 연동되므로, 일정 수준 처리량을 높이는데,.. 2023. 5. 5.
하고 싶은 것만 하며 살 순 없다 현대의 사람들이 단적으로 추구하는 "행복". 근데 그게 뭔데? 참으로 추상적이지 않을 수 없다. 전에도 생각을 마쳤다시피 행복은 추상적인 것이다. 결국, 남들과 비교하며 느끼잖아.. 실체가 없다. 근데 왜 추상적인 "감정" 이란 것에 목을 맬까? 생각해 봤다. 의미 부여를 하지 않으면 미치는 게 인간이다. 자신이 하고자 하는 일에 투자하는 시간, 감정 등이 결국 한정된 자원이기 때문이다. 의미 부여를 함으로써 인간은 비로소 자기 자신이 하는 일에 대한 정당성을 부여받는다. 왜 정당성을 부여받아야 하는가? 그래야, 인정을 받기 때문이다. 왜 인정을 받아야 하는가? 그것이 곧, 자신의 가치를 증명하는 수단이기 때문이다. 적어도 남성은 자기 자신의 가치를 일생 동안 증명해야 하는 존재다. 그렇기 때문에, 남성.. 2023. 4. 23.
OutBox Pattern 을 활용한 메일 전송 서비스 개발 [At Least Once] 스프링에서 메일 전송은 정말 간단하게 구현할 수 있다. JavaMailSender 로 말이야. 단순히, 메일만 전송하는 함수만 구현하면 끝일까? 물론 상황에 따라 간단한 구현이나, 복잡한 구현이 나눠져야 한다. 실 서비스에서는? 메일로 전송해야 하는 데이터 중요도에 따라 다르겠지만, 아무래도 메일을 수신하는 클라이언트 입장에서는 서버 장애 때문에, 메일 수신이 안 될 경우 매우 당황스러울 것이다. 즉, 적어도 한번 전송 (At least once) 를 만족하는 Eventually Consistency 를 구현해야 하는 것은 메일 전송 서비스에서 기본적으로 다뤄져야 할 사항이다. 일례로, 분산 서버 환경에서는, 알림 서비스만을 다루는 애플리케이션이 존재하는데, 이때 outbox 패턴이라는 것을 사용하여 구.. 2023. 4. 20.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 3-6장 카프카 커넥트 카프카 커넥트란? 데이터 파이프라인 생성 시 반복 작업을 줄이고, 효율적인 전송을 위한 애플리케이션 예로, 파이프라인 생성 시, 프로듀서 | 컨슈머 애플리케이션을 계속 만들 수 있지만, 반복 생성 작업의 경우 계속적으로 배포 및 운영이 비효율적이다. 이때 사용하면 안성 맞춤 Source Connector 프로듀서 역할 토픽으로 데이터를 보낼 때 Sink Connector 컨슈머 역할 토픽의 데이터를 받아 저장할 때 예시로, Mysql 의 데이터를 보내고 저장할 때 (JDBC 도 마찬가지) 커넥터를 이용하여 파이프라인 생성 가능 특징 오픈 소스 커넥터는 커넥터 jar 를 다운로드하여 편리하게 사용 가능하다. gradle 의 Mysql connector 를 말하는건가? 커넥터를 이용하여, 파이프라인 생성 시.. 2023. 4. 20.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 3-5장 카프카 스트림즈 카프카 스트림즈 토픽에 저장된 데이터를 실시간으로 다른 토픽에 적재하는 라이브러리 카프카 클러스터와 완벽 호환 및 스트림 처리에 필요한 편리한 기능 제공 장애 발생 시 Exactly Once 하도록 장애 허용 시스템 장착 => 데이터 처리 안정성 Up. 개요 스트림즈 애플리케이션은 내부적으로 1개 이상의 스레드 생성 가능 스레드는 1개 이상의 태스크를 가진다. 스트림즈의 Task 는 스트림즈 애플리케이션을 실행하면 생기는 데이터의 최소 처리 단위 3개의 파티션으로 이루어진 토픽을 처리할 경우, 스트림즈 애플리케이션을 실행 시, 내부의 3개의 태스크가 생김. 카프카 스트림즈는 스트림즈 DSL (Domain Specific Language) 과 프로세서 API 2개의 방법으로 개발 가능 스트림즈 DSL 은 .. 2023. 4. 13.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 3.4 장 카프카 클라이언트 카프카 클라이언트 카프카 클러스터에 명령을 내리거나 데이터를 송수신 하기 위해 사용한다. 카프카 프로듀서, 컨슈머, 어드민 클라이언트를 제공함. 엄연한 라이브러리이므로, 프레임워크나 애플리케이션에서 구현 후 실행. 프로듀서 API 카프카에 필요한 데이터를 선언하고 브로커의 특정 토픽의 파티션에 전송. 데이터를 전송할 때 리더 파티션 소유의 카프카 브로커와 직접 통신한다. 주요 특징 카브카 브로커로 데이터 전송 시, 내부적으로 파티셔너 및 배치 생성 단계를 거침. UniformStickyPartitioner 와 RoundRobinPartitioner 의 2개 파티션을 제공함. 메시지 키 유무에서 차이점이 발생한다. 프로듀서 동작에 특화된 UniformStickyPartitioner는 높은 처리량 및 낮은 .. 2023. 4. 9.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 3-2, 3장 토픽과 파티션, 레코드 토픽 데이터를 구분하기 위해 사용되는 단위 1개 이상의 파티션 소유 데이터를 Record 라 칭함 파티션 병렬처리의 핵심 컨슈머의 개수를 늘리는 스케일 아웃으로 한정된 컨슈머의 처리량을 보조 가능. Queue와 같은 구조 레코드 타임 스탬프, 메시지 키, 메시지 값, 오프셋, 헤더 구성 한번 적재된 레코드는 수정 불가 및 log retention or capacity에 따라 삭제 특징 생성된 시점에 Unix Time 설정 됨, 레코드 생성 시 타임 스탬프를 설정할 수 있다는 것에 유의 메시지 키를 이용하여 해시 값을 토대로 파티션 지정 가능 필요시 null 설정 메시지 값은 직렬화, 역직렬화 가능한 객체로 설정 => 동일한 형태로 상호 간 수행 컨슈머가 데이터를 가져갈 때, 오프셋을 사용 컨슈머 그룹이 .. 2023. 3. 27.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 3-1장 카프카 브로커와 클러스터 주키퍼 카프카 브로커 카프카 클라이언트와 데이터를 주고 받기 위해 사용하는 주체 장애가 발생하더라도 안전하게 사용하기 위해 데이터를 분산 저장하는 애플리케이션 보통 3대 이상의 클러스터로 운영 분산 저장 및 복제 카프카 브로커의 특징 전달 받은 데이터를 파티션에 저장 및 전달 파일 시스템에 데이터를 저장 메모리나 데이터 베이스가 아닌, 파일 시스템에 저장 => 속도 이슈를 캐싱으로 개선 데이터의 복제는 파티션 단위로 이루어짐 => 리더 파티션으로부터 받음 컨트롤러 다른 브로커들의 상태 체크 및 하나의 브로커가 제외될 경우, 리더 파티션을 재분배 데이터 삭제 카프카는 기본적으로 토픽 데이터 삭제하지 않음. 브로커만이 데이터를 삭제 가능함. => 삭제 용량 옵션 값 설정 가능 코디네이터 컨슈머 그룹 상태 체크 및 .. 2023. 3. 27.
반응형