분류 전체보기 191

[Modeling] 식별자를 정의할 때 주의하는 경우 (인조식별자)

엔티티를 설계할 때 명확한 본질식별자가 있음에도 불구하고 본능적으로 인조식별자를 PK로 사용해 왔다. 인조식별자를 정의하는 경우는 이론적으로 알고 있었지만 식별자가 한개일 때도 불구하고 인조식별자를 택했기 때문에 올바른 설계법이 궁금했다. 그래서 이번에는 인조식별자를 쓰더라도 추가로 보완해야 할 점에 대해 정리하고자 한다.1. 식별자 개념원래 존재하는 속성이냐에 따라 본질식별자 / 인조식별자로 구분대표성 여부에 따라 주 식별자 / 대체(보조)식별자로 구분엔티티에 원래 존재하는 속성인 사원번호, 주민등록번호 / 업무처리나 이벤트 성격의 데이터의 경우 회원 ID, 계좌번호처럼 ID나 일련번호 등을 부여하여 식별하는 경우 모두 본질식별자를 활용하는 예시다. 2. 인조식별자를 정의하는 경우엔티티를 통합할 때 통..

DB 2025.10.02

[ML] 3장. 결정 트리와 k-최근접 이웃

로지스틱 회귀서포트 벡터 머신결정 트리와 k-최근접 이웃 -- 이 글에서 다룰 내용0. 결정 트리결정 트리는 설명하기 쉽고 이해하기 쉬워 인기가 많은 모델이다. 데이터로부터 일련의 질문을 학습하는 모델인데 마치 스무 고개라고 생각할 수 있다. 결정 트리 역시 트리이기 때문에 가장 상단의 질문, 즉 노드는 루트 노드가 되며 아래로 뻗친 노드는 자식 노드가 된다. 자식 노드에서 반대로 위로 뻗으면 부모 노드가 된다. 그리고 자식 노드 없는 노드는 리프 노드가 되는데 여기서는 5개가 있다. 결정 트리는 이 리프 노드에 순수하게 한 종류의 클래스만 남도록 분류를 하는 것이 좋다. 순수노드가 될 때까지 질문을 하는 것을 다른 말로 정보 이득을 최대화한다고 표현한다. 이 트리에서는 날씨 질문에 대해 세 가지의 선택..

AI 2025.10.02

[ML] 3장. 서포트 벡터 머신(SVM)

로지스틱 회귀서포트 벡터 머신 -- 이 글에서 다룰 내용결정 트리, k-최근접 이웃SVM의 최적화 대상은 샘플의 클래스를 나누는 결정 경계와 샘플 간 거리를 최대로 하는 것이다. 즉 마진을 최대화하는 것이다.클래스를 구분하는 결정 경계(초평면)와 가장 가까운 훈련 샘플은 서포트 벡터라고 하며, 마진 안에 어떤 샘플도 없게 하는 마진을 하드 마진 그리고 1-2개 정도의 샘플은 허용하는 마진을 소프트 마진이라고 한다. 클래스는 w^T * x 의 선형계산으로 분류하는데 양성 쪽 초평면은 1, 음성 쪽 초평면은 -1로 두고 계산한다. 따라서 아래와 같이 도출된 식을 정리하면 양성 샘플과 음성 샘플 사이의 거리를 최대화하는 공식이 나온다. 우변을 최대화해야 마진이 최대화되기 때문에 분모의 노름 부분을 최소화하면..

AI 2025.10.01

[ML] 3장. 퍼셉트론 훈련과 로지스틱 회귀

로지스틱 회귀 -- 이 글에서 다룰 내용서포트 벡터 머신결정 트리와 k-최근접 이웃0. 퍼셉트론 훈련train_test_split()을 이용하여 X와 y 배열을 랜덤하게 나눈다. 훈련 데이터와 테스트 데이터 샘플은 0.3, 즉 70:30 비율로 지정했는데 기본값은 0.25라고 한다. stratify=y는 타깃 값인 y를 적어 입력 데이터셋의 훈련 데이터셋과 테스트 데이터셋의 클래스 레이블 비율을 동일하게 만든다는 의미다. from sklearn.model_selection import train_test_spliteX_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=1, stratify=y) 그리고 이..

AI 2025.09.25

[Modeling] 한 테이블에서 모두 관리 vs 식별자 상속으로 테이블 분리

편지를 주제로 하는 프로젝트를 하고 있는데 ERD를 그리면서 한 가지 궁금증이 생겼다. 편지 당 [공감해요,슬퍼요,힘내요,응원해요]와 같이 감정 이모티콘을 나타낼 수 있도록 엔티티를 설계하고 있는데, 이 감정들을 하나의 엔티티로 분류해서 식별자 상속을 하면 그룹화를 할 수 있으니 더 깔끔하지 않을까 궁금했다. 그래서 이들의 장단점을 비교해 보고자 한다.1. 한 테이블에 표시데이터를 조회할 때 조인을 하지 않고 하나의 테이블에서 조회할 수 있어 쿼리가 단순하다편지 관련 모든 정보가 한곳에서 관리되어 이해하기 쉽다새로운 감정 속성이 추가될 때마다 새로운 컬럼을 추가해야 한다2. 식별자 상속으로 테이블 분리감정 유형들을 네 개로 고정적으로 정해 놓았기 때문에 새로운 감정 추가에 유리한 구조가 아님을 유의한다...

DB 2025.09.19

부트캠프 최종 회고

부트캠프에 대한 마침표를 이제서야 찍으려고 한다. 대학 졸업을 하기도 전에 무언가에 쫓기듯 동계방학 인턴까지 포기해 가면서 부트캠프에 지원했다. 복전이었던 컴공이 내겐 주전공 이상의 의미가 있었고 실제로 가장 자신있던 영어를 서브로 두며 컴퓨터 공부에 더 많은 시간을 보내려고 애썼다. 컴공 친구도 동기도 없었던 터라 어떻게 공부를 해야 하는지를 맨땅헤딩 정신으로 교수님들 수업으로 배웠다. 문과로 지냈기 때문에 직관적이고 논리적인 공부가 흥미로웠고 제 분야에 열정과 전문성을 갖춘 교수님들을 보고 존경심이 많이 생겼다. 2학년 첫 전공수업부터 4학년 막학기 전공수업까지 들인 노력은 처음부터 끝까지 비슷하다고 느끼는데 시간과 이해력이 쌓이면서 성적도 점점 좋아졌다. 잘하고 싶다는 마음으로 시작해 공부를 해 ..

[AI] Google AI Essentials: Coursera Training 회고

나는 AI 사용에 대해 막 호의적인 사람은 아니었다. 정확히 말하면 일상적으로 많이 사용해 왔긴 하지만 프로젝트 때 의견차가 발생하면서 깨닫게 되었다. 최근 프로젝트에서 각자 AI 기능을 맡아 모르는 건 gpt한테 물어보면서 개발하자는 말에 걱정과 불편한 내색을 비추었다. 그랬던 이유는 AI 프로젝트를 한 번도 해본 적이 없고 아는 것도 없는데 방향성도 모르는 내가 과연 혼자서 할 수 있을까에 대한 우려였다. 잘 몰라도 AI가 다 알려주고 구글링을 해 보나, gpt한테 물어보나 어차피 복붙하는 건 같지 않냐는 냉정한 말들 중 ‘복붙’이란 단어에 꽂혀 바로 방어기제와(?), 나는 그런 사람이 아니라는 오만한 감정이 들었다. 할루시네이션을 겪거나 알려준 정보대로 진행하다 이 방법이 내게 맞지 않다는 것을 많..

AI 2025.07.16

[Project] 데이터베이스 연결 드라이버 선택

상황챗봇 코드를 비동기로 바꾸고 있는데 MySQL DB와 연결하는 pymysql 드라이버가 동기식이다.따라서 pymysql을 대체할 MySQL 비동기식 드라이버를 찾아야 한다.그래도 성능이 좋은 걸 택하고 싶다.설명DB 드라이버(DB 어댑터)는 다음과 같은 역할을 한다.python에 connect(): Application과 Database를 연결connection에 대한 pool 관리DB 풀에서 사용 가능한 데이터베이스 연결 하나를 빌려온다. 연결을 빌려온 후 작업을 마치고 반드시 연결을 풀에 반환한다. 연결을 빌려왔다면 그 연결을 통해 실제로 SQL 쿼리를 실행하고 이를 cursor()를 통해 수행한다. 즉 DB 연결 위에서 SQL 쿼리를 실행하고 그 결과를 받아오는 역할을 한다. async/awai..

[Project] onErrorResume 타임 아웃 예외 처리

상황파이썬 응답이 늦어질 경우 AsyncRequestTimeoutException이 발생하는데 서비스 단의 onErrorResume에서 처리되지 않고 전역 예외 처리기에서 처리된다.나는 WebClientRequestException과 마찬가지로 onErrorResume에서 처리하고 싶었다.파이썬에서 서버 로딩 시 DB 연결 예외가 발생하면 서버가 다운되면서 스프링에서는 WebClientRequestException이 발생한다. 이 경우는 마찬가지로 onErrorResume에서 예외 처리를 성공적으로 해 주었다. 설명1. 타임 아웃을 설정해야 하는 이유리소스 관리 및 보호서비스 거부 (DoS) 공격 방지에도 도움이 된다사용자 경험 개선장애 전파 방지하나의 느리거나 장애가 있는 외부 서비스로 전체 애플리케이..

[Project] 챗봇 파이썬 응답 흐름, 예외처리 정리

LifeSpan@app.on_event("startup") 지, deprecatedlifespan 방식과 이벤트 핸들러 방식은 함께 사용할 수 없어서 둘 중 하나만 사용해야 한다. 이벤트 핸들러는 등록된 순서대로 실행@app.on_event("startup")@app.on_event("shutdown")- 애플리케이션당 한 번만 정의 가능@asynccontextmanagerasync def lifespan(app: FastAPI): # 애플리케이션 시작 전 yield # 애플리케이션 종료 전 app = FastAPI(lifespan=lifespan) 애플리케이션 개발할 때 시작과 종료 작업이 서로 연결되는 경우 많음전역 변수 하나의 컨텍스트에서 같이 사용효율적인 리소스 관리yield..