2. Text는 어떻게 Vector가 될까? — Tokenization & Embedding 지난 글에서는 LLM이 언어를 계산하기 위해 사용하는 Vector , Matrix , Tensor 와 그 위에서 이루어지는 Dot Product , Cosine Similarity , Softmax 를 살펴봤다. 그런데 한 가지 중요한 질문이 남아 있다. 우리가 LLM에게 입력하는 것은 Vector가 아니다. "오늘 저녁 메뉴를 추천해줘." 우리가 입력하는 것은 Text 다. 반면 Transformer가 실제로 계산하는 것은 숫자로 이루어진 Tensor 다. 그렇다면 이 사이에서는 무슨 일이 일어날까? Raw Text ↓ Tokenizer ↓ Tokens ↓ Token IDs ↓ Embedding ↓ Token Vectors ↓ Position Information ↓ Input Representations ↓ Transformer 이번 글에서는 이 변환 과정을 따라가 본다. 단순히 Tokenization = 문장을 나누는 것 Embedding = Vector로 바꾸는 것 정도로 끝내는 것이 아니라, 왜 Text를 Token으로 나눠야 하는지, Token은 어떤 기준으로 만들어지는지, Token ID는 왜 필요한지, ID가 어떻게 Vector와 연결되는지, 그 Vector는 어떻게 학습되는지, 그리고 최종적으로 어떤 형태의 Tensor가 Transformer에 입력되는지 까지 살펴본다. 2.0 Text를 어떻게 계산 가능한 형태로 바꿀까? 지난 글에서 다음과 같은 Vector를 사용했다. [0.18, -0.42, 0.71, 0.09, ...] Vector라면 덧셈도 할 수 있고, Dot Product도 계산할 수 있다. 하지만 다음 문장은 그렇지 않다. "나는 오늘 학교에 갔다." 컴퓨터가 이 Text 자체에 바로 Matrix Multiplication을 수행할 수는 없다. 따라서 언어를 계산 가능한 숫자 표현 으로 변환해야 한다. 가장 먼저 떠올릴 수 있는 방법은 각 표현에 번호를 붙이는 것이다. 나는 → 3201 오늘 → 745 학교 → 2987 갔다 → 5021 하지만 여기서 3201 은 "나는" 의 의미를 나타내는 값이 아니다. 5021 > 745 라고 해서 "갔다" 가 "오늘" 보다 더 크거나 중요한 의미를 가진 것도 아니다. 이 숫자는 표현을 구분하기 위한 Identifier 일 뿐이다. 따라서 실제로 필요한 과정은 다음과 같다. Text ↓ Token ↓ Token ID ↓ Embedding Vector 그리고 첫 번째 질문은 자연스럽게 이것이 된다. Text를 어떤 단위로 나눌 것인가? 2.1 Tokenizer와 Tokenization Text를 모델이 처리할 수 있는 단위로 나누고 정수 ID로 연결하는 과정의 중심에 Tokenizer 가 있다. Text를 Token Sequence로 변환하는 과정을 Tokenization 이라고 한다. Tokenizer와 Tokenization은 서로 다른 개념이니 주의하자! Tokenizer = Tokenization을 수행하는 구성 요소/도구 Tokenization = Text를 Token으로 변환하는 과정 예를 들어 설명을 위해 다음 문장을 생각해보자. 나는 오늘 학교에 갔다. Tokenizer를 거치면 개념적으로 다음처럼 나뉠 수 있다. ["나는", "오늘", "학교", "에", "갔다", "."] 각각의 조각이 Token 이다. Raw Text ↓ Tokenizer ↓ Tokenization ↓ Token Sequence 여기서 가장 먼저 구분해야 하는 것이 있다. Token ≠ 항상 Word Token은 단어일 수도 있지만, 단어보다 작은 조각일 수도 있고 문자나 문장부호가 별도의 Token으로 처리될 수도 있다. 실제 Tokenization 결과는 사용하는 Tokenizer에 따라 달라진다. 그렇다면 왜 그냥 한 단어 = 한 Token 으로 만들지 않는 걸까? 2.2 Word-level Tokenization의 한계 가장 직관적인 방법은 단어 단위로 Text를 나누는 것이다. 나는 오늘 학교에 갔다. ↓ 나는 / 오늘 / 학교에 / 갔다 이를 Word-level Tokenization 이라고 생각할 수 있다. 문제는 실제 언어에서 등장할 수 있는 단어의 형태가 매우 많다는 것이다. 한국어만 보더라도: 먹다 먹고 먹었다 먹었어요 먹었지만 먹겠습니다 먹으려고 먹으니까 ... 처럼 하나의 어휘에서 다양한 형태가 만들어진다. 신조어와 고유명사도 계속 등장한다. ChatGPT ChatGPT가 ChatGPT에게 ChatGPT에서는 ... 모든 가능한 표현을 독립적인 Token으로 Vocabulary에 넣으려고 하면 Vocabulary가 매우 커질 수 있다. 그리고 Vocabulary에 없는 표현이 등장하면 OOV(Out-of-Vocabulary) 문제가 발생할 수 있다. 새로운 표현 ↓ Vocabulary에 없음 ↓ OOV 전통적인 방식에서는 이런 표현을 <UNK> 같은 Unknown Token으로 처리하기도 했다. 하지만 서로 전혀 다른 미등록 단어들이 모두 같은 <UNK> 로 바뀐다면 원래 Text에 있던 정보가 손실될 수 있다. 그렇다면 반대로 아주 작은 단위로 나누면 어떨까? 2.3 Character-level과 Subword Tokenization 예를 들어 문자 단위로 나눌 수 있다. 안녕하세요 ↓ 안 / 녕 / 하 / 세 / 요 이렇게 하면 필요한 기본 단위의 종류는 크게 줄어든다. 처음 보는 단어도 작은 단위들의 조합으로 표현할 가능성이 높아진다. 하지만 새로운 문제가 생긴다. Sequence가 길어진다. Word-level 큰 단위 ↓ Token 수 ↓ Vocabulary Size ↑ Character-level 작은 단위 ↓ Token 수 ↑ Vocabulary Size ↓ 즉 다음과 같은 Trade-off가 존재한다. Vocabulary Size ↕ Token Granularity ↕ Sequence Length 여기서 단어와 문자 사이의 절충안으로 등장하는 것이 Subword Tokenization 이다. 핵심 아이디어는 다음과 같다. 자주 등장하는 표현은 비교적 큰 단위로 유지하고, 드물거나 새로운 표현은 더 작은 단위의 조합으로 표현한다. 예를 들어 개념적으로: computer → ["computer"] computerization → ["computer", "ization"] 처럼 처리할 수 있다. 실제 분리 결과는 Tokenizer와 Vocabulary에 따라 다르지만 핵심은 같다. 모든 단어를 Vocabulary에 저장하지 않고도 작은 단위들의 조합으로 다양한 Text를 표현할 수 있다. 대표적인 Subword 계열 방식에는 다음과 같은 것들이 있다. Subword Tokenization │ ├── BPE ├── WordPiece └── Unigram 이번 글에서는 이 중 BPE(Byte Pair Encoding) 를 중심으로 원리를 이해해보자. 2.4 BPE — Subword는 어떻게 만들어질까? BPE의 핵심 아이디어는 비교적 간단하다. 자주 함께 등장하는 인접 단위를 반복적으로 병합한다. 예를 들어 학습 Corpus에 다음 표현이 있다고 가정해보자. low lower lowest 처음에는 작은 단위에서 시작한다. l o w l o w e r l o w e s t 그리고 Corpus에서 인접한 Pair의 등장 빈도를 확인한다. (l, o) (o, w) (w, e) (e, r) (e, s) ... 만약 (l, o) 가 자주 등장한다면 두 단위를 하나로 병합한다. l + o ↓ lo 그러면: lo w lo w e r lo w e s t 가 된다. 다시 Pair의 빈도를 계산한다. 이번에는 (lo, w) 가 자주 등장한다고 해보자. lo + w ↓ low 결과적으로: l / o / w ↓ lo / w ↓ low 처럼 반복되는 패턴이 점점 더 큰 단위가 된다. 이런 병합을 반복하면서 Tokenizer가 사용할 Subword와 Merge Rule을 만들어갈 수 있다. 핵심은: 빈번한 패턴 ↓ 더 큰 Token으로 병합 드문 패턴 ↓ 더 작은 Token의 조합으로 표현 하는 것이다. 2.5 Tokenizer Training ≠ 실제 Tokenization BPE를 이해할 때 꼭 구분해야 하는 것이 있다. Tokenizer를 학습하는 과정 과 학습된 Tokenizer를 사용하는 과정 은 다르다. Tokenizer Training Training Corpus ↓ 빈도 분석 ↓ 반복적인 Merge ↓ Vocabulary + Merge Rules 이 단계에서 사용할 Token 집합과 Tokenization 규칙이 결정된다. 반면 실제 LLM을 사용할 때는: New Text ↓ 이미 준비된 Tokenizer ↓ Tokens 가 된다. 즉 사용자가 Prompt를 입력할 때마다 BPE가 새로운 Corpus 분석을 시작하고 Vocabulary를 다시 만드는 것이 아니다. 이미 학습·설정된 Tokenizer의 Vocabulary와 규칙을 이용해 새로운 Text를 Tokenize한다. 2.6 Vocabulary와 Token ID Tokenizer가 사용할 수 있는 Token의 집합을 Vocabulary(Vocab) 라고 한다. 개념적으로 다음처럼 생각할 수 있다. Vocabulary Token ID ─────────────────── <pad> 0 <bos> 1 <eos> 2 나는 3 오늘 4 학교 5 에 6 갔다 7 . 8 ... 각 Token에는 고유한 정수 번호가 대응된다. 이 번호가 Token ID 다. 따라서: "나는 오늘 학교에 갔다." ↓ Tokenization ["나는", "오늘", "학교", "에", "갔다", "."] ↓ Vocabulary Lookup [3, 4, 5, 6, 7, 8] 가 된다. 전체 흐름을 다시 보면: Text ↓ Tokenizer ↓ Tokens ↓ Vocabulary ↓ Token IDs 여기서 반드시 기억해야 하는 것은: Token ID = Identifier Token ID ≠ Meaning 라는 점이다. Token ID 5 자체에는 "학교" 의 의미가 들어 있지 않다. ID는 다음 단계에서 어떤 Vector를 가져올 것인지 찾기 위한 Index 역할을 한다. 2.7 Special Token — Text 외에도 Token이 필요하다 Vocabulary에는 일반 Text 조각 외에도 특별한 기능을 담당하는 Token이 포함될 수 있다. 이를 Special Token 이라고 한다. 대표적으로 다음과 같은 역할이 있다. Token 대표적인 역할 BOS Sequence의 시작 표시 EOS Sequence의 종료 표시 PAD Batch 등에서 Sequence 길이를 맞출 때 사용 UNK Vocabulary에서 직접 표현할 수 없는 항목을 나타낼 때 사용 개념적으로: <BOS> 나는 오늘 학교에 갔다 <EOS> 처럼 Sequence의 경계를 표현할 수도 있다. 다만 모든 모델이 동일한 이름과 동일한 Special Token 구조를 사용하는 것은 아니다. 특히 현대 Subword/byte 기반 Tokenizer에서는 미등록 Text를 더 작은 단위로 표현할 수 있기 때문에 <UNK> 의 실제 필요성과 사용 방식도 Tokenizer에 따라 달라진다. 따라서 이름 자체를 암기하기보다는: Vocabulary에는 자연어 조각뿐 아니라 모델의 입력 구조나 제어에 사용되는 특별한 Token도 존재할 수 있다. 라고 이해하는 것이 좋다. 2.8 Token ID는 숫자지만 아직 Vector가 아니다 여기까지 오면 Text는 숫자로 변했다. "나는 오늘 학교에 갔다." ↓ [3, 4, 5, 6, 7, 8] 하지만 이 숫자들을 그대로 의미 계산에 사용할 수는 없다. 예를 들어: 오늘 = 4 학교 = 5 라고 해서: 학교 - 오늘 = 1 에는 의미가 없다. Token ID는 Categorical Identifier 에 가깝다. 하지만 0.1에서 살펴본 LLM의 연산에는 이런 형태가 필요했다. 학교 ↓ [0.18, -0.42, 0.71, 0.09, ...] 여기서 Embedding 이 등장한다. 2.9 Embedding — Token을 Vector 공간으로 옮기기 Embedding은 이산적인 Token을 연속적인 Vector Representation 과 연결한다. 개념적으로: "학교" ↓ Token ID = 5 ↓ Embedding ↓ [0.18, -0.42, 0.71, 0.09, ...] 이렇게 얻은 Vector를 Token Embedding 또는 Embedding Vector 라고 부를 수 있다. 그런데 여기서 중요한 질문이 생긴다. ID 5 를 어떤 공식으로 계산하면 저 Vector가 나오는 걸까? 단순히 5 라는 숫자에 어떤 수학 공식을 적용하는 것이 아니다. 이 구조를 이해하려면 Embedding Matrix 를 봐야 한다. 2.10 Embedding Matrix와 Lookup Vocabulary Size를 (V), Embedding Dimension을 (d)라고 하자. Embedding Matrix (E)는 개념적으로: [ E \in \mathbb{R}^{V \times d} ] 의 형태를 가진다. Embedding Dimension (d) ─────────────────────────→ ID 0 [ 0.12, -0.31, 0.44, ... ] ID 1 [-0.42, 0.11, 0.73, ... ] ID 2 [ 0.21, 0.38, -0.17, ... ] ID 3 [ 0.63, -0.19, 0.52, ... ] ID 4 [-0.11, 0.27, 0.81, ... ] ID 5 [ 0.18, -0.42, 0.71, ... ] ... ↑ Vocabulary Size (V) Token ID가 5 라면: Token ID = 5 ↓ Embedding Matrix ↓ 5번 Row ↓ [0.18, -0.42, 0.71, ...] 를 가져온다. 이것이 Embedding Lookup 이다. 즉: Token ID │ │ Index ▼ Embedding Matrix │ │ Lookup ▼ Embedding Vector 라고 이해할 수 있다. 따라서 Token ID는 의미를 직접 담은 숫자가 아니라: Embedding Matrix에서 어떤 Vector를 가져올지를 지정하는 Index 다. 2.11 Embedding Dimension은 무엇일까? Embedding Vector에는 하나의 값이 아니라 여러 개의 값이 들어 있다. [0.18, -0.42, 0.71, 0.09, ..., 0.31] 이 Vector가 몇 개의 숫자로 구성되는지를 Embedding Dimension 이라고 한다. 예를 들어: [0.2, 0.5, 0.7] dimension = 3 이다. 실제 Transformer에서는 훨씬 높은 차원의 표현을 사용한다. 개념적으로: Token ↓ Embedding ↓ d-dimensional Vector Transformer 아키텍처에서는 이 표현의 크기가 모델의 hidden size 또는 d_model 과 밀접하게 연결된다. 구체적인 구성은 모델 아키텍처에 따라 차이가 있을 수 있다. 중요한 것은: Token 하나가 하나의 숫자로 표현되는 것이 아니라, 여러 숫자로 이루어진 고차원 Vector로 표현된다. 는 점이다. 2.12 Embedding Vector의 값은 누가 정할까? 그렇다면: 학교 ↓ [0.18, -0.42, 0.71, ...] 에서 저 숫자들은 누가 정한 것일까? 사람이 각 Token의 의미를 분석해서 직접 값을 입력하는 것은 아니다. Embedding Matrix는 모델의 Learnable Parameter 다. 모델 학습 과정에서 다른 Parameter와 함께 값이 조정된다. 개념적으로 보면: Token IDs ↓ Embedding Matrix ↓ Token Embeddings ↓ Transformer ↓ Prediction ↓ Loss ↓ Backpropagation ↓ Parameter Update ↓ Embedding Matrix Update 처음부터 완성된 의미 Vector가 들어 있는 것이 아니라 모델의 학습 목적에 따라 Prediction Error를 줄이는 방향으로 Embedding Matrix의 값도 조정된다. 따라서: Embedding Matrix 역시 모델이 학습하는 Parameter의 일부다. 여기서는 Loss , Gradient , Backpropagation 의 구체적인 계산까지 들어가지는 않는다. 이 과정은 이후 Training & Inference 편에서 다시 다룬다. 2.13 Word2Vec — Embedding을 이해하기 위한 중요한 배경 단어를 Vector로 표현한다는 아이디어는 Transformer에서 처음 등장한 것이 아니다. 대표적인 초기 분산 표현 학습 방법 중 하나가 Word2Vec 이다. 핵심 아이디어를 단순화하면: 비슷한 문맥에서 등장하는 단어들이 유사한 Vector 표현을 갖도록 학습할 수 있다. Word2Vec의 대표적인 학습 방식에는 CBOW 와 Skip-gram 이 있다. CBOW 주변 단어를 이용해 중심 단어를 예측한다. Context Words ↓ CBOW ↓ Target Word Skip-gram 중심 단어를 이용해 주변 단어를 예측한다. Target Word ↓ Skip-gram ↓ Context Words 여기서 중요한 것은 Word2Vec 알고리즘 자체를 외우는 것이 아니다. 언어의 의미적·분포적 관계를 Vector 공간에 표현할 수 있다 는 Embedding의 직관을 이해하는 것이다. 그리고 이 개념은 Transformer에서 더 중요한 질문으로 이어진다. 같은 단어라도 문맥에 따라 의미가 달라진다면 Vector도 달라져야 하지 않을까? 2.14 Token Embedding과 Contextual Representation은 다르다 다음 두 문장을 보자. I deposited money at the bank. I sat on the bank of the river. 두 문장 모두 "bank" 라는 표현을 포함하지만 의미는 다르다. 첫 번째는 금융기관이고 두 번째는 강둑이다. 여기서 Token Embedding 과 Transformer를 거친 Contextual Representation 을 구분해야 한다. Token ↓ Token Embedding ↓ Transformer Layers ↓ Contextual Representation Token Embedding은 Transformer가 계산을 시작하기 위한 초기 수치 표현 이다. Transformer에서는 주변 Token과의 관계가 계산된다. 첫 번째 문장에서는: deposited │ money ── bank 두 번째 문장에서는: river │ bank ── sat 처럼 주변 Context가 다르다. Transformer Layer를 거치면서 각 위치의 내부 표현은 주변 Token의 정보를 반영해 변화한다. 전통적인 Static Embedding과 비교하면 차이가 더 명확하다. Static Word Embedding Word ↓ Vector 동일한 Word → 기본적으로 동일한 학습된 표현 Transformer-based Model Token ↓ Initial Token Embedding ↓ Transformer Layers ↓ Contextual Representation 동일한 Token이라도 문맥에 따라 내부 표현이 달라질 수 있음 따라서 중요한 구분은: Embedding ≠ Context Understanding 이다. Token Embedding은 문맥 이해의 최종 결과가 아니라 Transformer가 문맥 계산을 시작하기 위한 출발점이다. 2.15 Position Information — Vector만으로 충분할까? 이제 Token도 Vector로 변환했다. 그런데 또 하나의 정보가 필요하다. 다음 두 문장을 비교해보자. 고양이가 개를 쫓았다. 개가 고양이를 쫓았다. 비슷한 단어들이 등장하지만 의미는 다르다. 순서가 다르기 때문이다. 자연어에서는 Token의 위치가 의미를 결정하는 중요한 정보다. Self-Attention 연산 자체에는 순서를 별도로 알려줄 필요가 있기 때문에 Transformer에는 Position Information 이 필요하다. 개념적으로: Token Embedding + Position Information ↓ Transforme
경영진은 당장 내일부터 사내 생성형 AI를 전면 도입하라고 압박합니다. 하지만 인프라 담당자인 당신의 머릿속은 복잡하기만 합니다. 민감한 사내 핵심 데이터를 외부 거대 언어 모델(LLM)로 무작정 내보내자니 보안과 컴플라이언스 위반이 우려되고, 자체적인 안전망을 구축하고자 별도의 오픈소스 벡터 DB를 새로 도입하자니 관리 포인트와 데이터 동기화 이슈가 두 배로 늘어나기 때문입니다. 혁신을 요구받지만 그 이면의 리스크를 오롯이 책임져야 하는 IT 인프라 담당자들. 이제 기존의 복잡한 방식에서 벗어나 아키텍처의 패러다임을 바꿀 때입니다. 1. 2025-2026 엔터프라이즈 AI의 현실: 단순 챗봇을 넘어 '자율형 AI 에이전트'의 시대로 글로벌 생성형 AI 시장은 단순한 실험 단계를 지나 기업 비즈니스의 핵심 운영 인프라로 자리 잡는 성숙기에 진입했습니다. 특히 주목해야 할 변화는 단순한 질문-답변(Task) 중심에서 워크플로우를 스스로 기획하고 실 행하는 자율형 AI 에이전트(Agentic AI) 기반으로 진화하고 있다는 점입니다. 과거의 자동화가 인간의 지시를 기다리는 대시보드 중심(OODA 루프)이었다면, 이제는 AI가 정책 범위 내에서 상황을 인지하고 스스로 실행(ODAI 루프)하는 구조로 변모하고 있습니다 비교 항목 단순 자동화 (대시보드) 자율형 AI 에이전트 (실행 중심) 의사결정 루프 OODA (관찰-해석-결정-행동) ODAI (관찰-결정-행동-보고) 운영 권한 보조적 권고 (인간의 최종 승인 필수) 정책 기반 행동 (정책 범위 내 자율 실행) 인간의 역할 운영자: 모든 단계에 개입 및 조작 감독자: 정책 설계 및 예외 상황 관리 이러한 고도화된 AI 환경을 지탱하기 위해서는, 기반이 되는 데이터 인프라 역시 과거의 분절된 형태에서 벗어나 한 차원 더 진화해야 합니다. 2. IT 인프라 담당자를 괴롭히는 3가지 페인 포인트와 기존 RAG의 한계 사내 데이터를 AI에 안전하게 연동하기 위해 많은 기업이 RAG 아키텍처(검색 증강 생성)를 도입하고 있습니다. 하지만 전통적인 RAG 파이프라인을 구축할 때 IT 부서는 다음과 같은 치명적인 한계에 부딪힙니다. 극심한 데이터 파편화 (Data Fragmentation) : 기존 관계형 DB에 있는 데이터를 추출해 별도의 벡터 데이터베이스(Vector DB)로 복제하고 동기화해야 합니다. 데이터가 이동하는 순간 사일로(Silo)가 발생하며, 실시간 정합성을 보장하기 어려워집니다. 통제 불가능한 보안 및 컴플라이언스 리스크 : 데이터가 기존의 강력한 DB 보안 울타리를 벗어나 여러 시스템과 외부 API를 떠도는 순간, 권한 관리와 데이터 유출 방지(DLP) 체계는 무너집니다. LLM의 환각(Hallucination) 현상 : 최신 비즈니스 컨텍스트가 실시간으로 반영되지 않은 과거의 복제 데이터를 기반으로 답변을 생성할 경우, 그럴듯하지만 완전히 잘못된 정보를 생성하는 환각의 위험에 노출됩니다. 3. 패러다임의 전환: "데이터를 옮기지 말고, AI를 데이터베이스로 불러오라" 이러한 문제를 해결하는 가장 본질적이고 우아한 방법은 아키텍처의 발상을 뒤집는 것입니다. 데이터를 외부 AI 모델이나 별도의 벡터 DB로 내보내는 과거의 방식은 틀렸습니다. 이제는 AI 연산 기능과 벡터 검색 엔진을 기업의 데이터가 이미 안전하게 저장되어 있는 '핵심 데이터베이스 내부'로 끌어와야 합니다. 통합형 아키텍처의 강력함 (Converged DB 전략) 차세대 엔터프라이즈 AI 데이터베이스 는 관계형 데이터, JSON, 공간(Spatial), 그래프, 그리고 비정형 데이터를 하나의 플랫폼에서 통합 관리합니다. 별도의 벡터 DB를 구축할 필요가 없으므로 IT 인프라의 복잡성이 획기적으로 감소합니다. 네이티브 벡터 검색(Vector Search)의 마법 통합 DB 내에 구축된 벡터 검색(Vector Search)은 표준 SQL 쿼리 하나만으로 기존의 정형 데이터와 문서, 이미지 등 비정형 데이터의 의미적 유사성을 동시에 검색해 냅니다. 비교 항목 전통적인 키워드 검색 벡터 검색 (AI 시맨틱 검색) 비즈니스 가치 검색 원리 단어의 형태적 일치 여부 확인 데이터의 문맥적 의미 및 유사성 분석 질문자의 숨겨진 의도와 맥락 파악 결과의 정확도 오타나 동의어 검색에 매우 취약함 의도가 같다면 표현이 달라도 정확히 검색 RAG 아키텍처의 응답 신뢰성 확보 데이터 활용 주로 텍스트 기반 정형 데이터 위주 텍스트, 이미지, 오디오 등 모든 비정형 사장되어 있던 비정형 데이터의 자산화 단일 데이터베이스 내에서 AI 처리가 이루어지면, 기존에 설정해 둔 엄격한 보안 프로필과 데이터 접근 권한(Role-based Access)이 RAG 파이프라인에도 그대로 상속되어 완벽한 보안을 유지할 수 있습니다.도입 효과(ROI): 통합형 AI 데이터베이스가 가져온 혁신 사례 4. 도입 효과(ROI): 통합형 AI 데이터베이스가 가져온 혁신 사례 실제로 복잡한 기존 환경을 통합형 자율운영 AI 데이터베이스로 전환한 글로벌 선도 기업들은 놀라운 인프라 운영 효율과 비즈니스 ROI를 달성하고 있습니다. 글로벌 톱 티어 제조 기업인 P사의 경우, 파편화된 분석계 데이터베이스를 자동화된 통합 데이터 레이크하우스로 전환했습니다. 도입 결과, 데이터 분석 속도는 기존 대비 2.4배 향상되었으며, 일관된 데이터 거버넌스 체계를 확립했습니다. 더 나아가 단일화된 플랫폼 위에서 생산부터 영업까지 전 프로세스를 아우르는 지능형 팩토리 전략을 구현하여, 고객 문의 대응 시간을 기존 10일에서 1일로 무려 10배나 단축 하는 경이로운 비즈니스 민첩성을 확보했습니다. 이는 인프라의 단순화가 곧 비즈니스 실행력의 극대화로 이어진다는 것을 명확히 증명하는 사례입니다. 5. 성공적인 차세대 AI 인프라 전환을 위한 3단계 핵심 로드맵 안전하고 효율적인 사내 AI 도입을 준비하는 IT 리더라면 다음 3단계 로드맵을 즉각적으로 검토해야 합니다. 데이터 사일로 현황 진단 : 현재 부서별로 흩어져 있는 데이터와 불필요하게 복제 운영 중인 데이터베이스(파편화) 현황을 매핑합니다. 통합형 데이터베이스(Converged DB)로의 전환 : 별도의 벡터 DB 구축 없이, 네이티브로 벡터 임베딩과 시맨틱 검색을 지원하는 엔터프라이즈 AI 데이터베이스 솔루션을 도입하여 아키텍처를 단일화합니다. 내부 보안 정책이 적용된 AI 에이전트 배포:** 데이터 이동 없이 데이터베이스 내부에서 직접 동작하는 RAG 기술을 활용해, 완벽한 보안 통제 하에 자율형 AI 에이전트를 실무 부서에 배포합니다.** 데이터 이동 없이 데이터베이스 내부에서 직접 동작하는 RAG 기술을 활용해, 완벽한 보안 통제 하에 자율형 AI 에이전트를 실무 부서에 배포합니다. 🚀 결론: 복잡성을 줄이는 것이 가장 강력한 AI 전략입니다 데이터를 이동시키는 파이프라인이 많아질수록 보안 위협과 관리 비용은 기하급수적으로 늘어납니다. 차세대 엔터프라이즈 AI 데이터베이스 는 IT 인프라 담당자에게 '관리의 단순함'을 제공하고, 비즈니스 부서에는 '환각 없는 정확한 AI 인사이트'를 제공하는 유일한 해법입니다. 기존 데이터베이스 인프라를 AI 네이티브 환경으로 전환하여 보안과 혁신이라는 두 마리 토끼를 모두 잡으시길 바랍니다.
한 줄 요약 최신 API 기능을 빠르게 붙이는 것보다, 사람과 AI 에이전트가 함께 이해하고 검증할 수 있는 계약·문서·에러·비용 구조를 설계하는 것이 중요해지고 있다. 왜 지금 이 주제인가 최근 공개된 Build APIs Like This and You'll Fail the Interview 에서는 단순히 REST API를 구현하는 것과, 왜 그렇게 설계했는지를 설명하고 방어하는 것 사이에는 큰 차이가 있다고 지적한다. 영상에서는 간단한 상품 조회·등록 API를 만드는 과정에서 API 버저닝, 대량 데이터 조회, Entity의 직접 노출, 입력값 검증, HTTP 상태 코드, 멱등성, Rate Limiting, Controller에 비즈니스 로직을 두는 문제 등을 차례로 짚는다. 핵심은 코드를 작성하는 것 자체보다 설계의 트레이드오프를 설명할 수 있는가 에 있다는 것이다. 이 문제는 AI 시대에 한 단계 더 확장될 수 있다. 과거 API의 주요 소비자는 사람이 사용하는 웹·모바일 애플리케이션이었다. 하지만 이제는 LLM 기반 코딩 에이전트, RAG 파이프라인, MCP 기반 도구, 자동화 시스템 등도 API와 그 문서를 직접 소비한다. 따라서 API는 단순히 사람이 읽고 이해할 수 있는 문서만으로 충분하지 않다. 스키마, 예제, 에러 코드, 버전 정보, 사용 제약과 같은 구조화된 정보까지 포함해 기계가 해석하고 검증할 수 있는 계약으로 설계할 필요가 있다. 핵심 주장 이 글에서 이야기하고 싶은 핵심은 다음과 같다. API의 가치는 "얼마나 빠르게 만들 수 있는가"만으로 판단하기 어렵다. 사람과 AI 에이전트가 함께 검증할 수 있는 명확한 계약을 얼마나 잘 만들었는가도 중요한 판단 기준이 된다. 따라서 API를 설계할 때 다음과 같은 질문이 먼저 나와야 한다. 리소스 모델이 실제 비즈니스 개념과 일치하는가? 요청과 응답의 스키마가 명확한가? 에러 응답이 기계적으로 해석 가능한 형태인가? 멱등성 정책이 필요한 API에 명확하게 정의되어 있는가? API 버전과 Breaking Change 정책이 명시되어 있는가? 문서가 사람이 읽기 쉬울 뿐 아니라 AI 에이전트도 활용하기 쉬운 형태인가? AI가 생성하거나 수정한 코드를 사람이 리뷰하고 테스트할 수 있는가? 토큰 비용, Rate Limit, 캐시, 장애 시 Fallback 등을 고려했는가? API가 왜 현재와 같은 형태로 설계되었는지를 설명할 수 있는가? 이 질문에 답할 수 없다면 API는 단순히 "동작하는 코드"에 머물 가능성이 있다. API를 만드는 것에서 API의 설계를 설명하는 것으로 여기서 중요한 변화는 "API 면접에서 잘 답해야 한다"는 기술적인 팁에 그치지 않는다. 핵심은 API가 하나의 계약 자산이라는 점 이다. 사람은 API를 호출하고 문서를 읽는다. AI 에이전트는 API의 스키마와 문서를 참고해 호출 방법을 추론하고, 그 결과를 다음 작업의 입력으로 사용하기도 한다. 따라서 API 설계는 코드만의 문제가 아니다. API = Endpoint + Schema + Documentation + Error Contract + Versioning + Observability 라는 관점으로 확장해서 볼 필요가 있다. 이를 사람 중심 API와 AI 에이전트 소비 환경으로 나누어 보면 다음과 같다. 판단축 전통적인 API 소비 환경 AI 에이전트 소비 환경 문서 사람이 읽고 이해하는 설명 사람이 읽으면서 에이전트도 활용할 수 있는 구조화된 문서 계약 API 사용법과 설명 중심 스키마, 예제, 에러 코드, 멱등성, 버전 정보까지 명확하게 정의 리뷰 개발자 중심 코드 리뷰 AI 생성 결과에 대한 사람의 설계·코드 리뷰 비용 API 요청 및 인프라 비용 API 비용 + 모델 추론 및 토큰 비용 실패 모드 애플리케이션의 예외 처리 잘못된 해석에 따른 반복 호출과 연쇄적인 오류 관찰 가능성 로그와 시스템 지표 API 호출 패턴, 오류, 재시도, 비용까지 함께 관찰 여기서 중요한 것은 AI를 사용한다고 해서 기존 API 설계 원칙이 사라지는 것이 아니라는 점이다. 오히려 기존의 좋은 API 설계 원칙이 더 중요해진다. 명확한 리소스 모델, 일관된 스키마, 적절한 상태 코드, 입력 검증, 권한 관리, 멱등성, 버저닝, 관찰 가능성 같은 요소가 AI 에이전트 환경에서도 기본적인 안전장치가 된다. 문서는 사람이 읽는 페이지에서 에이전트가 활용하는 지식 자산으로 AI 시대의 API 설계에서 특히 눈여겨볼 부분은 문서의 형태 다. Mastra는 AI 에이전트가 프로젝트와 라이브러리를 더 정확하게 이해할 수 있도록 문서를 구조화하는 방식을 실제 프로젝트에 적용하고 있다. Mastra의 공식 자료에서는 패키지 내부에 SKILL.md 와 Markdown 기반 reference 문서를 제공하고, 패키지와 관련 문서를 연결하기 위한 구조화된 정보와 SOURCE_MAP.json 을 사용하는 방식을 설명한다. 또한 문서를 에이전트가 필요한 범위만 찾아 사용할 수 있도록 구성하는 접근도 소개하고 있다. 이 방식의 중요한 의미는 단순히 "문서를 Markdown으로 바꾼다"는 것이 아니다. 에이전트가 필요한 지식을 필요한 범위에서 찾아 사용할 수 있도록 문서 자체를 구조화한다는 것 이다. 예를 들어 다음과 같은 정보가 명확하게 제공될 수 있다. Package ├── API ├── Schema ├── Example ├── Version ├── Related Source └── Constraints 이렇게 하면 AI 에이전트가 프로젝트 전체를 무작정 읽는 대신 필요한 정보에 접근할 수 있다. 결과적으로 문서 품질은 단순히 "설명이 친절한가"라는 문제를 넘어선다. 정확성, 구조화 정도, 버전 일치 여부, 필요한 정보에 대한 접근성 도 중요한 품질 기준이 된다. AI 코딩 에이전트에서는 컨텍스트가 곧 품질이 된다 AI 코딩 에이전트를 사용할 때도 같은 문제가 발생한다. AI가 코드를 생성할 수 있다는 사실 자체는 이제 특별한 기능이 아니다. 더 중요한 질문은 다음과 같다. AI가 어떤 컨텍스트를 제공받고 코드를 생성하는가? 예를 들어 API를 변경해야 한다고 생각해 보자. 에이전트가 단순히 Controller와 Service 코드만 읽는 것과 다음 정보를 함께 제공받는 것은 결과가 달라질 수 있다. API 스키마 기존 호출 예제 에러 코드 데이터 모델 인증·권한 정책 버전 정책 관련 테스트 Breaking Change 정책 실제 사용 중인 클라이언트 코드 결국 AI 코딩의 품질은 모델의 생성 능력만으로 결정되지 않는다. 정확한 컨텍스트를 얼마나 잘 제공하고, 생성 결과를 어떻게 검증하는가 가 중요하다. 이 관점에서 API 문서는 단순한 개발자 문서가 아니라 AI 에이전트가 사용할 수 있는 프로젝트 지식의 일부가 된다. 토큰 비용도 API 설계의 새로운 고려사항이 된다 AI 에이전트가 API 문서를 반복적으로 읽고 호출한다면 기존에는 없었던 비용 구조도 등장한다. 예를 들어 문서가 지나치게 길거나 중복되어 있다면 에이전트가 필요한 정보를 찾는 데 더 많은 컨텍스트를 사용하게 될 수 있다. API 호출이 잘못 설계되어 불필요한 재시도가 반복되면 모델 추론 비용과 API 비용이 함께 증가할 수도 있다. 따라서 다음과 같은 요소도 함께 고려할 필요가 있다. 필요한 정보만 제공하는 문서 구조 명확한 에러 코드 재시도 가능 여부 Rate Limit Cache Pagination Timeout Fallback 요청 및 응답 크기 모델 컨텍스트 사용량 API 호출 로그와 비용 지표 특히 에러 메시지가 모호하면 에이전트가 잘못된 방법으로 재시도할 가능성이 있다. 반대로 에러 코드와 재시도 가능 여부 등이 명확하다면 에이전트가 실패 상황을 보다 일관되게 처리할 수 있다. 즉, API의 계약 품질이 곧 에이전트의 실행 품질에 영향을 줄 수 있다. AI 중심 설계에도 반론은 필요하다 그렇다고 모든 API를 AI-first 방식으로 다시 설계해야 한다는 의미는 아니다. 오히려 여기에는 몇 가지 중요한 트레이드오프가 있다. 1. AI 친화적인 문서가 항상 사람에게 친절한 것은 아니다 LLM이 처리하기 좋은 구조와 사람이 빠르게 이해하기 좋은 구조가 항상 동일한 것은 아니다. 따라서 사람을 위한 설명과 에이전트가 활용하기 위한 구조화된 정보가 서로 충돌하지 않도록 설계해야 한다. Markdown, Schema, Example 등을 적절하게 조합하는 방법도 하나의 선택지가 될 수 있다. 2. 문서 구조화는 운영 복잡도를 증가시킬 수 있다 문서를 별도의 구조로 관리하거나 패키지에 포함하고, 버전별로 관리하고, 소스와 문서를 연결하는 것은 추가적인 관리 비용을 만든다. 따라서 모든 프로젝트에 동일한 수준의 복잡성을 적용할 필요는 없다. AI 에이전트가 API를 반복적으로 사용하고 있거나, 문서와 실제 구현 사이의 차이가 자주 발생하는 시스템이라면 이런 구조화의 가치가 커질 수 있다. 반면 소규모 내부 도구라면 기존 README와 통합 테스트만으로도 충분할 수 있다. 3. AI가 생성한 코드는 사람의 검증이 필요하다 AI가 더 많은 코드를 빠르게 만들어준다고 해서 설계 검증까지 자동으로 끝나는 것은 아니다. 특히 다음과 같은 영역은 사람이 반드시 확인해야 한다. 권한 인증 멱등성 데이터 무결성 개인정보 및 보안 에러 처리 Breaking Change 트랜잭션 경계 성능 특성 AI가 생성한 코드가 동작한다는 사실과, 그 코드가 시스템의 설계 원칙에 맞는다는 사실은 서로 다르다. 4. 모든 API를 복잡하게 만들 필요는 없다 모든 API를 거대한 계약 자산으로 만드는 것도 좋은 접근은 아니다. 먼저 다음과 같이 영향도가 큰 API부터 정교하게 관리할 수 있다. 외부에 공개되는 핵심 API 여러 서비스에서 공통으로 사용하는 API AI 에이전트가 반복적으로 호출하는 API 데이터 변경의 영향도가 큰 API 버전 호환성이 중요한 API 중요한 것은 복잡성을 추가하는 것 자체가 아니라, 추가된 복잡성이 실제 문제를 해결하는가 다. 판단 프레임: 도입, PoC, 유지, 보류 자신의 시스템에 적용할 때는 다음과 같은 방식으로 판단할 수 있다. 판단 조건 도입 API를 LLM이나 에이전트가 반복적으로 호출하고 있으며, 문서·스키마·에러 계약을 체계적으로 관리할 필요가 있다. PoC 에이전트의 API 사용이 시작되었지만 실제 비용과 품질 개선 효과가 아직 불분명하다. 작은 범위에서 문서 구조화, Schema, MCP 등의 방식을 검증한다. 유지 API 트래픽이 낮고 사람 중심 문서와 테스트가 충분하며 현재 방식이 안정적으로 운영되고 있다. 보류 리소스 모델, 권한, 멱등성, 에러 계약 등 API의 기본 설계부터 명확하지 않다. 먼저 기본적인 API 계약을 정리한다. 이때 가장 중요한 것은 특정 기술을 도입하는 것이 아니다. 현재 발생하고 있는 문제가 무엇인지 먼저 확인하는 것 이다. 실무 체크리스트 API를 AI 에이전트가 소비할 가능성이 있다면 다음 항목을 점검해 볼 수 있다. 리소스 모델이 실제 비즈니스 개념과 일치하는가? URL, Entity, DTO, Response Schema에서 동일한 개념이 일관되게 표현되는가? 대량 조회 API에 Pagination이 적용되어 있는가? 변경 요청에 필요한 경우 멱등성 정책이 정의되어 있는가? 에러 응답에 기계가 해석할 수 있는 코드와 필요한 메시지가 포함되어 있는가? 재시도 가능한 오류와 재시도하면 안 되는 오류가 구분되어 있는가? API 버전과 Breaking Change 정책이 명확한가? 문서와 실제 API 구현의 버전이 일치하는가? Schema와 실제 요청·응답 예제가 일치하는가? AI 에이전트가 필요한 문서를 효율적으로 찾을 수 있는가? AI가 생성하거나 수정한 API 코드를 사람이 리뷰하는가? 인증과 권한 정책이 API 계약과 함께 관리되는가? Rate Limit, Cache, Timeout, Fallback 등을 고려했는가? API 호출 실패와 재시도 패턴을 관찰할 수 있는가? "왜 이렇게 설계했는가?"라는 질문에 설명할 수 있는가? 결론 Build APIs Like This and You'll Fail the Interview 가 던지는 핵심적인 질문은 단순히 "API 코드를 잘 작성할 수 있는가?"가 아니다. 왜 이 API를 이렇게 설계했는지를 설명할 수 있는가? 영상에서도 API 버저닝, 데이터 조회량, DTO, validation, HTTP status, idempotency, rate limiting, business logic의 위치 등 다양한 설계 요소를 코드와 함께 검토하면서, 단순히 동작하는 API와 설계 의도를 설명할 수 있는 API 사이의 차이를 보여준다. AI 시대에는 이 문제가 더욱 중요해질 수 있다. LLM과 에이전트는 잘 정의된 API와 구조화된 문서를 바탕으로 작업할 수 있지만, 모호한 계약은 잘못된 해석과 반복적인 시행착오로 이어질 가능성이 있다. Mastra가 보여주는 문서 구조화 사례 역시 이러한 변화를 보여준다. 문서를 단순한 웹 페이지가 아니라 에이전트가 필요한 정보를 찾아 사용할 수 있는 지식 자산으로 구성하는 방식이다. 따라서 앞으로 API 설계에서 중요한 질문은 다음과 같이 확장될 수 있다. 사람이 이 API를 이해할 수 있는가? AI 에이전트가 이 API를 오해하지 않고 사용할 수 있는가? 그 과정에서 발생하는 비용과 복잡도를 감당할 수 있는가? 실패했을 때 원인을 관찰하고 검증할 수 있는가? 그리고 왜 이렇게 설계했는지를 설명할 수 있는가? 이 질문에 답할 수 있을 때 API는 단순한 엔드포인트의 집합을 넘어, 사람과 AI가 함께 사용하는 기술적 계약이자 의사결정 자산 이 될 수 있다. 댓글로 의견을 나눠보고 싶은 질문 팀에서 LLM이나 AI 에이전트가 API 문서와 Schema를 직접 소비하도록 설계한 경험이 있으신가요? AI가 생성한 API 코드를 리뷰할 때 가장 먼저 확인하는 항목은 무엇인가요? API 문서를 사람 중심으로 관리하는 것과 에이전트가 활용하기 좋은 형태로 구조화하는 것 사이에서 어떤 방식을 사용하고 계신가요? 참고 자료 Amigoscode, Build APIs Like This and You'll Fail the Interview , 2026-08-25. Mastra, How to Structure Projects for AI Agents and LLMs . Mastra, Introducing Mastra Skills . Mastra, Introducing File-Based Agents for Mastra .
이 글은 MangaTranslate 운영사인 ficory LLC가 작성했습니다. MangaTranslate (망가트랜슬레이트)는 만화 이미지 속 대사를 인식하고 번역하는 웹 기반 AI 만화 번역기 서비스입니다. 별도 프로그램을 설치하지 않고 브라우저에서 이용하며, 문자 인식(OCR), 대사 번역, 원문 제거, 번역문 재배치를 하나의 흐름으로 처리합니다. 개요 이용자는 원문 언어와 목표 언어를 고른 뒤 JPG, PNG, WEBP, PDF, ZIP 등의 파일을 올리면 번역된 이미지를 받습니다. 공식 사이트는 100개 이상의 언어를 지원한다고 밝히며, 일본어·영어·중국어·한국어 등 주요 언어 사이의 번역을 폭넓게 다룹니다. 번역 엔진으로는 GPT-4o, Papago, Google 번역 등을 선택할 수 있습니다. 일반적인 만화 번역기 기능 외에 동인지 전용 동인지 번역기 페이지도 운영합니다. 주요 기능 개인 사용자는 페이지 수 제한 없이 여러 페이지를 한 작업으로 묶는 일괄 번역과, 언어·모델·글꼴을 직접 정하는 사용자 지정 번역을 이용할 수 있습니다. Studio 사용자는 Photoshop과 유사한 온라인 편집기에서 문구, 텍스트 상자 위치, 글꼴, 색상, 외곽선, 자간 등을 세밀하게 수정할 수 있습니다. API Key 인증 방식의 API를 제공하여 개인 작업 흐름이나 사내 시스템에 번역 기능을 연결할 수 있습니다. SLA와 보안 정책을 공개하는 등 기업급 제품으로 운영되며, 팀 단위의 대량 작업에도 대응합니다. 활용 번역팀은 만화 번역 도구 로 초벌 번역을 만든 뒤 편집기에서 식자와 교정을 마무리하는 방식으로 쓰기도 합니다. 웹사이트 외에 브라우저 플러그인 형태의 크롬 만화 번역 확장 프로그램 도 안내하고 있습니다. 다만 자동 번역 결과는 사람의 검수가 필요하며, 번역 이미지를 공개하려면 원작의 이용 허가를 확인해야 합니다.
Modafinil 400mg: An Overview Modafinil is a medicine that doctors prescribe to help people stay awake when they feel too sleepy during the day. Modafinil is often talked about for narcolepsy, obstructive sleep apnea and shift work disorder. Modafinil 400mg means a daily dose of the medicine and should not be seen as a normal starting dose. Knowing Modafinils approved uses how it is dosed its effects and precautions is very important before using this strength. Medical Uses Modafinil is mainly given to help adults stay awake when certain medical conditions cause much sleepiness. For people with narcolepsy Modafinil may reduce sleepiness and help keep them awake during regular hours. For people with sleep apnea Modafinil can help cut down leftover sleepiness when the airway problem is being treated well. Modafinil is also used for adults who have shift work disorder and feel too sleepy or find it hard to stay awake during their work shift. Modafinil does not fix the root causes of these disorders. Treatment should be part of a larger medical plan. Understanding the 400mg Dose The recommended adult dose of Modafinil for narcolepsy and obstructive sleep apnea is 200mg once a day. For shift work disorder doctors usually suggest 200mg taken one hour before the work shift starts. Even though some studies have looked at doses up to 400mg per day and found that people can tolerate them the medicine’s instructions say there is no proof that 400mg gives more benefit than 200mg a day. Because of that taking an amount does not automatically mean stronger or better results. The right dose depends on the person’s condition how they respond to treatment other medicines they take and overall health. A doctor should decide if a larger dose is right. How Modafinil Works Modafinil helps people stay awake. Scientists do not yet know all the ways it works. Modafinil changes brain chemicals and works with dopamine transport. Because of these changes Modafinil can make people more alert and cut down on sleepiness. Modafinil’s purpose is not just to act like a stimulant that keeps people awake. Modafinil is given for medical conditions where too much sleepiness is a known symptom. Using Modafinil for tiredness or normal lack of sleep is not the same as using it for an approved medical purpose. Common Side Effects Like medicines that doctors prescribe Modafinil can cause side effects. Common side effects reported are headache, nausea, nervousness, anxiety, diarrhea, dizziness and trouble sleeping. Some people may also have appetite or dry mouth. Side effects can differ from person to person. May become clearer when the dose changes. If someone has bothersome symptoms they should talk to a doctor instead of changing the dose on their own. Serious Safety Considerations In cases Modafinil can cause serious reactions. Skin reactions, such as rashes have been reported and may need immediate medical care. Swelling, breathing problems or signs of an allergy also need quick attention. Modafinil can mix with medicines and may lower the effectiveness of hormonal birth control. People who take prescription medicines, birth control or other treatments should give their doctor a list of all medicines before starting Modafinil. Who Should Use Extra Caution? People who have heart, mental, liver or kidney problems may need extra medical review before using Modafinil. A history of blood pressure, heart disease, anxiety, depression or other mental health issues should be talked about with a doctor. Modafinil can also disturb sleep if taken late in the day. Since people react differently doctor supervision is especially important when thinking about a daily dose like 400mg. Final Information Modafinil 400mg is a dose, not the normal dose for most approved uses. Doctors say that 200mg once a day is the recommended adult dose for narcolepsy and obstructive sleep apnea and studies on 400mg have not shown clear extra benefit, over 200mg. Therefore Modafinil should be used with professional medical advice. Knowing Modafinil’s purpose dosing rules, possible side effects, medicine interactions and safety warnings gives a view of Modafinil. Anyone who wants to change the dose should talk to a doctor instead of increasing or decreasing it on their own.
If you share your life with a dog or a cat, you know grooming is more than a haircut — it is part of their health. But getting your pet to the groomer can be a hassle: traffic, waiting rooms, and anxious pets. That is the problem Groomeer was built to solve. Groomeer is a mobile pet grooming platform that connects pet owners with local professional groomers. Instead of driving across town, you book a vetted groomer nearby and the grooming comes straight to your doorstep. Booking takes minutes. Browse nearby groomers, check their services and reviews, pick a time that works for you, and relax at home while your pet gets pampered by a professional. No cages, no long waits, no stressful car rides. Whether your dog needs a full bath and haircut or your cat needs a gentle deshedding session, Groomeer makes at-home grooming simple, safe, and convenient. Every groomer on the platform is vetted, so you can book with confidence. Tired of the trip to the salon? Visit Groomeer and bring the grooming salon to your door.
넛지헬스케어의 현재 채용 규모와 직무 분포 채용 페이지를 새로고침하며 어떤 직무가 나를 기다리고 있는지 궁금하신가요. 넛지헬스케어는 현재 총 24개의 개발 공고를 게시하고 있습니다. 가장 많은 비중을 차지하는 분야는 모바일로, 총 9개의 공고가 올라와 있습니다. 뒤를 이어 백엔드 5개, 데이터 4개, 프론트엔드 4개 순으로 채용이 진행 중입니다. 전체적인 채용 흐름은 산업기능요원과 병역특례, 그리고 채용전환형 인턴에 집중되어 있습니다. 아래는 전체 직무별 현황입니다. 공고 제목 직무 경력 원티드 포함 [캐시워크] Flutter개발 병역특례 모바일 표기 없음 O [캐시워크] Flutter개발 채용전환형 인턴 모바일 신입·무관 O [캐시워크] iOS개발 병역특례 모바일 표기 없음 O [캐시워크] iOS개발 채용전환형 인턴 모바일 신입·무관 O [캐시워크] 안드로이드개발 병역특례 모바일 표기 없음 O [캐시워크] 안드로이드개발 채용전환형 인턴 모바일 신입·무관 O [캐시워크애즈] Flutter개발 산업기능요원 모집 모바일 표기 없음 O [캐시워크애즈] iOS개발 산업기능요원 모집 모바일 표기 없음 O [캐시워크] 데이터분석 담당 병역특례 데이터 표기 없음 X [캐시워크] 데이터분석가 데이터 표기 없음 X [캐시워크] 데이터엔지니어 병역특례 데이터 표기 없음 O [캐시워크] 데이터엔지니어 채용전환형 인턴 데이터 신입·무관 X [캐시워크] 백엔드/서버 개발자 백엔드 3~4년 이상 X [캐시워크] 백엔드개발 채용전환형 인턴 백엔드 신입·무관 O [캐시워크] 백엔드개발(Node.js) 병역특례 백엔드 표기 없음 O [캐시워크애즈] 백엔드개발 산업기능요원 모집 백엔드 표기 없음 O [킬로] 백엔드개발 산업기능요원 모집 백엔드 표기 없음 X [캐시워크] 프론트엔드개발 병역특례 프론트엔드 표기 없음 O [캐시워크] 프론트엔드개발 채용전환형 인턴 프론트엔드 신입·무관 O [캐시워크애즈] 프론트엔드개발 산업기능요원 모집 프론트엔드 신입·무관 O [킬로] 프론트엔드개발 산업기능요원 모집 프론트엔드 신입·무관 X 연차별로 확인하는 채용 우선순위 넛지헬스케어의 채용 공고는 경력 사항에 따라 크게 세 분류로 나뉩니다. 가장 많은 공고는 경력이 명시되지 않은 '표기 없음' 그룹으로, 주로 병역특례 대상자를 찾고 있습니다. 다음은 '신입·무관' 그룹으로 채용전환형 인턴십이 주를 이룹니다. 유일한 경력직 공고는 3~4년 이상의 백엔드/서버 개발자 모집입니다. 경력직 지원자라면 자신의 경험이 3년 이상인지, 특히 백엔드 기술 스택과 부합하는지 먼저 살피시기 바랍니다. 경력 구분 공고 수 표기 없음 14 신입·무관 9 3~4년 이상 1 넛지헬스케어가 요구하는 핵심 기술 스택 데이터에 따르면 넛지헬스케어는 AWS 환경에서 운영되는 서비스에 집중하고 있습니다. 가장 빈번하게 요구되는 기술은 AWS(12건)이며, 다음으로 GraphQL(10건)과 REST API(10건)가 상위권을 차지합니다. 또한 DynamoDB(8건), Mysql(7건)과 같은 데이터베이스 역량을 강조하고 있으며, 백엔드에서는 Express(5건), 프론트 및 모바일 분야에서는 Android나 Elasticsearch(5건) 활용 능력을 중요하게 생각합니다. 본인이 지원할 직무가 위 기술 중 무엇을 사용하는지 매칭해 보는 과정이 필요합니다. 자체 채용 페이지와 원티드, 어떻게 다른가 원티드에는 넛지헬스케어의 개발 공고가 6개 등록되어 있습니다. 주로 [병역특례 현역/보충역]이라는 타이틀을 달고 안드로이드, 프론트엔드, 백엔드 직무 위주로 올라와 있습니다. 반면, 자체 채용 페이지에는 채용전환형 인턴십과 다양한 서비스(캐시워크애즈, 킬로 등)별로 세분화된 공고가 24개나 존재합니다. 원티드만 확인해서는 알 수 없는 기회가 공식 채용 페이지에는 더 많이 숨어 있습니다. 원티드에는 없는 데이터분석가나 구체적인 인턴십 공고를 찾는다면 공식 홈페이지 방문이 필수입니다. 지원을 위해 준비해야 할 핵심 포인트 제 판단으로는 넛지헬스케어 지원을 위해서는 우선적으로 본인의 기술 스택이 AWS 및 GraphQL 환경에서 어떻게 비즈니스 가치를 창출할 수 있는지를 이력서에 명확히 기술해야 합니다. 3~4년 차 백엔드 지원자라면 Node.js 기반의 서비스 운영 경험과 DynamoDB를 활용한 데이터 모델링 역량을 강조하는 것이 유리합니다. 병역특례나 인턴 지원자라면 기술 스택에 대한 깊은 이해보다는, 왜 넛지헬스케어의 서비스를 개발하고 싶은지에 대한 고민과 기초적인 컴퓨터 공학 지식을 충실히 준비하십시오. 이 숫자로 말하지 않는 것 본 글에 포함된 수치는 넛지헬스케어의 공식 채용 페이지와 원티드 플랫폼의 정보를 바탕으로 2026년 10월 3일 13:00 KST 기준으로 추출한 결과입니다. 표본은 넛지헬스케어 1개 기업이며, 원티드와의 비교는 해당 시점의 데이터에 기반합니다. 기술 스택의 우선순위는 공고의 상세 내용에서 언급된 키워드를 빈도순으로 계산한 것이며, 실제 업무에서의 비중과는 차이가 있을 수 있습니다. 그래서 무엇을 하면 좋을까요 오늘 바로 실천할 수 있는 일은 넛지헬스케어 채용 페이지에 방문하여, 내가 가진 기술 스택이 언급된 공고의 JD를 모두 복사해 나만의 '합격 키워드' 리스트를 작성하는 것입니다. 제가 만드는 tailf는 매일 바뀌는 채용 페이지의 공고를 잠금화면에서 한 줄로 확인하게 해 줍니다. 앱에서 본인이 주로 사용하는 기술 스택 두 개를 고르면, 지난 30일간의 관련 공고 수를 로그인 없이 즉시 확인할 수 있습니다. 내 기술로 지난 30일 공고 세어 보기 → 다음 화 다음 화에서는 또 다른 기업의 채용 페이지를 들여다보고 데이터가 가리키는 개발자 시장의 흐름을 정리하겠습니다. 보고 싶은 회사가 있다면 댓글로 남겨 주세요.
회고 기간: 26년 9월 28일 ~ 10월 2일 시작하며 지금까지는 LangChain·LangGraph 위에서 에이전트와 RAG를 만드는 "프레임워크 레벨"의 학습이 이어졌다면, 이번 주는 한 단계 더 아래와 위로 동시에 내려가고 올라간 한 주였다. MCP(Model Context Protocol)로 "모델이 외부 도구·서버와 어떻게 표준화된 방식으로 통신하는가"를 배웠고, HuggingFace 생태계 실습에서는 반대로 "모델 내부에서 웨이트가 실제로 어떻게 forward 연산으로 이어지는가"를 바닥까지 내려가서 확인했다. Liked MCP 실습에서 client.py 가 session.list_tools() 로 받아온 MCP 서버의 도구 목록을, OpenAI 스타일의 {"type": "function", "function": {...}} 스키마로 변환해 llm.bind_tools() 에 그대로 넘기는 구조가 인상 깊었다. MCP 서버가 어떤 Tool을 갖고 있는지 클라이언트가 미리 알 필요 없이, 런타임에 서버와 대화하며 도구 목록을 동적으로 받아온다 는 점이, 지금까지 코드에 직접 @tool 함수를 나열해온 방식과 가장 크게 다른 부분이었다. tools_response = await session.list_tools() self.available_tools = [ { "type": "function", "function": { "name": tool.name, "description": tool.description, "parameters": tool.input_schema, }, } for tool in tools_response.tools ] self.llm_with_tools = self.llm.bind_tools(self.available_tools) server.py 에 등록된 도구 중 search_financial_guide 가, 예전에 RAG 실습에서 만들었던 "금융투자협회 투자길라잡이" FAISS VectorDB를 그대로 재사용하고 있다는 걸 발견한 게 반가웠다. 그동안 따로따로 배운 RAG와 MCP가, 실제로는 "RAG로 만든 검색 기능을 MCP Tool 하나로 노출해 다른 에이전트가 가져다 쓸 수 있게 한다"는 식으로 자연스럽게 이어진다는 걸 코드로 확인할 수 있었다. HuggingFace 실습 마지막 "from_pretrained 딥다이브"에서, safetensors 로 직접 읽은 텐서 딕셔너리만으로 GPT-2의 forward 연산(임베딩 → 12개 Attention/MLP 블록 → LayerNorm → weight tying)을 손으로 구현하고, 그 결과가 실제 HuggingFace 모델의 출력과 소수점 5자리( 8.39e-05 )까지 일치하는 걸 확인한 게 이번 주, 아니 지금까지의 실습 중에서도 손꼽히게 짜릿한 순간이었다. 심지어 이 수동 forward만으로 "Hello, my name is"에 이어 "John. I'm a writer, and"까지 자기회귀 생성에 성공했다. print("직접 구현 vs HF forward 최대 오차:", max_diff) # 8.39e-05 print("✅ 사실상 동일한가? (atol=1e-3)", torch.allclose(logits_scratch, logits_hf, atol=1e-3)) # True Lacked HuggingFace 실습 초반에 "GPU: NVIDIA RTX 4090 (8GB VRAM)"라는 실습 환경 안내가 있었는데, 실제로 노트북을 실행한 로컬 환경에서는 ⚠️ CUDA GPU를 찾을 수 없습니다 가 떴다. 결국 FP16 모델로 "파이썬의 장점 3가지" 하나를 생성하는 데 1671초(약 28분)가 걸렸고, 처리 속도도 초당 0.1 토큰에 그쳤다. 처음엔 코드가 멈춘 줄 알고 당황했는데, 알고 보니 CPU로 1.5B 모델을 돌리고 있었던 것이었다. RunPod 같은 클라우드 GPU 환경이 왜 필요한지, 이 느린 로컬 실행을 직접 겪고 나서야 체감했다. 더 헷갈렸던 건, 같은 CPU 환경인데도 4bit 양자화 모델이 FP16 모델보다 오히려 훨씬 빨랐다 는 점이다. FP16은 초당 0.1토큰, 4bit는 초당 3.6토큰으로 36배 가까이 차이가 났다. 처음엔 "양자화는 메모리만 아끼고 속도는 비슷하거나 더 느릴 것"이라고 생각했는데, CPU에서는 가중치 자체의 크기가 작아지면 메모리에서 읽어오는 양이 줄어들어 오히려 속도에 더 유리할 수 있다는 걸, 직접 두 숫자를 비교하고서야 알게 됐다. FP16 : ⏱️ 소요 시간: 1671.24초 | ⚡ 처리 속도: 0.1 tokens/sec 4bit : ⏱️ 소요 시간: 35.42초 | ⚡ 처리 속도: 3.6 tokens/sec Learned MCP (Model Context Protocol) 클라이언트-서버 구조 client.py 는 stdio_client 로 MCP 서버 프로세스를 띄우고 ClientSession 을 생성해 session.initialize() 로 연결을 초기화한 뒤, session.list_tools() 로 받은 도구 목록을 LangChain의 bind_tools() 형식으로 변환했다. LLM이 tool_calls 를 반환하면 session.call_tool(name, arguments) 로 실제 MCP 서버의 도구를 호출하고, 그 결과를 ToolMessage 로 감싸 다시 LLM에 전달해 최종 답변을 받는 흐름은, 지난주 배운 로컬 @tool Function Calling과 거의 동일한 패턴이었다. 다른 점은 도구가 "내 파이썬 코드 안"이 아니라 "별도 프로세스로 뜬 MCP 서버 안"에 있고, 그 목록을 런타임에 동적으로 받아온다는 것이었다. server.py 는 @mcp.tool() 로 계산기(AST 샌드박스 기반 safe_calculate ), 날씨 조회(Open-Meteo API), 웹 검색(Tavily), 구글 캘린더 일정 조회, 그리고 금융 문서 VectorDB 검색( search_financial_guide )까지 5개의 외부 어댑터를 도구로 등록했다. @mcp.resource() 로는 시스템 정보( system://info )와 앱 사용 가이드( config://app-guide ) 같은, Tool과는 성격이 다른 "읽기 전용 정보"도 함께 노출할 수 있다는 걸 확인했다. 각 Tool은 외부 서비스 연동 로직( WeatherAdapter , TavilySearchEngine , GoogleCalendarAdapter , VectorDBAdapter )을 별도 어댑터 클래스로 분리해두고, Tool 함수 자체는 그 어댑터를 호출해 결과를 포맷팅하는 얇은 래퍼 역할만 한다는 구조적 특징도 눈에 띄었다. HuggingFace 생태계와 파인튜닝 이전 단계 - 모델 내부 들여다보기 AutoModelForCausalLM / AutoTokenizer 로 Qwen2.5-1.5B-Instruct를 로딩해 FP16 수동 생성과 pipeline API 추론을 비교했고, BitsAndBytesConfig 로 NF4 4bit 양자화(QLoRA 논문에서 제안된 기법, 이중 양자화로 추가 메모리 절약)를 적용해 FP16 대비 메모리 절약 효과를 확인했다. 가장 핵심적인 배움은 "심화" 섹션이었다. hf_hub_download 로 config.json (모델 설계도)과 model.safetensors (가중치 파일)를 직접 받아, safetensors.torch.load_file 로 {이름: 텐서} 딕셔너리를 열어봤다. AutoModelForCausalLM.from_config() 로 랜덤 웨이트짜리 모델 뼈대를 만든 뒤, load_state_dict() 가 이름 문자열 매칭 만으로 체크포인트 텐서를 모델에 할당한다는 걸 직접 재현했다. 마지막으로 이 모든 텐서를 nn.Module 없이 순수 행렬곱(Attention, MLP, LayerNorm, weight tying)으로만 이어붙인 수동 forward 함수를 작성해, 실제 HuggingFace 모델과 동일한 출력을 얻어냈다. from_pretrained() 한 줄이 사실은 "다운로드 → 스켈레톤 생성 → state_dict 로드 → 이름 매칭 할당"이라는 네 단계의 자동화일 뿐이라는 게, 이 실습 전체의 결론이었다. 참고로 이번에 다룬 노트북은 LoRA·Trainer 기반의 실제 파인튜닝 학습 코드까지는 포함하지 않았고, "LoRA 어댑터 파일이 왜 작은가?"(전체가 아닌 일부 이름의 저랭크 텐서만 저장되기 때문)처럼 다음 단계인 파인튜닝을 이해하기 위한 밑그림(모델 구조와 웨이트 로딩 메커니즘)을 다지는 내용이었다. 이번 주는 MCP로 "도구가 표준화된 프로토콜을 통해 모델과 분리된 채로 연결된다"는 확장성의 측면과, HuggingFace 딥다이브로 "그 모델이라는 것도 결국 이름 붙은 텐서 뭉치와 그 텐서들의 정해진 행렬곱일 뿐"이라는 환원주의적인 이해를, 같은 한 주 안에서 양쪽으로 경험한 게 특히 기억에 남는다. 특히 직접 구현한 forward가 HuggingFace의 공식 구현과 소수점 단위까지 일치하는 걸 확인한 순간 은, 그동안 블랙박스로만 여겼던 from_pretrained() 라는 한 줄이 실은 전혀 신비로운 게 아니라는 걸 몸으로 확인시켜준 경험이었다.
화면에서 자연스럽게 읽히는 문장이 노래로도 자연스러운 것은 아닙니다. 한 줄에 정보가 너무 많거나, 긴 음에 놓일 단어가 어색하거나, 숨을 쉴 곳이 없을 수 있습니다. 가사 초안을 받았을 때 바로 완성곡으로 넘기기 전에 할 수 있는 작은 점검을 정리했습니다. 저는 Creatune 팀의 Alex입니다. 이 글은 작업 방법과 템플릿을 설명합니다. 아래 문장은 설명을 위해 쓴 예시이며, AI로 생성하거나 실제 곡에 넣어 시험한 결과가 아닙니다. 문장의 역할을 한 가지로 정하기 먼저 한 줄이 해야 할 일을 정합니다. 장면을 보여 주는 줄인지, 감정을 말하는 줄인지, 후렴의 핵심 문장을 반복하는 줄인지 구분합니다. 예를 들어 다음 두 문장은 같은 장면을 다른 밀도로 표현합니다. 불 꺼진 역 앞에서 나는 아직도 너를 기다리고 있어 불 꺼진 역 앞에, 아직 너를 기다려 짧은 문장이 항상 더 좋은 가사는 아닙니다. 두 번째 문장이 첫 번째 문장의 말투나 의미를 얼마나 바꾸는지도 확인해야 합니다. 이 비교의 목적은 글자 수를 줄이는 것이 아니라, 한 프레이즈에 무엇을 남길지 결정하는 것입니다. 글자 수와 노래할 시간을 구분하기 같은 글자 수라도 받침, 발음의 연결, 빠른 단어 묶음에 따라 입에 걸리는 정도가 다릅니다. 또한 텍스트만으로는 박자와 멜로디가 정해지지 않습니다. 멜로디가 있다면 그 프레이즈에 맞춰 읽거나 불러 봅니다. 아직 멜로디가 없다면 편안한 속도로 소리 내어 읽어 문장이 꼬이는 위치를 표시합니다. 이때는 노래에 맞는다고 판정하는 것이 아니라, 문장의 문제를 미리 찾는 과정이라고 기록합니다. 점검 확인할 것 섣불리 결론 내리지 않을 것 의미 한 번에 이해되는 장면이나 감정 짧으면 무조건 좋다는 판단 발음 반복해서 입에 걸리는 구간 글자 수만으로 정한 난이도 호흡 자연스럽게 잠시 쉬는 위치 모든 줄에 같은 호흡이 필요하다는 가정 강조 오래 남기고 싶은 단어 운율을 맞추기 위해 의미를 바꾸는 것 긴 음에 놓일 단어를 따로 보기 후렴에서 중요한 단어가 길게 이어질 예정이라면, 그 단어를 표시합니다. 노래에서는 어떤 모음을 늘려 부르고 어떤 받침을 마무리할지 판단해야 합니다. 단어 전체를 글자 단위로 똑같이 늘리는 것이 아닙니다. 다만 실제 멜로디와 가창 없이 텍스트만 보고 가능 여부를 확정하지 않습니다. 후보 단어를 남겨 두고, 곡이 생긴 뒤 다시 확인합니다. 가수의 발음과 스타일도 결과에 영향을 줍니다. 첫 수정에서는 운율을 잠시 보류하기 운율을 맞추려다 보면 화자가 쓰지 않을 법한 표현이 들어가거나, 사건의 시점이 바뀔 수 있습니다. 먼저 의미, 말투, 발음, 호흡을 확인한 뒤 운율을 다듬는 순서를 시도해 보세요. 한 번에 모든 줄을 바꾸기보다, 문제가 분명한 한 줄을 고릅니다. 원문을 남기고 후보를 나란히 읽습니다. 의미를 지키는 수정인지, 새로운 내용을 쓴 것인지도 구분합니다. 줄의 역할: 역 앞에서 기다리는 장면 지킬 것: 장소, 기다림, 화자의 말투 문제: 한 호흡에 정보가 많음 수정: 문장 한 부분만 줄이기 미확인: 실제 멜로디에서의 발음과 호흡 도구가 만든 초안과 채택한 가사를 구분하기 Creatune AI 가사 생성기 는 주제와 음악 방향을 바탕으로 가사 초안을 준비할 때 사용할 수 있는 후보 도구입니다. 현재 입력 항목, 생성 조건과 다음 단계는 실제 화면에서 확인하세요. 가사 생성이 곧 멜로디에 맞춘 음절 배치를 보장하는 것은 아닙니다. 생성 초안, 수정 초안, 곡에 넣어 확인한 가사를 별도로 저장하면 무엇을 검토했는지 알 수 있습니다. 완성된 음원이 생기면 실제로 들리는 단어, 프레이즈 사이의 호흡, 반복되는 후렴의 의미를 다시 확인합니다. 가사 검토를 “문장이 예쁜가”에서 끝내지 않고, “어떤 내용을 어떤 호흡으로 전달할 것인가”까지 가져가는 것이 이 체크의 목적입니다.
07장 데이터 정제 01) 결측치 찾기 결측치 : 누락된 값, 비어 있는 값 결측치는 따옴표 없이 NA 로 표기한다 is . na ( ) 를 이용하면 데이터에 결측치가 있는지 확인할 수 있다 (is it NA?) (예) is.na(df) # df에 결측치가 있는가? 결측치 = TRUE / 결측치 아닌 값 = FALSE 로 결과가 나온다 is . na ( ) 를 table ( )에 적용하면 데이터에 결측치가 총 몇 개 있는지 알 수 있다 (예) table(is.na(df)) # df 속에 있는 결측치 개수 출력 어떤 변수에 결측치가 있는지 알려면 (예) table(is.na(df$sex)) # sex 결측치 빈도 출력 (FALSE와 TRUE로 각각의 개수가 나옴) 결측치가 포함된 데이터에 함수를 적용하면 연산이 되지 않고 NA가 출력된다 (mean 또는 sum 적용하면 NA 출력) 02) 결측치 제거하기 결측치 있는 행 제거하기 아니다(not)을 의미하는 !를 붙인 ! is.na( ) 는 결측치가 아닌 값 을 의미한다. 이를 filter( )에 적용하면 결측치를 제외하고 행을 추출한다. 예) df %>% filter(!is.na(score))** #score에서 결측치 제외하고 출력 이렇게 결측치 제거하면 다시 연산이 되고.. 여러 변수 동시에 결측치 없는 데이터만 추출하기 위의 (예)는 score 변수의 결측치만 제거한 채로 결과가 나왔다. 이제 score과 sex 두 변수가 동시에 결측치 없는 데이터만 추출하도록 해보자. (예) df %>% filter(!is.na(score) & !is.na(sex)) #score, sex 모두 결측치 제거 일일이 변수를 지정하지 않고 결측치가 있는 모든 행을 한번에 제거하기 na.omit( ) 을 이용한다. 위의 예는 사실 간편하게 na.omit(df) 라고 하면 모두 해결된다. 03) 결측치를 알아서 제거하고 연산하는 기능 이용하기 - na.rm 함수는 원래 데이터에 결측치가 있으면 계산을 하지 못하지만, na.rm을 TRUE로 설정 하면 결측치를 제외하고 함수를 적용할 수 있다. ( 단, 모든 함수가 이를 지원하는 것은 아니다) (예1) mean(df$score, na.rm = T ) #결측치를 제외하고 평균 산출 이는 mean, sum, median 등의 수치 연산 함수들에도 적용 가능하다. 04) 결측치 대체하기 데이터가 작고 결측치가 많을 경우, 결측치를 제거하면 너무 많은 데이터가 손실돼 분석결과가 왜곡되는 문제가 발생한다. 따라서 제거하는 대신, 다른 값들을 채워 넣는 방법을 사용한다. 평균값으로 결측치 대체하기 (1) 평균값 구하기 mean(exam$math, na.rm = T) # NA를 remove하고 math의 평균값을 구한다 (2) ifelse( )를 이용해서 (1)에서 구한 평균값으로 NA를 대체한다 exam $ math <- ifelse(is.na(exam $ math), 55, exam$math) 04) 이상치 정제하기 이상치 : 정상 범주에서 크게 벗어난 값 이상치를 결측치로 변환하기 : ifelse( )를 이용해 이상치일 경우 NA를 부여한다 (예) sex에는 1, 2만 존재함 만약 sex가 3인 이상치가 있으면 NA를 부여함 outlier$sex <- ifelse(outlier $ sex == 3, NA, outlier $ sex) 이제 분석할 때 결측치를 제외하면 된다 filter를 이용해 결측치를 제외한다 (예) outlier %>% filter(!is.na(sex) & is.na(score)) +) 이상치 제거하기 - 극단치 극단치 : 논리적으로 존재할 수는 있으나 극단적으로 크거나 작은값 ** (1) 상자 그림으로 극단치 기준 정하기** -사분위수 Q1 : 하위 25% 가운데 노란선 : 하위 50%(=중앙값) Q3 : 하위75% 선 바깥의 점 표시 : 극단치 (2) 상자그림 만들 때 필요한 다섯가지 통계치 출력 (status) boxplot(mpg$hwy)$status 08장 그래프 만들기 01) 산점도(scatter plot) : 데이터를 x축과 y축에 점으로 표현한 그래프 [ 산점도 그래프 만들기 ] 1. 배경 설정하기 (그래프가 그려질 배경) (예) # x축은 displ, y축은 hwy로 지정해 배경 생성 -> ggplot(data = mpg, aes(x = displ, y = hwy)) data 에는 그려질 데이터 를, aes 에는 x축 y축 의 변수를 넣는다 2. 그래프 추가하기 (geom_point) 1번에서의 배경에 +기호를 더해 그래프 유형을 지정한다 -> ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point( ) (이때, geom_point는 산점도를 그리는 함수다) 3. 축 범위를 조정하는 설정 추가하기 축 범위는 xlim( )과 ylim( )을 이용해 지정한다 (예) xlim(3, 6) : x축 범위를 3~6으로 지정 02) 막대 그래프 (Bar Chart) [ 평균 막대그래프 만들기 ] 집단별 평균표 만들기 그래프 생성하기 (geom_col) -> ggplot(data = df_mpg, aes(x=drv, y= mean_hwy)) + geom_col( ) 3. 크기 순으로 정렬하기 : reorder( )를 사용하면 크기 순으로 정렬할 수 있다 [ 빈도 막대그래프 만들기 ] : y축 없이 x축만 지정 / geom_col( ) 대신 geom_bar( ) 사용 -> ggplot(data = mpg, aes( x=drv )) + * geom_bar( ) * 정리하자면, 평균 막대그래프는 평균표 를 먼저 만든 후 생성되고 빈도 막대그래프는 별도로 표를 만들지 않고 원자료 를 이용해 바로 만든다 03) 선그래프 (Line Chart) [ 시계열 그래프 만들기 ] ggplot2 패키지에 있는 economics 데이터를 이용해 시계열 그래프를 만들어보자. x축에는 시간을 의미하는 date y축에는 실업자 수를 의미하는 unemploy를 지정하고 선그래프로 표현하기 위해 geom_line( )을 추가한다. -> ggplot(data = economics, aes(x= date, y= unemploy)) + geom_line( ) 04) 상자그림 (Box Plot) [ 상자그림 만들기 ] data , x축 y축 지정한 후 geom_boxplot( ) 추가 09장 데이터분석 프로젝트 - '한국인의 삶을 파악하라!'