기술 블로그 모음

국내 IT 기업들의 기술 블로그 글을 한 곳에서 모아보세요

전체 프론트엔드 백엔드 데브옵스 AI 아키텍처 DB 기타
AI 에이전트의 확산과 과제
삼성 SDS
AI 에이전트의 확산과 과제

이 아티클은 인프라 현대화, 데이터 통합, 보안 및 규정 준수 문제를 중심으로 AI 에이전트 도입의 현실적 난관과 기회를 살펴봅니다.

2024 Frontend Global Workshop 참석 후기
라인
2024 Frontend Global Workshop 참석 후기

들어가며 안녕하세요. LINE+ UIT 조직에서 프런트엔드 개발을 하고 있는 강형민입니다. LY에서는 매년 'Front-end Global Workshop'을 개최하고 있습니다. ...

클라우드 스토리지 유형과 특징, 활용 방안
NGINX STORE
클라우드 스토리지 유형과 특징, 활용 방안

클라우드 스토리지 유형과 특징, 활용 방안 이 포스트는 클라우드에서 주로 제공하는 세 가지 주요 스토리지 유형인 오브젝트 스토리지, 파일 스토리지, 블록 스토리지의 특징과, 각각의 스토리지를 어떤 상황에서 활용하는 것이 적합한지 설명합니다. 이러한 스토리지는 클라우드뿐만 아니라 온프레미스 환경에서도 활용할 수 있으며, 요구사항에 따라 적절한 방식으로 ...

[현장스케치] "AI-DOL", 인간의 가장 창의적 영역을 AI가 어떻게 이해하고 지원할 수 있을까?
네이버 클라우드
[현장스케치] "AI-DOL", 인간의 가장 창의적 영역을 AI가 어떻게 이해하고 지원할 수 있을까?

안녕하세요, 누구나 쉽게 시작하는 클라우드 네이버클라우드 ncloud.com입니다. "AI가 인간을 대체할 수 있을까?" 이 질문에서 시작된 MBC 예능 프로그램 "PD가 사라졌다!'가 시즌 2, 'AI-DOL (AI돌)'로 돌아옵니다! 이번 프로그램에서는 아이칠린(ICHILLIN'), 첫사랑(CSR), 우아(Woo!ah!), 퍼플키스(PURPLE K...

Amazon Bedrock, DeepSeek-R1 완전 관리형 서버리스 모델 정식 출시
AWS KOREA
Amazon Bedrock, DeepSeek-R1 완전 관리형 서버리스 모델 정식 출시

1월 30일부터 Amazon Bedrock Marketplace와 Amazon Bedrock 사용자 지정 모델 가져오기를 통해 DeepSeek-R1 모델을 Amazon Bedrock에서 사용할 수 있게 되었습니다. 그 이후로 수천 명의 고객이 Amazon Bedrock에 이 모델을 배포했습니다. 고객들은 안전한 AI 배포를 위한 견고한 가드레일과 포괄...

AWS 주간 소식 모음: Amazon Q CLI 에이전트, AWS Step Functions, AWS Lambda 업데이트 등
AWS KOREA
AWS 주간 소식 모음: Amazon Q CLI 에이전트, AWS Step Functions, AWS Lambda 업데이트 등

북반구의 날씨가 점차 따뜻해짐에 따라, 학습 및 교류의 기회가 더욱 많아지고 있습니다. 이번 주에 샌프란시스코에 머물 예정이며, AWS GenAI Loft에서 열리는 Nova Networking Night에서 만나 라이브 데모와 실제 구현을 통해 Amazon Nova 파운데이션 모델(FM)의 세계를 자세히 살펴보겠습니다. AWS Pi Day는 이제 연...

NELO Alaska: 대용량 로그 데이터 저장을 위한 Apache Iceberg 도입기
네이버 D2
NELO Alaska: 대용량 로그 데이터 저장을 위한 Apache Iceberg 도입기

로그 모니터링 시스템은 서비스 운영을 위해서 반드시 필요한 시스템입니다. 로그 모니터링 시스템 구축에는 인덱스 기반의 빠른 검색을 제공하는 검색 엔진인 Elasticsearch가 널리 사용됩니다. 네이버도 Elasticsearch 기반의 로그 모니터링 시스템을 구축했으며, 수천 대의 서버로 수 페타바이트 규모의 로그 데이터를 저장하고 있습니다. 최근 들어 서비스 규모가 확장되고 저장해야 하는 로그 데이터의 규모와 트래픽 양이 급속도로 증가하면서 Elasticsearch 기반의 로그 모니터링 시스템은 비용 문제와 더불어 확장성 문제에 직면하게 됐습니다. 네이버는 저비용으로 대용량의 로그 데이터를 수집할 수 있도록 Apache Iceberg(이하 Iceberg)를 도입한 신규 컴포넌트 Alaska를 개발해 네이버의 로그 모니터링 시스템 플랫폼 NELO에 적용했습니다. 이 글에서는 기존 로그 모니터링 시스템의 문제와 Iceberg의 특징을 소개하고, Alaska의 작동 방식과 Alaska를 NELO에 적용한 이후의 변화를 소개합니다. Elasticsearch 기반 기존 로그 모니터링 시스템의 한계 Elasticsearch를 기반으로 구축된 기존 로그 모니터링 시스템의 구조를 간략하게 도식화하면 다음 그림과 같습니다. 클라이언트로부터 수신된 로그 데이터는 Kafka에 적재된 후 Elasticsearch에 저장됩니다. Elasticsearch는 SSD 타입의 스토리지로 구성된 Hot 계층(Hot Tier)과 HDD 타입의 스토리지로 구성된 Warm 계층(Warm Tier)으로 구분되어 있습니다. 로그 데이터는 Hot 계층에 3일간 저장된 후 Warm 계층으로 이동되어 최대 90일까지 저장됩니다. 이렇게 Hot 계층과 Warm 계층의 두 단계로 나누어 데이터를 저장하면 검색이 빈번하게 일어나지 않는 데이터를 효율적이면서 저비용으로 저장할 수 있습니다. 기존 로그 모니터링 시스템은 수년간 이와 같은 구조로 운영되었습니다. 그동안 데이터가 증가함에 따라 Warm 계층에 저장된 데이터의 크기도 급증했습니다. Elasticsearch는 단일 클러스터로 저장할 수 있는 데이터의 크기에 제한이 있기 때문에 다수의 Elasticsearch 클러스터를 구성해 클러스터 수준에서 확장을 진행했습니다. 그 과정에서 모든 클러스터가 한계 수준까지 도달해 운영 장애를 빈번하게 겪었습니다. 연간 수십억 원의 인프라 사용 비용도 부담이 되었습니다. 두 계층으로 구성된 Elasticsearch 클러스터는 더 이상 로그를 효율적으로 저장할 수 있는 구조가 아니게 되었습니다. 새로운 타입의 데이터 저장 스토리지의 필요성 Warm 계층에 저장된 데이터의 크기가 급증하는 이유에는 장기간 로그의 저장에 대한 요구 사항도 있습니다. 기존 로그 모니터링 시스템은 Elasticsearch에 최대 90일까지 로그 데이터를 저장할 수 있게 허용했습니다. 하지만 서비스의 법적 요구 사항 등의 이유로 예외로 1년 이상의 로그 데이터 저장을 허용하고 있었습니다. 기존 로그 모니터링 시스템이 한계에 도달하면서 이러한 장기간 로그 데이터 저장에 대한 요구 사항을 Elasticsearch로 수용하는 것이 적합한지 검토하게 되었습니다. 이를 확인하기 위해 실제로 로그 데이터의 사용자들이 어느 시점의 데이터에 관심이 많은지 분석해 보았습니다. 다음은 한 달 동안 사용자들의 검색 요청 로그를 분석한 그래프입니다. 그래프에서 X축인 Data age는 데이터가 저장되고 지난 시간을 의미합니다. Y축은 해당 Data age에 속한 데이터를 검색하는 쿼리의 비율입니다. 분석 결과, 전체 검색 쿼리 중 95%의 쿼리가 당일에 발생한 데이터에 대한 것이었으며, 99%의 쿼리가 일주일 이내의 데이터를 위한 것이었습니다. 단 0.5%의 쿼리만이 2주 이상 지난 데이터를 요청하는 쿼리였습니다. Elasticsearch는 일반적으로 데이터 저장과 쿼리 계산을 위한 컴퓨팅을 같은 노드에서 담당하고 있기 때문에 이렇게 거의 검색되지 않는 데이터를 저장하는 것은 효율적인 일이 아닙니다. 최신 버전의 Elasticsearch는 원격 스토리지에 데이터를 저장하고 검색하는 기능을 제공합니다. 하지만 Elasticsearch의 규모가 한계 크기에 도달한 로그 모니터링 시스템에 적용할 수는 없었습니다. Elasticsearch는 마스터 노드가 관리할 수 있는 메타데이터 규모에 한계가 있기 때문입니다. 이러한 문제를 해결하려면 Elasticsearch에는 검색이 자주 일어나는 단기간의 데이터 저장만 허용하고, 장기간 데이터를 저장할 새로운 스토리지가 필요하다는 판단이 들었습니다. Elasticsearch를 대체하는 신규 스토리지에서는 데이터 저장을 위한 스토리지와 검색을 위한 컴퓨팅을 분리한다 아이디어를 기본으로 설계를 시작했습니다. 또한 Elasticsearch처럼 특정 쿼리 엔진에 제한(lock-in)되지 않는 오픈 데이터 포맷을 중요한 요구 사항 중 하나로 설정했습니다. 저비용의 스토리지에 검색이 가능한 데이터 포맷으로 데이터를 저장할 수 있는 여러 방식을 비교하고 분석했습니다. 여러 방식으로 시뮬레이션을 실행한 결과, Iceberg로 실행한 시뮬레이션에서 현재 수준에서 기존 로그 모니터링 시스템보다 최소 50% 이상 비용을 절감할 수 있다는 결론을 얻었습니다. 최종적으로 Iceberg를 선택해 로그 데이터 저장을 위한 새로운 타입의 스토리지를 구현한 컴포넌트인 Alaska를 개발해 적용했습니다. Iceberg의 특징 기존 로그 모니터링 시스템의 구조와 규모 때문에 새로운 타입의 스토리지에는 다음과 같은 요구 사항이 있었습니다. 데이터 쓰기/읽기가 동시에 가능해야 한다. 데이터 쓰기/읽기가 발생하는 상황에서 동시에 스키마 변경이 가능해야 한다. 단일 테이블로 페타바이트 규모의 데이터를 저장할 수 있어야 한다. 수십만 개의 테이블 운영이 가능해야 한다. 데이터 포맷으로 인한 쿼리 엔진 제한이 없어야 한다. 데이터 저장소와 쿼리 컴퓨팅 노드가 분리되어 있어야 한다. 데이터 압축 효율이 우수해야 한다. 이 요구 사항을 구현할 수 있는 기술로는 오픈 테이블 포맷을 사용하는 Iceberg와 Delta Lake, Apache Hudi가 있습니다. 그 중에 Iceberg의 커뮤니티가 가장 활발하게 업데이트되고 있었습니다. 또한 Databricks, Snowflake 등 여러 회사가 Iceberg를 두고 벌이던 기술 경쟁이 Databricks가 Iceberg를 만든 Tabular 회사를 인수하면서 일단락 되었고, Iceberg가 오픈 테이블 포맷 기술의 주도권을 갖게 되었습니다. 여러 사정을 고려해서 Alaska 컴포넌트에 Iceberg의 오픈 테이블 포맷을 적용하기로 결정했습니다. Iceberg는 '데이터', '메타데이터', '카탈로그'의 세 부분으로 나누어 데이터를 저장합니다. 데이터는 칼럼 스토리지 데이터 포맷인 Parquet로 관리되고, zstd 형식으로 압축됩니다. 이러한 데이터는 오브젝트 스토리지에 저장됩니다. 메타데이터는 하나의 테이블을 구성하기 위한 데이터 파일의 집합 관계와 스키마 정보를 JSON, Avro와 같은 형태로 저장합니다. 데이터와 마찬가지로 메타데이터도 오브젝트 스토리지에 저장됩니다. 카탈로그는 메타데이터의 메타라고 볼 수 있습니다. 가장 최신의 메타데이터의 위치 정보와 같은 최소한의 정보만 카탈로그에서 관리됩니다. 일반적으로 카탈로그 데이터는 데이터베이스에 저장됩니다. 이와 같이 테이블을 구성한 파일에 대한 메타데이터까지 함께 관리하기 때문에 Iceberg를 단순한 데이터 포맷이 아니라 테이블 포맷이라고 부릅니다. Iceberg는 ACID 트랜잭션을 지원하며 schema evolution, hidden partitioning 등 데이터를 다루는 데 유용한 기능을 제공합니다. 신규 로그 모니터링 시스템의 구조 Iceberg를 기반으로 개발한 새로운 로그 모니터링 시스템은 기존 Elasticsearch 기반의 로그 모니터링 시스템을 대체하는 것이 아닙니다. Elasticsearch에는 실시간 모니터링이 필요한 짧은 기간의 로그를 저장하고, 장기간 보관이 필요한 데이터는 새로운 스토리지를 활성화해 저장하도록 설계했습니다. 기존 로그 모니터링 시스템에서는 Kafka에 적재된 로그 데이터를 Elasticsearch에 인덱싱하는 방식을 사용했습니다. 신규 로그 모니터링 시스템도 동일한 Kafka 토픽으로부터 데이터를 읽어 Iceberg 테이블 포맷으로 저장합니다. Elasticsearch의 Warm 계층에서 데이터를 읽어 저장하는 방식을 택하지 않은 이유는 다음과 같습니다. 실시간 검색/모니터링이 필요하지 않은 데이터는 Elasticsearch에 저장하지 않고 직접 Iceberg로 저장할 수 있습니다. Elasticsearch와 Iceberg에 중복 데이터가 저장되더라도 Iceberg 기반 시스템 비용이 매우 저렴합니다. Elasticsearch의 Warm 계층으로부터 데이터를 읽으면 HDD 기반의 클러스터에 큰 부하가 발생합니다. 신규 로그 모니터링 시스템의 아키텍처는 다음 그림처럼 크게 데이터 적재 부분(Data ingestion & optimization)과 데이터 쿼리 부분(Data query)으로 나눌 수 있습니다. 데이터 적재 부분은 다음과 같은 요소로 구성되어 있습니다. Orca: Kafka의 데이터를 Iceberg 테이블 포맷으로 변환해 오브젝트 스토리지에 저장하는 컴포넌트 Polarbear: Iceberg 테이블 데이터를 최적화하고 데이터 라이프사이클을 관리하는 컴포넌트 Puffin: Iceberg 카탈로그 컴포넌트 데이터 쿼리 부분은 다음과 같은 요소로 구성되어 있습니다. Trino: Icerbeg 테이블 조회를 위한 쿼리 컴퓨팅 엔진 API Server: Alaska 데이터 조회를 위한 NELO Open API 제공 Frontend: Alaska 쿼리 UI 제공(웹 UI) 신규 로그 모니터링 시스템은 데이터 프로세싱을 위해서 Kappa Architecture를 따르고 있습니다. 즉, 실시간으로 저장되고 있는 로그 데이터 테이블에 사용자가 접근해 데이터를 조회할 수 있는 구조입니다. 전통적인 Lambda Architecture처럼 여러 개의 테이블을 운용해 데이터 변환 과정을 거쳐 사용자에게 제공하는 방식은 로그 저장 목적으로 사용하기에는 너무 복잡하고 비용 측면에서 효율적이지 않은 구조입니다. Iceberg의 오픈 테이블 포맷은 ACID 트랜잭션을 지원하기 때문에 실시간으로 쓰기가 발생하는 테이블을 동시에 사용자가 읽어도 데이터 정합성을 보장하며 서비스할 수 있습니다. 이러한 구조를 통해서 사용자는 짧은 지연 시간(데이터 동기화 주기 5분) 안에 데이터를 조회할 수 있습니다. 데이터 저장을 위해 사용하는 사내 오브젝트 스토리지 서비스인 Nubes는 MinIO라는 S3 게이트웨이를 활용해 S3 인터페이스를 기반으로 Iceberg와 연동되어 있습니다. 신규 로그 모니터링 시스템의 아키텍처에서 설명한 Orca, Polarbear, Puffin은 모두 Iceberg Java SDK를 기반으로 직접 개발한 컴포넌트입니다. 프로젝트 초기에 오픈 소스를 활용해 PoC(Proof of Concep)를 진행했지만 여러 이유로 오픈 소스를 사용할 수 없었습니다. 신규 로그 모니터링 시스템 개발 초기에 검토한 오픈 소스와 사용 불가 이유는 다음과 같습니다. 데이터 적재 kafka-connect: 기능적 요구 사항은 충족했습니다. 하지만 지원하는 동기화 대상 테이블의 수가 적었습니다. 동기화 대상 테이블의 수가 수십만이었지만, kafka-connect는 테이블의 수가 수백 개의 수준에만 도달해도 OOM(Out of Memory)이 발생했습니다. flink: Kafka의 데이터를 Iceberg로 저장하는 기능은 제공하지만 단일 테이블에 대해서만 작동합니다. 즉, 테이블 fan-out 기능이 존재하지 않습니다. 동기화해야 하는 테이블의 수만큼 flink 애플리케이션을 실행해야 하는 경우가 있어, 현실적으로 운영에 어려움이 있는 문제가 있습니다. 데이터 최적화 Trino, Spark, Hive 등 Iceberg 테이블을 지원하는 쿼리 엔진: 데이터 최적화 및 라이프사이클을 관리하는 것이 기능적으로는 가능합니다. 그러나 요구하는 테이블의 규모를 지원하려면 비용 부담이 커집니다. 또한 세부적인 스케줄링 및 스로틀링 설정이 어렵기 때문에 오브젝트 스토리지에 과한 부담이 발생할 수 있습니다. 카탈로그 Hive metastore, Nessie, Polaris, Unity 등 Iceberg 테이블을 지원하는 카탈로그: 최초 설계에서는 Hive metastore를 사용했으나 Hive lock 버그로 인해 경합이 심할 때에는 데드락에 빠지는 이슈가 발생했습니다. 또한 장기적으로 Iceberg REST 카탈로그를 표준으로 만들고, 다른 카탈로그를 직접적으로 사용하는 것을 중단할 계획이 있다는 것을 Iceberg 커뮤니티를 통해서 확인했습니다. REST 카탈로그는 표준 스펙만 존재하며 공식적인 구현체가 존재하지 않습니다. Snowflake에서 최근에 Polaris라는 REST 카탈로그 스펙에 준한 카탈로그를 공개했지만 특정 카탈로그에 제한될 우려가 있습니다. 또한 카탈로그를 사용자에게 공개해 데이터 연동(data federation)을 제공할 계획이 있어, 컴포넌트를 직접 개발하는 것이 효율적이라고 판단했습니다. 데이터 적재 다음 그림은 Orca 컴포넌트가 Kafka의 데이터를 Iceberg 테이블 포맷으로 변환해 저장하는 과정을 도식화한 그림입니다. Kafka에 쌓여 있는 로그 데이터를 Iceberg 테이블 포맷으로 변환해 저장할 때에는 다음과 같은 단계로 데이터를 처리합니다. Kafka 데이터 수신 Kafka 토픽으로부터 데이터를 읽습니다. 다중 컨슈머 구성을 통해서 I/O 병목 문제를 해결하고 처리량을 극대화했습니다. 로그 데이터 관리 및 전달 데이터를 수신한 후 데이터를 내부 메모리 큐에 적재합니다. 메모리 큐에 적재된 데이터는 레코드 리포지토리를 통해 각 Iceberg 테이블에 대응하는 Writer로 분배됩니다. 데이터 포맷 변환 및 저장 각 Writer는 데이터를 Parquet 형식으로 변환한 뒤 Writer 내부 메모리 버퍼에 저장합니다. Flush Manager가 특정 주기로 오브젝트 스토리지에 데이터를 저장하고 Iceberg 테이블에 커밋합니다. 간단해 보이는 구조이지만 다음과 같은 여러 가지 상황을 고려해 설계되었습니다. 테이블 fan-out 기능:Kafka 토픽에 저장되어 있는 로그는 tenant별로 분리되어 각 Iceberg 테이블에 저장됩니다. 그렇기 때문에 단일 데이터 스트림에서 다수의 테이블로 데이터를 전송하는 fan-out 기능이 필요합니다. 테이블 데이터가 처음 인입되는 시점에 동적으로 Writer가 생성되고 flush가 실행되는 시점에 메모리가 해제되도록 설계했습니다. 효율적인 메모리 관리:초당 수십만 건에 이르는 로그 데이터를 실시간으로 처리하려면 메모리 사용량 최적화가 필수입니다. 실시간으로 유입되는 데이터를 변환해 메모리에 적재하고 5분 단위로 flush를 진행해 메모리를 주기적으로 확보하도록 설계했습니다. 특정 테이블에 데이터가 많이 유입될 경우에는 해당 테이블에 해당하는 데이터를 파일로 먼저 내보내는 롤오버 동작을 수행합니다. 메모리 사용량이 급증할 경우에는 전체 Writer에서 강제 flush를 실행해 OOM을 예방합니다. Kafka 오프셋 관리:Kafka로부터 읽은 데이터의 Iceberg 테이블 커밋이 완료된 이후에 Kafka 오프셋 커밋이 가능합니다. Kafka로부터 읽어 온 batch 단위로 Iceberg 테이블에 커밋을 하면 너무 작은 파일 단위로 커밋이 실행되기 때문에 처리량 측면에서 성능이 저하될 수 있습니다. 그래서 Kafka로부터 읽은 데이터가 충분히 메모리에 쌓였을 때 커밋을 실행해야 하는데, 이럴 경우 Kafka에서 제공하는 자동 오프셋 커밋 기능을 사용할 수 없어 수동으로 오프셋을 관리해야 합니다.내부 메모리에 오프셋을 저장하고 실제로 Iceberg 테이블에 커밋이 성공한 위치까지의 오프셋만 다시 Kafka에 커밋되도록 구현했습니다. 데이터 손실은 발생하지 않지만 중복 데이터가 Iceberg 테이블에 저장될 수 있는 구조(at-least-once)로 설계했습니다.Iceberg의 equality delete 기능을 사용하면 중복 데이터를 방지할 수 있지만 Iceberg 테이블 운용 비용이 비싸지기 때문에 채택하지 않았습니다. 로그 데이터 유실은 중요한 문제가 될 수 있지만, 중복 발생은 대부분 크게 문제가 되지 않습니다. 또한 모든 로그에 유니크 아이디를 부여하고 있어서, 필요시 사용자가 쿼리를 통해서 중복 데이터를 제거할 수 있도록 안내하고 있습니다. 데이터 변환:기본적으로 신규 필드가 유입될 경우 시스템에서 해당 필드를 String으로 취급해 스키마를 자동으로 업데이트합니다(사용자는 UI와 API를 통해서 신규 필드를 원하는 타입으로 생성할 수 있습니다). 신규 필드가 유입되면 해당 테이블에 대해서 메모리에 쌓여 있던 데이터에 강제 flush를 실행한 이후에 스키마 업데이트를 진행하고 다시 메모리에 데이터를 쌓기 시작합니다.특정 필드에 대해서 변환이 불가능한 경우 에러 필드에 원본 데이터와 이유를 함께 저장합니다. Iceberg 테이블은 칼럼 이름의 대소문자 구분을 지원하지만, 쿼리 엔진이 대소문자 구분을 지원하지 않기 때문에 칼럼 이름을 대소문자를 구분하지 않게(case-insensitive) 설정해야 합니다. 대소문자만 다른 이름을 가진 중복되는 필드가 유입되면 에러 필드에 저장합니다. 또한 String이 아닌 다른 타입으로 생성된 필드에 대해서 지원되지 않는 값으로 데이터가 유입될 경우(예: 숫자 타입에 문자열 유입) 에러 필드에 저장합니다. 사용자는 에러 필드를 조회해 누락된 데이터 값과 누락된 사유를 확인할 수 있습니다.알 수 없는 이유로 데이터 변환에 실패하면 DLQ(dead-letter queue)에 전송해 후처리를 실행할 수 있도록 합니다. 트래픽이 증가해 데이터 적재 컴포넌트를 많은 수로 확장(scale-out)하면 단일 Iceberg 테이블에 대해서 여러 노드가 동시에 Write를 실행하게 됩니다. 이럴 경우 다음과 같은 문제가 발생할 수 있습니다. Iceberg 테이블에 대해 동시에 발생한 커밋이 충돌해 실패 가능성 높아집니다. 여러 노드에 데이터가 분산되어 작은 파일로 쪼개져서 Write가 일어납니다. 이 때문에 오히려 처리량이 저하될 수 있으며 오브젝트 스토리지에도 작은 파일로 인해 부담이 발생할 수 있습니다. 또한 추후 데이터 최적화를 위한 Rewriting 과정에서도 문제가 될 수 있습니다. 위와 같은 문제 때문에 데이터 적재 컴포넌트가 단일 노드에서 최대한의 성능을 낼 수 있도록 최적화에 많은 신경을 써서 개발을 진행했습니다. 추후 Kafka 토픽 커스텀 파티셔너를 통해서 개선할 계획도 있습니다. 데이터 최적화 데이터 최적화 컴포넌트는 다음과 같은 두 가지 역할을 수행합니다. Iceberg 테이블 데이터 최적화 및 라이프사이클 관리 Iceberg 테이블 관련 API 제공 데이터 최적화를 진행하지 않으면 Iceberg 테이블에 쌓이는 파일이 너무 많아져서 전체적인 성능이 저하될 수 있습니다. 이러한 데이터 최적화 및 라이프사이클 관리를 위한 태스크를 주기적으로 실행해 테이블의 상태를 최적의 상태로 유지합니다. 또한 API 서버로부터 Iceberg 테이블에 관련된 메타데이터 정보 및 스키마 업데이트 등을 요청받아 처리하는 역할도 수행합니다. 데이터 최적화 컴포넌트는 임베디드 분산 캐시를 내장하고 있으며, 해당 캐시를 통해서 노드의 리더를 선출합니다. 리더로 선출된 노드는 수행해야 할 테스크를 주기적으로 스케줄링해 내부 시스템 테이블로 생성합니다. 이때 시스템 테이블 또한 Iceberg 테이블을 기반으로 생성됩니다. 나머지 팔로워 노드는 시스템 테이블이 업데이트될 때 자신에게 할당된 태스크를 읽어 실행합니다. Iceberg 테이블 최적화 및 라이프사이클 관리를 위해 실행하는 배치 잡(batch job)은 다음과 같습니다. Rewriting data:같은 시간 파티션 안에 있는 파일을 병합하는 작업입니다.데이터 적재 시 5분 주기로 데이터 flush를 실행하기 때문에 실제 테이블에 쓰인 데이터는 작은 파일로 나누어져 있습니다. 예를 들어 데이터 적재 노드가 1개라면 하루에 최소 288개의 파일이 생성(5분당 최소 1개 파일 생성)됩니다. fan-out 대상 테이블의 수가 10,000개라면 하루에 최소 288만 개의 파일이 생성됩니다. 이 상태로 오랜 시간 데이터 적재를 진행하면 파일의 수가 많아져 메타데이터가 거대해지고 커밋 성능이 저하됩니다. 그리고 작은 파일에 대한 I/O가 증가해 쿼리 성능이 저하됩니다. 지속적인 작은 파일 쓰기는 오브젝트 스토리지에도 부담이 됩니다. 그래서 파일을 병합하는 작업을 주기적으로 실행합니다.테이블은 시간 파티션으로 나누어져 있는데, 같은 시간 파티션 안에 존재하는 파일을 병합하는 작업을 매시간 실행합니다. 목표 병합 파일의 크기는 128MiB로 설정되어 있습니다. 트래픽이 많은 일부 테이블을 제외하고 대부분 1시간 로그 데이터가 1개의 파일로 병합됩니다.시간 순서로 유입되지 않고 과거 시간의 로그와 뒤섞인 데이터(disorder data)가 인입되는 테이블의 경우에는 긴 시간 범위에 대해서 병합 작업을 진행합니다. 로그 모니터링 시스템이 네이버 모바일 앱의 로그 수집도 지원하기 때문에 disorder data가 발생합니다. 운영체제의 정책 등 모바일 기기의 특성상 네트워크, 배터리 상태에 따라 로그를 전송하는 시점이 늦어질 수 있습니다. 그래서 최대 3일 전의 로그까지 수집하는 것을 정책상 허용합니다. 이때 3일 이내의 시간 파티션에 계속 작은 파일이 생성되는 문제가 발생하고, 이러한 테이블에 대해서는 매시간마다 3일 내의 모든 파티션을 병합하는 작업을 실행합니다.데이터 적재 지연이 발생하거나 제대로 된 정보가 수신되지 않을 경우에는 해당 작업 스케줄링을 중단합니다. 데이터 지연을 고려하지 않으면 이미 병합이 종료된 시간 파티션에 다시 작은 파일이 생성되어 문제를 유발할 수 있기 때문입니다. Expire snapshot: 주기적으로 스냅숏을 삭제하는 작업입니다. Iceberg 테이블은 매 커밋마다 스냅숏 정보를 남깁니다. 스냅숏을 관리하지 않으면 무한대로 스냅숏이 생성되어 메타데이터 파일이 매우 커지고, 작은 파일이 쌓이는 문제가 발생합니다. 주기적으로 테이블마다 최근 10개의 스냅숏만 남기고 삭제합니다. Optimize table: Rewriting data와 Expire snapshot을 하나의 잡(job)으로 구성해 파일 병합이 종료된 이후에 스냅숏을 삭제하는 작업입니다. Retention: 보존 기간이 지난 로그를 삭제하는 작업입니다. 각 테이블마다 설정된 로그 보존 기간이 있습니다. 보존 기간이 지난 로그를 하루에 한 번씩 삭제합니다. Delete table: 삭제 요청이 있는 Iceberg 테이블을 물리적으로 삭제하는 작업입니다. 삭제 요청이 있은 시점으로부터 3일(데이터 복구 가능 기간)이 지난 뒤에 실행합니다. Iceberg SDK가 제공하는 삭제 API 실행 이후에도 실제 스토리지에 가비지 데이터가 남아 있을 수 있습니다. S3 API를 사용해 해당 테이블 디렉터리 하위에 존재하는 모든 파일에 대해 다시 한번 삭제를 실행합니다. Delete orphan files: 가비지 데이터를 삭제하는 작업입니다. Iceberg 테이블에 데이터 커밋 시 충돌이 발생하면 메타데이터, 데이터 영역에 모두 가비지 데이터가 발생할 수 있습니다. 메타파일과 실제 오브젝트 스토리지에 존재하는 파일을 주기적으로 대조해 가비지 데이터를 삭제합니다. 작업 실행 중 신규 파일이 커밋되면 신규 파일도 삭제될 위험이 있어서 생성된 지 7일 이상 지난 파일에 대해서만 가비지 데이터 분류를 실행합니다. 리더 노드는 주기적으로 배치 잡을 실행합니다. 태스크는 각 테이블의 평균 사이즈를 기준으로 빈 패킹(bin packing) 방식으로 모든 노드에 할당됩니다. 할당된 결과는 Iceberg 시스템 테이블로 저장되고, 각 노드는 해당 시스템 테이블을 주기적으로 읽어 자신에게 할당된 태스크를 실행합니다. 실행이 완료된 태스크는 시스템 테이블에서 삭제됩니다. 태스크 스케줄링 상태가 Iceberg 테이블로 저장되어 있기 때문에 노드가 다시 시작되어도 하던 작업을 이어서 실행할 수 있습니다. 카탈로그와 데이터 연동 신규 로그 모니터링 시스템은 Iceberg REST 카탈로그를 사용합니다. REST 카탈로그의 핸들러 등의 구현체는 Iceberg SDK에 포함되어 있습니다. SDK를 기반으로 Spring Boot로 래핑해 서버로 작동하게 만든 것이 Puffin입니다. REST 카탈로그를 사용하려면 실제 메타데이터가 저장될 저장소를 지정해야 하는데, MySQL을 백엔드 카탈로그로 지정해 사용합니다. Alaska의 초기 설계부터 카탈로그를 사용자에게 제공해 데이터 연동을 지원하려 했습니다. 로그에 포함되어 있는 데이터를 분석하려는 사용자가 많은데, 기존 로그 모니터링 시스템 환경에서는 Open API를 사용해 로그를 다운로드해 분석하는 사용자가 대부분이었습니다. 그렇기 때문에 카탈로그를 사용자에게 제공하면 사용자는 데이터 다운로드 없이 자신의 쿼리 엔진과 직접 연동해 바로 SQL 쿼리를 실행해 쉽게 데이터 분석을 실행할 수 있게 됩니다. 데이터 연동을 위해서 카탈로그에 다음과 같은 기능을 구현했습니다. 기존 로그 모니터링 시스템에서 발급받은 access key 기반으로 인증 시스템과 연동합니다(authentication). 인증된 정보를 기반으로 권한이 있는 테이블에만 접근할 수 있도록 제어합니다(authorization). 데이터 연동 시 read-only API에만 접근을 허용해 테이블에 커밋 및 삭제 등을 실행할 수 없게 합니다. 인증 기능은 Iceberg REST 카탈로그 표준 스펙에 맞춰 구현했고, iceberg.rest-catalog.oauth2.token 설정의 access key 값을 통해 사용자가 권한이 있는 테이블에 읽기 전용으로 접근할 수 있게 했습니다. 데이터 쿼리 신규 로그 모니터링 시스템의 쿼리 엔진으로는 Trino를 채택했습니다. Trino에 의존성을 가지지 않도록 내부 구조를 설계했기 때문에 필요하다면 언제든지 Spark와 같은 다른 쿼리 엔진으로 교체할 수 있습니다. 사용자는 웹 UI 혹은 Open API를 통해서 쿼리를 실행할 수 있습니다. 신규 로그 모니터링 시스템에서는 기본적으로 다음과 같이 쿼리를 크게 Main query와 Sub query로 구분합니다. Main query는 원본 로그 데이터 테이블을 대상으로 실행하는 쿼리입니다. 기본적으로 비동기로 실행됩니다(non-interactive query). CTAS(Create Table As Select) 쿼리로 실행되며, 쿼리 결과는 또 다른 테이블로 저장됩니다. Sub query는 메인 쿼리에 의해서 생성된 쿼리 결과 테이블을 대상으로 실행하는 쿼리입니다. 동기 방식으로 실행됩니다(interactive query). 이렇게 Main query를 비동기 방식으로 실행해 쿼리 결과를 테이블로 저장하는 이유는 대용량의 데이터를 검색할 때 실행 시간이 매우 길어질 수 있기 때문입니다. 일반적으로 인덱스가 없기 때문에 Elasticsearch보다 응답 속도가 느립니다. 장기간 검색을 허용하기 때문에 검색하는 데이터의 양과 쿼리 형태에 따라서 결과를 얻는 데 수시간이 소요될 수도 있습니다. 이러한 상황에서 동기 방식으로 쿼리를 실행하면 사용자는 응답이 올 때까지 웹브라우저가 종료되지 않도록 유지하고 대기해야 합니다. 또한 Main query를 통해 최대한 관심 있는 데이터 영역만 필터링해 쿼리 결과 테이블을 만들면 그 이후부터는 빠른 속도로 관심 있는 데이터 영역을 탐색할 수 있게 됩니다. 이러한 사용자 경험을 고려해 위와 같이 쿼리 방식을 설계했습니다. 새로운 타입의 데이터 저장 스토리지의 필요성에서 살펴본 것처럼 장기 보관 데이터에 대해서는 쿼리가 발생하는 비율이 낮습니다. 그렇기 때문에 Trino 클러스터를 적은 리소스로 제공하고 있습니다. 다만 신규 SQL 쿼리 기능의 도입으로 이전에 없던 쿼리 패턴이 등장해 쿼리 리소스가 과도하게 소모될 가능성이 생겼습니다. 이에 따라 다음과 같이 쿼리에 제약 사항을 두었습니다. 테이블마다 Main query는 동시에 최대 한 개만 실행합니다. Sub query의 실행 속도를 사용자마다 15queries/min로 제한합니다. 쿼리를 ANTLR 4 기반으로 분석해 SQL 문법을 제한합니다. SELECT 쿼리만 허용합니다. WITH, JOIN, UNION, INTERSECT, EXCEPT 연산자를 사용할 수 없습니다. 중첩 쿼리(nested query)를 사용할 수 없습니다. FROM 절에는 반드시 한 개의 대상 테이블만 명시합니다. SQL 쿼리 실행 시 사용되는 리소스를 제한합니다. 사용자 쿼리 요청 시 바로 실행하지 않고 쿼리 플래닝을 통해서 리소스를 예측합니다. 예측된 리소스가 제한 값을 초과하면 사용자에게 에러를 반환합니다. 이와 같은 제약 사항이 없다면 무거운 데이터 분석 쿼리가 많이 유입되어 쿼리 엔진 비용이 급속도로 증가할 가능성이 있습니다. 제약 사항을 넘어서는 쿼리 실행이 필요할 경우에는 카탈로그 데이터 연동을 통해서 사용자의 쿼리 엔진 리소스를 사용하도록 안내하고 있습니다. 신규 로그 모니터링 시스템 적용 결과 Iceberg 기반의 신규 로그 모니터링 시스템을 오픈하면서 기존 Elasticsearch 기반의 로그 데이터는 최대 데이터 보관 기간을 14일로 단축했습니다. 이러한 정책을 통해서 2,000대 이상의 Elasticsearch 노드를 줄일 수 있었으며, 데이터 용량도 수 페타바이트 규모에서 수백 테라바이트 규모로 감소했습니다. 대신 기존에 90일로 제한한 최대 로그 보관 기간을 신규 로그 모니터링 시스템을 활성화할 경우 최대 5년까지로 늘였습니다. 이를 통해서 예상되는 인프라 비용이 매년 수 십억 원까지 절감되었습니다. 늘어나는 트래픽 추세를 감안하면 절감되는 비용은 매년 그 이상이 될 것이라 예상합니다. 이렇게 비용을 절감할 수 있는 이유는 다음과 같습니다. 상대적으로 비용이 저렴한 오브젝트 스토리지에 데이터를 저장합니다. Parquet 데이터 포맷에 zstd 압축을 적용해 데이터 압축률이 높습니다. 다음 그래프에 나타난 것처럼 전체 평균 원본 데이터 대비 약 6% 수준으로 압축됩니다. 쿼리 엔진 리소스를 분리해 최소한의 규모로 운영합니다. 기존 Elasticsearch 기반 모니터링 시스템의 Warm 계층의 데이터 노드와 비교해 Trino 클러스터 규모가 더 작습니다. 다음 그래프는 데이터 적재 이후 데이터 최적화 과정의 파일 병합을 통해서 감소된 파일 비율입니다. 평균적으로 약 7.5%의 수준으로 감소했습니다. 파일 병합 작업을 통해 테이블을 최적화하지 않는다면 데이터 쓰기/읽기 측면서 시스템이 정상적으로 작동할 수 없습니다. 다음은 신규 로그 모니터링 시스템의 UI입니다. 원하는 테이블을 선택해 쿼리(Main query)를 실행하면 그 결과가 다시 Iceberg 테이블로 저장됩니다. 그 이후에 해당 결과에 여러 가지 필터를 적용해 실시간으로 데이터를 탐색할 수 있습니다. 마치며 네이버의 기존 로그 모니터링 시스템은 Elasticsearch를 기반으로 구성되었으며, 수 천대의 서버로 수 페타바이트 규모의 로그 데이터를 저장했습니다. 데이터 쿼리 패턴을 분석한 결과, 대규모 데이터 중에서 70%의 데이터는 검색이 거의 이루어지지 않는 콜드 데이터였습니다. 이런 데이터를 고비용, 고성능 저장소인 Elasticsearch에 저장해야 할지 검토하게 되었습니다. 검색이 거의 이루어지지 않지만 법적 요구 사항과 사후 분석을 위해 장기간 로그 저장에 대한 요구 사항이 많았기 때문에 새로운 저비용의 로그 검색 시스템을 구축하기로 결정했습니다. 새로운 로그 모니터링 시스템은 Iceberg라는 오픈 테이블 포맷을 기반으로 구성됩니다. 오브젝트 스토리지에 로그를 저장하는 기술을 개발하고, Trino 쿼리 엔진에 기반해 로그 검색 시스템을 구축했습니다. 새로운 저비용의 로그 모니터링 시스템으로 연간 수십억 원의 인프라 비용을 절감할 수 있는 기반을 마련할 수 있게 되었고, 새로운 방식의 SQL 로그 검색/분석 기능을 사용자에게 제공할 수 있게 되었습니다. Iceberg의 오픈 테이블 포맷을 사용한 데이터 저장은 데이터 분석 플랫폼에서는 흔하게 쓰이는 방식입니다. 하지만 로그 모니터링(observability) 측면에서 기존 로그 모니터링 시스템의 요구 사항을 만족하는 신규 시스템을 구축하는 것은 쉽지 않은 일이었습니다. 특히나 데이터 적재와 최적화를 위한 오픈 소스의 활용이 어려워 Iceberg SDK를 사용해 직접 컴포넌트를 개발해야 했습니다. Iceberg SDK에 대한 레퍼런스가 부족해 데이터를 시간 단위로 나누어 저장하고 다시 병합하며 메타데이터를 관리하는 부분의 개발은 초기 단계에서부터 많은 어려움이 있었습니다. 또한 신규 시스템의 트래픽이 사내 오브젝트 스토리지 시스템에 부하를 발생시켜, 해당 문제를 해결하는 것도 쉽지 않은 일이었습니다. 하지만 컴포넌트를 자체 개발함으로써 특정 엔진에 제한되지 않고, 최신의 Iceberg 버전을 적용할 수 있다는 점은 매우 큰 장점입니다. 신규 로그 모니터링 시스템 오픈 이후에 사용자들은 단순히 장기 보관 데이터에 대한 검색뿐만 아니라 최신 데이터에 대해서도 기존 Elasticsearch의 Lucene 쿼리로 분석하기 힘든 것을 SQL 기반으로 분석하기 시작했습니다. NELO라는 사내 로그 모니터링 플랫폼은 데이터 분석을 위한 시스템은 아니지만 Iceberg 기반의 신규 로그 모니터링 시스템이 데이터 레이크(data lake)의 데이터 소스 중 하나로 활용될 수 있기를 기대하고 있습니다. 해당 글은 N INNOVATION AWARD 2024 특집편으로 수상작 '대용량/장기간 데이터를 위한 저비용 로그 검색 시스템 : NELO Alaska'의 수상팀에서 작성해주셨습니다. N INNOVATION AWARD는 2008년부터 이어진 네이버의 대표적인 사내 기술 어워드로 매년 우수한 영향력과 성과를 보여준 기술을 선정하여 축하와 격려를 이어오고 있습니다.

2024 네이버 통합검색의 웹 성능 리뷰
네이버 D2
2024 네이버 통합검색의 웹 성능 리뷰

네이버 검색은 사용자 중심의 빠르고 원활한 검색 경험을 제공하기 위해 지속적으로 웹 성능을 모니터링하고 최적화하고 있습니다. 2024년에는 특히 LCP(Largest Contentful Paint)를 핵심 성능 지표로 삼아 여러 최적화 작업을 진행하였으며, 그 결과 네이버 검색의 웹 성능은 목표로 삼았던 구글 글로벌 LCP와 유사한 수준인 LCP p95 기준 2.31초를 달성할 수 있었습니다. 또한 2024년에 새로운 서치 피드 서비스가 도입되면서 기존의 웹 기반 성능 지표로는 측정하기 어려운 무한 스크롤 영역을 측정할 수 있는 새로운 성능 지표를 개발하여 관리하고 있습니다. 새로운 성능 지표는 동적 콘텐츠 로딩의 체감 속도와 이미지 렌더링 타이밍을 평가하는 데 활용됩니다. 이 글에서는 1) 2024년 네이버 통합검색의 웹 성능을 정리하고, 2) 새롭게 도입된 성능 지표를 소개하며, 3) 2024년 네이버에서 진행한 몇 가지 성능 개선 사례를 살펴봅니다. 2024년 네이버 통합검색 성능 연간 지표 네이버 검색은 LCP를 가장 중요한 성능 지표로 설정하고 있으며, 구글 글로벌 LCP 수준인 p95(95번째 퍼센타일) 기준 2.5초 이하를 목표로 하고 있습니다. 2024년 12월 기준 네이버 검색의 LCP Good Score는 96.59%를 기록했는데, 이는 대부분의 사용자들이 페이지 로딩 시 콘텐츠가 빠르고 원활하게 표시되고 있음을 의미합니다. 꾸준히 시스템을 모니터링하고 개선하기 위해 노력한 덕분에 2024년 하반기부터 성능 지표가 점진적으로 개선될 수 있었습니다. 2024년 네이버 통합검색 성능 개선 사례에서 구체적인 개선 사례를 확인할 수 있습니다. 2024년 네이버 검색의 전체 LCP는 p95 기준 약 2.31초이며, INP(Interaction to Next Paint)는 0.26초입니다. INP는 사용자가 버튼을 클릭하거나 입력을 했을 때 화면이 다음 단계로 넘어가기까지 걸리는 시간을 의미합니다. INP는 Core Web Vitals의 주요 지표 중 하나로 네이버 검색에서도 유심히 모니터링하고 있습니다. 구글에서는 좋은 INP를 200ms 이하로 안내하고 있습니다. 2024년 하반기부터 네이버 검색의 INP 지표가 점점 개선되고 있지만, 아직 목표 기준인 60ms를 초과하므로 추가적인 최적화 작업이 필요합니다. 2024년 네이버 통합검색의 새로운 성능 지표 네이버 검색은 최근 무한 스크롤 방식의 서치 피드(Search Feed)를 도입하여 사용자 경험을 개선하기 위해 노력하고 있습니다. 그런데 기존의 LCP 지표만으로는 동적으로 로드되는 무한 스크롤 영역의 성능을 정확하게 평가하는 데 한계가 있었습니다. LCP는 페이지를 최초로 로딩할 때 주요 콘텐츠의 시각적 완성도를 측정하는 데 효과적이지만, 사용자가 직접 스크롤로 새로운 데이터를 요청하는 서치 피드의 특성을 반영하기 어려웠습니다. 이러한 문제를 해결하기 위해 네이버 검색에서는 새로운 성능 지표를 정의하여 관리하고 있습니다. 피드 사용자 체감 성능 지표: FUPP FUPP(Feed User Perceived Performance)는 서치 피드의 동작 흐름과 사용자 상호작용을 기반으로 설계된 지표입니다. 사용자가 화면 아래까지 스크롤하여 새로운 콘텐츠를 요청하면, 백엔드 API 호출이 트리거되고 해당 데이터를 받아 화면에 렌더링하는 과정이 시작됩니다. FUPP는 API 호출이 시작되는 시점부터 서치 피드의 첫 번째 주요 이미지가 화면에 완전히 렌더링될 때까지의 시간을 측정합니다. 이는 단순히 네트워크 응답 속도뿐 아니라 데이터 처리와 시각적 요소의 표시 시간까지 포괄함으로써, 사용자가 실제로 새로운 콘텐츠를 '인지'하는 순간을 측정합니다. 즉, FUPP는 무한 스크롤 환경에서 사용자가 다음 콘텐츠를 얼마나 빠르게 확인할 수 있는지를 평가하는 기준입니다. 위 내용을 바탕으로 FUPP를 측정한 결과 p95 기준 약 1.5초로 나타났습니다. 이는 대다수 사용자가 1.5초 이내에 새로 로드된 서치 피드 콘텐츠를 확인할 수 있음을 의미합니다. 다시 말해 사용자가 화면 아래에 도달하기 1.5초 전에 서치 피드를 요청하면 끊김 없이 콘텐츠를 확인할 수 있습니다. 피드 이미지 로드 타이밍 지표: FILT 대부분의 서치 피드에서 가장 많은 영역을 차지하는 부분은 이미지입니다. 따라서 이미지 로딩 속도가 사용자 체감 성능에 많은 영향을 주게 됩니다. 네이버 검색에서는 FILT(Feed Image Load Timing)라는 지표를 도입해 서치 피드에서 이미지가 언제, 어떻게 로드되었는지를 분석하고 있습니다. 이미지가 노출되는 시점을 총 4가지 유형으로 세분화하여 FILT를 측정했습니다. 첫 번째 유형은 Standby(대기 중)로 이미지 로딩이 아직 시작되지 않은 상태를 의미합니다. 브라우저의 lazy loading 방식을 이용하므로 Standby는 아직 브라우저가 이미지를 로드하지 않은 상태입니다. 측정한 결과 전체 이미지 중 14%가 이 유형에 해당했습니다. 두 번째 유형인 Early(미리 로드됨)는 사용자가 해당 피드 영역에 도달하기 전에 이미지가 로드된 경우로, 사용자는 끊김 없이 피드를 소비할 수 있습니다. 전체 이미지의 75%를 차지합니다. 세 번째 유형은 Viewport(화면 내 로드됨)로 사용자가 피드에 진입한 시점에는 이미지가 로드 중이었지만 피드를 소비하는 과정에서 로드가 완료되는 경우입니다. 전체 이미지의 약 11%를 차지하고 있습니다. 마지막 유형은 Late(늦은 로딩)로 사용자가 피드를 지나친 후에 이미지가 로드된 경우입니다. 즉, 사용자가 해당 이미지를 확인하지 못한 상태로 피드를 지나쳤음을 의미합니다. 다행히 이런 경우는 0% 수준으로 확인되었습니다. 서치 피드 최적화 FUPP와 FILT 지표로 서치 피드의 성능을 정량적으로 측정하고 모니터링할 수 있는 체계를 구축했고, 이를 활용해서 서치 피드 최적화 실험을 진행했습니다. 무한 스크롤 방식의 고민 중 한 가지는 콘텐츠를 호출하는 시점입니다. 사용자가 화면을 끝까지 스크롤한 이후 콘텐츠를 로드한다면 대기 시간이 발생하여 사용성에 문제가 생길 수 있습니다. 반면 사용자가 화면 아래에 도달하기 전에 콘텐츠를 너무 빠르게 로드하면 소비 의도가 없는 사용자에게도 콘텐츠가 노출되어 서버 리소스가 불필요하게 소모될 수 있습니다. 그래서 우리는 로드 시점에 따른 사용성과 서버 부하 등을 확인할 수 있는 ABT를 진행했습니다. 화면 맨아래에서부터 200&Tilde1,600px 구간을 실험 구간으로 설정하고, 구간별로 서치 피드 호출 시점을 조정하여 소비 지표와 시스템 지표를 종합적으로 확인했습니다. 그 결과 콘텐츠 로드 시점을 100px 조정할 때마다 서버 호출량은 5%, 사용자 도달률은 2% 변동하는 패턴을 확인할 수 있었습니다. 예를 들어 화면 아래에서 600px 위치에서 콘텐츠를 로드하면, 800px 위치 대비 서버 호출량이 10% 감소했으나 사용자 도달률도 4% 하락했습니다. FILT 지표 역시 주목할 만한 변화를 보였습니다. 로드 시점이 늦어질수록 Viewport 비중이 증가했는데, 이는 이미지 요청 시점이 늦어졌기 때문에 발생한 현상으로 예측한 결과였습니다. 흥미로운 부분은 특정 시점(약 1,000px) 이후에는 로드 시점을 더 앞당겨도 Early 비중이 개선되지 않는다는 점이었습니다. 소비 지표(클릭률, 이탈률 등)에서도 유의미한 인사이트를 확인할 수 있었습니다. 로드 시점이 늦어질수록 소비 지표는 안 좋아질 것으로 예상했고, 실제로도 가설을 입증하는 데이터를 확인할 수 있었습니다. 반면 로드 시점이 빠를수록 소비 지표가 개선될 것이라는 초기 가설과 달리 특정 시점(약 1,200px)을 기준으로 소비 지표는 오히려 감소했습니다. 이는 콘텐츠 소비 의도가 없는 사용자에게까지 피드가 노출되므로 해당 사용자들이 피드를 무시하거나 빠르게 이탈하는 행동 패턴에 기인한 것으로 판단하였습니다. 실험 데이터를 종합한 결과, 화면 아래에서부터 600&Tilde1,000px 구간에서 서치 피드를 호출하는 것이 가장 효율적이라는 결론을 내렸습니다. 현재 네이버 검색은 1,000px을 기준점으로 채택하여 서비스 안정성과 사용자 경험을 동시에 개선했으며, 향후 트래픽 변동이나 사용자 패턴 변화에 따라 데이터 기반으로 유연하게 조정할 계획입니다. 2024년 네이버 통합검색 성능 개선 사례 네이버 검색에서 2024년에 진행한 몇 가지 성능 개선 사례를 소개합니다. 지역플러스 영역 LCP 개선 네이버 검색의 지역플러스 영역은 장소 검색 시 표시되는 검색 결과로, 주로 이미지와 함께 노출됩니다. 2024년 5월 30일 업데이트로 LCP p95 수치가 3,000ms에서 2,000ms로 30% 개선되었습니다. 이러한 성능 개선의 핵심 요인은 CSS의 background-image 속성을 사용해 이미지를 로딩하는 방식에서 img 태그를 사용하는 방식으로 변경한 데 있습니다. 과거에는 Internet Explorer 환경에 대응해야 해서 object-fit 속성 대신 background-image 속성을 사용할 수 밖에 없었습니다. background-image 속성을 사용하여 이미지를 삽입하는 방식은 브라우저가 DOM 파싱이 완료된 후에 CSS 파일을 파싱하면서 이미지를 요청합니다. 그 결과 이미지가 렌더링되기까지 추가적인 지연이 발생하며, 이는 LCP를 악화시키는 요인이 될 수 있습니다. 반면 HTML의 img 태그를 활용하는 방식은 HTML 문서를 파싱하는 즉시 img 태그를 인식하고 리소스 요청을 시작합니다. 이 방식은 브라우저의 초기 파싱 단계에서 이미지를 빠르게 불러오므로 이미지 렌더링 시간을 단축하고 LCP에 긍정적인 영향을 줄 수 있습니다. 다음의 그림은 각 이미지 로딩 방식을 적용했을 때 브라우저에서 이미지를 로드하는 과정을 나타낸 것입니다. 파란색 박스로 표시된 영역은 img 태그를 사용했을 때, 빨간색 박스로 표시된 영역은 background-image 속성을 사용했을 때입니다. 이번 개선 사례에서 네이버 검색의 성능 최적화 작업이 단순히 코드 최적화나 서버 인프라 개선에 국한되지 않으며, 프런트엔드 렌더링 전략의 미세 조정만으로도 상당한 효과를 얻을 수 있다는 점을 확인할 수 있었습니다. 네이버 통합검색 성능 개선에 도움을 주신 플레이스 검색 서비스 개발팀의 이대희 님, 임지수 님(메인&플레이스UI개발)께 감사드립니다. 크리스마스 브랜드검색 Flicking 성능 개선 크리스마스 시즌 동안, 네이버 검색의 특정 영역에서 egjs/Flicking을 활용한 UI의 화면이 끊기는 현상이 발생했습니다. 비록 이 문제가 Web Vitals 지표에는 큰 영향을 주지 않았지만, 사용자 경험에는 부정적인 인상을 남길 가능성이 높았습니다. 문제의 원인을 분석한 결과, 첫 번째로 marginLeft 속성을 지속적으로 변경함에 따라 브라우저가 레이아웃 재계산(reflow)을 빈번하게 수행하게 된 부분이 큰 영향을 주었습니다. 이로 인해 화면의 애니메이션이 부드럽게 이어지지 않고 중간에 끊기는 현상이 발생했습니다. 두 번째로, 배경 이미지를 CSS의 background-image 속성으로 로드했기 때문에 이미지 로딩 속도가 상대적으로 느려졌습니다. 이 문제를 해결하기 위해 marginLeft 속성 대신 transform:transX 속성을 적용하도록 안내했습니다. 이렇게 하면 레이아웃을 재계산하지 않고 GPU 가속을 활용하므로 애니메이션이 훨씬 부드럽게 구현됩니다. 또한 앞선 사례에서 소개한 것처럼 background-image 속성 대신 img 태그 기반의 방식으로 이미지를 렌더링하도록 변경하여 이미지 로드 속도를 향상시켰습니다. egjs/Flicking을 사용할 때 marginLeft를 사용한 원인을 확인해 보니 Flicking 애니메이션 도중 Parallax 효과를 구현하기 위해서였습니다. 사실 egjs/Flicking에서도 Parallax 기능을 제공하고 있었지만 당시 제공된 문서의 설명이 충분하지 않아 실제 적용 과정에서 어려움을 겪었던 것으로 파악됩니다. 이에 따라 관련 내용을 보완하였으며, 이외에도 egjs/Flicking에서 제공하는 다양한 기능을 제대로 활용할 수 있도록 지속적으로 문서를 개선할 계획입니다. 마치며 2024년 네이버 통합검색의 웹 성능은 꾸준한 관리로 지속적인 개선을 이루었으며, LCP p95 기준 2.31초를 기록할 만큼 안정적인 수준에 도달했습니다. 또한, 새로운 서치 피드 서비스에 적합한 성능 지표인 FUPP와 FILT를 도입하여 무한 스크롤 영역의 성능을 보다 정밀하게 측정하고 최적화할 수 있었습니다. 앞으로 다음과 같은 부분을 개선할 계획입니다. SSR(ServerSideRendering)과 부분 CSR(ClientSideRendering)이 공존할 때 성능 측정 방법 개발 INP 지표 개선을 위한 추가 최적화 네이버 검색은 지속적으로 성능을 관찰하고 개선하여 더욱 빠르고 효율적인 검색 환경을 제공하고 사용자 경험을 극대화하는 것을 목표로 하고 있습니다.

네이버클라우드 X 서울대학교 KDT 빅데이터 핀테크 전문가 과정
네이버 클라우드
네이버클라우드 X 서울대학교 KDT 빅데이터 핀테크 전문가 과정

안녕하세요, 누구나 쉽게 시작하는 클라우드 네이버클라우드(ncloud.com)입니다. 서울대학교 KDT 빅데이터 핀테크 전문가 과정에 캡스톤 참여기업으로 함께한 네이버클라우드의 의미 있는 경험을 여러분과 나누고자 합니다! ✨ 학생들의 반짝이는 아이디어와 네이버클라우드의 기술이 만나 어떤 놀라운 시너지를 만들어냈는지, 함께한 학생들의 이야기를 만나보겠습...

[CSAP 성공 사례집 #1] 디딤365가 푸는 검증된 전문가의 클라우드 보안 인증 공략법
네이버 클라우드
[CSAP 성공 사례집 #1] 디딤365가 푸는 검증된 전문가의 클라우드 보안 인증 공략법

안녕하세요. 누구나 쉽게 시작하는 클라우드 네이버클라우드 ncloud.com 입니다. 이번 포스팅에서는 네이버 클라우드 플랫폼을 활용해 공공시장 진출 시 필수인 CSAP 보안인증 요건을 해결하는 '디딤365'를 소개해 드리려고 해요! 디딤365는 네이버클라우드의 파트너사로, 공공기관과 비즈니스를 위한 디지털 전환을 지원하고, 컨설팅하고 있습니다. 디딤...

Istio Traffic Management: 모범 사례 살펴보기
NGINX STORE
Istio Traffic Management: 모범 사례 살펴보기

Istio Traffic Management: 모범 사례 살펴보기 이 블로그 포스트는 Istio 를 사용하며 네트워킹 또는 트래픽 관리 문제를 방지하기 위한 특정 배포 또는 구성 지침을 제공합니다. 목차 1. 서비스의 기본 경로 설정2. 네임스페이스 간 구성 공유 제어3. 네임스페이스 간 Istio Destination Rule 적용 문제4. Isti...

호텔 검색, 어떻게 달라졌을까요? 2편 - 지식 증류
네이버 D2
호텔 검색, 어떻게 달라졌을까요? 2편 - 지식 증류

기존 호텔 검색에서는 블로그에서 장소(Point of Interest, POI) 정보를 추출하고 다국어 음차 변환 및 번역을 수행하며 검색 키워드와 스니펫을 자동 생성하는 과정에서 대형 언어 모델(Large Language Model, 이하 LLM)을 활용했습니다. 하지만 LLM은 강력한 성능을 제공하는 대신 높은 연산 비용과 긴 응답 시간으로 인해 실시간 검색 서비스에 적용하기 어려웠습니다. 반면, sLLM(small large language model)은 빠르고 효율적이지만 성능이 낮아 검색 품질이 저하될 우려가 있었습니다. 호텔 검색에서는 다양한 블로그 데이터를 분석하고, 다국어 지원을 위해 번역 및 음차 변환을 수행해야 합니다. 이를 위해서는 LLM 기반의 자연어 처리 모델이 필수적이었습니다. LLM 수준의 성능을 소형 모델에서도 구현할 수 있다면 실시간 검색 품질을 유지하면서도 서버 부담을 줄일 수 있습니다. 이에 따라 플레이스 AI 팀은 지식 증류(Knowledge Distillation) 기법을 활용해 LLM의 성능을 유지하면서도 sLLM으로 최적화하는 기술을 연구했고, 그 결과 검색 품질을 유지하면서도 효율적인 서비스 운영이 가능해졌습니다. 구현 과정과 주요 도전 과제 Teacher와 Student 모델 선정 Teacher 모델의 성능이 학습 데이터 품질을 결정하고, Student 모델의 성능이 최종 검색 품질에 직접적인 영향을 미치기 때문에, 최적의 모델을 선정하는 것이 중요했습니다. 이에 따라 LLM as Judge 방식을 활용해 다양한 후보군을 평가한 뒤, 증류할 task에 대해 가장 성능이 뛰어난 Teacher와 Student 모델을 task마다 선정했습니다. 정확한 학습 데이터 확보 Teacher 모델에서 환각 현상(Hallucination)이 없는 학습 데이터를 추출하는 것이 핵심이었습니다. 이를 위해 정교한 프롬프트 엔지니어링을 적용하여 학습 데이터를 구성했습니다. 주요 설계 요소는 다음과 같습니다. task 설명과 구체적인 지침 제공 키워드 및 스니펫 생성 방식 가이드라인 적용 모델 응답의 형식과 구조 명확화 청중, 역할, 스타일 지침 제공 프롬프트 설계 시 OpenAI cookbook, Llama cookbook을 참고했습니다. 지식 증류 기법 개선 기존 방식으로는 sLLM이 LLM의 성능을 효과적으로 재현하기 어려웠기 때문에, 여러 단계에 걸쳐 증류 기법을 고도화했습니다. 1. 초기 접근 초기에는 SeqKLD 방식을 사용해 Label을 학습했지만, 기대만큼의 성능이 나오지 않았습니다. 2. 화이트박스 지식 증류 Label LM Loss와 함께 Logit 정보를 활용하는 방식도 시도했지만, 성능 향상 폭이 크지 않아 제외되었습니다. 3. 블랙박스 지식 증류 + 근거 학습 적용 Teacher 모델이 단순히 답을 제공하는 것이 아니라, 왜 그러한 답이 나왔는지에 대한 근거(Rationale)까지 학습하도록 설계했습니다. Label과 Rationale을 별도 Loss로 학습하는 Distilling Step-by-Step 방식을 적용하여 정교한 모델 성능을 확보하고, <|Label|>, <|Rationale|> 같은 특수 토큰을 추가해 학습 과정에서 구체적인 정보 구분이 가능하도록 했습니다. 4. 최적화 단계 학습 과정에서 Rationale 정보가 Label과 충돌하는 경우가 발생해, 이를 줄이기 위해 Label 정보를 Rationale 생성 단계에서 먼저 고려하도록 조정했습니다. 그 결과, 기존 Distilling Step-by-Step 방식 대비 모든 케이스에서 성능이 향상되었습니다(LLM as Judge). 5. 추가 시도 MoE(Mixture of Experts)와 MoE LoRA 방법도 적용해 보았습니다. MoE with LoRA가 가장 좋은 성능을 보였고 다중 작업 학습(multi-task learning)의 가능성을 확인할 수 있었습니다. 다만, 서비스에서는 개별 task의 성능이 서로 간섭하지 않아야 하므로 단일 작업 학습(single-task learning) 방식을 적용하고 있습니다. 마치며 이러한 과정을 통해 플레이스 AI 팀은 실시간 트래픽을 감당할 수 있는 sLLM을 성공적으로 개발해 서비스에 적용했고, 그 결과 LLM 수준의 검색 품질을 유지하면서도 보다 가벼운 시스템으로 서비스 운영이 가능해졌습니다. 앞으로도 지식 증류 기술을 지속적으로 연구하며 모델 성능과 서비스 품질을 더욱 향상시킬 예정입니다. 참고 문헌 Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena LLama cookbook, OpenAI cookbook Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes DAN24; LLM, MULTI-MODAL MODEL로 PLACE VERTICAL SERVICE 개발하기 해당 글은 N INNOVATION AWARD 2024 특집편으로 수상작 'LLM과 함께 호텔 검색의 한계를 넘다'의 수상팀에서 작성해주셨습니다. N INNOVATION AWARD는 2008년부터 이어진 네이버의 대표적인 사내 기술 어워드로 매년 우수한 영향력과 성과를 보여준 기술을 선정하여 축하와 격려를 이어오고 있습니다.

호텔 검색, 어떻게 달라졌을까요? 3편 - 검색 시스템
네이버 D2
호텔 검색, 어떻게 달라졌을까요? 3편 - 검색 시스템

호텔 검색을 고도화하기 위해서 검색 키워드 동의어·유의어 보강, 검색 문서 커버리지 확대, 질의와 연관된 콘텐츠 수급 기술이 필요했습니다. 이를 해결하기 위해 플레이스 AI 팀은 다국어 음차 변환 및 번역 모델 → POI 매칭 → 검색 키워드 및 스니펫 추출의 세 가지 단계를 포함한 프로젝트를 진행했습니다. POI: 사용자가 관심을 가질 만한 장소(Point of Interest)를 의미하며, 레스토랑, 호텔, 관광지, 쇼핑몰 등 다양한 유형의 장소를 포함합니다. 네이버 플레이스에서는 이러한 POI 정보를 체계적으로 관리하며 검색 및 리뷰 서비스에서 활용하고 있습니다. POI 매칭: 블로그, 결제 내역, 영수증, 리뷰 등에서 추출된 POI 정보를 네이버 플레이스 DB의 POI와 연결하는 과정입니다. 구현 과정과 주요 도전 과제 다국어 지원을 위한 음차 변환 및 번역 모델 적용 해외 호텔 및 명소 검색 시, 한국어, 영어, 일본어 등 다양한 언어로 입력된 질의가 일관된 검색 결과로 연결되지 않는 문제가 있었습니다. 기존 시스템은 CP사에서 제공한 필드만 색인하여 활용했기 때문에 다국어 질의 대응력이 부족했고, 이로 인해 일부 유명 업체조차 검색되지 않는 경우가 발생했습니다. 검색 키워드 동의어·유의어 보강을 위해 다국어 음차 변환 및 번역 모델을 적용하여 블로그 등에서 검색 대응 키워드를 확장했습니다. 이를 통해 언어별 명칭 차이로 인한 검색 누락을 방지하고 검색 결과의 일관성을 확보했습니다. 한국어 ↔ 일본어, 한국어 ↔ 로마자 음차 변환 모델을 도입하여 언어별 명칭 차이를 줄이고 검색 정확도를 향상시켰습니다. 업체 카테고리 기반 한국어 → 영어 번역 모델을 추가 개발하여 다국어 검색 커버리지를 확장했습니다. 또한, 호텔 검색, 어떻게 달라졌을까요? 2편 - 지식 증류의 기술을 적용하여 검색 품질을 전반적으로 개선했습니다. 이러한 개선을 통해 검색 결과의 일관성이 높아졌고, 글로벌 사용자가 원하는 정보를 더욱 쉽게 찾을 뿐만 아니라 한국어 사용자도 외국 명칭 검색 시 검색 누락 없이 직관적이고 정확한 결과를 경험할 수 있게 되었습니다. 다국어 지원 모델 도입 이후 검색 요청 수를 나타내는 QC(Query Count)와 고유 검색어 수를 의미하는 UQC(Unique Query Count)가 각각 3%와 13% 증가했습니다. QC와 UQC가 증가한다는 것은 검색에서 다루는 키워드가 다양해지고 더 많은 검색 요청이 발생한다는 의미입니다. 이로 인해 롱테일 검색어(수요는 적지만 누적되면 큰 트래픽을 유발하는 키워드)의 노출이 확대되면서 검색 커버리지가 자연스럽게 증가합니다. 또한, 해외 호텔 및 키워드별 평균 호텔 검색 커버리지도 약 3% 상승이 기대됩니다. POI 정보 추출 및 POI 매칭 호텔 검색의 커버리지를 확대하려면, 검색할 대상인 키워드를 다양하게 확보해야 합니다. 블로그에서 호텔 및 여행지 관련 POI 정보를 추출하고 이를 네이버 POI 플랫폼 DB와 매칭하여 키워드를 유입시킬 연결점을 만드는 것이 핵심 과제였습니다. 기존에는 Exact Match 방식을 활용하여 POI를 매칭했으나, 이 방식은 오탈자가 있거나 일부 데이터(주소, 전화번호 등)가 누락되면 정확한 매칭이 어렵다는 한계가 있었습니다. 예를 들어, 블로그에서 언급된 호텔 이름이 공식 명칭과 미세하게 다르거나, 결제 내역의 업체명이 네이버 플레이스 DB와 일치하지 않는 경우 POI가 제대로 매칭되지 않는 문제가 있었습니다. 이를 해결하기 위해 Dense Retrieval 기반의 POI 매칭 모델을 도입하여 POI 매칭의 정확도를 개선했습니다. 이 모델을 활용하면 블로그에서 추출한 업체명, 주소, 전화번호 등의 정보가 일부 불완전하더라도, 유사도를 분석하여 보다 정교한 매칭이 가능합니다. 이에 대한 자세한 내용은 POI 매칭 모델 구조에서 설명하겠습니다. 블로그에서 추출한 POI 데이터는 POI 플랫폼과 연동하여 검색 문서의 커버리지를 확대하고 검색 품질을 개선했습니다. 해외에서 새로운 POI를 발견하기 위해 블로그에서 업체명과 주소, 전화번호 등을 자동 추출한 후, 기존 DB와 비교하여 일치하는 POI가 없는 경우 신규 POI로 업데이트하는 기능도 적용했습니다. 개선 결과, 전 세계 호텔에 매칭한 블로그 수는 약 41만 개, 블로그에서 추출한 이미지는 380만 개로, 검색 결과의 커버리지가 대폭 확장되었습니다. POI 플랫폼은 단순한 텍스트 비교를 넘어, 플레이스 AI의 모델을 활용하여 POI 정보를 더욱 정교하게 매칭하고 신규 POI를 발견하는 기술 플랫폼으로 자리 잡았습니다. POI 매칭 모델 구조 POI 정보를 블로그에서 추출하더라도, 검색에 필요한 장소명, 주소, 전화번호 등의 정보가 누락되거나 오탈자가 포함될 수 있는데, 이런 경우 일반적인 BM25 검색 방식으로는 검색되기 어려웠습니다. 이를 해결하기 위해 정확도 92% 이상의 POI 매칭 성능을 가진 모델을 개발하여 도입했습니다. POI 매칭 모델은 Encoder → Retrieval → Reranker → Generator의 4단계 구조로 설계되었습니다. 1. Encoder 기존에 진행했던 Pairwise Supervised Contrastive Learning에 추가 loss를 적용함으로써 데이터 증강의 효과를 내서 인코더의 성능을 향상시켰습니다. 그 결과, Query POI 정보와 Target POI 정보를 인코딩하여 비교 가능한 벡터로 변환합니다. 2. Retrieval ANN 인덱스를 통해 Query POI와 가장 유사한 Target POI를 검색합니다. 3. Reranker Retrieval 단계에서 검색된 상위 10개의 Target POI 후보 중 가능성이 높은 상위 4개로 좁히는 Binary Classification 모델을 적용했습니다. 디코더는 bert 기반의 인코더, reranker보다 지식이 많고 성능이 좋기 때문에, 이런 디코더의 성능을 reranker에 증류하는 방식을 차용했습니다. 디코더가 정답이라고 한 후보군의 Logit을 reranker에서 높이도록 학습하여 reranker의 성능을 향상시켰습니다. 4. Generator(Decoder) Teacher Model에서 정답과 그에 상응하는 근거를 추출하여 Place sLLM 학습을 고도화했습니다. 플레이스 AI 팀에서 파인튜닝한 Q model-S 모델을 활용하여, Query POI와 reranker의 상위 4개 후보 POI를 입력으로 받아 최종 정답을 도출하는 구조로 설계했습니다. 검색 키워드 및 스니펫 추출 기존 모델은 UGC(User Generated Content) 기반 키워드 추출을 지원했지만, 자연어 처리(Natural Language Processing, NLP)의 품사 태깅을 활용하는 방식으로 인해 적합하지 않은 키워드가 다수 추출되고, 부정적인 의미로 사용된 키워드까지 포함되는 문제가 있었습니다. 또한, 특정 도메인(여행, 호텔)에 최적화되지 않아 검색 품질이 저하되었으며, 이로 인해 검색 결과의 직관성이 떨어지고 사용자들에게 명확한 정보를 제공하기 어려웠습니다. 개선된 모델에서는 Place sLLM을 학습하여 특정 도메인(여행, 호텔)에 적합한 키워드 및 스니펫을 추출하도록 설계했으며, 여러 POI 정보가 포함된 블로그 글에서도 특정 POI에 대한 키워드 및 스니펫만을 정확하게 추출할 수 있도록 최적화했습니다. 또한, 호텔 검색, 어떻게 달라졌을까요? 2편 - 지식 증류의 기술을 적용하여 검색 품질을 전반적으로 개선했습니다. 예를 들어, 사용자가 '가족 여행 추천 호텔'과 같은 특정 키워드로 검색할 때, 기존에는 블로그에서 연관된 키워드를 추출하고 이미지 검색 솔루션을 활용해 콘텐츠를 제공했지만, 이제는 Place sLLM을 통해 유의미한 검색 키워드만을 선별적으로 추출하고 추가로 키워드가 언급된 스니펫까지 함께 제공하여 검색 결과의 신뢰도를 높였습니다. 또한, 필터링 작업으로 저품질 키워드와 스니펫을 제거함으로써 보다 직관적이고 가독성 높은 검색 결과를 제공할 수 있도록 개선되었습니다. 이를 통해 국내 호텔 약 80만 개, 해외 호텔 41만 개의 검색 키워드 및 스니펫을 추출하여 약 3%의 검색 커버리지를 확대했습니다. 마치며 다국어 지원, POI 매칭, 검색 키워드 및 스니펫 추출 기술은 여행 검색 시스템의 핵심 성능을 좌우합니다. 다국어 지원은 글로벌 사용자뿐만 아니라, 한국어 사용자가 외국 명칭을 검색할 때 발생하는 언어별 명칭 차이를 해소해 검색 누락을 방지합니다. POI 매칭은 Exact Match 방식의 한계를 넘어 오탈자나 데이터 누락에도 정확한 장소 정보를 제공해 검색의 신뢰도와 효율을 높입니다. 검색 키워드 및 스니펫 추출은 도메인 특화 컨텍스트 분석을 통해 사용자 의도에 맞는 핵심 정보를 선별해 검색 결과의 가독성과 직관성을 개선합니다. 이 세 기술은 정확한 정보 전달을 통해 검색 경험을 혁신합니다. 앞으로도 POI 매칭 및 검색 성능을 지속적으로 최적화하여 사용자들이 원하는 정보를 더욱 빠르고 정확하게 찾을 수 있도록 개선해 나갈 예정입니다. 참고 문헌 Supervised Contrastive Learning Pairwise Supervised Contrastive Learning of Sentence Representations Re2G: Retrieve, Rerank, Generate 다운타임 없이 VectorDB 운영하기! DAN24; LLM, MULTI-MODAL MODEL로 PLACE VERTICAL SERVICE 개발하기 해당 글은 N INNOVATION AWARD 2024 특집편으로 수상작 'LLM과 함께 호텔 검색의 한계를 넘다'의 수상팀에서 작성해주셨습니다. N INNOVATION AWARD는 2008년부터 이어진 네이버의 대표적인 사내 기술 어워드로 매년 우수한 영향력과 성과를 보여준 기술을 선정하여 축하와 격려를 이어오고 있습니다.

호텔 검색, 어떻게 달라졌을까요? 4편 - 이미지 검색
네이버 D2
호텔 검색, 어떻게 달라졌을까요? 4편 - 이미지 검색

검색 서비스는 사용자의 다양한 질의에 대응해야 하며, 새로운 검색 키워드가 지속적으로 추가됩니다. 특히, 이미지 검색에서는 단순한 키워드 기반 매칭이 아니라, 검색 의도에 맞춰 가장 적합한 이미지를 찾아 제공하는 것이 중요합니다. 기존에 공개된 CLIP(Contrastive Language-Image Pre-training) 모델은 일반적인 Text-Image Retrieval에는 활용될 수 있었지만, 플레이스(명소, 호텔, 관광지 등) 도메인에 최적화되지 않아 검색 품질이 충분하지 않았습니다. 특히, 대표 이미지가 특정 이미지로 고정되어 검색 질의와 관련 없는 이미지가 제공되는 경우가 많아 사용자 경험이 저하되었습니다. 또한, 기존 모델은 특정한 질의에 대해 유사한 이미지를 추천하는 데 제한이 있었으며, 새로운 키워드가 등장할 때마다 이미지 매칭이 원활하지 않았습니다. 이를 해결하기 위해 검색 시스템이 키워드뿐만 아니라 이미지 콘텐츠를 깊이 있게 이해하고 활용할 필요가 있었습니다. 이에 플레이스 AI 팀은 플레이스 특화 CLIP 인코더를 학습하여, 특정 도메인에서도 높은 zero-shot inference 성능을 보이는 모델을 구축하게 되었습니다. 이를 통해 단순한 이미지 검색이 아니라, POI 및 장소별 컨텍스트를 고려한 이미지 매칭이 가능해졌습니다. 구현 과정과 주요 도전 과제 멀티모달 검색을 위한 모델 개발 여행, 호텔, 관광지 등의 플레이스 도메인에 적합한 멀티모달 인코더를 개발하고, 검색 키워드와 이미지의 연관성을 학습하여 질의에 맞는 이미지를 검색 결과로 제공할 수 있도록 최적화했습니다. 예를 들어, '수영장'을 검색하면 수영장이 포함된 호텔이나 리조트의 이미지가 노출되도록 개선했습니다. 이를 위해 블로그 및 사용자 리뷰 데이터를 활용하여 실제 사용자 선호도를 반영한 이미지 랭킹 알고리즘을 개발했습니다. 파괴적 망각 문제 방지 기존의 CLIP 인코더는 새로운 도메인을 학습하면 기존의 정보를 잊어버리는 파괴적 망각(Catastrophic Forgetting) 문제가 발생했습니다. 이를 방지하기 위해 다음과 같은 기술을 적용했습니다. Layer-wise Discriminative Learning Rate 모델의 낮은 레이어에서는 기존에 학습된 일반적인 feature를 유지할 수 있도록 낮은 학습률(learning rate)을 적용했습니다. 이를 통해, 기존 모델의 성능을 유지하면서도 새로운 도메인 확장이 가능해졌습니다. Domain-Adaptive Pre-training Continual Pre-training of Language Models에서 소개된 DAS(Continual DA-pre-training of LMs with Soft-masking)를 바탕으로 Pretrained 모델에서 기존 지식에 견고한(robust) 유닛과 그렇지 않은 유닛을 학습 전에 판별한 뒤, 견고한 유닛에 신규 도메인 데이터를 추가 학습시키는 방식을 적용했습니다. 이 접근법을 통해 기존 backbone CLIP과 비교했을 때, ImageNet과 같은 General Knowledge 성능이 향상되었으며(기존 지식을 잊지 않음), 플레이스 도메인의 성능은 최소 20%에서 최대 67%까지 개선되었습니다. 또한, 학습 과정에서 지속적인 모델 평가 및 파인튜닝을 적용하여, 기존 도메인의 성능을 유지하면서 신규 도메인 적응력을 높였습니다. 클래스 확장 시 필요한 이미지 수 최소화 새로운 도메인을 빠르게 확장하기 위해, 적은 이미지 수로도 높은 성능을 유지할 수 있는 기법을 연구했습니다. 각 도메인의 이미지들을 클러스터링하고 대표적인 centroid 이미지들로 학습 데이터를 구성함으로써 적은 데이터로도 도메인 내 다양한 분포를 반영할 수 있도록 했습니다. 실험 결과, 클래스별 20장의 이미지만 학습해도 전체 데이터셋을 학습한 경우와 큰 성능 차이가 없음을 확인하여, 현재 클래스별 20장의 이미지로 효과적인 도메인 확장을 진행 중입니다. 전체 데이터셋 클래스별 50장 클래스별 20장 클래스별 10장 한국음식(Acc@1) 85.98% 85.44% 85.40% 82.13% 숙박업체 내 시설(Acc@1) 96.68% 94.88% 94.72% 93.02% 마치며 이러한 개선을 통해, 플레이스 AI 팀은 기존 대비 검색 결과의 시각적 품질을 크게 향상시킬 수 있었습니다. 멀티모달 인코더 적용 후, 대표 이미지 검색의 정확도가 상승했으며 사용자 경험이 한층 더 직관적이고 풍부해졌습니다. 또한, 검색 결과에서 보다 직관적이고 연관성 높은 이미지를 제공하여 사용자의 체류 시간을 증가시키는 효과를 얻을 수 있었습니다. 향후에는 이미지 검색의 다양성을 더욱 높이고, 사용자 선호도 기반의 개인화된 이미지 추천 시스템을 도입하여 검색 경험을 개선할 예정입니다. 참고 문헌 Layer-wise Discriminative Learning Rate Continual Pre-training of Language Models DAN24; LLM, MULTI-MODAL MODEL로 PLACE VERTICAL SERVICE 개발하기 해당 글은 N INNOVATION AWARD 2024 특집편으로 수상작 'LLM과 함께 호텔 검색의 한계를 넘다'의 수상팀에서 작성해주셨습니다. N INNOVATION AWARD는 2008년부터 이어진 네이버의 대표적인 사내 기술 어워드로 매년 우수한 영향력과 성과를 보여준 기술을 선정하여 축하와 격려를 이어오고 있습니다.

호텔 검색, 어떻게 달라졌을까요? 1편 - 문제와 해결
네이버 D2
호텔 검색, 어떻게 달라졌을까요? 1편 - 문제와 해결

네이버는 호텔 검색이 다루는 범위를 대폭 확대하고 더 풍성한 결과를 제공하기 위해, 검색 엔진을 전환하고 대형 언어 모델(Large Language Model, 이하 LLM)을 도입했습니다. 그 결과 검색 품질과 사용자 경험 모두에서 큰 변화를 이끌어냈습니다. 이 글에서는 기존 문제점과 이를 해결하기 위한 접근법, 그리고 얻은 결과를 실제 사례와 함께 살펴보겠습니다. 문제와 해결 기존 호텔 검색 엔진은 짧은 질의에는 강하지만 다루는 범위는 좁았기에 새로운 유형의 질의 대응이 필요했습니다. 이를 위해 '호텔 검색 의도가 있지만 호텔 검색 결과가 노출되지 않는 질의'를 찾고 우선순위를 정하는 것이 핵심 과제였습니다. 블로그로 유입된 질의 중 호텔 관련 글을 클릭한 질의를 수집하고, LLM을 활용해 호텔 검색 의도가 있는 질의만 선별했습니다. 이렇게 확보한 데이터를 기반으로 검색 품질을 개선했습니다. 블로그에서 장소(Point of Interest, 이하 POI) 기본 정보를 추출해 네이버 POI 플랫폼과 매핑하여 검색 결과의 커버리지를 확장하고, 다국어 음차 변환 및 번역 모델을 도입해 언어 장벽을 해결했습니다. 또한, 키워드 및 스니펫 자동 추출, 이미지 검색 개선을 통해 검색 품질을 높였습니다. 예시를 소개드릴게요. 문제 1: 복잡한 검색 의도 처리의 어려움 예시: '도쿄 수영장이 있는 깨끗한 호텔' 같은 복잡한 질의는 기존 검색 엔진으로 검색할 수 없었습니다. 해결: LLM을 활용해 사용자의 검색 질의를 정밀하게 분석해 복잡한 질의 처리 능력을 강화했습니다. 블로그에서 POI 정보를 추출해 네이버 POI 플랫폼과 매핑했고, 블로그 글로부터 검색에 사용할 키워드('수영장', '깨끗한' 등)를 폭넓게 확보했습니다. 이를 통해 관련 호텔이 풍부하게 검색되고 검색 근거도 노출될 수 있도록 개선했습니다. 더불어 LLM을 이용해 오타와 정타 데이터를 생성 및 학습하여 오타 교정 기능도 탑재했습니다. 문제 2: 다국어 검색의 한계 예시: '호텔 한큐 레스파이어 오사카'는 한국인 여행자들에게 인기가 많은 호텔인데요, 영문명인 'Hotel Hankyu Respire Osaka'를 흔히 '호텔 한큐 리스파이어 오사카'라고 읽기도 하지만 '리스파이어'라는 한글 키워드가 없기 때문에 '한큐 리스파이어 오사카'로는 검색할 수 없었습니다. 해결: 다국어 음차 변환과 번역 모델을 도입해 한국어뿐 아니라 영어, 일본어 등 다양한 언어의 호텔 명칭을 발음하는 방식을 고려해 키워드를 확장했습니다. 이제 해외 호텔 검색도 훨씬 쉬워졌습니다. 문제 3: 콘텐츠 및 시각적 정보의 부족 예시: 사용자가 '도쿄 야경 호텔'을 검색했을 때에는 대표 사진에 글자만 잔뜩 나열된 결과보다는 야경이 보이는 사진, 야경과 관련된 리뷰 등 관련도 높은 직관적인 정보를 원할 것이라고 생각했습니다. 해결: 블로그 데이터를 활용해 키워드와 스니펫을 자동 추출하고 이미지 검색을 강화했습니다. 사용자가 사진과 함께 원하는 정보를 한눈에 파악할 수 있도록 개선했습니다(서비스 반영 준비 중). 문제 4: 튼튼한 시스템을 구축하고 검색 품질 유지하기 POI 데이터 관리를 XBU(eXtended Business Utility, 국내/해외 POI와 관련 데이터 통합 관리 및 파이프라인 운영 플랫폼)로 전환하여 글로벌 확장성을 확보하고 증분 색인 시스템을 구축해 실시간 검색 반영이 가능하도록 했습니다. 클라우드 서빙 플랫폼 CLOUS3.0을 통해 검색 인프라를 자동화하여 보다 튼튼한 검색 시스템을 구축했습니다. 검색 엔진을 기존 Elastic Search에서 네이버 자체 검색 엔진 Nexus로 전환해 질의 분석 정확도를 높이고, 보다 복잡한 질의에 유연하게 대응할 수 있도록 했습니다. 마지막으로, 검색 품질을 유지하기 위해 자동 품질평가 도구를 구축했습니다. 검색 질의에 대한 적절한 검색 결과를 벤치마크 데이터로 만들고, 품질 비교 및 데일리 모니터링을 통해 검색 로직의 타당성을 지속적으로 검증하고 있습니다. 네이버 호텔 검색, 이렇게 달라졌습니다 전년 동일 월 대비 다음과 같은 성과를 얻었습니다. 클릭 수: 전년 대비 70% 상승 – 더 많은 사용자가 원하는 결과를 클릭했습니다. 호텔 예약 건수: 비수기임에도 불구하고 19% 증가 – 검색 품질 개선이 곧 예약으로 이어졌습니다. 사용자 수 증가: 모바일 기준 16% 증가 - 더 많은 사용자가 호텔 검색을 경험했습니다. 검색 커버리지: UQC(Unique Query Count) 450% 상승, QC(Query Count) 157% 상승 – 호텔 검색의 대응 범위가 효과적으로 확대되었습니다. 다국어 검색 성능 개선: 다국어 대응 전후 UQC 13% 상승, QC 3% 상승 – 다국어 질의 처리로 대응 질의가 확대되었습니다. 시각적 정보 강화: 이미지 검색으로 사용자 경험이 한층 풍부해졌습니다. 마치며 네이버 호텔 검색을 개선하는 과정에서 여러 기술적 도전을 겪었습니다. 이에 대한 자세한 내용은 다음 글에서 이어서 설명하겠습니다. LLM 성능을 sLLM(small-Large Language Model)로 압축하며 성능을 유지해야 함 지식 증류(Knowledge Distillation) 기법과 고도의 프롬프트 엔지니어링을 활용 블로그에서 추출한 POI 정보가 불완전하거나 오타가 있는 경우 매칭이 어려움 고밀도 검색(Dense Retrieval) 기반의 POI 매칭 시스템을 도입하고 Milvus DB를 활용해 정확도 92% 이상 증가 새로운 데이터를 학습하면 기존 지식을 잊는 파괴적 망각(Catastrophic Forgetting) 문제 발생 Layer-wise Discriminative Learning Rate과 Domain-Adaptive Pre-training으로 해결 저희는 LLM 기술을 활용해 사용자 중심의 호텔 검색 경험을 지속적으로 혁신해 나가고 있습니다. 곧이어 반응형 이미지/리뷰 스니펫 결과를 서비스 오픈할 예정이고, 검색 컨텐츠의 커버리지도 지속적으로 높여갈 예정입니다. 호텔 검색에 이어 2025년 올해 저희의 목표는 여행 검색 결과를 개선하는 것입니다. 여행 준비가 네이버를 통해 더 편리하고 스마트해질 수 있도록, 앞으로도 기술적 발전과 사용자 경험 개선에 집중하겠습니다. 해당 글은 N INNOVATION AWARD 2024 특집편으로 수상작 'LLM과 함께 호텔 검색의 한계를 넘다'의 수상팀에서 작성해주셨습니다. N INNOVATION AWARD는 2008년부터 이어진 네이버의 대표적인 사내 기술 어워드로 매년 우수한 영향력과 성과를 보여준 기술을 선정하여 축하와 격려를 이어오고 있습니다.

Amazon GameLift Streams 정식 출시 – 규모에 따른 게임 스트리밍 경험 제공
AWS KOREA
Amazon GameLift Streams 정식 출시 – 규모에 따른 게임 스트리밍 경험 제공

2016년부터 게임 개발자들은 단일 게임에서 1억 명의 동시 사용자(CCU)를 지원할 수 있는 확장 가능한 전용 서버 호스팅을 통해 게임을 지원하는 Amazon GameLift를 사용해 왔습니다. 게임 서버 이외의 추가 관리형 컴퓨팅 기능에 대한 고객 요청에 부응하여 게임 퍼블리셔가 글로벌 플레이어와 직접 연결되는 게임 스트리밍 경험을 구축하고 제공할...

[모집]  6년 연속 최대 9,600만 원 지원 중! 핀테크 기업을 위한 금융 클라우드 지원 사업 (~4/4)
네이버 클라우드
[모집] 6년 연속 최대 9,600만 원 지원 중! 핀테크 기업을 위한 금융 클라우드 지원 사업 (~4/4)

안녕하세요, 누구나 쉽게 시작하는 클라우드 네이버클라우드 ncloud.com입니다. 돈과 개인정보를 다루는 만큼 금융∙핀테크 업계는 보안이 정말 중요한데요. 그렇기 때문에 금융∙핀테크 기업이 혁신적인 서비스를 개발하기 위해선 믿을 수 있는 안전한 클라우드 환경이 꼭 필요합니다. 하지만 중소 핀테크 기업이 보안 요건이 충족된 클라우드 인프라를 구축하는 ...

Helm – Kubernetes 패키지 매니저
NGINX STORE
Helm – Kubernetes 패키지 매니저

Helm – Kubernetes 패키지 매니저 이 포스트는 Kubernetes의 패키지 매니저와 같은 역할을 하는 Helm 이 무엇인지 알아보고, Helm의 기능과 구성 요소 및 설치 방법과 기본적으로 사용되는 명령어에 관해 설명합니다. 목차 1. Helm이란?2. Helm 주요 기능3. Helm 구성 요소4. Helm 설치 방법5. Hel...

[국제발신]카카오계정이 위험에 노출되어 정지 예정이니 접속하여 인증을 완료바랍니다. hxxp://my*****.o-r.kr
이스트 시큐리티
[국제발신]카카오계정이 위험에 노출되어 정지 예정이니 접속하여 인증을 완료바랍니다. hxxp://my*****.o-r.kr

      [3월 첫째주] 알약 스미싱 알림 본 포스트는 알약M 사용자 분들이 '신고하기' 기능을 통해 알약으로 신고해 주신 스미싱 내역 중 '특이 문자'를&nbsp...

엣지 컴퓨팅: 분산형 데이터 시대의 핵심
삼성 SDS
엣지 컴퓨팅: 분산형 데이터 시대의 핵심

이 글에서는 글로벌 컨퍼런스인 COP29, CES 2025, WEF 2025에서 강조한 ESG 관련 메시지를 통해 ESG 경영에 영향을 미칠 수 있는 주요 이슈들을 재조명하고자 합니다.

[클로바시선 #19] 일상 속 AI의 가치를 읽다, CLOVA X 대화 클러스터링 CAST
네이버 클라우드
[클로바시선 #19] 일상 속 AI의 가치를 읽다, CLOVA X 대화 클러스터링 CAST

AI가 일상이 된 요즘, 일상 속에서 궁금한 것이 생기면 자연스럽게 AI를 찾습니다. CLOVA X는 네이버의 초대규모 언어모델인 HyperCLOVA X 기술을 바탕으로 만들어진 대화형 AI 서비스인데요. 사용자들은 CLOVA X를 통해 다양한 주제에 대해 자유롭게 질문하며 풍부한 대화를 나눌 수 있죠. 그렇다면 2024년 4분기, CLOVA X에 가...

Kimsuky 그룹의 워터링 홀 공격, 통일 분야 교육 지원서를 위장한 악성 파일 유포 주의
이스트 시큐리티
Kimsuky 그룹의 워터링 홀 공격, 통일 분야 교육 지원서를 위장한 악성 파일 유포 주의

      안녕하세요? 이스트시큐리티 시큐리티대응센터(이하 ESRC)입니다.   국내 기관에서 개최하는 통일 분야 교육 프로그램 지원서 파일을 이용한 워터링 홀 공격이 발견되어 관련자분들의 각별한 주의가 필요합니다.    워터링 홀 공격이란? 공격 대상이 자주 방문하는 웹사이트에 미리 악성코드를 심...

한국어 몰라요 - 글로벌 협업의 4가지 패턴
라인
한국어 몰라요 - 글로벌 협업의 4가지 패턴

요즘 우리나라는 어느 회사든 글로벌 진출을 염두에 두고 있습니다. 대부분의 분야에서 우리나라 시장은 가파른 속도로 축소될 전망이므로 해외 진출은 하고 싶은 것이 아닌 할 수밖에 없...

리디, DRM 해제기 불법 공유 텔레그램 채널 폐쇄 이끌어
리디
리디, DRM 해제기 불법 공유 텔레그램 채널 폐쇄 이끌어

리디의 적극적인 대응으로 콘텐츠 불법 유통과 피해 확산을 막을 수 있었다. The post 리디, DRM 해제기 불법 공유 텔레그램 채널 폐쇄 이끌어 appeared first on 리디주식회사 RIDI Corporation.

NGINX App Protect WAF V5 – 기존 NGINX 통합 설치 가이드
NGINX STORE
NGINX App Protect WAF V5 – 기존 NGINX 통합 설치 가이드

NGINX App Protect WAF V5 – 기존 NGINX 통합 설치 가이드 이 포스트는 기존에 NGINX가 설치된 인스턴스에 NGINX App Protect WAF V5(NAP WAF)를 추가로 설치하여 통합하는 방법을 설명합니다. app-protect-module 패키지를 설치하고, Docker를 통해 waf-enforcer, wa...

이스트시큐리티가 eGISEC 2025 전자정부 정보보호 솔루션 페어에 참가합니다! 3/19(수)~21(금)
이스트 시큐리티
이스트시큐리티가 eGISEC 2025 전자정부 정보보호 솔루션 페어에 참가합니다! 3/19(수)~21(금)

안녕하세요, 이스트시큐리티입니다.   통합 보안 전문 기업, 이스트시큐리티가 오는 3월 19일(수)부터 3월 21일(금)까지 일산 KINTEX에서 개최되는 eGISEC 2025 전자정부 정보보호 솔루션페어에 참가하여 기업 고객을 위한 더욱 강력한 보안 대응 전략을 제시합니다!   이번 eGISEC 2025에서는 이스트시큐리티...

[클로바시선 #18] 복잡한 정보의 숲에서 길을 찾다: 지식 내비게이션 GraphReady
네이버 클라우드
[클로바시선 #18] 복잡한 정보의 숲에서 길을 찾다: 지식 내비게이션 GraphReady

인터넷에서 원하는 정보가 나오지 않아 답답했던 적 있나요? 하이퍼클로바X는 방대한 데이터 속에서 길잡이처럼 원하는 정보를 쏙쏙 찾아주는 기술을 가지고 있다는데요. 대체 어떻게 길을 찾고 있는 건지, 한 번 알아볼까요? 연결의 힘 보험 약관 수백 페이지, 내가 원하는 정보는 어디에..? 연말정산 항목에서 내게 해당하는 정보를 빠르게 찾을 수 있을까? 이...

건강한 SEO로 성장하는 웹사이트 만들기
당근마켓
건강한 SEO로 성장하는 웹사이트 만들기

안녕하세요, 당근 프로덕트 디자이너 Ina입니다.당근의 웹사이트를 알고 계신가요? 당근 웹사이트에서는 당근의 다양한 서비스를 앱 설치 없이도 만나볼 수 있는데요. 사용자들에게 당근의 매력을 알리는 중요한 창구예요.당근 웹사이트: https://www.daangn.com/Karrot 글로벌 웹사이트(캐나다): https://www.karrotmarket.com/ca/Karrot 글로벌 웹사이트(일본): https://www.karrotmarket.com/jp/이번 글에서는 당근의 글로벌 서비스 Karrot의 사용자들이 웹에서도 당근을 쉽게 만날 수 있도록, 북미와 일본 지역을 대상으로 검색 엔진 최적화(SEO)를 강화하고 자연스럽게 앱 설치로 이어지는 매물 중심 탐색 경험을 개선한 웹사이트 프로젝트를 공유해보려고 해요.SEO란 무엇일까요?SEO(Search Engine Optimization)는 검색 엔진 최적화를 의미해요. 구글이나 네이버 같은 검색엔진에서 사용자가 원하는 정보를 검색했을 때, 당근의 웹사이트가 상단에 노출되도록 만드는 작업이에요.예를 들어, “중고 아이폰 15”라는 키워드를 검색했을 때 당근 웹사이트가 검색 결과 첫 페이지에 노출된다면, 더 많은 사람들이 사이트를 방문하게 될 거예요. 이는 곧 서비스 성장으로도 이어지겠죠.즉, SEO는 검색 결과에서의 노출뿐만 아니라 사용자와의 연결을 강화하는 필수 전략이라고 볼 수 있어요.SEO를 위한 유저 경험 만들기이 프로젝트의 핵심은 당근 웹사이트의 검색 랭킹을 높이기 위해, 다음 세 가지 요소를 충족시키는 것이었어요:관련성(Relevance): 사용자가 실제로 원하는 키워드와 유용한 콘텐츠 제공품질(Quality): 신뢰도를 높이는 양질의 콘텐츠 및 백링크사용성(Usability): 모바일 친화성, 페이지 속도, 보안 등 사용자 중심의 사이트 환경위와 같은 기술적인 SEO 목표를 달성하면서, 동시에 사용자 만족을 높이기 위해선 어떤 경험이 필요할까요?저는 이 문제를 해결하기 위해 당근의 디자인 원칙 세 가지와 검색 랭킹을 높이기 위한 기술적 솔루션 세 가지를 매칭해보고자 했어요.연결된 경험 — 관련성(Relevance)직관적인 경험 — 품질(Quality)사용자를 위한 개선 — 사용성(Usability)(참고) 당근의 디자인 원칙 7가지1. 연결된 경험2. 사용자를 위한 개선3. 직관적인 경험4. 하나의 화면 하나의 목표5. 단순한 시각 요소6. 적절한 피드백7. 간결한 문구1. 관련성(Relevance)을 위해 ‘연결된 경험’을 제공해요맥락에 맞는 키워드를 배치해요사용자들이 실제로 많이 검색하는 키워드를 자연스럽게 배치하고자 검색 결과 페이지에 필터를 추가했어요.필터는 탐색 편의를 높여요. 동시에 필터에 포함된 키워드가 검색 결과에도 노출되죠. 따라서 사용자 경험과 SEO 모두에 긍정적인 영향을 줘요.그 외에도 검색창 아래에 인기 키워드를 배치하는 등 키워드가 노출되는 곳을 다양하게 늘려나가고자 했어요.지역 설정 기능을 제공해요당근을 떠올리면 가장 먼저 생각나는 ‘동네’ 키워드를 웹사이트에 녹여내기 위해, 동네 설정과 검색 기능을 추가했어요.이를 통해 사용자는 동네에서 거래되는 물건을 쉽게 확인할 수 있게 되었어요. 또한 검색 엔진에서 ‘서초동’ + ‘소파’ 같은 지역 키워드를 함께 입력했을 때도 자연스럽게 당근 웹사이트를 만나볼 수 있게 되었어요.2. 품질(Quality)을 위해 ‘직관적인 경험’을 제공해요카테고리 목록을 추가해요글로벌 Karrot은 중고거래 서비스만 제공하고 있어요. 그래서 카테고리 페이지를 추가해 사용자들이 어떤 카테고리가 있는지 한눈에 파악하도록 돕고, 카테고리 자체로도 검색 결과가 보일 수 있도록 개선했어요.카테고리 자체가 검색 결과가 되도록 노출하기카테고리도 하나의 검색 결과로 만들며 검색 엔진에 노출되도록 개선했어요브레드크럼(Breadcrumb)을 추가해요“홈 > 부동산 > 매물”처럼 현재 위치와 다음 동선을 한눈에 파악할 수 있도록 내비게이션 흐름을 구성했어요.브레드크럼(Breadcrumb)은 사이트 품질을 높여요. 동시에 사용자에게 지금 어느 페이지에 있고 이전에 어떤 페이지를 거쳤는지를 명확히 알려줘, 직관적인 탐색 경험을 강화해요.3. 사용성(Usability)을 위해 사용자를 위한 개선을 만들어요반응형 디자인글로벌의 다양한 디바이스 환경을 고려해, 화면 크기에 따른 배치·컴포넌트를 6가지 브레이크포인트로 정교하게 설계했어요. 그 결과, 모바일 디바이스·태블릿·웹 등 다양한 환경에서도 웹사이트를 불편함 없이 이용할 수 있게 되어, 사용성(Usability)이 크게 향상됐어요.결과배포 한 달 이후의 결과예요🇨🇦 북미(캐나다): Impression(노출) 약 20배 성장, 클릭이 2배 성장했어요.배포 이후의 성장 그래프🇰🇷 한국 (24년 11월 초에 동일한 UX/UI로 개편) : 월 접속자 수 약 43% 상승했어요. (기존 426만 → 610만)마치며이번 프로젝트는 ‘관련성(Relevance)’, ‘품질(Quality)’, ‘사용성(Usability)’의 세 가지 핵심 요소를 사용자 중심의 디자인으로 풀어낸 SEO 전략으로, 당근의 웹사이트가 더 많은 사용자에게 노출되고 건강하게 성장할 수 있는 발판을 마련한 프로젝트라 뜻깊게 참여할 수 있었어요.이 프로젝트에 함께해 준 토니, 리바이, 리아, 헤일리, 해나, 브랜딩팀 리지, 쿄, 유니와 이어서 웹사이트를 널리 알리는데 애써주시는 SEO Growth 팀에게 응원과 감사의 마음을 전해요!건강한 SEO로 성장하는 웹사이트 만들기 was originally published in 당근 테크 블로그 on Medium, where people are continuing the conversation by highlighting and responding to this story.

Kubernetes Web UI Dashboard 배포 및 사용법
NGINX STORE
Kubernetes Web UI Dashboard 배포 및 사용법

Kubernetes Web UI Dashboard 배포 및 사용법 Kubernetes Dashboard 는 Kubernetes 클러스터를 시각적으로 관리할 수 있는 웹 기반 UI입니다. 이를 통해 클러스터의 리소스를 모니터링하고, 애플리케이션 배포 상태를 확인하며, 직접 추가, 수정 및 삭제하는 등의 작업을 수행할 수 있습니다. 본 문서에서는 Kube...

FE News 25년 3월 소식을 전해드립니다!
네이버 D2
FE News 25년 3월 소식을 전해드립니다!

주요내용 25년 3월 소식에서는 다음과 같은 유용한 정보들을 만나보실 수 있습니다. 2024 Frameworks Year in Review Netlify의 웹덕후들이 2024년의 흐름 그리고 25년도에 대한 기대를 정리해 줍니다. How long is a second in JavaScript? JavaScript에서 '초'의 길이와 시간 측정의 역사와 과학적 배경을 탐구해 봅니다. Optimizing the Critical Rendering Path 웹 페이지의 초기 렌더링을 지연시키는 주요 자원들을 식별하고, 이를 최적화하여 사용자 경험을 향상시키는 방법을 다룹니다. Sunsetting Create React App React 공식 팀이 Create React App(CRA)을 더 이상 유지하지 않기로 결정했습니다. >> FE News 25년 3월 소식 보러가기 ◎ FE News란? 네이버 FE 엔지니어들이 엄선한 양질의 FE 및 주요한 기술 소식들을 큐레이션해 공유하는 것을 목표로 하며, 이를 통해 국내 개발자들에게 지식 공유에 대한 가치 인식과 성장에 도움을 주고자 하는 기술소식 공유 프로젝트 입니다. 매월 첫째 주 수요일, 월 1회 발행 되고 있으니 많은 관심 부탁드립니다. ▷ 구독하기