라인

107 개의 포스트

techblog.lycorp.co.jp/ko

태그로 필터

line원문

메신저용 온디바이스 이미지 모델 학습기 2편: 초저지연 비자기회귀(non-autoregressive) 캡션 생성 전략 (새 탭에서 열림)

네트워크 호출 없이 모바일 기기 내에서 작동하는 초저지연 이미지 캡션 기능을 위해, 비자기회귀(Non-autoregressive) 디코딩 구조와 다단계 지식 증류(Knowledge Distillation) 기술을 결합한 온디바이스 모델을 개발했습니다. 기존의 순차적 생성 방식인 자기회귀 디코딩의 병목 현상을 해결하여 응답 시간을 5초 이상에서 200~400ms 수준으로 12배 이상 단축했으며, 172MB의 가벼운 모델 크기로도 실사용 가능한 수준의 품질을 확보했습니다. 결과적으로 프라이버시를 보호하면서도 오프라인 환경에서 즉각적인 이미지 이해 기능을 제공하는 메신저 UX를 구현하는 데 성공했습니다. ### 기존 자기회귀 모델의 모바일 환경 한계 * **추론 지연의 핵심 원인**: LLM에서 흔히 쓰이는 자기회귀(AR) 방식은 토큰을 하나씩 순차적으로 생성하므로, 문장 길이에 비례해 디코더의 연산 횟수가 늘어나 모바일 기기에서 수 초 이상의 지연 시간을 발생시킵니다. * **기존 모델의 부적합성**: BLIP-1, MobileVLM 등 기존의 오픈소스 모델들은 양자화 후에도 응답 시간이 5초를 초과하여, 즉각적인 반응이 필요한 메신저 서비스 시나리오를 충족하지 못했습니다. * **온디바이스 제약**: 단순한 모델 경량화만으로는 목표치인 수백 ms대 진입이 불가능했으며, 네트워크 상태나 기기 성능에 구애받지 않는 안정적인 속도 확보가 필수적이었습니다. ### 비자기회귀 디코딩을 통한 속도 혁신 * **병렬 토큰 예측**: 이미지 표현을 조건으로 하여 N개의 학습 가능한 쿼리 토큰이 모든 단어를 한 번에 예측하는 비자기회귀(NAR) 구조를 채택해 시간 복잡도를 O(1)로 낮추었습니다. * **Query-CTC 손실 함수**: 병렬 생성 시 발생하는 정답 토큰과 쿼리 위치 간의 정렬 문제를 해결하기 위해, 음성 인식에서 주로 쓰이는 CTC(Connectionist Temporal Classification) 계열의 손실 함수를 도입했습니다. * **초저지연 달성**: 이 구조를 통해 기존 2.8~5초 이상 걸리던 캡션 생성 시간을 200ms 내외로 획기적으로 줄여 사용자 체감 성능을 극대화했습니다. ### 실사용 품질 확보를 위한 평가 및 학습 전략 * **수락 비율(Accept Ratio) 도입**: CIDEr나 CLIPScore 같은 기존 벤치마크 점수가 실제 문장의 자연스러움을 대변하지 못하는 문제를 해결하기 위해, GPT-4o mini를 활용해 문법 오류나 중복 단어를 걸러내는 새로운 평가 지표를 정의했습니다. * **데이터 정제와 캡션 재생성**: 원본 학습 데이터의 노이즈(짧거나 장황한 캡션 등)를 제거하기 위해, 고성능 모델을 이용해 캡션을 다시 쓰는 Re-captioning 과정을 거쳐 고품질의 학습 데이터를 확보했습니다. * **다단계 지식 증류**: 거대 모델(Teacher)의 정교한 표현력을 작은 모델(Student)에게 전수하는 지식 증류 기법을 적용하여, 모델 크기는 줄이면서도 비자기회귀 모델 특유의 반복 문구 생성이나 문법 오류 문제를 해결했습니다. 온디바이스 AI 개발에서 성능 지표(Score) 향상보다 중요한 것은 실제 사용자 환경에서의 '수락 가능한 품질'과 '지연 시간'의 균형입니다. 단순히 모델을 작게 만드는 것에 그치지 않고, 디코딩 패러다임을 비자기회귀로 전환하고 데이터의 질을 높이는 지식 증류 과정을 반복하는 것이 모바일 환경에 최적화된 고성능 모델을 만드는 핵심 전략입니다.

line원문

메신저용 온디바이스 이미지 모델 학습기 1편: 지식 증류로 확장한 다국어 이미지 검색 (새 탭에서 열림)

메신저 환경 내 사용자 경험을 개선하기 위해 네트워크 연결 없이 모바일 기기 내부에서 작동하는 온디바이스 이미지 이해 모델을 개발했습니다. 거대 모델의 정교한 표현력을 작은 모델에 전수하는 '지식 증류(Knowledge Distillation)' 기법을 핵심 전략으로 사용하여, 기존 영어 전용 모델을 한국어를 포함한 5개 국어 지원 모델로 확장하면서도 성능과 효율성을 동시에 확보했습니다. 이를 통해 모바일 기기의 제한된 자원 속에서도 높은 정확도의 다국어 이미지 검색 기능을 성공적으로 구현하는 성과를 거두었습니다. ### 온디바이스 이미지 이해의 필요성과 제약 조건 * 메신저 내 이미지 검색 기능을 키워드 매칭 방식에서 의미 기반(Semantic) 검색으로 고도화하고, 알림 시 이미지 내용을 요약해 주는 등 사용자 경험을 개선하고자 했습니다. * 지연 시간(Latency) 최소화, 개인 사진에 대한 프라이버시 보호, 오프라인 환경 지원을 위해 서버가 아닌 온디바이스 처리가 필수적이었습니다. * 앱 다운로드 부담을 줄이기 위해 모델 크기를 200MB 이하로 최적화해야 했으며, Android와 iOS 모두에서 수백 ms 이내의 빠른 응답 속도와 호환성을 보장해야 했습니다. ### 지식 증류를 통한 다국어 텍스트 인코더 확장 * 기존의 번역 파이프라인 방식은 번역 오류로 인한 품질 저하와 추가적인 지연 시간 문제가 있어, 지식 증류를 통해 다국어를 임베딩 공간에 직접 정렬하는 방식을 채택했습니다. * 이미 검증된 영어 텍스트 인코더를 교사(Teacher) 모델로 고정하고, 다국어 입력을 받는 학생(Student) 모델이 교사의 임베딩 공간을 복제하도록 MSE(평균 제곱 오차) 손실 함수를 사용해 학습시켰습니다. * 이미지 인코더를 재학습하지 않고 텍스트 인코더만 정렬함으로써, 기존 모델이 가진 강력한 이미지-텍스트 정렬 성능을 다국어 환경에서도 그대로 유지하며 효율적으로 확장했습니다. ### 다국어 검색 성능 및 기술적 구현 성과 * 지식 증류 결과, 다국어 Recall@5 지표가 기존 10% 미만에서 평균 78% 이상으로 약 7배 향상되어 실제 서비스에 적용 가능한 수준의 성능을 확보했습니다. * Android와 iOS 통합 지원을 위해 표준 런타임인 LiteRT를 선택했으며, PyTorch 모델 변환 과정에서 호환되지 않는 연산자(erf 등)를 의사 연산자로 대체 구현하여 최적화했습니다. * 언어별 데이터 불균형을 해소하기 위한 샘플링 전략과 모바일 환경에 맞춘 토큰화기(Tokenizer) 규약을 수립하여 실무적인 배포 완성도를 높였습니다. 이 프로젝트는 온디바이스라는 제약 조건 속에서 지식 증류라는 효율적인 학습 전략을 통해 다국어 지원 문제를 성공적으로 해결했습니다. 특히 영어 모델의 성능 손실을 최소화하면서도 한국어, 일본어 등 주요 언어의 검색 품질을 획기적으로 끌어올린 과정은, 리소스가 제한된 모바일 환경에서 AI 모델을 배포하고자 하는 개발자들에게 유용한 기술적 이정표가 될 것입니다.

line원문

LINE DEV AI 리포터즈의 여정을 공유합니다! (새 탭에서 열림)

LY Corporation은 개인의 AI 활용 경험을 조직 전체의 자산으로 전환하기 위해 'AI 리포터즈'를 결성하고, 단계별 공유 체계를 구축하여 기술적 성장을 도모하고 있습니다. 단순히 도구 사용법을 익히는 데 그치지 않고, 실무 적용 과정에서 겪은 시행착오와 설계 역량의 중요성을 공유함으로써 AI가 기술 부채를 양산하지 않고 생산성 향상으로 이어지게 하는 조직 문화를 마련했습니다. 결국 AI 시대를 맞이하는 개발자에게 필요한 역량은 개별 구현 능력을 넘어 프로젝트 전체를 설계하고 관리하는 '메타 지식'임을 강조하고 있습니다. **가벼운 시도로 시작하는 공유 문화 형성** * 성공 사례에 국한되지 않고 개인의 실험적 시도와 시행착오를 가감 없이 공유하여 AI 도입에 대한 심리적 허들을 낮추었습니다. * Claude Code와 Antigravity를 활용해 하루에 서비스 하나를 제작하는 '바이브 코딩' 실험을 통해 빠른 구현 속도만큼이나 '명확한 명세와 기획'이 중요함을 확인했습니다. * 결과물보다 과정에 집중하는 분위기를 조성하여, 조직원들이 잘해야 한다는 부담 없이 AI를 업무에 우선 적용해 보는 환경을 만들었습니다. **실무 관점의 AI 협업과 기술 부채 관리** * Claude Code를 기반으로 한 달 이상의 실제 프로젝트를 진행하며, AI 에이전트와 협업할 때 개발자의 역할이 '구현'에서 '프로젝트 설계 및 관리'로 변화함을 실증했습니다. * AI 에이전트는 현재의 코드 상태를 기준으로 다음 작업을 수행하기 때문에, 구조 개선이나 리팩토링을 미루면 기술 부채가 평소보다 훨씬 빠르게 증폭된다는 실무적 인사이트를 도출했습니다. * 커밋 전 자동 테스트를 생략했을 때 발생하는 오류 사례를 통해, 에이전트의 결과물을 검증하고 아키텍처를 유지하는 사람의 역할이 더욱 중요해졌음을 공유했습니다. * 작업을 시작하기 전 에이전트가 충돌 없이 일할 수 있도록 환경과 순서를 먼저 정리하는 '계획 단계'의 비중을 높여 일의 흐름을 최적화했습니다. **조직 단위의 워크숍 및 기술 심화 공유** * 기획, 디자인, 개발, 배포를 한 흐름으로 연결하는 '원스톱 실습 워크숍'을 통해 ChatGPT, Claude Code, Stitch AI 등 여러 도구를 맥락에 맞게 결합하는 경험을 전파했습니다. * 'GAI 활용 연구회'를 통해 PyTorch 기반 LLM과 MCP(Model Context Protocol) 서버의 상호작용 구조, JSON-RPC 기반 메시지 설계 및 세션 관리 등 심도 있는 기술적 디테일을 다루었습니다. * FastMCP와 같은 고수준 라이브러리가 감추고 있는 추상화 레이어를 직접 구현해 봄으로써, AI 에이전트 시스템의 내부 작동 원리와 설계 선택지에 대한 깊이 있는 이해를 공유했습니다. **지속 가능한 AI 공유 생태계 구축** * AI 도구와 환경은 끊임없이 변화하므로, 일회성 교육보다는 '자주 시도하고 빠르게 공유하는 문화' 자체가 조직의 핵심 경쟁력이 된다는 점을 시사합니다. * 슬랙(Slack)을 통한 트렌드 공유와 월간 정기 미팅 등 개별 팀의 노하우를 조직의 경험으로 연결하는 구조적 장치를 통해 AI 활용 능력을 지속적으로 내재화할 것을 추천합니다.

line원문

Claude Code Action: 조직 전반의 코드 품질을 지키는 AI 코드 리뷰 플랫폼화 (새 탭에서 열림)

LINE NEXT는 조직의 성장에 따른 코드 리뷰 품질 편차를 줄이고 개인 단위로 파편화된 AI 도구 활용을 조직 차원의 표준으로 통합하기 위해 Claude Code를 활용한 플랫폼화된 코드 리뷰 시스템을 구축했습니다. GitHub Actions를 기반으로 설계된 이 시스템은 리뷰 기준과 실행 로직을 중앙에서 관리함으로써 수많은 프로젝트에 일관된 품질의 피드백을 신속하게 제공합니다. 결과적으로 개별 팀의 운영 부담은 최소화하면서 보안과 거버넌스가 강화된 자동화된 리뷰 환경을 전사적으로 확산시키는 성과를 거두었습니다. ### AI 코드 리뷰 플랫폼화의 배경과 목적 * **품질 편차 해소:** 조직 규모가 커짐에 따라 리뷰어의 경험과 성향에 따라 달라지는 코드 리뷰의 깊이와 관점을 조직 차원에서 일관되게 유지할 필요가 있었습니다. * **개인 도구의 한계 극복:** 개별 개발자가 로컬에서 AI를 사용할 때 발생하는 리뷰 기준의 상이함, 프로세스 단절, 신규 구성원 온보딩의 어려움을 해결하고자 했습니다. * **DevOps 관점의 표준화:** 파편화된 품질 프로세스를 하나로 묶어 PR(Pull Request) 워크플로에 자연스럽게 녹아드는 '표준 구성 요소'로 재정의했습니다. ### GitHub Actions 기반의 통합 전략 * **기존 흐름 유지:** LINE NEXT의 표준 소스 관리 도구인 GitHub와 CI/CD 도구인 GitHub Actions를 활용하여 개발자의 학습 비용을 낮추고 기존 워크플로에 즉시 통합했습니다. * **인프라 운영 효율화:** DevOps 팀이 공통 GitHub App Runner 환경을 제공함으로써, 각 서비스 팀은 추가 인프라 구성 없이 설정만으로 AI 리뷰를 도입할 수 있게 했습니다. * **접근성 향상:** PR 내에서 `@claude` 멘션만으로 리뷰를 트리거하고, 결과물은 GitHub 댓글이나 리뷰 형태로 즉각 확인하는 직관적인 UX를 제공합니다. ### 호출과 실행을 분리한 설계 구조 (Caller-Executor) * **서비스 리포지터리(Caller):** AI 리뷰의 진입점 역할만 수행하며, 서비스명과 리뷰 타입 등 최소한의 정보만 전달하여 구조적 단순함을 유지합니다. * **중앙 리포지터리(Executor):** 프롬프트 관리, 페르소나 정의, 리뷰 정책, 권한 제어 등 핵심 로직을 집약하여 관리합니다. * **일관성 및 확산성:** 중앙에서 프롬프트를 수정하면 연결된 모든 프로젝트에 즉시 반영되며, 새로운 프로젝트는 표준 워크플로 호출만으로 빠르게 온보딩이 가능합니다. * **보안 강화:** GitHub Apps 기반의 인증과 Secrets 중앙 관리를 통해 외부 AI 호출 시의 보안 권한과 코드 접근 이력을 명확히 추적하고 통제합니다. ### 기술적 제약 극복: 포크(Fork) 기반 PR 처리 개선 * **공식 Action의 한계:** Claude Code Action의 초기 버전은 변경 코드가 `origin` 저장소에 있다는 것을 전제로 하여, 외부 포크 저장소에서 생성된 PR의 차이(diff)를 가져오지 못하는 문제가 있었습니다. * **내부 참조(ref) 활용:** 특정 브랜치를 fetch하는 방식 대신, GitHub가 모든 PR에 대해 자동으로 생성하는 특수한 참조 주소인 `refs/pull/<PR 번호>/head`를 사용하도록 로직을 재설계했습니다. * **결과:** 이 구조적 개선을 통해 내부 브랜치뿐만 아니라 외부 기여자의 포크 PR에 대해서도 중단 없는 AI 코드 리뷰가 가능한 범용적인 플랫폼 환경을 완성했습니다. ### 실용적인 제언 AI 코드 리뷰 도구를 도입할 때는 단순히 개별 리포지터리에 적용하는 것을 넘어, **'호출은 단순하게, 책임은 중앙으로'** 분리하는 아키텍처를 설계하는 것이 중요합니다. 이를 통해 조직 전체의 리뷰 품질을 상향 평준화하고, 보안 정책 변경이나 프롬프트 고도화 시 발생하는 운영 비용을 획기적으로 줄일 수 있습니다.

line원문

슬로우 쿼리 해결기: 함수형 인덱스로 비트 연산 쿼리 최적화하기 (새 탭에서 열림)

LINE VOOM 서비스는 헤비 유저의 프로필 조회 시 비트 연산 조건으로 인해 발생하는 30초 이상의 슬로우 쿼리 문제를 해결하기 위해 MySQL 8.0.13의 함수형 인덱스(functional index)를 도입했습니다. 기존의 비트 연산 조건은 인덱스를 무력화하여 수십만 건의 데이터를 풀 스캔하게 만들었으나, 연산 결과를 인덱싱하고 이를 10진수 동등 비교 쿼리로 전환함으로써 스캔 범위를 3% 수준으로 대폭 축소했습니다. 이 과정에서 무중단 인덱스 생성과 점진적 롤아웃을 통해 운영 안정성을 확보하며 시스템 성능을 성공적으로 최적화했습니다. ### 비트 연산 조건에 의한 성능 저하 원인 * LINE VOOM의 포스트 메타데이터 테이블은 `category_flag`와 `access_flag`라는 `bit(64)` 타입 컬럼에 서비스 상태 정보를 압축 저장합니다. * 특정 상태를 필터링하기 위해 `category_flag & 0x0100`과 같은 비트 연산을 사용했는데, 이는 인덱스에 저장된 원본 값이 아닌 연산 결과를 조건으로 활용하므로 기존 인덱스를 타지 못합니다. * 결과적으로 특정 사용자의 모든 포스트를 일일이 순회하며 연산을 수행해야 했고, 포스트가 수십만 건에 달하는 헤비 유저의 경우 쿼리 타임아웃이 빈번하게 발생했습니다. ### 함수형 인덱스를 활용한 최적화 설계 * MySQL 8.0.13에서 도입된 함수형 인덱스는 표현식의 결과를 가상 컬럼 형태로 저장하고 인덱싱하는 기능을 제공합니다. * 팀은 `user_id`와 비트 연산 표현식을 결합한 복합 인덱스 `idx_user_premium_searchable (user_id, (category_flag & 0x0100), (access_flag & 0x0001))`를 설계했습니다. * 이 방식은 기존 테이블 스키마를 크게 변경하지 않으면서도 특정 비트 패턴에 대해 즉각적인 인덱스 조회를 가능하게 합니다. ### 인덱스 활성화를 위한 쿼리 튜닝 및 검증 * 개발 환경 테스트 결과, 단순히 비트 연산을 포함하는 것만으로는 인덱스가 작동하지 않는 것을 확인했습니다. * 인덱스를 타기 위해서는 쿼리의 표현식이 인덱스 정의와 완벽히 일치해야 하며, 특히 비트 연산 결과를 **10진수 값으로 동등 비교**(`= 256`)했을 때만 인덱스가 정상적으로 적용되었습니다. * 최적화 후 스캔 행 수가 805건에서 31건으로 줄어드는 등 극적인 성능 향상을 보였으며, 인덱스 용량 증가(약 24%)는 운영 환경에서 수용 가능한 수준으로 판단되었습니다. ### 운영 환경 적용 및 시행착오 해결 * **무중단 인덱스 생성**: DBA 팀과 협업하여 Online DDL 방식을 사용함으로써 서비스 중단 없이 수십 개의 테이블에 인덱스를 추가했습니다. * **복제 지연 대응**: 인덱스 생성 중 발생한 마스터-슬레이브 복제 지연으로 인해 최신 글이 보이지 않는 이슈가 발생했으나, 캐시 만료 시간을 단축하여 사용자 불편을 최소화했습니다. * **논리 오류 방지**: 비트 연산을 동등 비교로 바꿀 때 OR 조건과 AND 조건의 의미 차이로 인한 버그를 발견했습니다. 이를 방지하기 위해 동적 설정을 활용해 샤드별로 쿼리를 점진적으로 적용하며 안전하게 검증을 마쳤습니다. 비트 연산과 같이 컬럼 가공이 필요한 조건을 상시로 사용해야 한다면, MySQL의 함수형 인덱스는 스키마 변경 부담을 최소화하면서 성능을 극대화할 수 있는 강력한 도구입니다. 다만, 인덱스가 적용되는 정확한 표현식(10진수 비교 등)을 사전에 검증하고, 대규모 테이블 작업 시 발생할 수 있는 복제 지연과 논리적 조건 변화를 세심하게 모니터링하는 것이 중요합니다.

line원문

미래의 클라우드를 창조하다 (새 탭에서 열림)

LY Corporation은 기존의 분산된 인프라와 플랫폼을 통합한 차세대 프라이빗 클라우드 'Flava(플라바)'를 통해 개발자 경험과 보안, AI 기술이 융합된 지능형 플랫폼으로의 진화를 꾀하고 있습니다. 단순히 자원을 제공하는 수준을 넘어 사내의 모든 플랫폼 기능을 하나의 UX로 통합하는 '플라바이제이션'과 강력한 보안 거버넌스 위에서도 높은 사용성을 유지하는 '실용적 보안' 구축을 핵심 목표로 설정했습니다. 나아가 AI를 인프라 운영과 아키텍처 설계에 접목하여 자연어만으로 클라우드를 관리할 수 있는 인텔리전트 환경을 실현함으로써 2~3년 내에 고도화된 클라우드 생태계를 완성할 계획입니다. ### 통합 플랫폼으로의 진화, 플라바이제이션(Flavaization) * 현재 DB, 컨테이너 등으로 파편화된 사내 플랫폼들의 권한 관리, 로깅, 모니터링, 빌링, API/CLI 등을 하나의 통합 클라우드 UX로 일원화하는 작업을 진행 중입니다. * 개발자가 각 플랫폼의 개별 사용법과 승인 프로세스를 일일이 익힐 필요 없이, 통합된 환경에서 모든 인프라 자원을 효율적으로 제어할 수 있는 환경을 1~2년 내 완수하는 것이 목표입니다. ### 강력하면서도 사용성 높은 실용적 보안 구축 * 기획 단계부터 보안 조직(CISO)과 협업하여 데이터 등급(기본, 기밀, 최고 기밀)별로 리소스를 분리하고 사내 보안 거버넌스를 기술적으로 자동 구현했습니다. * 리소스 생성은 수분 내로 단축되었으나, 이후의 접근 권한 승인 절차(VDI, 데이터 교환 폴더 생성 등)에서 발생하는 병목 현상을 최적화하여 보안성과 개발 속도의 균형을 맞추고자 합니다. * 강화된 VPC ACL(접근 제어 리스트)로 인한 네트워크 지연 시간을 개선하여, 메시징 서비스처럼 응답 속도가 중요한 애플리케이션 요구사항을 충족시키는 기술적 고도화를 병행합니다. ### 데이터 폭증에 대응하는 스토리지 및 하위 레이어 기술 * 사용자의 멀티미디어 데이터(사진, 영상 등)가 지속적으로 증가함에 따라 비용 효율적이면서도 합리적인 접근 속도를 보장하는 스토리지 계층화 기술을 확보하고 있습니다. * AI 워크로드의 대규모 데이터 처리를 위해 고속 네트워크 기술인 DPU(Data Processing Unit), 스마트 NIC, 초고속 NVMe 기반 스토리지 자동 계층화 등 하드웨어 및 인프라 하부 레이어의 최적화에 집중합니다. ### AIOps 및 인텔리전트 클라우드로의 도약 * MCP(Model Context Protocol) 서버 관리, 벡터 DB, AI 관측 가능성(Langfuse 등) 플랫폼을 사내 규정에 맞게 공통 서비스로 제공하여 개발팀의 AI 도입을 지원합니다. * 사용자가 자연어로 요구사항을 입력하면 AI가 최적의 아키텍처를 제안하고 인프라를 자동 구축하는 '인텔리전트 클라우드'로 진화하고 있습니다. * 저사용 리소스 탐지, 비용 최적화 제안, 암호화되지 않은 개인정보 탐지, OSS 취약점 관리 등 과거 엔지니어가 수동으로 수행하던 운영 업무를 AI 챗봇이 대신 수행하는 환경을 프로토타이핑 중입니다. Flava는 단순한 도구 제공자를 넘어 하위 레이어의 인프라 기술력과 상위 레이어의 AI 지능을 결합하여, 누구나 쉽고 안전하게 대규모 시스템을 운영할 수 있는 환경을 지향합니다. 향후 2~3년 내에 실현될 이러한 변화는 개발자가 복잡한 인프라 관리보다는 서비스 본연의 가치에 집중할 수 있게 만드는 실질적인 기술 동력이 될 것으로 보입니다.

line원문

Scaling to Infinity: 한계를 넘어서는 LY Corporation의 관측 가능성 플랫폼 진화기 (새 탭에서 열림)

LY Corporation은 수만 대의 서버와 컨테이너 환경에서 발생하는 일간 수조 건의 지표를 효율적으로 처리하기 위해 독자적인 시계열 데이터베이스(TSDB)를 개발하여 운영하고 있습니다. 초기 MySQL과 OpenTSDB의 한계를 극복하고자 인메모리(IMDB), Cassandra, S3를 결합한 다중 계층 저장소 아키텍처를 구축함으로써 데이터 폭증에 유연하게 대응하고 있습니다. 이를 통해 개발자와 운영자가 인프라 관리 부담 없이 서비스의 건강 상태를 즉각적으로 파악하고, 향후 AI 기반의 지능형 관찰가능성 플랫폼으로 진화하는 것을 목표로 합니다. **시계열 데이터의 규모와 저장소의 중요성** * **기하급수적인 데이터 증가:** 서버 1대의 CPU 지표(15초 주기)는 연간 약 562 MiB를 차지하며, 수천 대 규모의 인프라에서는 연간 테비바이트(TiB) 단위의 저장 공간이 필요합니다. * **고해상도 데이터의 필요성:** 장애 징후를 사전에 포착하고 정밀하게 모니터링하기 위해 1분 미만의 고해상도 지표 수집이 필수적이지만, 이는 범용 데이터베이스에 엄청난 쓰기 부하를 줍니다. * **클라우드 네이티브의 복잡성:** 쿠버네티스 환경에서는 파드(pod)의 잦은 생성과 소멸로 인해 관리해야 할 대상(Cardinality)이 폭증하며, 이를 수용할 유연한 스키마 구조가 요구됩니다. **자체 시계열 데이터베이스 엔진 개발 과정** * **기존 솔루션의 한계:** MySQL은 쓰기 성능과 경직된 스키마 문제로, OpenTSDB는 태그 개수 제한 및 문자열 제약, 쿼리 전 웜업(warm-up) 필요성 등의 운영상 한계가 있었습니다. * **Gorilla 논문 기반 최적화:** 데이터 조회의 85%가 최근 26시간 이내에 집중된다는 점에 착안하여, 최근 데이터는 IMDB에 저장하고 과거 데이터는 디스크 기반 저장소로 보내는 전략을 수립했습니다. * **사용자 편의성 유지:** 백엔드 아키텍처를 근본적으로 교체하면서도 기존 API와의 호환성을 완벽히 유지하여, 사용자가 코드 수정 없이도 성능 향상의 혜택을 누리게 했습니다. **데이터 홍수에 대응하는 계층형 저장 구조** * **가중치 기반 부하 분산:** 서로 다른 스펙의 노드가 혼재된 환경에서도 성능을 극대화할 수 있도록 IMDB의 부하 분산 알고리즘을 개선했습니다. * **S3 기반의 하이브리드 저장소:** 고성능 처리가 필요한 최근 14일치 데이터는 Cassandra에, 그 이전의 방대한 데이터는 비용 효율적인 S3 호환 저장소에 적재하는 3단계 계층 구조를 도입했습니다. * **데이터 파이프라인 최적화:** IMDB의 데이터를 슬롯 단위로 읽어 블록화하여 S3에 저장하는 '덤퍼(Dumper)'와, 읽기 성능을 위해 디스크 캐싱을 수행하는 'Storage Gateway'를 구축했습니다. **기술적 난관 극복과 협업의 성과** * **메모리 고갈 문제 해결:** 스토리지 게이트웨이의 I/O 과정에서 페이지 캐시 점유율이 급증하는 문제를 발견하고, 직접 I/O(Direct I/O) 대신 커널 페이지 캐시를 효율적으로 쓰는 B+ 트리 기반 캐시로 전환했습니다. * **부서 간 협업:** 직접 I/O 적용 시 발생할 수 있는 클라우드 스토리지 대역폭 문제를 유관 부서와 긴밀히 소통하여 조기에 파악하고 최적의 해답을 도출했습니다. 대규모 시스템의 관찰가능성을 확보하기 위해서는 데이터의 접근 패턴에 맞춘 계층형 저장소 설계가 필수적입니다. 단순한 저장소 확장을 넘어, 파편화된 데이터를 통합하고 AI를 활용한 예측 모델을 결합함으로써 시스템의 안정성을 선제적으로 관리하는 지능형 플랫폼으로 나아가야 합니다.

line원문

코드 품질 개선 기법 30편: (투명한) 운명의 붉은 실 (새 탭에서 열림)

코드 내에서 서로 다른 함수가 암묵적인 전제 조건을 공유할 때 발생하는 유지보수의 위험성을 경고하고, 이를 해결하기 위한 구체적인 리팩터링 방향을 제시합니다. 특정 함수가 다른 함수의 실행 결과에 의존하는 '암묵적 연관성'은 런타임 에러의 원인이 되므로, 로직을 하나로 통합하거나 의존 관계를 명확히 정의하여 코드의 안전성을 높여야 한다는 것이 핵심입니다. ### 함수 간 암묵적 연관성의 위험성 데이터의 유효성을 검사하는 함수(`isContentValid`)와 데이터를 처리하는 함수(`getMessageText`)가 분리되어 있을 때, 두 함수 사이에는 보이지 않는 의존성이 발생합니다. * **런타임 에러 발생 가능성:** 처리 함수가 유효성 검사 함수에서 `true`를 반환했을 때만 안전하게 호출될 것을 전제로 설계되면, 이 규칙을 어길 경우 컴파일 타임이 아닌 런타임에 에러가 발생합니다. * **일관성 유지의 어려움:** 새로운 데이터 타입이 추가될 때마다 두 함수의 로직을 동시에 업데이트해야 하며, 하나라도 누락할 경우 시스템 전체의 논리적 일관성이 깨지게 됩니다. * **낮은 가독성과 오용 위험:** 호출부의 코드만 봐서는 두 함수가 강하게 결합되어 있다는 사실을 인지하기 어려워, 향후 리팩터링이나 기능 확장 시 함수를 잘못 사용할 가능성이 큽니다. ### 로직 통합을 통한 원자적 처리 필터링(유효성 검사)과 변환(데이터 처리) 기능을 하나의 함수로 합치면 암묵적인 의존성을 제거하고 코드의 안전성을 즉각적으로 향상시킬 수 있습니다. * **Nullable 반환 타입 활용:** `getMessageText` 함수가 유효하지 않은 입력에 대해 에러를 던지는 대신 `null`을 반환하도록 수정함으로써, 호출자가 반환 값을 통해 유효성 여부를 자연스럽게 판단하도록 유도합니다. * **책임의 단일화:** 유효성 검사와 텍스트 추출 로직이 한 곳에 모이게 되어, 데이터 구조가 변경되더라도 한 함수 내의 `when` 절 등에서 모든 처리를 완결할 수 있습니다. ### 연관성을 명시하는 대안적 구현 성격이 다른 두 함수를 반드시 분리해야 하는 상황이라면, 한 함수가 다른 함수를 참조하게 만들어 의존 관계를 겉으로 드러내야 합니다. * **함수 재정의:** `isContentValid` 함수를 독립적인 로직으로 구현하는 대신, `getMessageText(content) != null`과 같이 데이터 처리 함수의 결과를 확인하는 방식으로 재정의합니다. * **단일 진실 공급원(SSOT) 확보:** 이렇게 구현하면 로직의 실질적인 판단 근거가 하나로 집중되어, 함수 간의 동작 불일치 문제를 원천적으로 차단할 수 있습니다. 함수 사이에 '보이지 않는 붉은 실'과 같은 암묵적 규칙이 존재한다면, 이를 코드상에 명확히 드러내거나 하나의 함수로 묶어 관리하는 것이 좋습니다. 이를 통해 동료 개발자가 별도의 사전 지식 없이도 코드를 안전하게 재사용할 수 있는 환경을 만들 수 있습니다.

line원문

코드 품질 개선 기법 29편: 고르디우스 변수 (새 탭에서 열림)

코드 내 데이터의 의존성이 복잡하게 얽혀 로직을 파악하기 어려운 상태를 '고르디우스의 매듭'에 비유하며, 이를 해결하기 위한 설계 기법을 제시합니다. 복잡한 조건문과 데이터 가공이 반복되는 경우, 최종 로직에 필요한 이상적인 중간 데이터 구조를 먼저 정의하고 이를 생성하는 방식으로 코드를 재구성하면 가독성과 유지보수성을 동시에 높일 수 있습니다. **데이터 의존성 과다로 인한 가독성 저하** * 원격과 로컬 데이터를 동기화할 때 추가, 업데이트, 삭제 대상을 구분하는 과정에서 데이터 의존성이 복잡해지기 쉽습니다. * 단순히 ID 목록을 비교해 차집합을 구하는 방식은 실제 데이터를 처리할 때 다시 원본 리스트에서 객체를 찾아야 하거나, 맵(Map)에서 데이터를 꺼낼 때 발생할 수 없는 예외 상황을 처리해야 하는 번거로움을 유발합니다. * 이로 인해 비즈니스 로직의 핵심인 '동기화 액션'보다 데이터를 분류하고 가공하는 '준비 과정'이 코드의 흐름을 방해하게 됩니다. **이상적인 중간 데이터 설계를 통한 역설계** * 복잡한 매듭을 풀기 위해서는 최종적으로 필요한 데이터의 형태를 먼저 상상하고, 그 지점부터 함수의 구성을 역으로 설계하는 것이 효과적입니다. * 이번 사례에서는 추가(`created`), 업데이트(`updated`), 삭제(`deleted`)될 대상들을 명확히 분리한 세 가지 리스트를 중간 데이터로 정의했습니다. * 로컬과 원격의 모든 ID 집합을 기준으로 `Pair<RemoteData?, LocalData?>` 형태의 시퀀스를 만들고, 이를 상태에 따라 분류하는 것이 핵심입니다. **`partitionByNullity`를 활용한 로직 단순화** * `partitionByNullity`라는 유틸리티 함수를 도입하여 데이터의 존재 여부에 따라 세 그룹(Remote만 존재, 둘 다 존재, Local만 존재)으로 깔끔하게 분리합니다. * 이 함수를 사용하면 메인 함수인 `synchronizeWithRemoteEntries`에서는 복잡한 필터링이나 조건문 없이 각각의 리스트에 대해 `forEach`를 돌며 추가, 업데이트, 삭제 로직만 수행하면 됩니다. * 결과적으로 런타임 에러를 방지하기 위한 불필요한 null 체크가 사라지고, 전체적인 실행 흐름이 일관성 있게 정돈됩니다. **실용적인 제언** 코드의 흐름을 따라가기 벅차다면 데이터의 흐름이 꼬여있지 않은지 점검해야 합니다. 구현에 매몰되기보다 "어떤 모양의 데이터가 있으면 이 로직이 가장 깔끔해질까?"를 먼저 고민하고, 그 중간 구조를 만들어내는 로직을 별도로 분리하면 코드 품질을 획기적으로 개선할 수 있습니다.

line원문

엔터프라이즈 LLM 서비스 구축기 1: 컨텍스트 엔지니어링 (새 탭에서 열림)

대규모 엔터프라이즈 환경에서 LLM 서비스를 구축할 때는 정교한 지시어(프롬프트 엔지니어링)보다 AI에게 필요한 정보만 선별해 제공하는 '컨텍스트 엔지니어링'이 더욱 중요합니다. LY Corporation은 260개가 넘는 API와 방대한 문서를 다루는 클라우드 AI 어시스턴트를 개발하며, 컨텍스트의 양이 늘어날수록 모델의 추론 성능이 하락하고 환각 현상이 발생하는 문제를 확인했습니다. 이를 해결하기 위해 사용자의 의도에 맞춰 필요한 도구와 가이드라인만 실시간으로 주입하는 '점진적 공개' 전략과 시스템 프롬프트의 충돌을 방지하는 '모의 도구 메시지' 기법을 도입하여 성능과 정확도를 동시에 확보했습니다. ### 컨텍스트 과부하와 성능의 상관관계 * **정보량과 성능의 반비례**: 최신 LLM은 수십만 토큰의 컨텍스트 윈도우를 지원하지만, 입력 길이가 길어질수록 핵심 정보를 찾는 능력이 최대 85%까지 급격히 하락합니다. * **노이즈로 인한 판단력 저하**: 질문과 유사해 보이지만 실제로는 관계없는 정보(노이즈)가 섞이면 모델이 당당하게 가짜 정보를 생성하는 환각 현상이 빈번해집니다. * **토큰 소모 효율성**: LLM은 이전 대화를 기억하지 못하는 스테이트리스(stateless) 구조이므로, 대화가 길어지고 API의 JSON 응답이 누적되면 64K 토큰 정도의 용량은 순식간에 소모되어 비용과 성능에 악영향을 줍니다. ### 도구 선별을 통한 컨텍스트 절약 * **선별적 로드**: 260개의 모든 API 도구를 한 번에 컨텍스트에 올리지 않고, 사용자의 질문에서 제품군(예: Redis, Kubernetes)을 먼저 식별합니다. * **도구 최적화**: 사용자가 특정 제품에 대해 물을 때만 관련된 소수의 도구(API)만 선별하여 제공함으로써 모델의 인지 부하를 획기적으로 줄입니다. ### 응답 가이드라인과 점진적 공개 전략 * **상황별 지침 주입**: "리소스 변경 시 UI 안내 우선"과 같이 특정 조건에서만 필요한 운영 지침을 '응답 가이드라인'으로 정의하고, 질문의 성격에 따라 필요한 시점에만 선택적으로 로드합니다. * **시스템 프롬프트와 가이드라인의 분리**: 모든 상황에 적용되는 '대원칙'은 시스템 프롬프트에, 특정 상황의 '행동 절차'는 가이드라인에 배치하여 관리 효율을 높입니다. ### 모의 도구 메시지(ToolMessage)를 활용한 환각 방지 * **프롬프트 충돌 문제**: 새로운 가이드라인을 단순히 시스템 프롬프트 뒤에 추가할 경우, 모델이 기존의 대원칙(예: "반드시 검색 결과로만 답변하라")을 무시하고 가이드라인에만 매몰되어 환각을 일으키는 현상이 발생했습니다. * **도구 메시지 전략**: 가이드라인을 시스템 프롬프트에 넣는 대신, 마치 검색 도구를 실행해서 얻은 결과값인 것처럼 '도구 메시지(ToolMessage)' 형식으로 주입합니다. * **전략의 효과**: 이 방식을 통해 LLM은 시스템 프롬프트의 대원칙을 준수하면서도, 주입된 가이드라인을 도구로부터 얻은 최신 정보로 인식하여 훨씬 정확하고 일관된 답변을 생성하게 됩니다. 엔터프라이즈 LLM 서비스의 핵심은 모델의 지능을 믿고 모든 데이터를 던져주는 것이 아니라, 모델이 가장 똑똑하게 판단할 수 있도록 최적의 정보만 정교하게 큐레이션하여 전달하는 설계 능력에 있습니다. 특히 복잡한 비즈니스 로직이나 사내 고유 지식을 반영해야 할 때는 시스템 프롬프트를 비대하게 만드는 대신, 도구 메시지나 동적 컨텍스트 주입 기술을 활용해 모델의 판단 체계를 보호하는 것이 실질적인 해결책이 됩니다.

line원문

코드 품질 개선 기법 28편: 제약 조건에도 상속세가 발생한다 (새 탭에서 열림)

코드의 불변성을 보장하기 위해 설계된 클래스가 상속을 허용할 경우, 자식 클래스에서 해당 제약을 위반함으로써 시스템 전체의 안정성을 해칠 수 있습니다. 특히 `Immutable`이라는 이름을 가진 클래스가 가변적인 자식 클래스를 가질 수 있게 되면 개발자의 의도와 다른 런타임 동작이 발생할 위험이 큽니다. 따라서 특정 제약 조건을 강제하고 싶다면 클래스를 상속 불가능하게 설계하거나, 공통의 '읽기 전용' 인터페이스를 활용하는 구조적 접근이 필요합니다. ### 불변성 보장을 방해하는 상속 구조 * Kotlin의 `IntArray`를 래핑하여 성능과 불변성을 동시에 잡으려는 `ImmutableIntList` 예시를 통해 상속의 위험성을 설명합니다. * 클래스를 상속 가능(`open`)하게 설정하면, `Immutable`이라는 명칭에도 불구하고 이를 상속받아 내부 상태를 변경하는 `MutableIntList`와 같은 자식 클래스가 생성될 수 있습니다. * 외부에서는 `ImmutableIntList` 타입으로 참조하더라도 실제 인덱스 값이 변할 수 있는 객체를 다루게 되어, 불변성을 전제로 한 로직에서 오류가 발생합니다. ### 멤버 오버라이딩을 통한 제약 조건 우회 * 내부 데이터 구조를 `private`이나 `protected`로 보호하더라도, 메서드 오버라이딩을 통해 불변성 제약을 우회할 수 있습니다. * 예를 들어 `get` 연산자를 오버라이딩하여 내부 배열이 아닌 가변적인 외부 필드 값을 반환하도록 재정의하면, 클래스의 핵심 규약인 '불변 데이터 제공'이 깨지게 됩니다. * 범용적인 클래스일수록 예상치 못한 곳에서 잘못된 상속이 발생할 가능성이 높으므로, 어떤 멤버를 노출하고 오버라이딩을 허용할지 엄격하게 제한해야 합니다. ### 가변·불변 객체의 올바른 상속 관계 * 가변 객체가 불변 객체를 상속하면 불변성 제약이 깨지고, 불변 객체가 가변 객체를 상속하면 불필요한 변경 메서드(`add`, `set`)로 인해 런타임 에러가 발생할 수 있습니다. * 가장 이상적인 구조는 가변 객체와 불변 객체가 모두 '읽기 전용(Read-only)' 인터페이스나 클래스를 상속받는 형태입니다. * 가변 객체는 읽기 전용 부모의 메서드 집합을 확장하고, 불변 객체는 읽기 전용 부모의 제약 조건을 확장하는 방식(예: Kotlin의 `List` 구조)이 안전합니다. 특정 제약 조건(불변성 등)이 핵심인 클래스를 설계할 때는 기본적으로 상속을 금지(`final`)하고, 확장이 필요하다면 상속 대신 독립된 타입을 정의하거나 읽기 전용 인터페이스를 통한 계층 분리를 권장합니다.

line원문

입사 일주일 만에 일본 출장을? LINE Plus Developer Relations 뉴비의 바쁜 적응기 (새 탭에서 열림)

라인플러스 Developer Relations(DevRel) 팀에 합류한 신규 입사자의 경험을 통해 기술 중심 회사가 엔지니어의 성장을 돕고 개발 문화를 확산시키는 구체적인 과정을 보여줍니다. 저자는 입사 일주일 만에 떠난 일본 출장과 이후 진행한 다양한 사내외 행사를 통해, DevRel의 핵심 역할이 단순한 운영을 넘어 엔지니어와 기술 문화를 유기적으로 연결하는 데 있음을 강조합니다. 결과적으로 탄탄한 온보딩 프로세스와 도전적인 팀 문화가 구성원의 빠른 적응과 창의적인 업무 수행을 가능하게 한다는 결론을 도출합니다. ## 글로벌 기술 컨퍼런스와 해커톤 참여 * **Tech-Verse 및 Hack Day 운영 지원:** 일본에서 열린 글로벌 컨퍼런스 'Tech-Verse'에서 한국어, 영어, 일본어 다국어 동시통역 환경을 점검하고, 사내 해커톤인 'Hack Day'의 현장 이슈 대응 및 운영을 담당하며 글로벌 규모의 행사 체계성을 체감했습니다. * **글로벌 DevRel 협업:** 일본, 태국, 대만, 베트남 등 각국의 DevRel 팀과 주기적으로 미팅하며 국가별 기술 행사 운영 방식과 엔지니어 대상 콘텐츠 구성 사례를 공유하는 유기적인 협업 구조를 확인했습니다. * **현장 기반 테크 브랜딩:** 행사 현장에서 숏폼(Shorts) 영상과 카드 뉴스를 직접 제작 및 배포함으로써, 행사의 폭발적인 에너지를 외부로 전달하는 '테크 브랜딩' 업무의 실무적 접점을 익혔습니다. ## 참여를 이끄는 창의적인 테크 토크 기획 * **파격적인 홍보 전략:** '나의 AI 활용법'을 주제로 한 Tech Talk에서 오프라인 참여율을 높이기 위해 기존의 틀을 깬 유머러스한 포스터와 컵홀더를 제작하는 등 B급 감성을 활용한 마케팅을 시도했습니다. * **실습형 핸즈온 세션 도입:** 엔지니어들의 피드백을 반영해 ChatGPT와 Claude Code를 활용한 핸즈온 세션을 기획했으며, Jira 티켓과 Wiki를 연동한 주간 리포트 자동 생성 등 실무에 즉시 적용 가능한 기술적 사례를 다루었습니다. * **철저한 사전 기술 지원:** 실습 중 발생할 수 있는 변수를 최소화하기 위해 환경 세팅 가이드를 사전 제작하고 문제 발생 시 대응 방안을 마련하는 등 참여자 중심의 세밀한 행사 설계를 진행했습니다. ## 전사 AI 리터러시 향상을 위한 AI Campus Day * **참여 장벽 완화 설계:** '업무에서 벗어나 AI와 놀기'라는 콘셉트로 AI 포토존(Gemini 활용)과 메시지 보드를 운영하여, 약 3,000명의 구성원이 자연스럽게 AI 기술을 경험할 수 있도록 동선을 설계했습니다. * **AI 도구의 실무 적용:** 행사 안내 영상 제작 시 사내에서 지원하는 AI 툴로 아이콘을 만들고 AI 음성을 입히는 등, DevRel 스스로가 기술의 활용 사례가 되어 구성원들의 흥미를 유발했습니다. * **범조직적 협업:** 한 달 반의 준비 기간 동안 여러 부서와 협력하며 'Event & Operation' 역할을 수행했고, 이를 통해 대규모 전사 행사를 성공적으로 이끄는 운영 노하우를 습득했습니다. ## 개방적이고 도전적인 팀 문화 * **심리적 안정감과 실행력:** 신규 입사자의 아이디어를 "재밌겠다"며 지지해 주는 유연한 분위기 덕분에 파격적인 홍보나 새로운 세션 도입과 같은 시도가 실제 성과로 이어질 수 있었습니다. * **체계적인 온보딩 시스템:** 입사 직후 촉박한 출정 일정 속에서도 업무 미션과 온보딩 리스트가 잘 정리되어 있어 업무 맥락을 빠르게 파악하고 전문성을 발휘할 수 있는 환경이 조성되었습니다. 성공적인 DevRel 활동을 위해서는 기술적 이해도만큼이나 엔지니어의 니즈를 파악하는 공감 능력, 그리고 아이디어를 즉각 실행에 옮길 수 있는 개방적인 팀 문화가 필수적입니다. 조직 내 개발 문화를 활성화하고 싶다면, 구성원들이 기술을 즐겁게 경험할 수 있도록 참여 문턱을 낮추는 작은 실험부터 시작해 볼 것을 추천합니다.

line원문

코드 품질 개선 기법 27편: 티끌이 모여 태산이 되듯 의존성도 쌓이면 (새 탭에서 열림)

의존성 주입(Dependency Injection)은 코드의 유연성을 높이는 강력한 도구이지만, 명확한 목적 없이 모든 요소를 주입 대상으로 삼는 것은 오히려 코드 복잡도를 높이고 유지보수를 어렵게 만듭니다. 참조 투명한 유틸리티나 단순한 모델 클래스까지 외부에서 주입받기보다는, 복잡도가 낮거나 변경 가능성이 희박한 객체는 내부에서 직접 생성하는 것이 더 효율적일 수 있습니다. 따라서 의존성을 주입할 때는 객체의 라이프사이클 관리, 구현체 전환, 테스트 용이성 등 구체적인 목적이 있는지 먼저 검토해야 합니다. **불필요한 의존성 주입의 사례와 개선** * **과도한 주입의 예시**: 뉴스 기사 스니펫을 생성하는 `LatestNewsSnippetUseCase` 클래스에서 데이터 모델인 `NewsSnippet`의 팩토리 함수나, 단순한 문자열 포매터인 `StringTruncator`까지 생성자로 주입받는 경우입니다. * **개선 방향**: 상태를 갖지 않는 단순한 유틸리티 구현체나 데이터 모델의 생성자는 클래스 내부에서 직접 호출하도록 변경합니다. * **단순화 결과**: 환경에 따라 달라지는 값(Locale)이나 네트워크 통신 등 복잡한 로직을 가진 리포지터리만 주입 대상으로 남겨 코드를 더 간결하게 유지할 수 있습니다. **의존성 주입이 필요한 명확한 목적** * **라이프사이클 및 범위 관리**: 객체의 상태를 공유해야 하거나, 사용하는 객체보다 더 긴 수명을 가진 객체를 활용해야 할 때 주입을 사용합니다. * **의존성 역전(DIP)**: 모듈 간의 순환 의존성을 해결하거나 아키텍처에서 정의한 계층 간 의존 방향을 준수하기 위해 필요합니다. * **구현체 전환 및 분리**: 테스트나 디버깅을 위해 Mock 객체로 교체해야 하는 경우, 혹은 빌드 속도 향상을 위해 독점 라이브러리를 분리해야 할 때 유용합니다. **무분별한 주입이 초래하는 문제점** * **추적의 어려움**: 인터페이스와 주입이 남발되면 특정 로직의 실제 동작을 확인하기 위해 생성자의 호출자를 거꾸로 추적해야 하는 수고가 발생합니다. * **호출자 책임 전가**: 하위 클래스의 모든 의존성을 상위 호출자가 해결해야 하므로, 의존성 해결이 연쇄적으로 전달되어 메인 클래스에 과도한 책임이 집중됩니다. * **연관 데이터의 일관성 파괴**: 예를 들어 동일한 `Locale` 값을 사용해야 하는 여러 객체를 각각 주입받을 경우, 실수로 서로 다른 로케일이 전달되어도 컴파일 타임에 이를 감지하기 어렵고 테스트 작성이 까다로워집니다. 의존성 주입은 '할 수 있기 때문'이 아니라 '필요하기 때문'에 수행해야 합니다. 복잡한 비즈니스 로직이나 외부 시스템 의존성은 주입을 통해 유연성을 확보하되, 단순한 값 객체(Value Object)나 유틸리티는 직접 인스턴스화하여 코드의 명확성을 높이는 것을 권장합니다.

line원문

사내 AI 리터러시를 향상하기 위한 AI Campus Day를 개최했습니다 (새 탭에서 열림)

LY Corporation은 전 직군의 AI 리터러시를 높이고 실무 적용을 독려하기 위해 사내 실습 행사 'AI Campus Day'를 개최했습니다. 외부 강사 대신 사내 전문가인 'AI 멘토'를 활용하고 실습 중심의 핸즈온 세션을 구성함으로써, 보안 가이드라인과 사내 업무 환경에 최적화된 실질적인 AI 활용 노하우를 성공적으로 전파했습니다. 이번 행사는 단순한 교육을 넘어 축제 형태의 운영 방식을 도입하여 임직원들이 자발적으로 AI 기술을 탐색하고 업무 생산성을 높이는 계기를 마련했습니다. **실무 역량 강화를 위한 수준별 핸즈온 세션** * **직군별 맞춤 트랙 운영:** 'Common', 'Creative', 'Engineering'의 3개 트랙으로 나누어, 기초 프롬프팅부터 MCP(Model Context Protocol) 서버 구축과 같은 심화 주제까지 총 10개의 세션을 제공했습니다. * **단계별 난이도 설계:** 참가자의 AI 활용 수준에 맞춰 3단계 레벨을 설정하여, 비개발 직군부터 엔지니어까지 누구나 자신의 수준에 맞는 학습이 가능하도록 했습니다. * **철저한 실습 지원 체계:** 흐름을 놓치지 않도록 상세한 '세션 가이드'를 제작 배포하고, 세션마다 2~3명의 조교(총 26명)를 배치하여 현장에서 발생하는 기술적 문제를 즉각 해결했습니다. * **Slack 기반의 소통:** 각 세션별 채널을 통해 실습 결과물을 실시간으로 공유하고 질의응답을 진행하여 참여도를 높였습니다. **사내 콘텍스트를 반영한 AI 멘토링** * **내부 전문가 활용:** 외부 강사 대신 사내에서 이미 AI를 적극적으로 활용 중인 동료 10명을 멘토로 선발하여 현장감 있는 지식을 공유했습니다. * **최적화된 도구 활용:** ChatGPT Enterprise, Gemini, Claude Code 등 사내에서 허용된 도구와 보안 수칙을 100% 반영하여, 배운 내용을 즉시 업무에 적용할 수 있는 환경을 구축했습니다. * **체계적인 콘텐츠 검토:** 운영진은 멘토 가이드를 제공하고, '주제 검토 - 최종 자료 리뷰 - 리허설'로 이어지는 다단계 프로세스를 통해 교육 콘텐츠의 완성도를 확보했습니다. **자발적 참여를 유도하는 축제형 운영** * **캠퍼스 테마 도입:** 수강 신청, 등교, 스탬프 랠리 등 대학교 캠퍼스 컨셉을 활용하여 학습에 대한 심리적 장벽을 낮추고 즐거운 분위기를 조성했습니다. * **몰입형 이벤트 부스:** Gemini를 활용한 AI 포토존, 자체 개발 AI 업무 지원 솔루션 체험, AI 에이전트 콘테스트 홍보 등 다채로운 부스를 운영하여 AI의 효용성을 직접 경험하게 했습니다. * **리더십의 전폭적 지지:** 경영진의 축전 영상을 통해 '업무 대신 AI와 함께 노는 하루'라는 메시지를 전달함으로써, 임직원들이 심리적 부담 없이 행사에 몰입할 수 있는 환경을 만들었습니다. 성공적인 사내 AI 전환(AX)을 위해서는 단순한 도구 보급을 넘어, 사내 보안 가이드와 업무 맥락을 정확히 이해하는 내부 전문가 중심의 실습 교육이 필수적입니다. AI Campus Day와 같이 학습을 '숙제'가 아닌 '축제'로 인식하게 만드는 운영 전략은 구성원들의 자발적인 기술 수용도를 높이는 데 매우 효과적인 접근 방식이 될 것입니다.

line원문

안전은 기본, 비용 절감은 덤: AI 서비스에 별도 가드레일이 필요한 이유 (새 탭에서 열림)

AI 가드레일은 모델의 오동작을 막는 필수 안전장치이지만, 단순히 시스템 프롬프트에 규칙을 심는 방식은 모델 본연의 성능 저하와 예기치 못한 부작용을 초래할 수 있습니다. 시스템 프롬프트는 규칙의 위치나 미세한 수정에 따른 출력 변동성에 매우 민감하기 때문에, 모델 외부에서 입출력을 검증하는 별도의 가드레일 체계를 구축하는 것이 보안과 서비스 안정성 측면에서 더욱 효율적입니다. ### 시스템 프롬프트 기반 가드레일의 과도한 거절 문제 * 시스템 프롬프트에 강력한 안전 규칙을 부여하면, 모델이 전체적으로 보수적인 태도를 취하게 되어 무해한 질문까지 거절하는 위양성(False Positive) 확률이 높아집니다. * 연구 결과에 따르면 안전 프롬프트 추가 시 전체 쿼리의 임베딩이 '거절' 방향으로 이동하며, "Python 프로세스를 죽이는(kill) 방법"과 같은 기술적인 질문조차 위험한 요청으로 오인하여 거절하는 패턴이 관찰됩니다. * 이는 보안 강도와 사용자 경험(정상적인 답변 수신) 사이의 트레이드오프를 심화시켜 모델의 유용성을 떨어뜨리는 원인이 됩니다. ### 프롬프트 위치 및 순서에 따른 위치 편향(Position Bias) * LLM은 긴 컨텍스트 안에서 처음과 끝부분의 정보는 잘 인식하지만, 중간에 위치한 정보는 간과하는 'Lost in the Middle' 현상을 보입니다. * 여러 제약 조건이 섞여 있는 경우, 가드레일 규칙이 시스템 프롬프트의 어느 지점에 위치하느냐에 따라 모델이 해당 규칙을 지키는 가중치가 달라집니다. * 실험 결과에 따르면 난이도가 높은 제약을 앞쪽에 배치할 때 성능이 가장 좋으며, 가드레일 규칙이 중간이나 뒤로 밀려날 경우 보안 성능이 일정하게 유지되지 않는 불안정성을 보입니다. ### 미세한 수정이 유발하는 성능의 나비효과 * 시스템 프롬프트 내의 아주 사소한 변화(공백 추가, "감사합니다" 문구 삽입 등)만으로도 모델의 결정 경계가 이동하여 전체 예측 값의 10% 이상이 바뀔 수 있습니다. * 특히 출력 형식을 지정(JSON/XML)하거나 특정 탈옥 방지 문구를 섞는 행위가 모델의 내부 추론 경로를 완전히 바꾸어, 일부 작업에서 성능이 급락하는 '재앙적인 수준의 붕괴'가 발생하기도 합니다. * 안전 규칙, 스타일, 형식 등 수십 줄의 요구사항을 하나의 시스템 프롬프트에 담을 경우, 한 줄의 수정이 모델이 어떤 규칙을 우선시할지에 대한 예측 불가능한 변화를 일으킵니다. ### 별도 가드레일 적용을 통한 보완과 추천 * 모델 본연의 성능을 유지하면서도 안전성을 확보하기 위해서는 모델 앞뒤에 독립적인 보안 게이트(별도 가드레일)를 세우는 방식이 효과적입니다. * 사용자의 입력 단계에서 위험을 감지해 차단(Tripwires)하거나 안전하게 재작성(Rewriter)하여 전달하고, 모델의 응답 후에도 다시 한번 결과를 점검하는 다층 방어 체계를 구축해야 합니다. * 이를 통해 시스템 프롬프트의 복잡도를 낮추고, 보안 정책의 수정이 모델의 전체 성능(추론 로직)에 직접적인 영향을 주지 않도록 분리하는 것이 실무적으로 권장됩니다.