전체 글 94

HTTP 기반 백엔드에서 HTTPS 도메인 배포 구조로의 전환

1. 처음 상황초기에는 백엔드에서 Express 기반 API를 개발한 뒤, 해당 코드를 GitHub에 올리고 프론트엔드와 API를 공유하는 방식으로 개발을 진행하였다.일반적으로 백엔드 개발은 먼저 로컬 환경에서 시작된다. 이 주소는 개발자의 개인 컴퓨터 안에서만 접근 가능한 개발용 서버이다. 백엔드 개발자는 이 환경에서 API를 구현하고, Swagger 문서를 통해 API 명세를 확인하거나 Postman과 같은 도구로 요청을 테스트한다. 이후 API가 어느 정도 완성되면 백엔드 코드를 GitHub에 올리고, 프론트엔드 개발자에게 “API가 나왔다”고 공유하게 된다. 이때 프론트엔드 개발자는 백엔드에서 제공한 API 명세를 바탕으로 화면과 기능을 연결하기 시작한다. 초기에는 다음과 같은 방식으로 API가 ..

머신러닝의 수학적 기반에 대하여

1. 지도학습에서 우리가 진짜 하고 싶은 일 지도학습의 데이터는 이렇게 생겼습니다.$$S = \{(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)\}$$$x$는 입력, $y$는 정답입니다. 타이타닉 데이터로 예를 들어볼까요. $x_1$은 첫 번째 승객의 정보, 즉 (남성, 3등석, 22세, 형제 1명, 요금 7.25달러) 같은 벡터이고, $y_1$은 그 승객이 살아남았는지 여부(0 또는 1)입니다. 이런 쌍이 891개 있는 것이 타이타닉 훈련 데이터입니다. 우리가 하고 싶은 건 단순합니다. 새로운 $x$가 들어왔을 때, 예를 들어 test.csv에 있는 어떤 승객의 정보 (여성, 1등석, 35세, 혼자)가 들어왔을 때 이 사람이 생존했을지 안 했을지($y$)를 잘 맞추는 함수 $..

Machine Learning 2026.04.22

로지스틱 회귀 모델링 <예측>

[#8] 모델 학습 및 평가7편에서 전처리된 데이터가 준비됐습니다. 8편에서는 로지스틱 회귀 모델을 학습하고 성능을 평가합니다. 전처리 데이터 준비X_train_df = pd.read_csv(OUTPUT_DIR / "21_X_train_processed.csv")y_train = X_train_df["Survived"]X_train = X_train_df.drop(columns=["Survived"])Step 1. 로지스틱 회귀 모델 학습로지스틱 회귀는 이름에 "회귀"가 붙어 있지만, 실제로는 분류 모델이에요. 내부적으로 세 단계로 작동합니다. 1단계 — 선형 결합각 변수에 가중치를 곱해서 더합니다.$$ z = w_1 \cdot \text{Sex\_female} + w_2 \cdot \text{Pclas..

로지스틱 회귀 모델링 <전처리>

[#6] 최종 변수 선택 정책 확정3~5편에서 변수별 신호 강도와 다중공선성 이슈를 파악했습니다. 6편에서는 모델에 실제로 넣을 변수를 최종 확정합니다.변수 선택은 신중해야한다.지금까지 분석한 변수는 총 9개입니다. 그런데 이걸 전부 다 넣으면 안 됩니다. 이유는 두 가지입니다.첫째, 다중공선성 — 서로 같은 정보를 담은 변수를 둘 다 넣으면 모델이 혼란스러워집니다. Fare와 Pclass, FamilySize와 IsAlone이 대표적입니다.둘째, 노이즈 — 신호가 약한 변수를 억지로 넣으면 모델이 의미 없는 패턴까지 학습하려다 성능이 오히려 떨어집니다.따라서 "쓸 것"과 "버릴 것"을 명확히 가르고 근거를 남겨야 합니다.Step 1. 첫번째 제외 결정 — Fare vs Pclass4편에서 Fare의 생..

로지스틱 회귀 모델링 <가설>

[#3] 가설 검증 — 범주형 변수가 생존과 관련 있는가 1~2편에서 데이터의 상태를 파악했습니다. 3편부터는 "어떤 변수가 생존을 예측하는 데 쓸만한가?" 를 검증합니다.3편에서는 범주형 변수를 먼저 다룹니다.Sex (성별)Pclass (객실 등급) Embarked (탑승 항구)범주형 변수는 접근 방식이 비교적 직관적입니다. 각 카테고리별로 생존율을 집계하면, "이 그룹이 더 많이 살아남았는가"를 바로 비교할 수 있습니다. 수치형 변수(Age, Fare)는 구간 변환이 필요해서 4편에서 별도로 다룹니다. 왜 가설 검증을 하는가2편까지는 변수를 개별적으로 봤습니다. "Age는 이런 분포, Fare는 저런 분포" 처럼요.그런데 우리가 진짜 알고 싶은 건 이것입니다. "이 변수가 높으면/낮으면, 생존율이 ..

로지스틱 회귀 모델링 <진단>

Intro Logistic Regression으로 Titanic 생존 예측 모델을 만드는 과정을 단계별로 기록합니다. 이 시리즈의 목표머신러닝 과제를 받으면 보통 이런 흐름으로 코드를 짜기 쉽습니다.데이터 불러오기 → 결측 채우기 → 모델 돌리기 → 점수 확인돌아가긴 하지만, "왜 이 변수를 썼는지", "왜 이렇게 변환했는지" 를 설명하라고 하면 막막해집니다. 모델 성능이 안 나올 때 어디부터 손봐야 할지도 모르고요. 이 시리즈에서는 같은 Titanic 데이터를 다루되, 모든 결정에 근거를 남기는 방식으로 접근합니다. EDA(탐색적 데이터 분석)를 한 덩어리로 보지 않고, 의사결정의 단계로 쪼개서 진행할 겁니다. 핵심 설계 원칙: 진단 → 가설 → 처방병원에서 환자를 보는 순서를 떠올려보면 이해가 쉽습니..

도대체 머신러닝이 도대체 무엇인가?

1. 머신러닝이란 무엇인가머신러닝을 한 문장으로 정의하면 다음과 같다.데이터를 보고, 규칙을 스스로 찾게 하는 것. 전통적인 프로그래밍에서는 사람이 직접 규칙을 정의한다. 예를 들어 "집이 크면 가격이 비싸다", "종양이 크면 악성일 가능성이 높다"와 같은 규칙을 사람이 먼저 가정하고, 그 규칙을 코드로 옮긴다. 이 방식의 한계는 명확하다. 사람이 미리 알고 있는 규칙만 시스템에 반영할 수 있고, 그 규칙이 틀렸을 때 시스템 전체가 함께 틀린다. 머신러닝은 접근 방식이 반대다. 규칙을 직접 작성하는 대신, 데이터를 충분히 많이 제공하고, 그 안에서 규칙을 찾도록 맡긴다. 사람이 해야 할 일은 좋은 데이터를 모으고, 학습이 가능한 형태로 문제를 정의하는 것이다. 이 글에서는 머신러닝의 가장 기초적인 분..

Machine Learning 2026.04.16

API 통신 2.0: TanStack Query 학개론

0. TanStack Query의 대한 기본지식클래식한 API 통신은 클래식한 방식 (useEffect + useState을 활용하여 아래처럼 한다.const [data, setData] = useState(null);const [loading, setLoading] = useState(false);const [error, setError] = useState(null);useEffect(() => { setLoading(true); fetch('/api/users') .then(res => res.json()) .then(setData) .catch(setError) .finally(() => setLoading(false));}, []);어떤 문제상황이 발생할까?컴포넌트가 언..

AI를 슬기롭게 2026.04.12

가벼운 Express의 한계를 해결하는 Node.js 백엔드 아키텍처 설계

배경최근 급하게 스타트업 홈페이지 외주 제작 프로젝트를 총괄하게 되었습니다.프로젝트 특성상 복잡한 백엔드 시스템이 필요한 것은 아니었고, API의 개수도 많지 않을 것으로 예상되었습니다.따라서 빠르게 개발을 시작하기 위해 Node.js 기반의 Express를 사용하기로 결정했습니다. Express는 가볍고 유연한 프레임워크이기 때문에,초기 개발 속도를 확보해야 하는 상황에서 상당히 좋은 선택지였습니다.하지만 실제로 개발을 진행하면서 한 가지 문제가 생겼습니다.Express는 매우 자유로운 프레임워크이지만, 그만큼 프로젝트의 구조를 어떻게 설계할지에 대한 기준을 거의 제공하지 않습니다.처음에는 단순한 API 몇 개로 시작했지만, 기능이 조금씩 추가되면서 자연스럽게 다음과 같은 고민이 생기기 시작했습니다.C..

풀스택 환경에서 더욱 더 통일된 npm run 검증을 해야하는 이유

풀스택으로 프론트·백 둘 다 Node + TS 쓰다 보면 type-check, lint, build가 똑같이 있어서 “같이 돌리면 되겠지” 싶게 됩니다. 근데 이름만 같고 역할이 조금 다르고, 백엔드 쪽은 빌드 빼먹으면 500 터지는 일이 꽤 많습니다.저도 한 번 소스에서 테이블 지웠는데 npm run start만 켜서 500 나고, 보니까 예전에 빌드해둔 dist/가 돌아가고 있더라고요. 그때부터 “백엔드 start는 빌드 이후”만 따로 기억하고 있습니다.왜 프론트·백 둘 다 같은 검증을 쓰는 게 좋은지Node + TypeScript 쓰면 package.json에 type-check, lint, build가 프론트·백 둘 다 비슷하게 들어갑니다. 우연이 아니라 같은 언어, 같은 생태계라서 그렇습니다.T..

AI를 슬기롭게 2026.02.23