함수 정의와 호출 이번 글에서는 모든 프로그램에서 핵심이라 할 수 있는 함수 선언과 호출을 코틀린이 어떻게 개선했는지 살펴보겠습니다. 추가로 확장 함수와 프로퍼티를 사용해 혼합 언어 프로젝트에서 코틀린의 이점을 모두 살릴 수 있는 방법도 알아보겠습니다. 컬렉션 fun main() { val set = setOf(1, 7, 53) val list = listOf(1, 7, 53) val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three") println(set.javaClass) // class java.util.LinkedHashSet println(list.javaClass) // class java.util.Array..
코틀린 기초 함수와 변수 이번 글에서는 모든 프로그램을 구성하는 기본 단위인 함수와 변수를 살펴보겠습니다.첫 번째 코틀린 코드를 작성하고 코틀린에서 타입 선언을 생략해도 된다는 사실을 보고, 코틀린이 어떻게 변경 가능한 데이터보다 변경할 수 없는 불변 데이터 사용을 권장하는지와 왜 불변 데이터가 더 좋은 것인지 살펴보겠습니다. Hello World 가장 기본적인 예제인 'Hello, World'를 출력하는 프로그램으로 시작해보겠습니다. 코틀린에서는 함수 하나로 이 프로그램을 만들 수 있습니다.함수를 선언할 때 fun 키워드를 사용합니다.함수를 모든 코틀린 파일의 최상위 수준에 정의할 수 있으므로 클래스 안에 넣어야 할 필요가 없습니다.최상위에 있는 main 함수를 애플리케이션의 진입점으로 지정할 수 있습..
코틀린이란? 코틀린(Kotlin)은 자바 가상머신(JVM) 플랫폼과 JVM 외의 다른 플랫폼에서 돌아가는 현대 프로그래밍 언어로, 처음에는 '더 나은 자바'로 시작했습니다. 즉, 개발자들이 일반적으로 저지를 수 있는 유형의 오류를 방지하고, 현대적 언어 설계 패러다임을 포용하면서도 자바가 쓰이던 모든 곳에 더 편리하게 쓸 수 있는 언어로 시작했습니다. 최근 10년간 코틀린은 자신이 여러 유형이 개발자, 프로젝트, 플랫폼에 실용적으로 잘 들어맞는 언어임을 증명해왔습니다. 안드로이드는 이제 코틀린 우선 플랫폼입니다. 이는 대부분의 안드로이드 개발자가 코틀린으로 개발을 한다는 뜻입니다. 스프링(spring) 같은 널리 쓰이는 프레임워크들이 코틀린을 네이티브로 지원하고 풍부한 코틀린 문서도 함께 제공하는 반면,..
Transport 이전에 [Java] Multiplexor 라는 글에서 Java NIO가 제공하는 Selector 기반의 이벤트 처리 모델을 살펴보았습니다. Selector는 단일 스레드가 수많은 소켓 이벤트를 동시에 감시할 수 있게 함으로써, 대규모 네트워크 연결을 효율적으로 관리하기 위해 등장한 메커니즘입니다. [Java] MultiplexerI/O Multiplexing 이란? I/O Multiplexing이라는 기술은 여러 개의 입출력 작업을 동시에 처리하는 기법을 의미합니다. 일반적으로 하나의 프로세스(혹은 싱글 스레드)가 여러 개의 I/O 요청을 처리해야 할freshdev.tistory.com Java NIO의 Selector는 플랫폼 독립적인 API를 제공하지만 실제 하부 동작은 운영체제의 ..
4주차 회고 3주차까지의 고도화 작업은 모두 하나의 가설에서 출발했습니다.“로그 처리 경로를 비동기화하고, 장애를 전제로 한 복구 구조를 설계하면대량 트래픽과 장애 상황에서도 로그 유실 없이 안정적으로 동작할 수 있을 것이다.” 4주차에는 이 가설이 실제로 성립하는지를 확인하기 위해,모니터링 지표를 기반으로 한 부하 테스트와 장애 시나리오 테스트를 진행했습니다. 부하 테스트는 k6를 사용해, 운영 환경에서 여러 OPA 인스턴스가 동시에 로그를 전송하는 상황을 단순화한 형태로 구성했습니다.부하 조건: 초당 1,000건 요청을 60초간 지속요청 형태: gzip 압축된 Decision Log (요청당 1~5건 배치)목표:요청 수신이 병목 없이 유지되는지로그 저장 경로가 요청 처리 흐름에 영향을 주지 않는지장애..
3주차 회고 1주차에 문제를 정의하고, 2주차에 조회를 고도화했다면,3주차에는 이 구조가 실제 운영 환경에서도 안전하게 동작할 수 있는지를 고민하는 단계였습니다. 여러 OPA 인스턴스를 연결하고 많은 트래픽과 함께 대량의 정책 결정 로그가 유입되는 상황을 가정했을 때로그가 유실되지 않고 처리될 수 있는지로그 수집이 서비스 흐름에 영향을 주지 않는지코드 구조가 이후 확장과 변경에 유연한지를 중점적으로 점검하고 개선했습니다. 정책 결정 로그는 단순한 부가 데이터가 아니라 장애 분석과 보안 판단의 근거가 되는 관측 데이터입니다.특히 여러 OPA를 연결하고 트래픽이 증가할수록 로그 유입량은 급격히 늘어나고, 저장 지연이나 장애가 발생할 가능성도 커지며, 로그 처리 로직이 서비스 로직과 강하게 결합되어 있다면 전..
Spring Kafka 앞서 작성한 글에서 Apache Kafka의 기본 구조와 분산 스트리밍 플랫폼으로서 Kafka가 제공하는 핵심 개념들을 살펴보았으니, 이번 글에서는 Spring Kafka에 대해서 자세히 살펴보겠습니다. Spring Kafka는 Kafka 클라이언트를 직접 다루는 복잡성을 줄이고, Spring의 프로그래밍 모델과 일관된 방식으로 메시지 프로듀서와 컨슈머를 구성할 수 있도록 지원합니다. 특히 템플릿 기반의 프로듀서 API, 애너테이션 중심의 리스너 모델, 트랜잭션과 오류 처리에 대한 통합 지원을 통해, Kafka를 보다 안정적이고 선언적으로 사용할 수 있게 해줍니다. Connecting to Kafka Spring Kafka에서 KafkaAdmin, ProducerFactory, ..
2주차 회고 1주차에서는 이 프로젝트에서 어떤 문제를 다룰 것인지, 그리고 왜 이 주제를 선택했는지를 정리했습니다.2주차에 들어서면서는 본격적으로 코드를 작성하기 시작했고, 그 과정에서 아키텍처에 대한 고민이 자연스럽게 따라오기 시작했습니다. 처음부터 명확한 아키텍처를 정해두고 시작한 것은 아니었으며, 개발 과정에서 지속적인 확장과 변경을 염두에 두다 보니 구조에 대한 고민이 점점 필요해졌습니다. CQRS 패턴을 적용하게 된 이유 처음에는 Decision Log를 저장하고 조회하는 기능을 하나의 흐름으로 구현하고 있었습니다.그런데 코드를 작성하다 보니, 쓰기와 읽기의 요구사항이 생각보다 많이 다르다는 점이 눈에 들어왔습니다.로그 수집 쪽은 최대한 단순해야 했습니다.원본 로그를 빠르게 저장하는 것실패 없이..
Kafka Overview Event Streaming 이벤트 스트리밍(Event Streaming)은 오늘날의 디지털 시스템에서 핵심적인 역할을 수행하는 데이터 처리 방식입니다.공식 문서에서는 이를 인간의 신경계에 비유합니다. 신경계가 신체 곳곳에서 발생하는 신호를 실시간으로 전달하고 반응을 이끌어내듯, 이벤트 스트리밍은 시스템 전반에서 발생하는 사건을 지속적으로 전달하고 해석할 수 있도록 합니다. 기술적으로 이벤트 스트리밍이란, 데이터베이스, 센서, 모바일 기기, 클라우드 서비스, 소프트웨어 애플리케이션과 같은 다양한 이벤트 소스로부터 실시간으로 발생하는 데이터를 이벤트의 흐름(stream) 형태로 수집하고, 이를 내구성 있게 저장하며, 실시간 또는 사후적으로 처리하고, 필요한 대상에게 적절히 전달하..
1주차 회고 러너스하이를 시작한지 어느덧 1주가 지났습니다.이번 회고에서는 무엇을 만들었는지보다, 왜 이 문제를 선택했는지와 1주차 동안 어떤 작업을 진행했는지를 정리해 보려고 합니다. 문제 선택 Learner’s High는 단순히 “과제를 잘 수행했는가”를 평가하는 프로그램이 아니었습니다.한 달이라는 제한된 시간 안에서,어떤 문제를 선택했고왜 그 문제였으며어떻게 해답을 찾았고그 결과 어떤 임팩트를 만들었는가를 설명할 수 있는지를 보는 프로그램이라고 이해했습니다. 따라서 이번 프로젝트의 출발점은 기술 선택이나 구현 난이도가 아니라, "지금 환경에서 가장 의미 있는 병목은 무엇인가" 라는 질문이었습니다. 프로젝트 배경과 환경 제가 속한 조직에서는 기존의 사내망 중심 접근 제어 방식에서 제로 트러스트(..