AlwaysLikeNewbie
-
객체지향 디자인 패턴의 첫 걸음, SOLID 원칙!
객체지향 디자인 패턴의 첫 걸음, SOLID 원칙!
2024.10.250. 들어가며오랜 시간동안 수많은 개발자들은 효율적이고, 견고하며, 유지보수가 용이한 프로그램을 만들기 위해 고민했습니다. 그 결과, 객체지향 디자인 패턴의 SOLID 원칙이 탄생했습니다.지금부터, SOLID 원칙을 학습하며 객체지향 디자인 패턴의 첫 걸음을 떼어 봅시다! 이 글은 제가 애청하는 얄코님의 'SOLID 원칙 - 객체지향 디자인 패턴의 기본기' 의 내용을 사전 동의 하에 정리한 글입니다. 어려운 내용을 정말 쉽게 가르쳐 주시기 때문에, OODP에 관심 많으신 분들께 강력하게 추천드립니다. 1. 단일 책임 원칙 (Single Responsibility Principle)단일 책임 원칙은 말 그대로, 한 클래스는 하나의 책임만 가지고 있어야 한다는 의미입니다.만약 한 클래스가 여러 메서드를 가지.. -
새 브랜치 생성을 깜빡했을 때, 작업물 빠르게 옮기기
새 브랜치 생성을 깜빡했을 때, 작업물 빠르게 옮기기
2026.07.15작업을 하다 보면 (코아일체에 빠져서 신나게 작업하다가) 새 브랜치 생성을 깜빡한 채 기존 브랜치에서 그대로 작업을 진행해버리는 경우가 종종 있다. 이럴 때는 아래 순서대로 처리하면 된다. 작업 중인 변경 사항을 임시로 보관한다.main 브랜치로 이동해 최신 상태로 업데이트한다.새 브랜치를 생성한다.임시 보관해둔 작업물을 새 브랜치로 복원한다. 매번 이 과정을 검색해서 찾아보는 게 번거로워, 이번 기회에 정리한다. # 1) 작업물 임시 보관(수정 파일 + untracked 포함)git stash push -u -m "wip: ENTER_THE_NAME_OF_THE_WORK"# 2) main으로 이동 후 최신화git checkout maingit pull origin main# 3) 새 브랜치에서 이어가기.. -
260618_AI로 바꾼 제품 설계의 순서
260618_AI로 바꾼 제품 설계의 순서
2026.06.191. 내용 정리토스 고객센터 챗봇으로 들어온 사용자의 약 60%가 중간에 이탈했다. 원인은 구조 자체였다. 사용자는 자신의 문제는 알아도 서비스 카테고리 분류 방식은 알 수 없었기 때문이다. 그래서 카테고리 탐색 구조를 없애고 자연어로 말하면 AI가 의도를 파악해 필요한 행동으로 바로 연결해 주는 경험으로 바꾸기로 했다. 챗봇 설계에서 가장 복잡한 부분은 시나리오 작성이다. 하나의 문의에도 수십 개의 분기가 생기기 때문이다. 보통은 시나리오를 모두 완성한 뒤 프로토타입을 만드는데 이번에는 순서를 뒤집었다. AI로 시나리오 초안을 만들고 곧바로 프로토타입에서 검증하는 방식으로 진행했다. 1단계: 실제 상담 데이터로 시나리오 초안 만들기빈도 높은 상단 유형 20개를 추려 AI가 시나리오 초안을 만들도록 했다.. -
260616_AI, 고객 행동의 순서를 읽다: 카카오뱅크 시퀀스 기반 FDS 모델 개발기
260616_AI, 고객 행동의 순서를 읽다: 카카오뱅크 시퀀스 기반 FDS 모델 개발기
2026.06.161. 내용 정리기존 탐지 방식의 한계보이스피싱 수법이 소액 분할 거래, 채널 다양화, 가상자산 활용 등으로 진화하면서 특정 거래 시점(포인트)만 분석하는 기존 AI모델의 한계가 드러남. 또한 기존 모델은 특정 유형에 맞춰 변수를 가공해야 해 신종 사기에 선제 대응이 어려웠음.시퀀스 기반 접근 방식하인리히 법칙처럼 보이스피싱 피해 전에도 고객 행동에 이상 징후가 반드시 나타난다는 점에 착안해 개별 거래가 아닌 고객의 연속된 행동 전체(시퀀스)를 분석하는 방식으로 전환함.시퀀스를 이벤트 유형, 시간 정보, 금융 거래 관련 금액, 거래 맥락 텍스트의 네 가지 핵심 정보로 구성하고 feature engineering 없이 모델이 직접 패턴을 학습하도록 설계함. 출력은 ‘정상’, ‘사기, ‘피해’ 세 클래스로 분.. -
Ch 4. 코루틴: asyncio를 이해하는 핵심 열쇠
Ch 4. 코루틴: asyncio를 이해하는 핵심 열쇠
2026.05.27앞 챕터에서 asyncio가 단일 스레드에서 수만 개의 작업을 동시에 처리할 수 있다고 했습니다. 그 중심에는 코루틴(coroutine)이 있습니다. 코루틴을 이해하면 asyncio가 왜 그렇게 가볍고 안전한지 알 수 있습니다. 이 글은 시리즈의 마지막 챕터로 일반 함수와 코루틴이 콜 스택 수준에서 어떻게 다른지를 먼저 살펴봅니다. 이어서 await가 내부적으로 어떻게 동작하는지를 이벤트 루프와 함께 설명합니다. 마지막으로 스레드와 코루틴을 메모리, 전환 비용, race condition 측면에서 비교하며 마무리합니다. 1. 일반 함수 vs 코루틴OS 수업에서 배운 함수 호출 모델을 떠올려 보겠습니다. 함수는 호출되면 스택 프레임이 쌓이고 return과 함께 프레임이 소멸합니다. 이때 지역 변수도 함께 ..
지금까지 올라온 글들
-
새 브랜치 생성을 깜빡했을 때, 작업물 빠르게 옮기기
새 브랜치 생성을 깜빡했을 때, 작업물 빠르게 옮기기
2026.07.15작업을 하다 보면 (코아일체에 빠져서 신나게 작업하다가) 새 브랜치 생성을 깜빡한 채 기존 브랜치에서 그대로 작업을 진행해버리는 경우가 종종 있다. 이럴 때는 아래 순서대로 처리하면 된다. 작업 중인 변경 사항을 임시로 보관한다.main 브랜치로 이동해 최신 상태로 업데이트한다.새 브랜치를 생성한다.임시 보관해둔 작업물을 새 브랜치로 복원한다. 매번 이 과정을 검색해서 찾아보는 게 번거로워, 이번 기회에 정리한다. # 1) 작업물 임시 보관(수정 파일 + untracked 포함)git stash push -u -m "wip: ENTER_THE_NAME_OF_THE_WORK"# 2) main으로 이동 후 최신화git checkout maingit pull origin main# 3) 새 브랜치에서 이어가기.. -
260618_AI로 바꾼 제품 설계의 순서
260618_AI로 바꾼 제품 설계의 순서
2026.06.191. 내용 정리토스 고객센터 챗봇으로 들어온 사용자의 약 60%가 중간에 이탈했다. 원인은 구조 자체였다. 사용자는 자신의 문제는 알아도 서비스 카테고리 분류 방식은 알 수 없었기 때문이다. 그래서 카테고리 탐색 구조를 없애고 자연어로 말하면 AI가 의도를 파악해 필요한 행동으로 바로 연결해 주는 경험으로 바꾸기로 했다. 챗봇 설계에서 가장 복잡한 부분은 시나리오 작성이다. 하나의 문의에도 수십 개의 분기가 생기기 때문이다. 보통은 시나리오를 모두 완성한 뒤 프로토타입을 만드는데 이번에는 순서를 뒤집었다. AI로 시나리오 초안을 만들고 곧바로 프로토타입에서 검증하는 방식으로 진행했다. 1단계: 실제 상담 데이터로 시나리오 초안 만들기빈도 높은 상단 유형 20개를 추려 AI가 시나리오 초안을 만들도록 했다.. -
260616_AI, 고객 행동의 순서를 읽다: 카카오뱅크 시퀀스 기반 FDS 모델 개발기
260616_AI, 고객 행동의 순서를 읽다: 카카오뱅크 시퀀스 기반 FDS 모델 개발기
2026.06.161. 내용 정리기존 탐지 방식의 한계보이스피싱 수법이 소액 분할 거래, 채널 다양화, 가상자산 활용 등으로 진화하면서 특정 거래 시점(포인트)만 분석하는 기존 AI모델의 한계가 드러남. 또한 기존 모델은 특정 유형에 맞춰 변수를 가공해야 해 신종 사기에 선제 대응이 어려웠음.시퀀스 기반 접근 방식하인리히 법칙처럼 보이스피싱 피해 전에도 고객 행동에 이상 징후가 반드시 나타난다는 점에 착안해 개별 거래가 아닌 고객의 연속된 행동 전체(시퀀스)를 분석하는 방식으로 전환함.시퀀스를 이벤트 유형, 시간 정보, 금융 거래 관련 금액, 거래 맥락 텍스트의 네 가지 핵심 정보로 구성하고 feature engineering 없이 모델이 직접 패턴을 학습하도록 설계함. 출력은 ‘정상’, ‘사기, ‘피해’ 세 클래스로 분.. -
Ch 4. 코루틴: asyncio를 이해하는 핵심 열쇠
Ch 4. 코루틴: asyncio를 이해하는 핵심 열쇠
2026.05.27앞 챕터에서 asyncio가 단일 스레드에서 수만 개의 작업을 동시에 처리할 수 있다고 했습니다. 그 중심에는 코루틴(coroutine)이 있습니다. 코루틴을 이해하면 asyncio가 왜 그렇게 가볍고 안전한지 알 수 있습니다. 이 글은 시리즈의 마지막 챕터로 일반 함수와 코루틴이 콜 스택 수준에서 어떻게 다른지를 먼저 살펴봅니다. 이어서 await가 내부적으로 어떻게 동작하는지를 이벤트 루프와 함께 설명합니다. 마지막으로 스레드와 코루틴을 메모리, 전환 비용, race condition 측면에서 비교하며 마무리합니다. 1. 일반 함수 vs 코루틴OS 수업에서 배운 함수 호출 모델을 떠올려 보겠습니다. 함수는 호출되면 스택 프레임이 쌓이고 return과 함께 프레임이 소멸합니다. 이때 지역 변수도 함께 .. -
Ch 3. 동시성: 대기 시간을 낭비하지 않는 법
Ch 3. 동시성: 대기 시간을 낭비하지 않는 법
2026.05.27두 번째 챕터에서는 GIL을 프로세스 분리로 우회해 진짜 병렬 실행을 구현했습니다. 그런데 모든 작업이 높은 CPU 연산량을 요구하지는 않습니다. 네트워크 요청, 파일 읽기, DB 쿼리처럼 대기가 대부분인 작업에서는 병렬성보다 동시성이 더 적합합니다. 이번 챕터에서는 동시성과 병렬성이 어떻게 다른지부터 짚겠습니다. 이어서 멀티스레딩 구현 방식을 살펴보고 코루틴 기반의 asyncio와 비교합니다. 마지막으로 스케줄링 방식과 race condition 측면에서 둘을 정리하며 어떤 상황에서 무엇을 선택해야 하는지 안내합니다. 1. 동시성과 병렬성은 다르다두 개념은 자주 혼용되지만 엄밀히 다릅니다. 병렬성은 실제로 동시에 실행되지만, 동시성은 실제로 같은 순간에 실행되지 않아도 됩니다. 마치 요리사 한 명이 물.. -
Ch 2. 병렬성: GIL을 피해 진짜 동시 실행을 구현하는 법
Ch 2. 병렬성: GIL을 피해 진짜 동시 실행을 구현하는 법
2026.05.27앞선 챕터에서 GIL이 CPU 바운드 작업에서 멀티스레딩을 무력화한다는 것을 확인했습니다.그렇다면 Python에서 진짜 병렬 실행이 필요할 때는 어떻게 할까요? 답은 스레드가 아니라 프로세스에 있습니다. 이 글은 먼저 왜 멀티프로세싱이 GIL 문제의 해결책인지 살펴봅니다. 이어서 순차 실행과의 성능 비교를 통해 병렬화 효과를 직접 확인합니다. 그리고나서 Python에서 멀티프로세싱을 구현하는 세 가지 방법을 저수준에서 고수준 순서로 정리합니다. 마지막으로 병렬화가 항상 유리하지 않은 이유와 한계에 대해 짚습니다. 1. 왜 프로세스가 답인가스레드는 하나의 프로세스 안에서 GIL을 공유합니다. 반면 프로세스를 여러 개 띄우면 각자 독립된 Python 인터프리터 인스턴스를 가지고 GIL도 각자 따로 가집니다... -
Ch 1. GIL: 파이썬은 왜 멀티쓰레딩을 제한할까?
Ch 1. GIL: 파이썬은 왜 멀티쓰레딩을 제한할까?
2026.05.25"파이썬은 멀티쓰레딩을 지원하지 않는다." 저는 오랫동안 이렇게 생각했습니다. 하지만 Python이 병렬성과 동시성을 다루는 방식을 공부하면서 이 말이 절반은 맞고 절반은 틀렸다는 걸 알게 됐습니다. 그 과정에서 배운 내용을 "GIL부터 코루틴까지: Python이 병렬성과 동시성을 다루는 법" 시리즈로 정리합니다. 이 글은 그 첫번째 챕터로 GIL(Global Interpreter Lock)이 무엇인지, 그리고 왜 존재하는지를 살펴봅니다. 그리고 Python의 메모리 관리 방식인 참조 카운팅(reference counting)과 race condition을 통해 GIL이 단순한 설계 실수가 아님을 확인합니다. 마지막으로 Python 3.13에서의 변화도 간략히 짚습니다. 1. GIL이란 무엇인가GIL(G.. -
[Nginx] 최소한의 리다이렉트 설정 가이드
[Nginx] 최소한의 리다이렉트 설정 가이드
2026.05.24제 경험을 토대로 최소한의 nginx 리다이렉트 패턴을 정리합니다.이 글에서는 HTTPS > HTTPS 강제, www 제거까지만 다룹니다. 1. 왜 리다이렉트가 필요할까?웹 서비스의 도메인은 하나지만 사용자들은 여러 진입점들을 통해 들어올 수 있습니다.예를 들면 아래와 같이 말이죠.진입점의도한 도착지http://app.comhttps://app.comhttp://www.app.comhttps://www.app.com 이를 방치하면 검색엔진은 같은 페이지를 다른 URL로 중복 인식하고, 브라우저 캐시도 분산됩니다. nginx에서 3가지 server 블록만 설정하면 이 문제를 해결할 수 있습니다. 2. 최소한의 리다이렉트 패턴 첫 번째 블록은 HTTP(80)을 HTTPS로 강제합니다.server { l.. -
[Claude code] 이전 프롬프트를 수정하거나 코드 수정사항을 원복하고 싶으면 /rewind 기능을 활용해라
[Claude code] 이전 프롬프트를 수정하거나 코드 수정사항을 원복하고 싶으면 /rewind 기능을 활용해라
2026.05.14종종(사실 꽤 자주) 이전 프롬프트를 수정하거나 클로드가 작성한 코드를 원복해야 할 때가 있다. 그런 경우 터미널에서 Esc 키를 두 번 누르거나 /rewind 명령어를 입력하면 된다. -
일부 변경사항만 선택적으로 스테이징하고 싶을 때 git add -p 사용해라
일부 변경사항만 선택적으로 스테이징하고 싶을 때 git add -p 사용해라
2026.05.12git add -p를 입력하면 변경사항을 코드 블록(hunk) 단위로 화면에서 확인하며 선택적으로 스테이징할 수 있다. ?를 입력하면 사용 가능한 명령어 목록을 볼 수 있다. 테스트용 로그를 제외하고 실제 코드만 커밋하고 싶을 때 활용하면 좋다.