Stripe가 개발자 경험에 성공한 비밀과 Kinde가 바꾸는 미래
Stripe의 혁신적인 개발자 경험과 Kinde가 이끄는 인증 시스템의 미래를 살펴보고, 개발자 친화적 솔루션 도입 인사이트를 제공합니다.
Shelled AI (한국)
© 2025 Shelled Nuts Blog. All rights reserved.
Capture your moments quietly and securely
Stripe의 혁신적인 개발자 경험과 Kinde가 이끄는 인증 시스템의 미래를 살펴보고, 개발자 친화적 솔루션 도입 인사이트를 제공합니다.
Shelled AI (한국)
복잡한 환경에서 에이전트 협업 시뮬레이션 실습을 통해 멀티 에이전트 시스템의 실제 적용과 사례를 단계별로 체험해보세요.
Shelled AI (한국)
한 번의 API 호출로 인증과 결제를 동시에 처리하는 비밀 패턴을 소개합니다. 개발 효율과 보안을 동시에 향상시키는 최신 웹 개발 팁!
Shelled AI (한국)
어, 또 만났네요! 지난번 "2024년 최신 AI 에이전트와 RAG 활용 LLM 앱 7가지 완벽 가이드" 글, 어떠셨나요? 댓글을 보니 지식 그래프 구축과 시맨틱 검색 엔진 개발에 대한 궁금증이 정말 많더라고요. 그래서 오늘은 이 주제를 제대로 파헤쳐보려고 합니다.
저도 처음엔 “지식 그래프”라는 말이 왜 이렇게 어렵게 느껴졌는지 몰라요. 시맨틱 검색이 기존 검색과 뭐가 다른지 헷갈리기도 했고요. 그런데 실제 프로젝트에 적용해보니, 데이터의 ‘의미’와 ‘연결성’을 제대로 이해하는 게 얼마나 중요한지 뼈저리게 느꼈습니다. 이제는 데이터 과학자, 검색 엔진 개발자, 그리고 의료 정보 시스템 전문가까지 모두가 주목하는 기술이죠.
오늘은 지식 그래프의 기본 개념부터 실제 구축 방법, 그리고 시맨틱 검색 엔진을 통해 어떻게 더 똑똑한 검색 환경을 만들 수 있는지 단계별로 안내해드릴게요. 읽고 나면, 단순 키워드 매칭을 넘어 사용자의 ‘의도’를 이해하는 검색 시스템을 설계할 수 있는 역량이 한층 업그레이드될 겁니다. 완벽하지 않아도 괜찮으니, 저와 함께 한 걸음씩 배워가보시죠!
여러분, “지식 그래프”라는 말 들어보셨나요? 요즘 네이버, 구글 같은 검색 엔진에서 자주 언급되는 단어인데, 처음 들으면 좀 낯설죠. 저도 처음엔 "이게 도대체 뭐지?" 싶었거든요. 그런데 알고 나면 정말 검색의 판을 바꿀 만한 기술이더라고요.
지식 그래프란, 현실 세계의 모든 요소(‘개체’)와 이들 사이의 관계를 일종의 ‘그래프’ 구조로 만든 데이터베이스입니다. 예를 들어 "이순신"이라는 인물과 "한산도 대첩"이라는 사건이 있다면, 두 개체가 "지휘자"라는 관계로 연결되는 식이죠. 여기서 개체(Entity), 속성(Attribute), 관계(Relationship), 그리고 온톨로지(Ontology)라는 용어가 나옵니다.
온톨로지가 잘 정리되어야 그래프가 엉키지 않고, 나중에 검색할 때도 정확합니다. 저도 온톨로지 설계하다가 데이터가 꼬여서 한참을 다시 고친 적이 있어요. 실수는 누구나 하죠. 여러분도 이런 경험 있으셨나요?
시맨틱 검색 엔진은 뭘까요? 기존 검색 엔진이 단순히 "키워드"만 보고 결과를 보여줬다면, 시맨틱 검색은 사용자의 질문이 뭘 의미하는지, 그 의도를 파악해서 더 정확한 답을 줍니다. 예를 들어, "한국에서 가장 높은 산은?" 이렇게 검색하면, 단순히 ‘한국’과 ‘산’이라는 단어가 들어간 문서만 보여주는 게 아니라, ‘한라산’이라는 개체를 지식 그래프에서 찾아서 딱 집어주는 거죠.
예전에 "서울에서 한강 보이는 카페 추천"이라고 검색했는데, 한강이랑 카페 키워드만 들어간 엉뚱한 결과가 많았던 기억, 다들 있으시죠? 그런데 요즘은 시맨틱 검색 덕분에 실제로 한강뷰가 보이는 카페 리스트가 쫙 나오더라고요. 기술의 발전이 체감되는 순간이었습니다.
실무에서 지식 그래프 구축할 때 팁을 드리자면, 데이터 정제 진짜 꼼꼼히 하셔야 해요. 저도 처음에 그냥 크롤링한 데이터로 그래프 만들었다가, 엉뚱한 관계가 막 생성돼서 한동안 고생했었거든요. 온톨로지 설계도 꼭 전문가랑 상의해서 진행하세요! 저도 아직 배우는 중이라, 실수하면서 많이 배우고 있습니다.
이렇게 지식 그래프와 시맨틱 검색 엔진을 잘 활용하면, 우리 서비스의 검색 품질이 한 단계 업그레이드될 수 있다는 점, 오늘 꼭 기억해두세요!
온톨로지 기반 모델링과 자연어 처리(NLP) 활용, 이 두 가지가 실제로 어떻게 결합되는지 궁금하지 않으세요? 저도 처음엔 "온톨로지? 그냥 데이터 구조화 아닌가?" 싶었는데, 직접 해보니 완전히 다른 차원의 설계더라고요.
온톨로지는 어떤 도메인(예: ‘한국 박물관 정보’) 내에서 중요한 개체(박물관, 도시 등)와 이들 사이의 관계(위치, 소유자 등)를 논리적으로 정리한 설계도입니다. 예전에 지식 그래프 프로젝트를 할 때, 그냥 엑셀에 데이터 쫙~ 정리한 거랑 온톨로지로 구조화한 거랑 비교해봤는데, 데이터 연결성과 확장성에서 천지 차이 나더라고요. 데이터가 커질수록 관리가 힘들어진 경험, 여러분도 있으시죠?
온톨로지 설계에서 가장 중요한 건 “개체의 고유성”과 “관계의 명확성”입니다. 예를 들어, ‘서울’이라는 도시와 ‘박물관’이라는 유형이 헷갈리지 않게 각각을 명확하게 정의하고, ‘서울에 위치한 박물관’이라는 관계도 딱 떨어지게 설계해야 하죠. 그리고 RDF(리소스 설명 프레임워크), OWL(웹 온톨로지 언어) 같은 표준 언어로 모델링하면, 글로벌 시스템과도 호환이 쉬워집니다.
@prefix ex: <http://example.org/> .
ex:Seoul a ex:City .
ex:Museum a ex:Place .
ex:NationalMuseumOfKorea a ex:Museum ;
ex:locatedIn ex:Seoul .
딱 봐도 ‘국립중앙박물관’이 ‘서울’에 위치했다는 관계가 명확하죠? 이렇게 URI로 개체를 고유하게 식별하는 게 핵심이에요.
온톨로지만 잘 짜놔도, 사용자가 “서울에 있는 박물관 알려줘”라고 물으면, 이걸 알아듣고 적절히 매핑해야 하잖아요? 처음엔 “그냥 키워드 매칭하면 되지”라고 생각했는데, 실제로 적용해보니 ‘서울 박물관’처럼 단어만 뽑아서는 모호한 경우가 많았어요. 그래서 형태소 분석, 개체명 인식(NER), 의미역 결정 같은 NLP 기법들이 필요하더라고요.
예를 들어 Python의 KoNLPy
와 간단한 규칙을 섞어서 질의에서 핵심 개체/관계를 뽑아볼 수 있습니다:
from konlpy.tag import Okt
query = "서울에 위치한 박물관은?"
okt = Okt()
nouns = okt.nouns(query)
print(nouns) # ['서울', '위치', '박물관']
여기서 ‘서울’과 ‘박물관’이 주요 개체로 뽑히죠. 그런데 중요한 건, ‘위치’가 관계라는 점도 포착해야 해요. 이걸 온톨로지의 관계 속성(ex:locatedIn
)으로 자동 매핑할 수 있으면, 훨씬 똑똑한 검색 시스템이 되는 거죠.
실제로 저도 처음엔 NLP 모델이 엉뚱한 단어를 관계로 뽑는 바람에, 검색 결과가 완전 엉뚱하게 나온 적이 있었어요. 그래서 룰 베이스와 머신러닝 기반의 NER을 조합해서, 의미 분석 정확도를 높였습니다. 아직도 완벽하진 않지만, 계속 테스트하면서 개선 중이에요.
직접 해보면 머리 아플 때도 있지만, 결과가 맞아떨어질 때의 쾌감이 있답니다. 아직 저도 배우는 중이니, 같이 실수하면서 한 걸음씩 나아가봐요!
이번엔 그래프 데이터베이스와 임베딩 기반 벡터 검색에 대해 본격적으로 알아볼까요?
이 주제를 처음 접하면 좀 어렵게 느껴질 수 있는데요, 저도 예전에 Neo4j랑 Node2Vec을 붙여서 써보면서 “이걸 대체 어디에 어떻게 써먹지?” 싶었던 적이 많아요. 그런데 실제로 써보니, 데이터 간 복잡한 관계를 파악하고, 의미적으로 비슷한 엔티티를 찾는 데 정말 강력하더라고요!
그래프 데이터베이스는 ‘그래프’ 구조—노드(점)와 엣지(선)—를 데이터 저장 방식으로 삼는 DB입니다. 흔히 쓰는 테이블 기반 RDB랑은 다르게, 친구 추천, 소셜 네트워크, 추천 시스템 등 ‘관계’가 중요한 서비스에서 많이 써요.
예를 들어, 네이버 지식백과에서 “임베딩” 관련 개념들을 추적할 때 각 개념(엔티티)을 노드로, 개념 간 연결을 엣지로 표현할 수 있죠.
대표적인 제품으로는 Neo4j, Amazon Neptune, TigerGraph 등이 있고, 쿼리 언어로 Cypher(Neo4j), Gremlin, SPARQL 등이 있습니다.
MATCH (a:Person)-[:FRIEND]->(b:Person)-[:FRIEND]->(c:Person)
WHERE a.name = '철수'
RETURN DISTINCT c.name
‘철수’의 친구의 친구를 찾아주는 쿼리입니다. 저도 처음엔 이 패턴 매칭 문법이 헷갈렸는데, 몇 번 써보니까 금방 익혀지더라고요!
텍스트, 이미지, 그래프 등 다양한 데이터를 ‘벡터’(수치형 리스트)로 바꿔서, 기계가 의미적으로 비교할 수 있게 만드는 게 바로 임베딩입니다.
예를 들어, “강아지”와 “개”라는 단어를 BERT 같은 모델로 임베딩하면, 두 벡터의 거리가 아주 가깝게 나와요.
그래프 데이터에서도 마찬가지로, Node2Vec/GraphSAGE 같은 알고리즘을 써서 노드별 임베딩을 만들 수 있죠.
from node2vec import Node2Vec
import networkx as nx
G = nx.Graph()
G.add_edges_from([('철수', '영희'), ('영희', '민수'), ('철수', '민수')])
node2vec = Node2Vec(G, dimensions=8, walk_length=10, num_walks=100)
model = node2vec.fit(window=3, min_count=1, batch_words=4)
print(model.wv['영희'])
솔직히 처음엔 파라미터 튜닝하다가 값이 이상하게 나오기도 하고, “이게 진짜 의미 있는 관계를 잘 표현하나?” 고민도 많이 했어요. 그런데 시각화해서 가까운 노드들을 실제로 비교해보면, 확실히 연관도가 높게 나오는 게 보이더라고요!
임베딩 벡터가 만들어졌으면, 이제 유사도를 재는 게 핵심이죠.
보통 코사인 유사도나 내적(dot product) 계산을 많이 씁니다.
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
v1 = np.array([0.2, 0.8, 0.1])
v2 = np.array([0.1, 0.9, 0.2])
sim = cosine_similarity([v1], [v2])
print(f'코사인 유사도: {sim[0][0]:.4f}')
대규모 데이터라면?
FAISS, Annoy 같은 라이브러리로 근사 최근접 이웃(ANN) 검색을 써야 실시간 응답이 나옵니다.
제가 실제로 FAISS로 1백만 개 문서 임베딩 검색을 구현해봤는데, 진짜 쿼리 속도가 눈에 띄게 빨라서 “와, 이건 정말 물건이다” 싶었어요!
아직 저도 배우는 중이지만, 이 세 가지를 잘 조합하면
정말 ‘사람처럼’ 의미를 이해하는 검색 시스템, 만들 수 있습니다.
여러분도 작은 그래프와 임베딩부터 실습해보세요. 실수하면서 배우는 게 제일 빠르더라고요!
대규모 데이터 환경에서 ‘확장성’과 ‘실시간 데이터 업데이트’를 어떻게 구현할 수 있을까요? 저도 처음엔 “확장성? 실시간? 왠지 거창한데...” 싶었는데, 실제로 해보니 실무에서 꼭 필요한 부분이더라고요. 트래픽 급증이나 데이터 폭증 경험, 한 번쯤 있으셨죠? 저도 예전에 한 번 서버가 터질 뻔했던 기억이 있는데, 그때 이 구조에 미리 신경 썼으면 진짜 덜 고생했을 거예요.
확장성 하면 일단 ‘분산 시스템’이 먼저 떠오르죠. 한 서버에 모든 걸 몰아넣으면 언젠가는 한계가 오기 마련이니까요. 그래서 요즘은 지식 그래프나 시맨틱 검색 엔진 같은 서비스도 보통 샤딩(Sharding), 레플리케이션(Replication) 을 지원하는 그래프 데이터베이스(예: Neo4j, TigerGraph 등)를 많이 씁니다. 저도 Neo4j에서 샤딩을 적용해봤는데, 노드 수가 급격히 늘어나도 쿨하게 분산돼서 시스템이 버티는 걸 보고 “와, 이건 정말 신세계다!” 싶었죠.
그리고 마이크로서비스 아키텍처(MSA) 도 빼놓을 수 없습니다. 각 기능을 작은 서비스로 쪼개서, 필요할 때마다 ‘수평 확장’(서버 여러 개 늘리기)이 가능하거든요. 예를 들어 검색, 데이터 수집, 인덱싱을 각각 마이크로서비스로 분리하면, 갑자기 검색 트래픽이 폭증해도 그 부분만 확장해서 대응할 수 있어요.
실시간 데이터 반영, 요즘 사용자들은 진짜 ‘즉시성’에 예민하잖아요? 누가 기사 하나만 수정해도 바로 검색에 반영돼야 하고요. 이럴 때 이벤트 기반 아키텍처가 빛을 발합니다. Kafka나 RabbitMQ 같은 메시지 큐를 사용하면, 데이터가 바뀔 때마다 그 이벤트를 바로 처리할 수 있거든요.
예를 들어, 제가 실제로 Kafka로 실시간 데이터 파이프라인을 만들어봤는데, 데이터가 들어오자마자 Apache Flink로 변환해서 그래프DB와 검색 엔진에 동시에 반영할 수 있었습니다. 처음엔 흐름이 헷갈렸는데, 익숙해지니까 “이렇게 편할 수가!” 싶더라고요. 물론, 실수로 파이프라인 설정 잘못해서 데이터가 중복 반영된 적도 있지만, 이런 경험이 실력을 키워준다니까요.
여기서 중요한 게 있어요. 아무리 구조를 잘 짜도, 성능이 안 나오면 소용없잖아요? 그래서 캐싱과 인덱싱 전략을 꼭 챙겨야 합니다. 예를 들어, 자주 쓰는 쿼리 결과는 Redis 같은 인메모리 캐시로 미리 저장해두면, 트래픽이 몰려도 빠르게 응답할 수 있죠.
또, 시맨틱 검색에서는 역색인(inverted index) 이나 엔티티별 특성 인덱스 설계를 고민해야 해요. 저도 Elasticsearch로 역색인 설계하다가 쿼리 속도가 확 느려진 적이 있었는데, 필드별로 인덱싱 옵션을 조정하고 나서야 제대로 성능이 나왔어요.
실제로 해보면 처음엔 헷갈릴 수 있지만, 시행착오를 거치면서 점점 구조가 탄탄해지는 게 느껴질 거예요. 저도 아직 배우는 중이지만, 여러분도 겁먹지 말고 하나씩 도전해보세요!
실제로 지식 그래프와 시맨틱 검색이 어떻게 쓰이고 있는지, 현장에서 써보면서 느꼈던 점들을 같이 나눠볼게요. 구체적인 사례가 궁금하셨죠?
회사에서 자료 찾다가, "아니, 분명 비슷한 프로젝트가 있었는데 왜 아무리 찾아도 안 나오지?" 이럴 때 있으시죠? 저도 예전 회사에서 보고서 찾다가 파일 서버, 메신저, 메일까지 다 뒤진 적 있는데요. 이럴 때 지식 그래프가 진짜 빛을 발합니다.
지식 그래프는 내부 문서의 핵심 엔티티(예: 사업부, 담당자, 프로젝트명 등)를 노드로, 이들 간의 관계(참여, 참고, 의존 등)를 간선으로 연결해줍니다. 예를 들어, ‘2023년 마케팅 전략’ 보고서와 ‘SNS 광고 성과분석’ 보고서가 같은 부서, 같은 시기, 동일한 캠페인으로 연결되어 있으면, 관련성 높은 문서끼리 네트워크로 딱 보여줘요.
실제로 저희 회사에서는 이 시스템 덕분에, 신입사원도 복잡한 정책 문서나 과거 프로젝트 자료를 한눈에 파악할 수 있었습니다. 처음엔 시각화 화면이 헷갈렸는데, 익숙해지니까 중복 작업도 확 줄고, 회의 준비도 훨씬 쉬워졌죠.
팁: 파일명이나 폴더 구조에만 의존하지 말고, 문서 내 엔티티 태깅을 꼼꼼히 해두세요. 그래야 그래프가 제대로 그려집니다!
전자상거래 운영하시는 분들, 상품 추천 시스템 고민해보신 적 많으시죠? 예전엔 ‘비슷한 상품 더보기’ 정도였는데, 요즘 고객들은 ‘나만을 위한 추천’을 기대하잖아요.
지식 그래프와 시맨틱 검색을 쓰면, 상품 카테고리, 브랜드, 속성(예: 재질, 용도, 컬러), 사용자 행동(검색, 클릭, 찜, 구매 등)까지 다 연결해서 분석합니다. 예를 들어, "가벼운 러닝화 추천"이라고 검색하면, 단순히 ‘러닝화’ 키워드만 찾는 게 아니라, 실제로 무게가 가볍고, 운동용으로 설계된 신발을 추려서 보여줘요.
제가 직접 쇼핑몰 검색엔진을 튜닝하다가, 상품 설명에 ‘경량’이라는 단어가 안 들어가면 추천에서 빠지는 걸 보고, 상품 속성 데이터의 중요성을 뼈저리게 느꼈죠. 그러다 속성 정보를 그래프에 추가하니 추천 정확도가 확 좋아졌어요.
팁: 상품 데이터 입력할 때 속성, 카테고리, 연관태그를 꼭 표준화해서 입력하세요. 그래야 시맨틱 검색이 제대로 작동합니다.
의료 쪽은 워낙 데이터가 많고, 용어도 어려워서 진짜 헷갈리죠. 저도 처음에는 ‘시맨틱 검색’이 의료에서 얼마나 쓸모 있겠나 싶었는데, 직접 EMR(전자 의무기록)에 적용한 사례를 보고 생각이 달라졌어요.
예를 들어, 환자가 "최근에 숨이 차고, 밤에 기침이 심해요"라고 기록하면, 지식 그래프는 증상-질병-약물-연구논문 정보까지 연관 지어 보여줍니다. 이 시스템 덕분에 의사는 ‘심부전’, ‘천식’, ‘알레르기’ 등 관련 질병과 최신 치료법, 금기 약물까지 한 화면에서 볼 수 있어요. 진단 속도도 빨라지고 실수도 줄어듭니다.
실제로 의료진이 "비슷한 증상 환자 케이스"를 찾다가, 기존에는 논문이나 과거 기록을 일일이 뒤졌는데, 지식 그래프 덕분에 몇 번의 클릭만으로 결과를 받아볼 수 있었습니다. 저도 처음엔 용어 매칭 오류로 엉뚱한 진단이 나오기도 했는데, 용어 표준화 작업을 하면서 많이 개선됐어요.
팁: 의료 데이터는 표준 용어(예: SNOMED CT, ICD-10)를 꼭 매핑해서 저장하세요. 그래야 정확한 시맨틱 검색이 가능합니다.
실제 현장에서 지식 그래프와 시맨틱 검색이 어떻게 쓰이고 있는지 살펴봤는데요, 솔직히 아직 저도 배우는 중이에요. 실수도 많았고, 계속 개선해 나가야 할 부분도 많더라고요. 현업에서 적용해보시면, 분명 새로운 인사이트 얻으실 거예요!
이쯤에서 "이렇게 좋은데, 왜 다들 아직 완벽하게 못 쓰고 있지?"라는 의문이 들 수 있어요. 실제로 도전 과제도 만만치 않습니다. 저도 몇 번이나 벽에 부딪혀서 좌절했던 기억이 있거든요.
지식 그래프와 시맨틱 검색 엔진은 온톨로지 기반 모델링, NLP, 그리고 그래프 데이터베이스·벡터 임베딩 기술을 결합해, AI 에이전트와 RAG 기반 LLM 앱의 지식 활용도를 극대화합니다. 실시간 데이터 업데이트와 확장성 전략, 실제 사용 사례 분석을 통해 실질적인 도입 방안도 살펴봤습니다.
이제 여러분도 최신 AI 트렌드를 바탕으로, 조직의 데이터 자산을 지식 그래프로 전환하고, 맞춤형 시맨틱 검색 엔진 구축에 도전해보세요. 변화의 중심에서, 한 단계 앞선 데이터 혁신을 이끌어 가시길 응원합니다!
여기까지 읽으셨다면, 이제 지식 그래프와 시맨틱 검색에 대한 감이 확실히 잡히셨을 거예요. 처음엔 어렵고 복잡해 보여도, 하나씩 직접 해보고, 실수도 해보면서 성장하는 게 가장 빠른 길입니다. 여러분도 저처럼 3시간 날리는 경험(!) 하실 수도 있지만, 그만큼 더 깊이 이해하게 되실 거예요. 다음 글에서 더 실전적인 사례와 코드를 들고 찾아올게요. 궁금한 점은 언제든 댓글로 남겨주세요!