눈에 보이는 증상이 아니라 진짜 원인을 찾을 때까지 파고드는 백엔드 개발자입니다.
느리거나 이상하게 동작하는 문제를 만나면 추측으로 고치지 않고, 측정하고 재현해 원인을 좁힌 뒤 최소한으로 고치는 방식을 선호합니다.
특히 보안·동시성·장애처럼 평소엔 드러나지 않지만 터지면 큰 지점을 코드와 데이터로 방어하는 데 관심이 많고,
성능 수치를 위해 코드를 넓게 갈아엎기보다 무엇을 고치고 무엇을 안 고칠지 근거를 남기며 결정합니다.
Tech Stack
Java
Spring Boot
JPA
MySQL
PostgreSQL
Redis
AWS
Docker
Project — SearchON
AI 검색 노출 진단 서비스SW마에스트로 17기
2026.04–진행중 · 백엔드 단독
ChatGPT·Perplexity 같은 AI 검색에 사이트가 잘 노출되는지 진단하는 서비스.
서버가 사용자 입력 URL을 대신 스캔하는 구조라 보안·동시성·외부연동 안정성이 핵심이었습니다.
스캔 파이프라인을 보안·수집·콘텐츠·스키마 등 10여 개 기능 슬라이스로 분리해 설계하고,
500개 이상의 테스트로 회귀를 방어했습니다.
스캔 파이프라인을 프로파일링해 숨은 병목을 찾아 제거 2.8×
- 단계별로 시간을 재보니 스캔 시간의 94%가 content 분석 한 단계에 몰려 있었습니다.
- 중복 파싱부터 없앴는데 10%밖에 안 줄어, 파싱 자체는 병목이 아니라고 보고 다시 측정했습니다. 진짜 원인은 여러 AI 크롤러 관점이 같은 페이지를 받는데도 매번 처음부터 다시 추출하던 것이었습니다.
- 같은 HTML은 한 번만 추출해 재사용하도록 바꿔(동작은 그대로, 테스트 통과) content 단계를 283ms → 100ms(2.8배), 전체 스캔은 307ms → 121ms로 줄였습니다.
사용자가 넣은 URL을 서버가 대신 요청하는 구조의 SSRF 위험 차단
- 아무 URL이나 서버가 대신 요청하다 보니, 내부망 주소나 클라우드 메타데이터가 노출될 수 있는 위험이 있었습니다.
- 외부 요청을 하나의 보안 경로로 통일하고, 사설 IP·리다이렉트 우회·비정상 포트를 미리 검사해 막았습니다.
- 위험한 요청은 오류로 중단하지 않고 진단 결과로 남겨, 스캔은 계속 진행되도록 했습니다.
예전 공유 링크가 열 때마다 500 에러 나던 하위 호환 문제 발견·수정
- 스캔 결과를 JSON으로 저장해 공유 링크·캐시에 재사용하는데, 응답 형식을 바꾸면서 캐시 무효화와 하위 호환 처리를 빠뜨려 예전에 만든 공유 링크가 열 때마다 500 에러가 났습니다.
- 저장된 결과는 코드가 바뀐 뒤에도 남는다는 점을 전제로, 읽어들이지 못하면 500 대신 공유는 404로 돌려주고 캐시는 새로 스캔하도록 바꿨습니다.
- 잘못된 저장본 하나가 엔드포인트 전체를 무너뜨리던 것을 없애고, 회귀 테스트를 더했습니다.
AI가 못 읽는 페이지를 '정상'으로 잘못 판정하던 것을 실제 측정으로 바로잡음
- 본문이 JS 렌더링 후에만 나타나는 사이트(예: 다나와)를 기본 기준값으론 "콘텐츠 충분"으로 잘못 판정했습니다.
- 실제 사이트에서 본문 길이를 직접 재보니 300~436자였고, 이를 근거로 기준값을 올렸습니다. 바뀐 기준은 엔진 버전을 올려 반영했습니다.
- 해당 유형에서 보이지 않던 콘텐츠 41%를 제대로 잡아내도록 개선했습니다.