언제부턴가 우리들 마음속 한편을 불편하게 만드는 것이 있습니다. 바로 오늘의 주인공 ‘양자컴퓨터’입니다. AI에 이어 차세대 기술로 주목받고 있지만, 그 복잡한 개념 때문에 이해를 포기하는 분들이 많은데요. 그래도 이제 더 이상 양자컴퓨터 공부를 미룰 수 없습니다. 세계 각국의 기업들과 연구기관들이 양자컴퓨터 개발에 총력을 기울이며, 작지만 의미 있는 성과들도 하나둘 나타나고 있기 때문입니다. 오늘은 아직까지 양자컴퓨터가 생소하신 분들을 위해 최대한 쉽고 간단하게 그 개념을 설명해 드리고자 합니다.
ChatGPT나 Claude로 간단한 프로토타입을 만들어보던 순간의 깨달음을 잊을 수 없습니다. 시스템 프롬프트(System Prompt)만 잘 짜면 복잡한 코드 없이도 꽤 그럴듯한 서비스를 만들 수 있겠다는 가능성이 보였죠. 처음엔 모든 게 완벽해 보였습니다. AI는 정확히 의도한 대로 동작했고, 마치 잘 짜인 코드처럼 일관된 결과를 보여줬으니까요. 하지만 대화가 조금만 길어져도 문제가 시작됐습니다. 제가 속한 LLAMI팀에서도 똑같은 문제를 겪었습니다. 하지만 우리는 흥미로운 가능성을 발견했습니다. 그것도 우리가 매일 사용하는 프로그래밍 패러다임에서요. 복잡한 프로그램을 모듈로 나누듯, 시스템 프롬프트도 여러 개의 특화된 에이전트로 분할하면 어떨까? 하고 말이죠. 이번 글에서는 시스템 프롬프트를 여러 AI 에이전트가 분산 처리하는 아키텍처를 소개해 보려고 합니다.
자바스크립트(Javascript)는 단순히 웹 브라우저에서 실행되는 스크립트 언어를 넘어, 웹 개발은 물론 백엔드, 모바일 앱, 그리고 데스크톱 애플리케이션까지 다양한 분야에서 널리 사용되는 언어입니다. 자바스크립트가 이렇게 다양한 분야에서 활약할 수 있는 이유는 무엇일까요? 여러 이유가 있겠지만, 그중 하나는 바로 자바스크립트가 가진 독특한 실행 방식에 있습니다. 자바스크립트는 다른 언어들과 비교했을 때 ‘스코프(Scope)’와 ‘호이스팅(Hoisting)’과 같은 독특한 개념을 바탕으로 동작하며, 이 두 개념은 자바스크립트를 배우고 사용하기 위해 필수적으로 알아야 하는 개념 중 하나로, 이번 글에서 살펴보겠습니다.
개발자라는 말에 여러분은 어떤 이미지를 떠올리나요? 영화나 드라마에서 자주 등장하는 대로 검은 화면에 빠르게 코드를 치며 해킹하는 모습이 생각날지도 모르겠습니다. 물론 해킹도 개발의 일부이지만, 소프트웨어 개발은 그보다 훨씬 더 방대하고 다양한 영역을 포괄합니다. 이를 비유하자면, 마치 RPG 게임에서 등장하는 여러 캐릭터 클래스(Character Class, 이하 클래스)와 비슷하다고 할 수 있죠. 그런 의미에서 소프트웨어 개발자에 RPG 클래스를 입혀보려고 합니다. 개발자 여러분은 어떤 클래스를 가지게 될까요?
최근에 마이크로서비스 아키텍처에 대해 다시금 생각하게 만드는 두 가지 일이 있었습니다. 하나는 가까운 지인이 자신의 회사 서비스에 마이크로 서비스를 도입하며 겪은 경험담을 듣는 일이었습니다. 또 다른 하나는 유명 개발자 크리스 리처드슨의 글에서 마이크로서비스에 대한 이미지를 본 일입니다. 그 두 가지 사건이 인상 깊었던 배경에는 아마도 제가 2016년부터 중국에서 일할 때, 마이크로서비스 아키텍처를 채택하며 경험한 일들이 작동했을 것입니다. 개인적으로는 가벼운 자극에 지나지 않아도, 두 사건을 계기로 그간 변화한 생각을 덧붙여 마이크로 서비스에 대한 글을 써 보기로 합니다.
기술사 자격 취득을 목표로 신변 정리를 시작한 뒤, 학원에 처음 입성했던 날이 생각납니다. 다양한 연령대의 사람들이 큰 강의실에 빽빽이 들어앉아 있었죠. 모두 마스크를 쓰고 있음에도 긴장한 기색이 역력했습니다. 강의 시작에 앞서 가벼운 아이스 브레이킹을 하던 멘토님께서는 “자, 이제 여러분도 수험 생활을 시작했으니 열심히 해보자, 모두 해낼 수 있다”고 기운을 북돋아 주셨습니다. 그리고 바로 하셨던 말씀은 바로, “제가 본 멘티 중에는 4개월 만에 합격한 친구도 있어요. 여러분도 할 수 있습니다.” 저 또한 처음 기술사 자격시험을 준비할 때 목표한 기간은 1년이었습니다. 그런데 멘토님의 말씀을 듣고 나니 한가지 생각이 머리를 스쳤습니다. ‘4개월? 그럼 나도 한번 해봐?’
이번에는 메모리에 관한 모든 것을 소개합니다. 정확히 말하면 ‘랭체인’에서의 메모리에 관한 것이죠. 상호참조해결(Coreference Resolution), 랭체인에서 메모리를 다루는 전략, 메시지를 영구적으로 저장하기 위한 LangGraph, 효율적인 메시지 활용을 위한 처리와 요약 방법을 다룹니다. 우선 메모리에 무엇을 저장하는지, 이를 알아보려고 합니다. 우리는 랭체인으로 모든 미가공 메시지를 저장하거나, 다듬어진 일부 메시지를 저장하거나, 메시지의 요약본을 저장할 수 있습니다. 물론 저장하고 싶은 메모리에 대한 처리 과정을 추가할 수도 있습니다. 또, 이 기능을 애플리케이션에 더 적합한 로직으로 확장할 수도 있죠.
E2E 테스트의 중요한 마지막 단계인 모듈화를 통한 재사용, 나아가 Playwright를 다시 개선한 내용에 대해 알아보겠습니다. 모듈화 과정에서 저는 완전한 자동화를 위해 다양한 툴을 찾아봤습니다. 여러 노력에도 결국 마땅한 툴이나 라이브러리를 찾을 수 없었고, 그래서 직접 툴을 만들기로 했습니다. 일렉트론으로 구현한 테스트 자동화 도구 제작기를 소개합니다. 또한, 이번 글에서 설명한 개념들을 활용하면 이런 테스트 툴이 없더라도 어느 정도 E2E 테스트를 쉽게 진행할 수 있습니다. 여러분도 제 작업 과정을 참고하여 E2E 테스트를 조금 더 효율적이고 간편하게 진행할 수 있기를 바랍니다.
우리가 서비스를 운영할 때는 백엔드에서도 유닛 테스트를 하고 프론트엔드에서도 유닛 테스트를 합니다. 반면 유닛 테스트가 잘 이뤄지지 않는 경우도 많습니다. 그렇기 때문에 E2E 테스트를 통해서 사용자 관점에서의 테스트를 정립하고 검증해야 문제가 없다고 판단할 수 있습니다. 그러나 E2E 테스트는 통합 테스트이고, UI 테스트가 합쳐져 있기 때문에 테스트 코드를 작성하는 것부터 시간이 오래 걸리고, 테스트 속도도 상대적으로 느립니다. 이번 글에서는 E2E 테스트의 어려움을 줄여주는 셀레늄, 퍼펫티어, Playwright와 같은 다양한 테스트 툴, 나아가 인증 관련 서비스 및 유지 보수 비용을 줄여 효율적인 테스트 코드를 작성하는 방법을 소개하겠습니다.