ML Systems Tracking & Versioning
모델 개발 과정에서는 수많은 아키텍처와 하이퍼파라미터 조합을 실험하게 됩니다. 겉보기에는 학습률을 0.003에서 0.002로 바꾸는 정도의 작은 차이처럼 보여도, 실제 성능은 크게 달라질 수 있습니다. 각 실험을 재현할 수 있을 만큼의 정보와 산출물(artifact)을 체계적으로 남기는 일이 중요합니다. 학습 과정의 상태를 관찰하고 비교하는 expe...
모델 개발 과정에서는 수많은 아키텍처와 하이퍼파라미터 조합을 실험하게 됩니다. 겉보기에는 학습률을 0.003에서 0.002로 바꾸는 정도의 작은 차이처럼 보여도, 실제 성능은 크게 달라질 수 있습니다. 각 실험을 재현할 수 있을 만큼의 정보와 산출물(artifact)을 체계적으로 남기는 일이 중요합니다. 학습 과정의 상태를 관찰하고 비교하는 expe...
모델 개발은 한 번에 끝나는 일이 아니라 반복적인(iterative) 과정입니다. 매 반복(iteration)마다 이전 실험 대비 성능이 개선되었는지 확인하고, 그 개선이 실제 프로덕션에 적합한 개선인지(비용/지연/해석가능성 등)를 함께 평가해야 합니다. 문제에 맞는 모델을 고르는 방법(모델 선택 팁) 모델 개발 과정에서 필요한 운영 요소(...
머신러닝 모델은 오프라인 평가에서 성능이 좋아도 프로덕션에서는 무용지물이 될 수 있습니다. 그 대표 원인 중 하나가 데이터 누수(Data Leakage)입니다. 데이터 누수는 정답(label)에 관한 정보가 어떤 형태로든 입력(feature)으로 새어 들어가 모델이 평가 과정에서 “부정확한 방식으로” 높은 성능을 내는 현상을 뜻합니다. 문제는 이 정보...
머신러닝 시스템에서 특징(feature)은 모델의 성능과 안정성을 좌우하는 핵심 요소입니다. 2014년에 발표된 Facebook의 논문 “Practical Lessons from Predicting Clicks on Ads at Facebook”에서는 올바른 특징을 갖추는 것이 모델 개발에서 가장 중요하다고 강조하였습니다. 아무리 최신 모델 아키텍처...
현업에서 다루는 데이터는 대개 균형 잡힌 분포가 아니라 쏠린 분포에 가깝습니다. 클래스 불균형이 왜 모델 학습을 어렵게 만드는지, 그리고 이를 완화하기 위해 평가 지표, 데이터 분포, 학습 알고리즘을 어떤 관점으로 조정해야 하는지 알아보겠습니다. Class Imbalance 개념과 범위 클래스 불균형(class imbalance)은 분류 문제에...
대부분의 머신러닝 시스템은 비지도 학습의 가능성에도 불구하고 여전히 감독학습에 의존하고 있으며, 이는 곧 라벨 데이터의 품질과 양이 모델 성능을 직접적으로 좌우함을 의미합니다. 실무 환경에서 라벨링은 더 이상 부수적인 작업이 아니라, 모델 개발과 운영을 지속하기 위한 핵심 기능으로 자리 잡았습니다. 라벨링 전략을 어떻게 설계하느냐에 따라 실험 속도...
머신러닝 시스템에서 학습 데이터를 다루는 일은 단순한 전처리 단계가 아니라, 모델이 어떤 세계를 보고 학습할 것인지를 결정하는 핵심 설계 요소입니다. 모델 구조나 손실 함수는 눈에 잘 띄지만, 실제 프로젝트에서는 데이터 수집·정제·샘플링 단계가 전체 성패를 좌우하는 경우가 많습니다. 현실의 데이터는 완성된 “데이터셋”이라기보다, 시간에 따라 분포가 ...
소프트웨어 디버깅은 오류가 발생했을 때 그 원인을 찾아 수정하는 활동입니다. 소프트웨어 변화 과정에서 디버깅은 가장 많은 시간과 비용이 소요되는 작업 중 하나입니다. 소프트웨어가 장기간 변화하는 현대 개발 환경에서는 디버깅을 개인의 숙련도에만 의존하기 어렵습니다. 이로 인해 자동화된 디버깅 기법이 중요한 연구 주제로 자리 잡았습니다. Softw...
소프트웨어는 코드만으로 구성되지 않습니다. 실행 가능한 프로그램과 이를 설명·보조하는 문서가 함께 소프트웨어를 이룹니다. 문서는 개발, 유지보수, 협업, 인수인계 전 과정에서 핵심적인 역할을 합니다. 애자일 개발에서는 과도한 문서를 지양하지만, 문서 자체를 불필요한 산출물로 보지는 않습니다. 핵심은 “얼마나 많이 쓰느냐”가 아니라 “필요한 정보를 ...
소프트웨어 검증은 구현된 소프트웨어가 주어진 명세를 정확히 따르는지를 확인하는 활동입니다. 검증의 핵심 질문은 “우리가 의도한 대로 만들었는가”입니다. 이는 사용자의 진짜 요구를 다루는 검증(validation)과 구분됩니다. 실제 개발에서는 명세 자체가 불완전한 경우가 많아, 검증과 검증 대상인 명세를 함께 개선하는 과정이 반복됩니다. Verifi...
대규모 소프트웨어 시스템에서 개발자는 이미 존재하는 코드를 반복해서 작성하는 경우가 많습니다. 이는 필요한 코드를 찾기 어렵거나, 기존 코드의 존재를 인지하지 못하기 때문입니다. Code Search와 Clone Detection은 이러한 문제를 해결하기 위한 대표적인 소프트웨어 공학 과제입니다. 두 작업 모두 “유사한 코드를 찾는다”는 공통점을 가지...
설계와 구현은 요구사항을 실제 동작하는 소프트웨어로 바꾸는 단계입니다. 이 단계의 핵심은 코드를 많이 작성하는 것이 아니라, 변경에 강하고 유지 가능한 구조를 선택하는 데 있습니다. 특히 아키텍처 수준의 설계 결정은 이후 구현 비용에 큰 영향을 미칩니다. Architectural Design 아키텍처 설계는 시스템의 전체 구조를 정의합니다. 구성 ...
소프트웨어 공학에서 요구사항은 시스템이 제공해야 하는 서비스와 지켜야 하는 제약을 의미합니다. 요구사항 공학은 고객이 원하는 서비스를 파악하고, 개발·운영 과정에서 발생하는 제약을 함께 식별하여 합의 가능한 명세로 정리하는 반복적 활동입니다. 계획 기반 개발에서는 요구사항을 초기에 상세히 고정하려는 경향이 있으나, 애자일에서는 과도한 상세 요구사항이 ...
소프트웨어 공학에서 개발 프로세스는 단순한 절차의 문제가 아니라, 불확실성과 변화에 어떻게 대응할 것인가에 대한 철학적 선택입니다. 전통적인 계획 중심 개발 방식은 명확한 요구사항과 안정적인 환경을 전제로 하지만, 실제 소프트웨어 개발 환경에서는 요구사항 변경, 기술적 리스크, 이해관계자의 변화가 빈번하게 발생합니다. 이러한 문제의식 속에서 Agile...
대규모 언어 모델은 수십억 개 이상의 파라미터를 가지며, 뛰어난 성능을 보이는 동시에 심각한 블랙박스 문제를 내포하고 있습니다. 언어 모델은 자연스럽고 설득력 있는 문장을 생성하지만, 왜 그러한 출력을 생성했는지에 대한 근거를 명확히 제시하지 않는 경우가 많습니다. 이로 인해 환각 현상, 편향된 판단, 위험한 추론 과정이 발생할 수 있으며, 이러한...
생성 모델은 데이터 분포를 학습하여 새로운 샘플을 생성하는 모델로, 최근 인공지능 연구와 응용 전반에서 핵심적인 역할을 수행하고 있습니다. 이러한 생성 모델은 단순히 데이터를 만들어내는 데 그치지 않고, 설명가능 인공지능 관점에서 두 가지 중요한 역할을 가집니다. 첫째, 생성 모델은 기존 설명 기법을 보완하는 설명자, Explainer로 활용될 수 ...
설명가능 인공지능에서 가장 근본적인 문제 중 하나는 설명 방법 자체가 아니라, 그 설명이 얼마나 신뢰할 수 있는지를 판단하는 기준입니다. 모델의 예측 성능은 정확도, 정밀도, 재현율과 같은 명확한 지표로 평가할 수 있지만, 설명의 품질은 직관적이고 주관적인 판단에 의존해 온 경우가 많습니다. 이로 인해 서로 다른 XAI 방법이 제안되더라도, 어떤 방법...
Global Explanation Methods는 개별 입력 하나의 예측 근거를 설명하는 Local Explanation과 달리, 모델 전체가 어떤 규칙과 패턴을 학습했는지를 설명하는 방법입니다. 이러한 방법은 모델의 평균적인 동작과 전반적인 의사결정 구조를 이해하는 데 목적이 있습니다. Global Explanation은 모델 디버깅, 편향 탐지, ...
Python은 표준 라이브러리를 통해 운영체제(OS)의 기능을 제어하거나, 날짜와 시간을 정밀하게 다루는 기능을 제공합니다. 본 문서는 Python Essentials 2 코스에서 다루는 Module 4의 내용을 바탕으로, 파일 시스템을 제어하는 os 모듈과 시간 및 날짜 데이터를 처리하는 datetime, time, calendar 모듈의 핵심 기능...
Python Essentials 2 (PE2) 과정의 핵심 모듈인 제너레이터와 이터레이터, 클로저, 그리고 파일 입출력(I/O) 시스템에 대해 다룹니다. Python의 강력한 기능인 yield 문법과 함수형 프로그래밍 요소인 람다와 클로저를 이해하고, 텍스트 및 바이너리 파일을 효율적으로 처리하는 방법을 코드를 통해 상세히 설명하겠습니다. 제너레이터...
딥러닝 기반 예측 모델은 높은 성능을 보이지만, 왜 그런 예측을 했는지 설명하기 어렵다는 한계를 가집니다. 설명가능 인공지능, 즉 XAI는 이러한 불투명성을 줄이고 모델의 예측 근거를 사람이 이해할 수 있는 형태로 제공하는 것을 목표로 합니다. 그중 Local Explanation Methods는 특정 입력 하나에 대한 개별 예측을 설명하는 방법에 ...
Python Essentials 2 과정의 핵심인 객체 지향 프로그래밍(OOP)을 기초부터 심화 응용까지 한 번에 정리했습니다. 기본 개념 설명 중간중간에 실제 시험 문제에 등장하는 까다로운 코드 예제들을 배치하여, 이론이 실제 코드에서 어떻게 동작하는지 깊이 있게 이해할 수 있도록 구성했습니다. 객체 지향 프로그래밍의 기초 절차적 접근 vs 객...
Python Essentials 2 과정의 두 번째 모듈인 문자열, 리스트 메서드 및 예외(Strings, string and list methods, and exceptions)의 내용을 체계적으로 정리한 학습 자료입니다. 프로그래밍에서 숫자가 아닌 데이터를 처리하는 능력은 필수적입니다. 이 모듈에서는 컴퓨터가 텍스트를 저장하고 처리하는 원리부터 시...
Python Essentials 2 과정의 첫 번째 모듈에서는 파이썬 프로그래밍의 확장성과 유지보수성을 결정짓는 모듈(Module), 패키지(Package), 그리고 패키지 관리 도구인 PIP에 대해 학습하였습니다. 코드가 길어지고 프로젝트의 규모가 커짐에 따라 모든 코드를 하나의 파일에 작성하는 것은 비효율적입니다. 코드를 기능별로 나누어 관리하...
Pretext Task의 등장 대규모 딥러닝 학습에는 막대한 양의 레이블링 된 데이터가 필요합니다. SSL은 레이블이 없는 데이터(Unlabeled data)로부터 스스로 문제를 정의하고 정답(Label)을 생성하여 학습하는 Pretext Task를 통해 이 문제를 해결하고자 합니다. 주요 Image Transformation 기반 Pretext T...
초기 단순 분류 문제에서 시작하여 픽셀 단위의 예측을 수행하는 Semantic Segmentation, 그리고 R-CNN 계열을 거쳐 실시간 탐지가 가능한 Faster R-CNN 및 Single-Stage Detector(YOLO, SSD)로 이어지는 기술적 흐름을 포함하고 있습니다. 정교한 마스크 생성을 위한 Mask R-CNN까지 포괄하고 있어 시...
RNN 기반 Seq2Seq 모델의 한계점과 이를 극복하기 위한 Attention 메커니즘의 발전 과정을 다룹니다. 기존 구조의 문제점(Bottleneck)을 짚은 뒤, 어텐션의 수식적 정의와 시각적 설명, 그리고 최종적으로 Transformer로 이어지는 개념적 연결을 정리합니다. RNN 기반 Seq2Seq의 기본 구조와 한계 인코더와 디코더의 구...
순환신경망(RNN)은 시퀀스 형태의 데이터를 처리하는 대표적인 구조이지만, 시간이 길어질수록 정보를 안정적으로 전달하기 어렵습니다. 특히 기울기 소실과 기울기 폭발 문제로 인해 장기 의존성을 학습하기 힘들다는 한계가 있습니다. 이러한 한계를 극복하기 위해 LSTM 구조가 제안되었으며, 정보가 여러 시점에 걸쳐 안정적으로 보존되도록 설계된 점에서 중요한...
파이썬(Python)은 간결한 문법과 높은 생산성 덕분에 많은 사람들이 사용하는 언어입니다. 하지만 대부분의 사용자들은 파이썬이 단일한 형태로 존재한다고 생각하며, 그 내부 구현 방식이나 다른 파이썬 구현체까지는 잘 알지 못합니다. 파이썬 언어의 이름이 뱀이 아니라 코미디 프로그램에서 유래했다는 사실도 자주 혼동됩니다. 본 문서에서는 파이썬의 이름...
시각 인공지능(Visual Artificial Intelligence) 강의 중 순환 신경망(RNN, Recurrent Neural Networks)에 대한 핵심 내용을 다루고 있습니다. 기존의 ‘Vanilla’ 신경망이 고정된 크기의 입력과 출력을 처리하는 데 그쳤다면, RNN은 가변적인 길이를 가진 시퀀스(Sequence) 데이터를 처리하는 데 특...
시각적 인공지능(Visual AI)을 위한 신경망 학습 과정에서 고려해야 할 활성화 함수, 초기화, 정규화, 하이퍼파라미터 튜닝 및 전이 학습에 대한 상세 내용을 다룹니다. 활성화 함수 (Activation Functions) 뉴런의 활성화 여부를 결정하는 비선형 함수들의 특징과 문제점, 그리고 권장 사항입니다. Sigmoid 수식: \(\...
컴퓨터 비전 분야의 발전, 특히 ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 우승 모델들을 중심으로 CNN 아키텍처의 발전 과정을 다룹니다. 초기 LeNet-5부터 시작하여 네트워크가 점차 깊어지고(Deeper), 효율적으로(Efficient) 변화하는 과정을 확인할 수 있습니다. 주요 아...
컴퓨터 비전 분야에서 핵심적인 역할을 하는 Convolutional Neural Networks, 즉 CNN에 대한 강의 자료를 정리한 것입니다. 일반적인 신경망(Neural Networks)의 한계를 짚어보고, 이미지를 처리하기 위해 특화된 CNN의 아키텍처 구조, 주요 레이어의 기능, 파라미터 설정 방법, 그리고 대표적인 CNN 모델들의 발전 과정...
앞선 정리에서는 데이터 소스, 포맷, 모델을 중심으로 “데이터가 어떤 형태로 저장되는가(파일/스키마/피처 표현)”를 봤습니다. 이번 글은 한 단계 더 내려가서, 데이터가 어떤 저장 엔진에 놓이고 어떤 처리 엔진을 거쳐 어떤 파이프라인(ETL/ELT)로 흘러가며 그 결과가 ML 시스템 품질/비용/운영 안정성에 어떻게 연결되는지 즉, 데이터가...
역전파(Backpropagation)의 개념, 왜 계산하는지, 그리고 손실 함수를 줄이는 방향으로의 파라미터 업데이트 규칙을 정리했습니다. 역전파는 연쇄법칙을 반복 적용하여 최종 스칼라 손실 \(L\)의 기울기를 입력과 매개변수에 대해 계산하는 방법입니다. 신경망 학습에서 \(L\)을 가중치 \((W, b)\)에 대해 미분하여 경사하강법으로 업데이트...
ML은 빅데이터의 성장과 맞물려 있습니다. 대규모 데이터 시스템은 복잡하며 표준과 도구가 빠르게 변합니다. 이 글은 데이터 소스 → 데이터 포맷/저장 방식 → 데이터 모델(관계형·NoSQL) 순서로 기초를 정리하여, 실무에서 흔히 마주치는 선택지를 이해하도록 돕습니다. 프로세스 간 데이터 전달 방식과 배치/스트림 처리의 구분은 후속 글에서 다룹니다. ...
이 문서는 MacOS 환경에서 Apache Airflow를 설치하고, 기본 프로세스 실행 방식과 이메일 알림(SMTP) 설정 과정을 정리한 문서입니다. 특히 Airflow 3.x 버전 기준으로 api-server, scheduler, dag-processor 3가지 프로세스를 실행해야 하는 이유와, DAG 실패 시 이메일 알림이 오도록 설정하는 과정을...
Linear Classification은 입력 데이터와 weight의 곱으로 점수를 계산하는 방식입니다. 공식은 s = Wx 입니다. 예를 들어 CIFAR-10 이미지 분류 문제에서는 입력 x 가 [3072 × 1] 크기의 벡터이고, weight W 는 [10 × 3072] 크기를 가지며, 출력 s 는 10개의 class score로 나타납니다. ...
Apache Airflow는 코드(Python)로 워크플로우를 정의하고 스케줄, 실행, 모니터링하는 오케스트레이션 플랫폼입니다. 데이터 파이프라인, 모델 학습 배치, ETL/ELT, 주기적 백오피스 작업 등에 적합합니다. Airflow는 작업 간 의존성(Dependency) 을 명시하고, 재시도/에러 처리/알림/로그를 표준화하며, UI 기반 모니터링...
이 문서는 《Designing Machine Learning Systems》 책의 내용을 요약한 것입니다. 당신은 밀레니얼 세대를 타깃으로 하는 은행의 ML 엔지니어링 기술 리드라고 상상해봅니다. 어느 날, 상사가 경쟁 은행이 ML을 이용해 고객 서비스 지원을 두 배 빠르게 처리한다는 소식을 듣습니다. 그는 당신의 팀에게도 ML을 이용해 고객 서비...
머신러닝 시스템은 단순히 모델만을 개발하는 것이 아니라, 비즈니스 목표, 데이터, 인프라, 배포, 모니터링 등 다양한 요소가 유기적으로 결합되어야 합니다. 머신러닝 시스템 설계의 핵심 요소와 요구사항, 그리고 반복적 개발 프로세스를 정리했습니다. 1. 비즈니스와 ML 목표 머신러닝 시스템을 개발하기 전에 가장 먼저 고려해야 할 것은 왜 이 시...
오늘 수업에서는 이미지 분류(Image Classification) 문제를 예시로 하여, 모델 학습에서 중요한 세 가지 핵심 요소를 다루었습니다. Score Function 입력된 이미지 픽셀을 클래스 점수로 변환합니다. 예시: 선형 함수 \(f(x_i, W) = W x_i\) Loss Func...
이미지 분류(Image Classification)는 컴퓨터 비전의 핵심 과제 중 하나입니다. 단순히 이미지를 보고 무엇인지 맞히는 것처럼 보이지만, 컴퓨터 입장에서는 수십만 개의 픽셀 숫자를 해석해야 합니다. 기본적인 이미지 분류 개념과 kNN → 5-NN 확장 선형 분류기(Linear Classifier)와 Bias Trick, 전처리...
행렬을 벡터에 곱하면 보통 방향이 바뀝니다. 하지만 특별한 벡터들은 방향이 그대로 유지되면서, 길이만 일정 비율로 변합니다. 이 벡터를 고유벡터(eigenvector), 그 비율을 고유값(eigenvalue) 라고 합니다. 1. 기본 정의 [Ax = \lambda x] \(A\): \(n \times n\) 정방행렬 \(x\): ei...
출처: 사이토 고키, 『밑바닥부터 시작하는 딥러닝』 (2017) 본 문서는 4장: 신경망 학습의 내용을 정리한 것입니다. 딥러닝 모델을 사용하려면 반드시 학습 과정을 거쳐야 합니다. 학습이란 훈련 데이터로부터 가중치와 편향 같은 매개변수의 최적값을 자동으로 찾아내는 과정을 의미합니다. 이때 모델이 올바르게 학습하도록 이끌어주는 것이 바로 손실 함수...
운영체제 정리 (정보처리기사) 1. 운영체제의 개요 운영체제(OS, Operating System) 하드웨어 자원을 효율적으로 관리하고 사용자가 컴퓨터를 편리하게 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어. 응용 프로그램과 하드웨어 사이에서 인터페이스와 자원 관리자 역할 수행. 목표 (성능평가 기준) ...
Gilbert Strang의 선형대수학 11강 강의 내용을 바탕으로, 정리한 글입니다. 행렬 공간의 개념을 확장하고, 부분 공간의 차원 계산, 랭크 1 행렬의 의미, 그리고 스몰 월드 그래프를 다룹니다. Matrix as a Vector Space 📐 행렬(matrix)도 벡터(vector)가 될 수 있다는 아이디어에서 시작합니다. 벡터 공...
이 책 (Designing Machine Learning Systems) 을 요약 정리한 내용입니다. 2016년 11월, 구글은 자사의 다국어 신경망 기계번역 시스템을 Google Translate에 적용했다고 발표했는데, 이는 대규모 실제 서비스 환경에서 딥러닝 인공신경망이 성공적으로 활용된 최초의 사례 중 하나였습니다. 구글에 따르면, 이 업데...
ICD-Coding 프로젝트를 쿠버네티스 환경에서 실행하기 위한 Deployment, Service, Job manifest 예시와 설정 방법을 정리하였습니다. 1. Deployment GPU 자원을 활용하여 SSH 접속 가능한 컨테이너를 띄우기 위한 설정입니다. apiVersion: apps/v1 kind: Deployment metadat...
GPU 기반 딥러닝 프로젝트를 위해서는 CUDA, cuDNN, PyTorch GPU wheel, 그리고 프로젝트 환경을 손쉽게 관리할 수 있는 Conda가 필요합니다. 아래에서는 NVIDIA 공식 CUDA 런타임 이미지를 베이스로, Conda 환경을 만들고 GPU용 PyTorch를 설치한 뒤 Harbor 레지스트리에 푸시하여 리눅스 GPU 서버에서 실...
Python에서는 동시성(concurrency)과 병렬성(parallelism)이 필수입니다. 데이터 처리량이 커지고, 네트워크나 파일 입출력(I/O)을 동반한 작업이 많아지면서 순차 실행만으로는 프로그램의 응답성과 처리 속도에 한계가 있습니다. 본 글에서는 반복 가능한 객체를 만드는 제너레이터와 코루틴, concurrent.futures (Thr...
파이썬에서는 함수가 일급 객체입니다. 함수를 변수에 담고, 다른 함수에 전달하며, 실행 결과로 반환할 수 있습니다. 이러한 특징은 higher‑order function, closure 개념으로 이어집니다. 함수는 일급 객체다 특징 설명 예제 코드 스니펫 ...
HTTP는 성능 병목을 해결하기 위해 노력해왔습니다. 주요 문제 중 하나는 HOL(Head‑of‑Line) Blocking이며, HTTP/3는 QUIC 위에서 이 문제를 완화하는 것을 목표로 설계되었습니다. 본 문서는 HOL blocking의 개념을 정리하고, HTTP/1.1→HTTP/2→HTTP/3로 이어지는 해결 전략과 HTTP/3만의 고...
객체지향이 필요한 이유는 데이터(상태)와 행동(기능)을 하나로 묶어, 코드의 재사용성과 유지보수성을 높이기 위해서입니다. 이 과정에서 다음 개념들이 등장합니다: 클래스 변수 / 인스턴스 변수 — 모든 객체가 공유하는 값과, 각 객체가 개별로 가지는 값을 구분합니다. 인스턴스 메서드 / 클래스 메서드 / 정적 메서드 — 객체의 상태를 다루는...
현대 애플리케이션은 다중 서비스(예: Flask + Elasticsearch)로 구성되는 경우가 많습니다. 각 서비스를 배포하고 실행하려면 다음 세 가지가 필수입니다. 도구 핵심 역할 얻는 이점 Dockerfile 애플리케이션과 모든 의존성을 이미지 로...
Python에서 Descriptor는 ‘속성(attribute) 접근을 가로채서 원하는 로직을 실행’하도록 해 주는 저수준(low-level) 메커니즘입니다. 다음과 같은 상황이라면 property 만으로는 반복‧재사용이 불편하거나 기능이 부족합니다. 여러 클래스에서 동일한 속성 로직을 재사용하고 싶을 때 ORM, 캐싱, 로깅 (DB 조회,...
메타클래스(Metaclass) 개념을 정리했습니다. type, __new__, __init__, __call__의 실행 순서와 역할을 정리했습니다. 1. 메타클래스란? 구분 정의 클래스(Class) 객체(인스턴스)를 찍어내는 설계도 ...
Python 객체지향(OOP) 개념을 정리하였습니다. @property, *args, **kwargs, 메서드 오버로딩, 다중 디스패치, 상속 구조 등 자주 쓰이는 핵심 내용을 간단한 설명과 예제 중심으로 담았습니다. 1. @property vs Getter/Setter 캡슐화 목적은 동일하지만, Python에서는 메서드를 속성처럼 노출해 사용...
Python 문법인 데코레이터(Decorator), 제너레이터(Generator), 그리고 with 문에서 사용하는 컨텍스트 매니저(Context Manager) 개념을 정리합니다. Python에서는 리소스를 열고 사용하는 과정을 안전하게 처리하기 위해 with 문을 사용합니다. 이 흐름을 효과적으로 구성하기 위해 yield, enter, exit ...
Docker는 프로그램을 어떤 컴퓨터에서도 에러 없이 설치하고 실행할 수 있도록 돕는 도구입니다. 복잡한 설치 과정이나 운영체제, 버전 차이로 인한 문제를 해결합니다. 설치를 간편하게 하고, 항상 일관된 환경을 제공합니다. 또한 프로그램 간 충돌 없이 독립적으로 실행할 수 있도록 합니다. Docker란? 위키피디아는 Docker를 다음과 같이 정의...
자바 프로그램 개발 시 예외 상황을 올바르게 관리해야 합니다. 본 글에서는 자바의 예외 계층 구조, 체크 예외와 언체크 예외의 차이, 공통 예외 처리 방법에 대해 알아보겠습니다. 자바 예외 계층 구조 자바에서 예외는 객체로 다루어집니다. Throwable을 최상위로 하여 Error와 Exception 두 가지로 분류됩니다. graph TB ...
소프트웨어를 개발하다 보면 상태(state) 나 카테고리(category) 를 문자열(String)로 표현하는 경우가 흔합니다. 예를 들어 회원 등급을 “BASIC”, “GOLD”, “DIAMOND” 같은 문자열로 다루는 경우를 말합니다. 이 방식은 오타나 잘못된 입력을 컴파일 단계에서 걸러낼 수 없다는 단점이 있습니다 본 글에서는 문자열 기반 ...
인터넷이 대중화되고 웹 애플리케이션이 복잡해짐에 따라, 더 빠르고 효율적인 통신 프로토콜에 대한 수요가 늘어났습니다. 전통적으로 사용되던 HTTP/1.1 프로토콜은 단순성과 호환성이 뛰어났지만, 오늘날과 같은 방대한 데이터를 처리하는 데 한계를 보였습니다. 이러한 문제점을 해결하기 위해 등장한 것이 HTTP/2입니다. 특히 HTTP/1.1에서 발생하던...
컴퓨터 구조는 크게 ISA(Instruction Set Architecture)와 Machine Organization으로 구분하여 살펴볼 수 있습니다. ISA는 컴퓨터가 이해하고 실행할 수 있는 명령어와 데이터를 어떻게 정의하고 처리하는지 다루며, Machine Organization은 이를 실제로 구현하는 하드웨어적 구성 요소와 동작 방식을 다룹니...
소프트웨어 설계에서 역할과 구현을 분리하는 것은 매우 중요합니다. 이 둘을 분리하면, 구현체를 손쉽게 교체할 수 있고 기존 코드를 최소한으로만 수정할 수 있기 때문입니다. 이러한 설계 원칙을 OCP(Open-Closed Principle)라고 부릅니다. Open for extension(확장에는 열려 있음), Closed for modific...
그래프는 노드(정점)와 간선으로 구성된 자료구조로, 다양한 실세계 상황을 모델링하는 데 사용됩니다. 소셜 네트워크, 도로 체계, 컴퓨터 네트워크 등 많은 시스템이 그래프로 표현될 수 있습니다. 그래프 탐색 알고리즘은 이러한 구조를 체계적으로 순회하고 분석하는 방법을 제공합니다. 그래프 표현 방식은 크게 인접 행렬(Adjacency Matrix)과...
Hypertext Transfer Protocol(HTTP)는 클라이언트와 서버 간의 통신 규칙, 프로토콜입니다. 웹 애플리케이션이 발전함에 따라 초기 HTTP 버전의 한계가 나타났습니다. 이는 네트워크 리소스의 비효율적인 사용과 Head-of-Line(HOL) 블로킹 문제입니다. HTTP HOL Blocking Head-of-Line 블로킹에서...
SQL에서 데이터를 다룰 때, 단순한 그룹화와 집계 함수만으로 원하는 결과를 얻기 어려운 경우가 많습니다. 특정 범위 내에서 순위를 매기거나 누적 합을 계산하는 등 보다 정교한 분석이 필요할 때 윈도우 함수(Window Functions)를 사용합니다. 윈도우 함수는 기존의 집계 함수와 달리, GROUP BY 없이도 개별 행을 유지한 상태에서 추가...
JPA (Java Persistent API)는 자바 객체와 관계형 데이터베이스 간의 매핑을 도와줍니다. 이를 통해 SQL 문을 작성하지 않고 객체를 다루는 것처럼 데이터를 관리할 수 있습니다. API 설계 과정에서 엔티티를 직접 사용하는 것은 지양해야 합니다. 엔티티를 API 요청/응답에 그대로 활용하면 다음과 같은 문제가 발생합니다. A...
이번 글에서는 Spring MVC의 컨트롤러 기본 기능을 정리해보겠습니다. 기본 기능으로는 요청을 컨트롤러에 매핑하는 기능과 데이터를 주고받는 기능이 있습니다. 아를 위해 @RequestMapping을 비롯한 다양한 매핑 어노테이션과 요청 데이터를 처리하는 방법을 중심으로 살펴보겠습니다. @RequestMapping @RequestMappi...
FrontController pattern Background 웹 애플리케이션에서 사용자의 요청을 처리하는 기본적인 방식은 서블릿(Servlet)을 활용하는 것입니다. 만약 우리가 사용자 요청을 처리하기 위해 각 기능별로 서블릿을 만든다면 어떻게 될까요? 다음과 같은 3가지 요청을 처리하는 애플리케이션을 만들려고 합니다. /users →...
Servlet은 Java 기반의 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 Server-side components입니다. 다음은 chatgpt 웹사이트 request 요청입니다. POST /v1/chat/completions HTTP/1.1 Host: https://chatgpt.com Authorization: Bearer ...
Spring이란 Java 기반 오픈소스 웹 Framework입니다. Framework는 Library와 달리 IoC(Inversion of Control)를 통해 코드 변경을 최소화해주고, 다양한 상황에 맞도록 코드 구성을 도와줍니다. Spring을 통해 개발자는 비지니스 로직에 집중하여 효율적으로 개발할 수 있습니다. Spring Framework...