분류 전체보기 305

완전 관해 (CR, Complete Response)

정말 기적같은 소식이다. 추적검사에서의 재발이 없다고는 이야기 못한다.이번에 고생을 시작하게 된것도 추적검사에서의 재발이 시작이었으니까.희귀한 케이스기에, 언제든지 악화될 수 있고, 방광 제거와 같은 추가적인 수술적 치료가 고려될 수 있다고도 한다. 그러나, 1년 8개월간의 고생 끝의 얻은 3개월의 여유라는 것만으로도, 우리 가족에게는 너무나 큰 가치있는 소식이었다.그동안 힘들었던 항암치료를 버텨주신 아버지께도 감사드리고, 가족에게 활기를 불어넣어 주신 하나님께도 감사드린다.돌이켜보면, 정말 운이 따라줬다고 할 수 있다.더 늦게 발견했다면, 그냥 기존 병원에서 지속적으로 치료했다면 더 안좋은 상황을 마주했을지도 모른다.꼼꼼히 봐주신 의사선생님께도 감사드렸다.고비용의 항암요법이 아닌, 수술로 치료할 가능성..

[코틀린 코루틴] 플로우

플로우는 코루틴을 기반으로 한 리액티브 스트림이다. 플로우를 사용하면 시간이 지남에 따라 나타나는 여러 값을 다루는 상황에서 코루틴의 동시성 매커니즘을 활용할 수 있다. 플로우의 여러 유형과 이를 생성/변환/소비하는 방법을 알아보자.목차플로우란 무엇인가?콜드 플로우핫 플로우플로우란 무엇인가?일시 중단 함수는 스트림 형태의 데이터에는 취약하다.다음 코드를 실행해보자.private var zeroTime = System.currentTimeMillis() fun log(message: Any?) = println("[${System.currentTimeMillis() - zeroTime} ms] ${Thread.currentThread().name}: $message") suspend fun create..

[코틀린 코루틴] 구조적 동시성

코루틴 컨텍스트이전 글에서 Dispatcher를 설정할 때, 이부분에 대해 의구심이 생길 수 있다.우린 분명 launch 의 인자로 Dispatcher를 넘겼는데, launch의 파라미터는 context를 받고 있다.이 컨텍스트는 뭐고, 왜 Dispatcher를 넘겨도 동작할까? 사실 우리가 넘긴 디스패처는 기존 코루틴 컨텍스트에 덮어씌워지는 역할을 수행한다. 코루틴 컨텍스트에는 다양한 정보들이 들어있다.코루틴 디스패처코루틴 생명주기Job 객체코루틴 객체 이름코루틴 ExceptionHandler그리고, 다음과 같이 파라미터로 넘긴 Context로 덮어씌우는게 가능하다.실제로 다음과 같이 코루틴 컨텍스트가 바뀐 것을 확인할 수 있다.구조적 동시성지금까지 코루틴 컨텍스트를 왜 알아봤냐 하면, 구조적 동시성을..

[코틀린 코루틴] 코틀린의 동시성 모델 - 코루틴

코틀린은 동시성 모델로 쓰레드 활용이 아닌, 코루틴을 권장한다.코틀린 코루틴 vs 전통적 스레드코틀린에서는 concurrent.thread 함수를 이용하면, 새 스레드를 간편하게 시작할 수 있다.하지만 이는 커널 스레드를 직접 만드는 형태이기 때문에 비용이 많이 든다.스레드는 계층 개념이 없기 때문에, 계층적 관리를 하기 까다롭다.스레드는 어떤 작업이 완료되길 기다리는 동안에는 블록된다.최신 시스템이라도 한번에 몇 천개의 스레드만 효과적으로 관리할 수 있다.기본적으로 스레드는 굉장히 무거운 자원이다.요청 1개를 처리하는 동안 스레드 1개를 할당하는 구조에서,DB 호출/외부 HTTP/파일 I/O 등으로 스레드가 블로킹되면 그 스레드는 그 시간 동안 유용한 일을 못 하면서도 계속 점유된다.동시 요청이 늘면 ..

RAG(검색 증강 생성) 입문 튜토리얼

RAG(Retrieval-Augmented Generation, “검색 증강 생성”)은 외부 지식의 검색을 통해 대형 언어 모델(LLM)의 응답 생성을 향상시키는 기술이다. LLM 단독으로는 훈련 데이터에 없는 최신 정보나 세부사항을 모를 수 있고, 존재하지 않는 답변을 그럴듯하게 만들어내는 환각(hallucination) 문제가 있다.RAG는 이러한 한계를 해결하기 위해 신뢰할 수 있는 데이터 소스의 정보를 미리 찾아서 LLM에 제공함으로써, 응답의 정확성과 신뢰성을 높이는 역할을 수행한다RAG 파이프라인 개념도문서를 사전 처리하여 임베딩(벡터 표현)을 생성하고 벡터 DB에 저장해 둔 뒤, 사용자 질문(query)에 따라 관련 임베딩을 검색한다. 검색된 문서 내용들을 LLM 프롬프트에 추가(증강)하여,..

Kotlin 문법 - Java와의 차이점

코틀린을 사용하면서, 자바랑 확연히 달라 적응하기 어려웠던 부분들을 기록해둔다.read-only vs mutable 관리read-only vs mutable: 객체 내부 프로퍼티 접근제어코틀린에서 val/var 차이와, 프로퍼티의 getter/setter를 정의하는 방식(특히 private set)을 정리한다.1. val vs varval: 재할당 불가(읽기 전용 참조). 프로퍼티 관점에서는 setter가 없음.var: 재할당 가능. 프로퍼티 관점에서는 getter + setter가 있음.val a = 10// a = 20 // 컴파일 에러var b = 10b = 20 // 가능2. 기본 getter/setter코틀린 프로퍼티는 기본적으로 접근자(accessor)가 자동 생성된다.class User { ..

동시성 vs 병렬성

오랜만에 용어를 다시보니 헷갈려서 정리한다.동시성 vs 병렬성핵심 정의동시성(Concurrency): 여러 작업이 같은 시간 구간에 진행되며, 실행이 교차(interleave) 될 수 있는 성질.단일 코어에서도 가능(스케줄링/컨텍스트 스위치).병렬성(Parallelism): 여러 작업이 같은 시각에 실제로 실행되는 성질.멀티코어/멀티프로세서에서 물리적 동시 실행.따라서, 병렬 실행은 “같은 시간 구간에 진행”을 만족하므로 동시성도 만족한다.하지만 동시성은 단일 코어에서도 성립하므로 병렬성이 없어도 동시성은 성립한다.이 관계를 집합으로 보면Concurrency ⊇ Parallelism 상호 배타적이 아니라, 병렬성은 동시성 안에 포함된다(포함 관계).예시로 구분동시성 O, 병렬성 X단일 코어에서 스레드 A..

[번역] Python의 ORM - SQLAlchemy 튜토리얼

ORM 빠른 시작기본 ORM 사용 형태를 빠르게 보고 싶은 신규 사용자를 위해, SQLAlchemy Unified Tutorial에서 사용하는 매핑과 예제를 축약해 보여준다. 이 섹션의 설명은 의도적으로 매우 짧게 작성되어 있으므로, 여기서 다루는 각 개념에 대한 더 자세한 설명은 SQLAlchemy Unified Tutorial을 참고하는 것이 권장된다.목차모델 선언테이블 생성영속화(Create)조회(Read) - 단순 조회 & 조인수정(Update) - 변경 사항 반영삭제(Delete)모델 선언(Declare Models)여기서는 데이터베이스에서 조회할 구조를 구성하는 모듈 수준 구성 요소를 정의한다.이 구조는 선언적 매핑(Declarative Mapping) 이라고 하며, 파이썬 객체 모델과 함께,..

이벤트-루프 모델과 DB 트랜잭션 지원

비동기(Promise, Async, Coroutine, Reactor) 에 대한 깊은 이해를 수행하다보면, 필연적으로 마주치는 어려움이 있다.바로 이벤트 루프 모델은 어떻게 DB I/O 방식을 바꾸는가 이다. 상당히 이해하기 어려운 개념이기 때문에, 읽는 독자 여러분들도 직접 그림을 그려보며 이해하는 것을 권장한다. 자바+스프링의 예시를 바탕으로 이야기를 전개해 나가겠다.목차이벤트 루프(비동기) 모델의 목표DB 드라이버와 DB간의 통신 방식DB 드라이버와 애플리케이션 간에 발생하는 문제점결론1. 이벤트 루프(비동기) 모델의 목표일반적인 HTTP 요청의 처리 흐름을 그려보면 다음과 같다.속이 빈 형태 - 인터페이스속이 채워져있는 형태 - 구현체너무나 당연한 이야기지만, 애플리케이션 코드 플로우는 자체적인 ..

2026년 1월 1주차 회고

감사가 무너지면 꾸준함이 무너진다.조급해지기 전에, 대안을 찾기전에, 충분히 감사했나?이번 주의 감사더 이상 악재에 휘둘리지 않고 초연해줘서 고맙다.이렇게 핀잇을 구현할 여유를 만들어낼 수 있음에 고맙다.항상 무언가를 수행하기.체계적인 상태를 유지하기.큰그림 그리고 핵심 짚기.처음부터 끝까지 차근차근 전개하기.현 시스템에 대한 감사를 유지하기.보상 체계를 깨끗히 유지하기.입장 중심이 아닌 이익 중심으로 사고하기.윈-윈 전략 생각하기.단정 짓지 말고, 다음에 무엇을 해야 할 지 상상하기.내가 놓치고 있는 부분이 분명히 존재한다는 걸 인정하기.상대방이 어떤 점을 해결해 주는 것을 원하는가?지금 내가 다음에 무엇을, 어떤 절차로 해야 하는가?이번주에 한 것디스코드 에러로그 알림 도입API 사용 데이터 로깅(프..