logo
emoji
검색하기
어제 가장 많이 검색된 기술
emoji
가장 많이 읽은 글
logo
신용대출 찾기 서비스 제휴사 mock 서버 개발기
신용대출 찾기 서비스는 다양한 제휴사의 대출 상품을 연동하여, 고객이 보다 편리하게 대출 상품을 탐색하고 신청할 수 있도록 돕는 서비스입니다.이번 글에서는 신규 제휴사 연동 이후 제휴사의 테스트 서버가 유효한 응답을 주지 않거나, 특정 케이스를 테스트하기 어려운 상황을 어떻게 해결했는지, 그리고 이를 위해 설계한 mock 서버를 소개하고자 해요.신규 제휴사 연동 이후 다음과 같은 문제들이 반복적으로 발생했어요.• None 특정 퍼널 또는 고객 조건에 맞는 테스트 데이터 확보의 어려움• None 테스트 과정에서 실제 제휴사 서버로부터 유효한 응답을 받기 어려운 상황이러한 문제들은 QA 및 신규 기능 개발 효율을 떨어뜨릴 뿐 아니라, 서비스 출시 일정에도 영향을 주었습니다. 이를 해결하기 위해 사용자, 제휴사, 퍼널 단위로 정밀하게 동작을 제어할 수 있는 mock 서버를 설계했어요.본격적인 설명에 앞서, 대출 도메인과 관련된 주요 용어를 간략히 정리할게요.• None : 은행, 저축은행, 보험사 등 대출 상품을 제공하는 금융기관• None : 고객 정보를 활용해 대출 금리, 한도 등을 간단히 확인하는 행위• None : 가심사 결과를 바탕으로 고객이 특정 상품에 대해 대출을 신청하는 행위• None : 제휴사가 고객 정보를 활용해 대출을 실행하고 자금을 입금하는 행위기능적 / 비기능적 요구사항은 아래와 같았어요.mock 서버는 다음과 같은 구성요소로 설계되었습니다.신용대출 찾기 서비스는 mock 동작 여부나 mock 데이터 생성 시 필요한 유저 정보를 클라이언트 요청의 헤더를 통해 주입받습니다. 이렇게 하면 비즈니스 로직에는 전혀 영향을 주지 않고, 테스트를 유연하게 제어할 수 있어요.• None RestTemplate에는 인터셉터를 통해 요청마다 헤더를 추가할 수 있어요. 아래는 유저 ID와 원장 ID를 주입하는 예시입니다.• None 에 등록하면, 모든 제휴사 요청에 자동으로 헤더가 포함됩니다.• None WebClient에서는 을 활용해 헤더를 주입해요. 아래는 동일한 목적의 필터 예시입니다.• None 와 같이 등록해주면 돼요.모든 설정값은 DB 테이블에서 관리하여 유연성을 확보했어요.• None• None 콜백 을 N 초 후에 받을 것인지• None 특정 퍼널 에 대해 어떤 mock 응답을 받을 것인지 등정의된 정보를 사용해 mock 응답 을 생성합니다.mock 서버에서는 실제 제휴사처럼 콜백 응답을 지연하여 전송하는 기능이 필요합니다. 이를 통해 비동기 응답을 테스트할 수 있도록 지원하며, 실제 서비스 환경을 더 현실감 있게 시뮬레이션할 수 있어요.예약은 다음과 같이 두 단계로 구성됩니다.• None 가심사 조회나 대출 신청 API 호출 시점에,• None 각 요청에 대해 몇 초 후 콜백을 호출할 지 결정되며, 이 설정은 유저 설정( )에 정의된 값을 사용합니다.• None 필드에 실행 시점을 기록합니다.• None mock 서버에서는• None 를 사용해 콜백 API 요청을 실제로 전송합니다.mock 응답은 실제 제휴사 응답과
6/12/2025
logo
신용대출 찾기 서비스 제휴사 mock 서버 개발기
신용대출 찾기 서비스는 다양한 제휴사의 대출 상품을 연동하여, 고객이 보다 편리하게 대출 상품을 탐색하고 신청할 수 있도록 돕는 서비스입니다.이번 글에서는 신규 제휴사 연동 이후 제휴사의 테스트 서버가 유효한 응답을 주지 않거나, 특정 케이스를 테스트하기 어려운 상황을 어떻게 해결했는지, 그리고 이를 위해 설계한 mock 서버를 소개하고자 해요.신규 제휴사 연동 이후 다음과 같은 문제들이 반복적으로 발생했어요.• None 특정 퍼널 또는 고객 조건에 맞는 테스트 데이터 확보의 어려움• None 테스트 과정에서 실제 제휴사 서버로부터 유효한 응답을 받기 어려운 상황이러한 문제들은 QA 및 신규 기능 개발 효율을 떨어뜨릴 뿐 아니라, 서비스 출시 일정에도 영향을 주었습니다. 이를 해결하기 위해 사용자, 제휴사, 퍼널 단위로 정밀하게 동작을 제어할 수 있는 mock 서버를 설계했어요.본격적인 설명에 앞서, 대출 도메인과 관련된 주요 용어를 간략히 정리할게요.• None : 은행, 저축은행, 보험사 등 대출 상품을 제공하는 금융기관• None : 고객 정보를 활용해 대출 금리, 한도 등을 간단히 확인하는 행위• None : 가심사 결과를 바탕으로 고객이 특정 상품에 대해 대출을 신청하는 행위• None : 제휴사가 고객 정보를 활용해 대출을 실행하고 자금을 입금하는 행위기능적 / 비기능적 요구사항은 아래와 같았어요.mock 서버는 다음과 같은 구성요소로 설계되었습니다.신용대출 찾기 서비스는 mock 동작 여부나 mock 데이터 생성 시 필요한 유저 정보를 클라이언트 요청의 헤더를 통해 주입받습니다. 이렇게 하면 비즈니스 로직에는 전혀 영향을 주지 않고, 테스트를 유연하게 제어할 수 있어요.• None RestTemplate에는 인터셉터를 통해 요청마다 헤더를 추가할 수 있어요. 아래는 유저 ID와 원장 ID를 주입하는 예시입니다.• None 에 등록하면, 모든 제휴사 요청에 자동으로 헤더가 포함됩니다.• None WebClient에서는 을 활용해 헤더를 주입해요. 아래는 동일한 목적의 필터 예시입니다.• None 와 같이 등록해주면 돼요.모든 설정값은 DB 테이블에서 관리하여 유연성을 확보했어요.• None• None 콜백 을 N 초 후에 받을 것인지• None 특정 퍼널 에 대해 어떤 mock 응답을 받을 것인지 등정의된 정보를 사용해 mock 응답 을 생성합니다.mock 서버에서는 실제 제휴사처럼 콜백 응답을 지연하여 전송하는 기능이 필요합니다. 이를 통해 비동기 응답을 테스트할 수 있도록 지원하며, 실제 서비스 환경을 더 현실감 있게 시뮬레이션할 수 있어요.예약은 다음과 같이 두 단계로 구성됩니다.• None 가심사 조회나 대출 신청 API 호출 시점에,• None 각 요청에 대해 몇 초 후 콜백을 호출할 지 결정되며, 이 설정은 유저 설정( )에 정의된 값을 사용합니다.• None 필드에 실행 시점을 기록합니다.• None mock 서버에서는• None 를 사용해 콜백 API 요청을 실제로 전송합니다.mock 응답은 실제 제휴사 응답과
2025.06.12
emoji
좋아요
emoji
별로에요
logo
AWS Summit Seoul 2025 스케치
안녕하세요. 여기어때컴퍼니 iOS개발팀 샐리입니다.지난 5월 14일 AWS Summit Seoul 2025 — Industry Day에 참석했습니다.예상대로 올해 행사에서는 생성형 AI가 가장 화두였습니다. 다양한 세션들을 듣고 Expo도 둘러보았는데요. 생성형 AI가 산업 전반에 얼마나 빠르게 적용되고 있는지 체감하고 인사이트도 얻을 수 있었습니다.코엑스에 도착하니 벌써 많은 분들이 부스 체험을 하고 계셨습니다. 저도 얼른 참가자 등록을 하러 갑니다.행사 입장을 위해 네임택을 수령하러 왔습니다. 세련된 공간 연출과 조명 덕분에 마치 콘서트에 온 듯 했네요. 규모에서부터 압도되는 느낌이었고 어떤 프로그램들이 기다리고 있을지 기대감이 커졌습니다.AWS Summit Seoul 행사는 세션과 Expo로 이루어져있습니다. 모두 다 해보려니 시간이 약간 부족하기도 했지만 세션과 Expo를 모두 즐기고 알차게 보내고 왔습니다.세션1. 여행 goes AI! AWS 생성형 AI 없이는 살아남을 수 없어!여기어때가 여행/숙박 앱이다보니 자연스레 관심이 가는 주제였습니다.RAG 기반의 업무용 생성형 AI 챗봇인 Amazon Q에 대해서 알게 되었는데요. Amazon Q로 사내에 도움이 되는 챗봇을 만들어보면 재밌을것 같다는 생각이 들었습니다.AI is not going to replace humans, but humans with AI are going to replace humans with AI. — Karim Lakhani말 그대로 직역해보자면 AI는 사람을 대체할 수는 없지만 AI를 사용하는 사람이 AI를 사용하지 않는 사람을 대체할 것이다.AI가 오래 전부터 연구되어 온 기술이긴 하지만 AI기술이 보편화되는 것은 살짝 먼 이야기라고 느껴졌었는데요. Chat-GPT의 등장으로 판도가 완전히 바뀌었죠. 이제는 누구나 AI를 사용하고 활용할 수 있게 되었. Chat-GPT가 등장한게 지금으로부터 불과 몇년 전이지만 현재는 AI가 없는 일상이나 업무는 거의 상상할 수 없을 정도니까요. 단순한 정보 검색을 넘어서 문서와 코드 작성, 아이디어 구상 등 실질적인 생산성 도구가 되어 우리의 삶을 더 편리하게 해주고 있습니다.저도 AI가 인간의 모든 능력을 완전히 대체할 수는 없다고 생각합니다. 하지만 이제는 AI 없이 일하는 게 비효율이 되어버린 시대로 바뀌었다는 생각이 들었습니다. 앞으로는 AI를 어떻게 잘 효율적으로 활용하느냐가 큰 관건이 될 것 같습니다.2. Amazon Bedrock을 이용한 이미지 검색서비스의 혁신저는 작년 사내 해커톤에서 GenAI를 활용한 챗봇을 주제로 참가했었는데요. 간단하게 설명드리면 Google Vision API로 숙소 이미지 메타데이터를 태깅하고 색인 DB를 구축하여 이미지 기반 숙소 검색 기능을 제공하는 챗봇이었습니다. 해커톤에서 만든 것과 실제 비즈니스 방식이 어떻게 어떻게 다를지 궁금했습니다.게티이미지코리아에서는 키워드 기반의 검색을 자연어 검색이 가능한 기능을 구현했다고 합니다. 사용자가 이미지를 업로드하면 Amaz
6/12/2025
logo
AWS Summit Seoul 2025 스케치
안녕하세요. 여기어때컴퍼니 iOS개발팀 샐리입니다.지난 5월 14일 AWS Summit Seoul 2025 — Industry Day에 참석했습니다.예상대로 올해 행사에서는 생성형 AI가 가장 화두였습니다. 다양한 세션들을 듣고 Expo도 둘러보았는데요. 생성형 AI가 산업 전반에 얼마나 빠르게 적용되고 있는지 체감하고 인사이트도 얻을 수 있었습니다.코엑스에 도착하니 벌써 많은 분들이 부스 체험을 하고 계셨습니다. 저도 얼른 참가자 등록을 하러 갑니다.행사 입장을 위해 네임택을 수령하러 왔습니다. 세련된 공간 연출과 조명 덕분에 마치 콘서트에 온 듯 했네요. 규모에서부터 압도되는 느낌이었고 어떤 프로그램들이 기다리고 있을지 기대감이 커졌습니다.AWS Summit Seoul 행사는 세션과 Expo로 이루어져있습니다. 모두 다 해보려니 시간이 약간 부족하기도 했지만 세션과 Expo를 모두 즐기고 알차게 보내고 왔습니다.세션1. 여행 goes AI! AWS 생성형 AI 없이는 살아남을 수 없어!여기어때가 여행/숙박 앱이다보니 자연스레 관심이 가는 주제였습니다.RAG 기반의 업무용 생성형 AI 챗봇인 Amazon Q에 대해서 알게 되었는데요. Amazon Q로 사내에 도움이 되는 챗봇을 만들어보면 재밌을것 같다는 생각이 들었습니다.AI is not going to replace humans, but humans with AI are going to replace humans with AI. — Karim Lakhani말 그대로 직역해보자면 AI는 사람을 대체할 수는 없지만 AI를 사용하는 사람이 AI를 사용하지 않는 사람을 대체할 것이다.AI가 오래 전부터 연구되어 온 기술이긴 하지만 AI기술이 보편화되는 것은 살짝 먼 이야기라고 느껴졌었는데요. Chat-GPT의 등장으로 판도가 완전히 바뀌었죠. 이제는 누구나 AI를 사용하고 활용할 수 있게 되었. Chat-GPT가 등장한게 지금으로부터 불과 몇년 전이지만 현재는 AI가 없는 일상이나 업무는 거의 상상할 수 없을 정도니까요. 단순한 정보 검색을 넘어서 문서와 코드 작성, 아이디어 구상 등 실질적인 생산성 도구가 되어 우리의 삶을 더 편리하게 해주고 있습니다.저도 AI가 인간의 모든 능력을 완전히 대체할 수는 없다고 생각합니다. 하지만 이제는 AI 없이 일하는 게 비효율이 되어버린 시대로 바뀌었다는 생각이 들었습니다. 앞으로는 AI를 어떻게 잘 효율적으로 활용하느냐가 큰 관건이 될 것 같습니다.2. Amazon Bedrock을 이용한 이미지 검색서비스의 혁신저는 작년 사내 해커톤에서 GenAI를 활용한 챗봇을 주제로 참가했었는데요. 간단하게 설명드리면 Google Vision API로 숙소 이미지 메타데이터를 태깅하고 색인 DB를 구축하여 이미지 기반 숙소 검색 기능을 제공하는 챗봇이었습니다. 해커톤에서 만든 것과 실제 비즈니스 방식이 어떻게 어떻게 다를지 궁금했습니다.게티이미지코리아에서는 키워드 기반의 검색을 자연어 검색이 가능한 기능을 구현했다고 합니다. 사용자가 이미지를 업로드하면 Amaz
2025.06.12
emoji
좋아요
emoji
별로에요
logo
흔한 IntelliJ 사용자의 Cursor 사용 욕망 충족기 (Feat. Claude)
흔한 IntellIJ 사용자의 Cursor를 쓰고싶다는 욕망요즘 Cursor와 같은 IDE 와 LLM 을 통합한 제품들이 정말정말 인기가 많습니다.주변 개발자 중 안쓰는 사람이 없을 정도입니다.써보니까 너-무 좋기는 한데 골수 Jetbrains 빠인 저에게는VS Code 기반의 IDE 인 Cursor 넘어가는 것이 굉장히 부담스러웠습니다.좋은 것은 알겠는데, 10년간 써온 IDE를 바꾸는 것은 쉽게 결정할 수가 없었습니다.그래도 이런 툴을 안 쓰기에는 아쉬워서코딩은 IntelliJ 로 AI와의 대화는 Cursor로 하는 어정쩡한 방식을 한동안 사용했습니다.그래도 젯브레인인데, 유사한 기능이 금방 나오겠거니 하고 기다렸더니IntelliJ 안에서 쓸 수 있는 툴이 나오기 시작했습니다.일단 좋아하는 회사에서 만든거라 굉장한 편견을 가지고 사랑을 보내며 사용했는데,시간만 가고 해결이 안되는 현상을 수없이 겪고나서 사용을 포기하게 되었습니다.• None 가격: $10 / 월 (또는 IntelliJ All Products Pack 을 쓰면 무료)동료 개발자에게 들은 새로운 툴인 Augment Code는 조금 느리긴 하지만Cursor 에 거의 필적하는 코드작성 능력과 속도를 보여줬습니다.성능만 본다면 쓸만한데,$50 의 월간 구독료는 견디기가 힘들어 무료 사용기간이 끝나고 포기하게 되었습니다.• None 코드 작성능력: 커서보다 아주조금 떨어짐• None 괜찮은 성능에 괜찮지 못한 가격.gif마지막으로 찾은 툴은 Claude + IntelliJ 였고, 효과는 놀라웠습니다.IntelliJ IDEA 의 코드를 Cursor와 동일한 품질로 이해하고 답변을 작성해줬습니다.게다가 Google 드라이브 + 메일 + 일정 등의 외부 생태계와도 연결을 할 수 있어 확장성이 매우 뛰어났습니다.그래서 저는 정기결제를 추가하고 당분간은 여기에 정착하기로 했습니다.• None 방식: 별도 App 을 설치하여 IntelliJ와 연결• None 좋은 성능에 합리적인 가격.gif둘을 연결하려면 MCP (Model Context Protocol) 를 활용하여 연결해야 합니다.MCP 는 LLM에게 Context (이 글에서는 내 프로젝트 코드) 를 제공하는 프로토콜입니다.MCP 에 대한 자세한 설명은 아래 블로그를 참고해주세요!우리는 아래 2개를 설정하여 사용할 것입니다.먼저 IntelliJ 에는 Server로 작동하게끔 하는 플러그인을 설치해줍니다.IntelliJ 설정에서 Plugins 로 들어가서 MCP Server 를 검색하고 설치만 하면 됩니다.다음으로는 Cluade Desktop 에 Intellij Server 정보를 등록해줍니다.Claude Desktop 이 없다면 다음의 링크에서 다운로드 받고 설치합니다.설치를 마치고 Claude를 열고 설정에 들어갑니다.Claude 설정을 열고 (맥 기준 Cmd + , ) 개발자 탭으로 들어갑니다.여기서 설정 편집 버튼을 누르고 claude_desktop_config.json 파일을 엽니다.그럼 거의 비어있는 json 파일이 열리는데요.그곳에 아래 내용을 넣고 저장합니다.그리고 Claude Desktop을 다시 켜서 설정으로 들어가보면아래 그림처럼 jetbrains 가 추가되어 running 상태로 나옵니다.이제 모든 준비가 완료되었습니다.이제 내 코드를 기반으로 Claude와 대화해보세요!Claude + Github, Google 등 다른 툴과의 연계방법이것으로 끝나면 Cursor와 똑같다고 느끼실 수 있는데 MCP 방식으로 연동하면 더 큰 장점이 있습니다.바로 MCP를 준수하는 세상의 모든 툴과 연계를 할 수 있다는건데요.$20으로 Claude 유료결제만 하면 연계기능을 제공하는 모든 툴들과 연계를 해서 사용할 수 있습니다.Google 의 드라이브 + 메일 + 일정은 연결버튼만 누르면 바로 연결이 됩니다.먼저 설정으로 다시 들어가서 일반 탭에서 Claude 설정 바로가기 버튼을 누릅니다.들어오면 이렇게 연결 버튼만 누르면 바로 컨텍스트로 제공할 수 있는 앱들이 있고, 계속 추가될 전망입니다.여기까지 Cluade 와 다른 툴들을 연계하는 방법이었구요!매번 AI 기술의 발달이 놀랍게만 느껴집니다.
6/12/2025
logo
흔한 IntelliJ 사용자의 Cursor 사용 욕망 충족기 (Feat. Claude)
흔한 IntellIJ 사용자의 Cursor를 쓰고싶다는 욕망요즘 Cursor와 같은 IDE 와 LLM 을 통합한 제품들이 정말정말 인기가 많습니다.주변 개발자 중 안쓰는 사람이 없을 정도입니다.써보니까 너-무 좋기는 한데 골수 Jetbrains 빠인 저에게는VS Code 기반의 IDE 인 Cursor 넘어가는 것이 굉장히 부담스러웠습니다.좋은 것은 알겠는데, 10년간 써온 IDE를 바꾸는 것은 쉽게 결정할 수가 없었습니다.그래도 이런 툴을 안 쓰기에는 아쉬워서코딩은 IntelliJ 로 AI와의 대화는 Cursor로 하는 어정쩡한 방식을 한동안 사용했습니다.그래도 젯브레인인데, 유사한 기능이 금방 나오겠거니 하고 기다렸더니IntelliJ 안에서 쓸 수 있는 툴이 나오기 시작했습니다.일단 좋아하는 회사에서 만든거라 굉장한 편견을 가지고 사랑을 보내며 사용했는데,시간만 가고 해결이 안되는 현상을 수없이 겪고나서 사용을 포기하게 되었습니다.• None 가격: $10 / 월 (또는 IntelliJ All Products Pack 을 쓰면 무료)동료 개발자에게 들은 새로운 툴인 Augment Code는 조금 느리긴 하지만Cursor 에 거의 필적하는 코드작성 능력과 속도를 보여줬습니다.성능만 본다면 쓸만한데,$50 의 월간 구독료는 견디기가 힘들어 무료 사용기간이 끝나고 포기하게 되었습니다.• None 코드 작성능력: 커서보다 아주조금 떨어짐• None 괜찮은 성능에 괜찮지 못한 가격.gif마지막으로 찾은 툴은 Claude + IntelliJ 였고, 효과는 놀라웠습니다.IntelliJ IDEA 의 코드를 Cursor와 동일한 품질로 이해하고 답변을 작성해줬습니다.게다가 Google 드라이브 + 메일 + 일정 등의 외부 생태계와도 연결을 할 수 있어 확장성이 매우 뛰어났습니다.그래서 저는 정기결제를 추가하고 당분간은 여기에 정착하기로 했습니다.• None 방식: 별도 App 을 설치하여 IntelliJ와 연결• None 좋은 성능에 합리적인 가격.gif둘을 연결하려면 MCP (Model Context Protocol) 를 활용하여 연결해야 합니다.MCP 는 LLM에게 Context (이 글에서는 내 프로젝트 코드) 를 제공하는 프로토콜입니다.MCP 에 대한 자세한 설명은 아래 블로그를 참고해주세요!우리는 아래 2개를 설정하여 사용할 것입니다.먼저 IntelliJ 에는 Server로 작동하게끔 하는 플러그인을 설치해줍니다.IntelliJ 설정에서 Plugins 로 들어가서 MCP Server 를 검색하고 설치만 하면 됩니다.다음으로는 Cluade Desktop 에 Intellij Server 정보를 등록해줍니다.Claude Desktop 이 없다면 다음의 링크에서 다운로드 받고 설치합니다.설치를 마치고 Claude를 열고 설정에 들어갑니다.Claude 설정을 열고 (맥 기준 Cmd + , ) 개발자 탭으로 들어갑니다.여기서 설정 편집 버튼을 누르고 claude_desktop_config.json 파일을 엽니다.그럼 거의 비어있는 json 파일이 열리는데요.그곳에 아래 내용을 넣고 저장합니다.그리고 Claude Desktop을 다시 켜서 설정으로 들어가보면아래 그림처럼 jetbrains 가 추가되어 running 상태로 나옵니다.이제 모든 준비가 완료되었습니다.이제 내 코드를 기반으로 Claude와 대화해보세요!Claude + Github, Google 등 다른 툴과의 연계방법이것으로 끝나면 Cursor와 똑같다고 느끼실 수 있는데 MCP 방식으로 연동하면 더 큰 장점이 있습니다.바로 MCP를 준수하는 세상의 모든 툴과 연계를 할 수 있다는건데요.$20으로 Claude 유료결제만 하면 연계기능을 제공하는 모든 툴들과 연계를 해서 사용할 수 있습니다.Google 의 드라이브 + 메일 + 일정은 연결버튼만 누르면 바로 연결이 됩니다.먼저 설정으로 다시 들어가서 일반 탭에서 Claude 설정 바로가기 버튼을 누릅니다.들어오면 이렇게 연결 버튼만 누르면 바로 컨텍스트로 제공할 수 있는 앱들이 있고, 계속 추가될 전망입니다.여기까지 Cluade 와 다른 툴들을 연계하는 방법이었구요!매번 AI 기술의 발달이 놀랍게만 느껴집니다.
2025.06.12
emoji
좋아요
emoji
별로에요
logo
14년 된 네이버 캘린더 앱, KMP & 컴포즈 멀티 플랫폼 모듈 적용기
네이버 사내 기술 교류 행사인 NAVER ENGINEERING DAY 2025(5월)에서 발표되었던 세션을 공개합니다. 발표 내용14년 된 네이버 캘린더 안드로이드/iOS 네이티브 앱에 코틀린 멀티플랫폼(KMP), 컴포즈 멀티플랫폼(Compose-Multiplatform) 모듈을 적용하며 얻은 경험을 공유강의 대상멀티플랫폼(KMP), 컴포즈 멀티플랫폼(Compose-Multiplatform)에 관심 있는 개발자크로스 플랫폼에 관심 있는 개발자목차KMP, Compose-Multiplatform 소개 KMP, Compose-Multiplatform 모듈 도입 배경 모듈 연동 방법 공통 플랫폼 설정 Android 개발 iOS 개발 NAVER ENGINEERING DAY란? NAVER에서는 사내 개발 경험과 기술 트렌드를 교류를 할 수 있는 프로그램이 많이 있습니다. 그중 매회 평균 70개 이상의 발표가 이루어지는 NAVER ENGINEERING DAY를 빼놓을 수 없는데요. 2016년부터 시작된 ENGINEERING DAY는 실무에서의 기술 개발 경험과 새로운 기술과 플랫폼 도입 시 유용하게 활용될 수 있는 팁 등을 공유하며 서로 배우고 성장하는 네이버의 대표적인 사내 개발자 행사입니다. 올해 진행된 NAVER ENGINEERING DAY 2025(5월)의 일부 세션을 공개합니다.
6/12/2025
logo
14년 된 네이버 캘린더 앱, KMP & 컴포즈 멀티 플랫폼 모듈 적용기
네이버 사내 기술 교류 행사인 NAVER ENGINEERING DAY 2025(5월)에서 발표되었던 세션을 공개합니다. 발표 내용14년 된 네이버 캘린더 안드로이드/iOS 네이티브 앱에 코틀린 멀티플랫폼(KMP), 컴포즈 멀티플랫폼(Compose-Multiplatform) 모듈을 적용하며 얻은 경험을 공유강의 대상멀티플랫폼(KMP), 컴포즈 멀티플랫폼(Compose-Multiplatform)에 관심 있는 개발자크로스 플랫폼에 관심 있는 개발자목차KMP, Compose-Multiplatform 소개 KMP, Compose-Multiplatform 모듈 도입 배경 모듈 연동 방법 공통 플랫폼 설정 Android 개발 iOS 개발 NAVER ENGINEERING DAY란? NAVER에서는 사내 개발 경험과 기술 트렌드를 교류를 할 수 있는 프로그램이 많이 있습니다. 그중 매회 평균 70개 이상의 발표가 이루어지는 NAVER ENGINEERING DAY를 빼놓을 수 없는데요. 2016년부터 시작된 ENGINEERING DAY는 실무에서의 기술 개발 경험과 새로운 기술과 플랫폼 도입 시 유용하게 활용될 수 있는 팁 등을 공유하며 서로 배우고 성장하는 네이버의 대표적인 사내 개발자 행사입니다. 올해 진행된 NAVER ENGINEERING DAY 2025(5월)의 일부 세션을 공개합니다.
2025.06.12
emoji
좋아요
emoji
별로에요
logo
"딸깍"으로 이미지 리소스 반영하는 법
안녕하세요, 저는 Comm Client 팀 이준영입니다. 저희 팀은 에이닷 앱 전화, 에이닷 전화(구. T전화) iOS 클라이언트 개발을 담당하고 있습니다.iOS 앱을 개발하다 보면, 다양한 리소스 파일들을 다루게 됩니다. 이 중에서도 버튼, 아이콘처럼 여러 해상도와 테마에 대응해야 하는 이미지 리소스 관리는 매우 번거롭습니다.그래서 오늘은 저희 팀이 이미지 리소스를 어떻게 관리하고 있는지에 대한 이야기를 공유해 드리려 합니다.Xcode가 이미지 리소스를 다루는 법Xcode는 라는 Asset Catalog를 통해 각종 리소스를 관리합니다.이 구조 덕분에 해상도(2배율, 3배율 대응)나 테마 모드(Dark, Light)등에 따라 여러 종류의 이미지를 제공하더라도, 코드에서는 아래와 같이 이름 하나만으로 이미지를 참조할 수 있습니다.만약 여러분이 , 라는 이미지를 Xcode에 으로 추가하면 내부적으로는 아래와 같은 폴더 구조가 생성됩니다.여기서 폴더는 하나의 "논리적 이미지" 단위를 나타내며, 실제 사용될 이미지 파일들과 파일로 구성됩니다.각 폴더 안에는 이라는 파일이 항상 존재합니다.이 파일은 해당 이미지 세트에 어떤 이미지 파일이 들어 있는지, 어떤 해상도와 테마에 대응하는지를 정의하는 메타 데이터를 담고 있습니다.쉽게 말해, Xcode가 어떤 상황에서 어떤 이미지를 선택해야 하는지를 알려주는 역할을 합니다.위 의 예시를 보여드리겠습니다.이 구조를 구성하는 주요 요소들을 하나씩 살펴보면 다음과 같습니다.• None : 실제로 연결될 이미지 파일들의 집합입니다. 각 항목은 하나의 PNG 파일에 해당합니다.• None• None 해당 이미지가 몇 배 해상도용인지 나타냅니다. (예: 1x, 2x, 3x)• None• None 어떤 플랫폼에서 사용할 수 있는지를 나타내며, 보통은 입니다.• None• None 해당 이미지가 어느 테마 모드에서 사용될지를 나타냅니다.• None 예를 들어, 다크모드일 경우 처럼 명시됩니다.• None : 이 파일 자체의 메타데이터입니다.• None• None 보통 로 고정됩니다.• None• None 현재 버전은 이며, Xcode 버전에 따라 내부 사용될 수 있는 값입니다.결과적으로 위 예시는 라이트 모드에서는 , 다크 모드에서는 를 자동으로 적용하도록 설정한 구조입니다.이처럼 에는, 각 이미지가 어떤 조건에서 어떻게 사용할지 정의되어 있다는 것을 알 수 있습니다.실제 프로젝트에서의 문제점에이닷 내 전화의 경우, 아래와 같이 이미지 리소스를 구성하고 있습니다.보시다시피, 하나의 이미지 리소스가 총 4개의 이미지 파일로 구성되어 있습니다.따라서 하나의 이미지 리소스를 변경하려면, 4개의 PNG 파일을 바꿔줘야 합니다.25개의 리소스만 변경하려고 해도, 실제로는 100개의 이미지 파일을 교체해야 하는 것이죠.이걸 사람이 하나하나 확인해 가면서 직접 옮기는 것은 너무 힘든 일입니다.그래서 저희 팀은, 이미지 리소스 관리 자동화를 도입했습니다.위에서 보셨듯이, 저희는 이미지 리소스를 일정한 규칙에 따라 관리하고 있습니다.모든 파일 이름은 해상도와 테마 모드를 기준으로 이름 짓고 있으며, 아래와 같은 규칙을 따르고 있습니다.따라서, 위 규칙만 따른다면 아래와 같이 정보를 추출할 수 있습니다.• None• None 이미지의 논리적인 이름그래서 다음과 같이 자동화 목표를 잡았습니다.• None 파일명에서 이미지 정보 추출• None 같은 을 가진 이미지 파일들을 그룹화이제 단계별로 실제 스크립트를 작성해 보겠습니다.1. 파일명에서 이미지 정보 추출하기제일 먼저, 이미지 파일 이름으로부터 이미지 정보를 알아내야 합니다.예를 들어 라는 파일명이 주어지면 다음과 같은 정보를 알아낼 수 있습니다.이 정보를 추출하는 코드는 아래와과 같습니다.2. 같은 base_name을 가진 PNG 파일 그룹화이제 함수를 통해 각 파일의 정보를 얻을 수 있게 되었으니, 본격적으로 같은 리소스 이름( )을 가진 이미지 파일들을 그룹으로 묶는 작업을 해보겠습니다.여기에서 목적은 같은 을 가진 PNG 파일들(ex. , ) 같은 파일들을 하나의 으로 묶기 위한 준비 작업입니다.아래는 디렉터리 전체를 재귀적으로 순회하면서 PNG 파일들을 그룹화하는 함수입니다.이제 이 그룹을 기반으로 .imageset 폴더를 만들고, 각각의 이미지 파일을 복사한 뒤, 그에 맞는 Contents.json 파일을 생성하는 단계만 남았습니다.앞서 설명해 드렸듯이, Xcode는 .imageset 폴더 내부에 있는 Contents.json 파일을 기준으로 어떤 이미지를 어떤 상황에서 사용할지 판단합니다.이 파일에는 이미지의 해상도( ), 테마 모드( ), 파일 이름( ) 등의 메타 정보가 담깁니다.예를 들어, 파일에 대한 항목은 다음과 같이 구성되어야 합니다.이 내용을 생성하는 코드는 아래와 같습니다.이제 PNG 파일을 분석해서 이미지 이름( )을 기준으로 묶었고, 각 파일에 대해 메타 정보도 생성할 수 있습니다.이제 남은 작업은, 각 그룹을 폴더로 변환하고, 해당 폴더에 이미지 파일을 복사한 뒤, 그에 맞는 파일을 생성하는 것입니다.이걸 코드로 작성하면 아래와 같습니다.이 함수를 실행하면, 아래에 Xcode에서 바로 사용할 수 있는 폴더 구조로 자동으로 생성됩니다.수많은 PNG 리소스를 개발자가 손댈 필요 없이 에 바로 집어넣을 수 있는 상태로 만드는 것입니다.자, 이제 png 파일들을 변환하는 데 필요한 코드는 모두 작성했습니다.이제 실제로 자동화 스크립트를 실행해 보겠습니다.안의 PNG 파일들을 전부 순회하면서 이미지 이름( )을 기준으로 그룹화하고,에는 Xcode가 바로 사용할 수 있는 구조가 자동으로 생성됩니다.이제 이 결과물을 Xcode 프로젝트의 디렉터리에 그대로 복사해 넣으면, 아래와 같이 이미지가 자동으로 적용됩니다.이 스크립트를 도입한 이후, 이미지 리소스를 관리하는 방식이 완전히 달라졌습니다.기존에는 디자이너로부터 수십, 때로는 수백 개에 달하는 PNG 파일을 받을 때마다 일일이 파일을 Drag&Drop해야 했습니다. 그 과정에서 실수도 종종 발생했고요.하지만 이제는 몇 초 만에 모든 리소스를 자
6/12/2025
logo
"딸깍"으로 이미지 리소스 반영하는 법
안녕하세요, 저는 Comm Client 팀 이준영입니다. 저희 팀은 에이닷 앱 전화, 에이닷 전화(구. T전화) iOS 클라이언트 개발을 담당하고 있습니다.iOS 앱을 개발하다 보면, 다양한 리소스 파일들을 다루게 됩니다. 이 중에서도 버튼, 아이콘처럼 여러 해상도와 테마에 대응해야 하는 이미지 리소스 관리는 매우 번거롭습니다.그래서 오늘은 저희 팀이 이미지 리소스를 어떻게 관리하고 있는지에 대한 이야기를 공유해 드리려 합니다.Xcode가 이미지 리소스를 다루는 법Xcode는 라는 Asset Catalog를 통해 각종 리소스를 관리합니다.이 구조 덕분에 해상도(2배율, 3배율 대응)나 테마 모드(Dark, Light)등에 따라 여러 종류의 이미지를 제공하더라도, 코드에서는 아래와 같이 이름 하나만으로 이미지를 참조할 수 있습니다.만약 여러분이 , 라는 이미지를 Xcode에 으로 추가하면 내부적으로는 아래와 같은 폴더 구조가 생성됩니다.여기서 폴더는 하나의 "논리적 이미지" 단위를 나타내며, 실제 사용될 이미지 파일들과 파일로 구성됩니다.각 폴더 안에는 이라는 파일이 항상 존재합니다.이 파일은 해당 이미지 세트에 어떤 이미지 파일이 들어 있는지, 어떤 해상도와 테마에 대응하는지를 정의하는 메타 데이터를 담고 있습니다.쉽게 말해, Xcode가 어떤 상황에서 어떤 이미지를 선택해야 하는지를 알려주는 역할을 합니다.위 의 예시를 보여드리겠습니다.이 구조를 구성하는 주요 요소들을 하나씩 살펴보면 다음과 같습니다.• None : 실제로 연결될 이미지 파일들의 집합입니다. 각 항목은 하나의 PNG 파일에 해당합니다.• None• None 해당 이미지가 몇 배 해상도용인지 나타냅니다. (예: 1x, 2x, 3x)• None• None 어떤 플랫폼에서 사용할 수 있는지를 나타내며, 보통은 입니다.• None• None 해당 이미지가 어느 테마 모드에서 사용될지를 나타냅니다.• None 예를 들어, 다크모드일 경우 처럼 명시됩니다.• None : 이 파일 자체의 메타데이터입니다.• None• None 보통 로 고정됩니다.• None• None 현재 버전은 이며, Xcode 버전에 따라 내부 사용될 수 있는 값입니다.결과적으로 위 예시는 라이트 모드에서는 , 다크 모드에서는 를 자동으로 적용하도록 설정한 구조입니다.이처럼 에는, 각 이미지가 어떤 조건에서 어떻게 사용할지 정의되어 있다는 것을 알 수 있습니다.실제 프로젝트에서의 문제점에이닷 내 전화의 경우, 아래와 같이 이미지 리소스를 구성하고 있습니다.보시다시피, 하나의 이미지 리소스가 총 4개의 이미지 파일로 구성되어 있습니다.따라서 하나의 이미지 리소스를 변경하려면, 4개의 PNG 파일을 바꿔줘야 합니다.25개의 리소스만 변경하려고 해도, 실제로는 100개의 이미지 파일을 교체해야 하는 것이죠.이걸 사람이 하나하나 확인해 가면서 직접 옮기는 것은 너무 힘든 일입니다.그래서 저희 팀은, 이미지 리소스 관리 자동화를 도입했습니다.위에서 보셨듯이, 저희는 이미지 리소스를 일정한 규칙에 따라 관리하고 있습니다.모든 파일 이름은 해상도와 테마 모드를 기준으로 이름 짓고 있으며, 아래와 같은 규칙을 따르고 있습니다.따라서, 위 규칙만 따른다면 아래와 같이 정보를 추출할 수 있습니다.• None• None 이미지의 논리적인 이름그래서 다음과 같이 자동화 목표를 잡았습니다.• None 파일명에서 이미지 정보 추출• None 같은 을 가진 이미지 파일들을 그룹화이제 단계별로 실제 스크립트를 작성해 보겠습니다.1. 파일명에서 이미지 정보 추출하기제일 먼저, 이미지 파일 이름으로부터 이미지 정보를 알아내야 합니다.예를 들어 라는 파일명이 주어지면 다음과 같은 정보를 알아낼 수 있습니다.이 정보를 추출하는 코드는 아래와과 같습니다.2. 같은 base_name을 가진 PNG 파일 그룹화이제 함수를 통해 각 파일의 정보를 얻을 수 있게 되었으니, 본격적으로 같은 리소스 이름( )을 가진 이미지 파일들을 그룹으로 묶는 작업을 해보겠습니다.여기에서 목적은 같은 을 가진 PNG 파일들(ex. , ) 같은 파일들을 하나의 으로 묶기 위한 준비 작업입니다.아래는 디렉터리 전체를 재귀적으로 순회하면서 PNG 파일들을 그룹화하는 함수입니다.이제 이 그룹을 기반으로 .imageset 폴더를 만들고, 각각의 이미지 파일을 복사한 뒤, 그에 맞는 Contents.json 파일을 생성하는 단계만 남았습니다.앞서 설명해 드렸듯이, Xcode는 .imageset 폴더 내부에 있는 Contents.json 파일을 기준으로 어떤 이미지를 어떤 상황에서 사용할지 판단합니다.이 파일에는 이미지의 해상도( ), 테마 모드( ), 파일 이름( ) 등의 메타 정보가 담깁니다.예를 들어, 파일에 대한 항목은 다음과 같이 구성되어야 합니다.이 내용을 생성하는 코드는 아래와 같습니다.이제 PNG 파일을 분석해서 이미지 이름( )을 기준으로 묶었고, 각 파일에 대해 메타 정보도 생성할 수 있습니다.이제 남은 작업은, 각 그룹을 폴더로 변환하고, 해당 폴더에 이미지 파일을 복사한 뒤, 그에 맞는 파일을 생성하는 것입니다.이걸 코드로 작성하면 아래와 같습니다.이 함수를 실행하면, 아래에 Xcode에서 바로 사용할 수 있는 폴더 구조로 자동으로 생성됩니다.수많은 PNG 리소스를 개발자가 손댈 필요 없이 에 바로 집어넣을 수 있는 상태로 만드는 것입니다.자, 이제 png 파일들을 변환하는 데 필요한 코드는 모두 작성했습니다.이제 실제로 자동화 스크립트를 실행해 보겠습니다.안의 PNG 파일들을 전부 순회하면서 이미지 이름( )을 기준으로 그룹화하고,에는 Xcode가 바로 사용할 수 있는 구조가 자동으로 생성됩니다.이제 이 결과물을 Xcode 프로젝트의 디렉터리에 그대로 복사해 넣으면, 아래와 같이 이미지가 자동으로 적용됩니다.이 스크립트를 도입한 이후, 이미지 리소스를 관리하는 방식이 완전히 달라졌습니다.기존에는 디자이너로부터 수십, 때로는 수백 개에 달하는 PNG 파일을 받을 때마다 일일이 파일을 Drag&Drop해야 했습니다. 그 과정에서 실수도 종종 발생했고요.하지만 이제는 몇 초 만에 모든 리소스를 자
2025.06.12
emoji
좋아요
emoji
별로에요
logo
정답 없는 AI 시대, 당근이 새로운 경험을 만드는 방식
정답 없는 AI 시대, 당근이 새로운 경험을 만드는 방식   당근 AI Show & Tell #6당근은 매주 AI Show & Tell 을 통해 각 팀의 AI 실험을 전사적으로 공유하며, 새로운 시대의 문제 해결 방식을 빠르게 찾아가고 있어요. 당근이 AI로 만드는 생생한 도전의 순간들, 지금 만나보세요. ️ 이 콘텐츠는 생성형 AI를 활용해 제작한 콘텐츠입니다.해당 이미지는 OpenAI의 이미지 생성 모델 DALL·E를 활용하여 GPT-4o에서 생성한 이미지입니다.AI 기술은 믿기 어려울 만큼 빠르게 진화하고 있고, 사용자 반응은 그만큼 예측하기 어려워졌어요. 어떤 기능이 구현 가능할지, 또 실제로 어떻게 받아들여질지는 점점 더 알기 어려운 시대죠. 그래서 중고거래실은 빠르게 실험하고 사용자 반응에 맞춰 다시 설계하는 방식을 택했어요. 그렇게 만들어진 새로운 기능은 반복적인 개선을 거치며, 사용자에게 자연스러운 경험 으로 자리 잡고 있어요. 지금 소개할 두 프로젝트는 모두 예측할 수 없는 반응 속에서 사용자 경험 중심으로 발전해 온 사례들이에요. 그 안에 담긴 고민과 설계 과정을 함께 살펴보시죠.Project 1. 물품이 보낸 편지   내가 판 물건이 편지를 써준다면?첫 번째 실험. 사용자의 호기심을 끌어내다중고거래실은 거래 경험을 개선해 이웃 간의 연결을 자연스럽게 늘릴 방법을 늘 고민하고 있어요. 최근엔 생성형 AI의 가능성을 빠르게 탐색하던 중, 중고거래실 PM인 Suzy는 이런 상상을 하게 됐죠. 내가 거래한 물건이 나에게 편지를 써준다면? 방금 판 물건이 그동안 감사했다는 인사를 전하며 후기를 써달라고 요청한다면, 사용자의 호기심과 감성을 자극해 자연스럽게 거래 후기 작성으로 이어지지 않을까 기대했어요.중고거래실은 빠르게 실행에 들어갔어요. 우선 LLM이 편지 스타일 응답을 생성하게끔 프롬프트를 설계했죠. 물품이 사용자 닉네임을 부르며 인사를 건네고, 함께 해서 행복했다 와 같은 여운 있는 문장을 일관되게 포함하도록 프롬프트를 다듬었어요. 동시에 Stark, Bada, Philip은 Claude와 Cursor를 활용해 편지가 담길 화면의 목업을 만들었어요. 그렇게 일사천리로 편지를 자동 생성하는 시스템을 구현해 냈고, 곧바로 A/B 테스트에 돌입했어요.실험군에 속한 사용자들은 거래 후기를 남겨주세요 라는 익숙한 알림 대신, 물품이 편지를 보냈어요! 라는 새로운 메시지를 받았어요. 알림을 클릭하면 웹뷰 페이지로 이동해, LLM이 생성한 거래한 물품의 작별 인사를 확인할 수 있죠. 편지 마지막 부분엔 저 대신 새로운 주인에게도 고마운 마음을 전해주실 수 있을까요? 같은 문구로 자연스럽게 후기를 작성하도록 유도했어요.테스트 결과 알림 오픈율은 기존 대비 두 배 이상 상승했지만, 정작 후기 작성률은 유의미한 변화가 없었어요. 알림을 클릭한 사용자의 다수는 후기 작성 경험이 없는 신규 사용자였죠. 평소 후기를 작성하지 않는 사용자들의 호기심은 유발했지만, 행동 전환까지는 이어지지 않았던 거예요. 기대한 성과에 도달하지 못했지만, 중고거래실은 여기서 멈추지 않았어요. 콘텐츠가 사용자의 관심을 끌어냈다는 점에 주목하고 곧바로 다음 실험을 이어갔습니다.두 번째 실험. 사용자의 관심을 행동으로중고거래실은 앞선 실패에서 중요한 인사이트를 도출했어요. 사용자가 특정 행동을 왜 해야 하는지 명확한 동기를 제공하지 못하면, 콘텐츠가 아무리 새롭고 흥미로워도 사용자 반응은 호기심에서 그칠 수 있다는 점이에요. 중고거래실은 후기까지 작성해야 할 이유를 어떻게 만들어낼지 고민한 끝에, 간단하지만 명확한 보상 구조를 설계했어요. 후기를 작성해야만 구체적인 편지 내용을 볼 수 있도록 한 거예요. 편지를 열어보고 싶다는 호기심 그 자체를 행동의 동기로 활용해 보기로 한 거죠.2차 실험을 빠르게 이어가기 위해 수정은 최소화했어요. 기존 알림 문구는 그대로 유지하되, 알림을 클릭하면 블러 처리된 편지지 위로 후기를 먼저 작성하라는 화면이 나타나도록 했죠. 기능 구조는 최대한 기존 상태를 그대로 유지하고, 사용자의 행동 순서와 조건만 변경한 셈이죠결과는 놀라웠어요. 알림 오픈율은 여전히 기존의 2배 이상을 유지하면서, 후기 작성률은 기대 이상으로 증가했어요. 게다가 SNS와 커뮤니티에서 가서 행복하게 잘 살아야 해 , 뭉클하고 귀여웠어요 같은 사용자 반응이 이어졌어요. 후기 작성 수를 높였을 뿐만 아니라, 사용자에게 따뜻한 경험을 선사했다는 점에서도 의미가 있었죠. 이후 이 기능은 국내뿐 아니라 북미와 일본 시장에도 정식으로 배포됐어요. 물품이 보낸 편지 는 실패 속에서도 유의미한 반응을 발견하고 개선한 덕분에 탄생할 수 있었어요.Project 2. AI 물품 추천   어떤 물건을 사야 할지 추천해 드려요!이어서 중고거래실은 AI를 활용해 새로운 탐색 경험을 만들어보기로 했어요. 당근은 ML 기반으로 사용자가 좋아할 만한 물건을 피드에 보여주고 있는데요. 비슷한 추천이 반복되면 새롭고 다양한 물건을 발견할 기회는 줄어든다는 한계가 있었어요. 중고거래실은 이 문제를 해결할 방법을 고민하다가, GPT 등장 이후 사람들이 AI에게 자연스럽게 질문하는 방식에 익숙해지고 있다는 점에 주목했어요. 구체적인 목적 없이도 AI와 대화하듯 새로운 물건을 탐색하는 기능을 만들어 보기로 한 거죠.이 기능은 LLM과 임베딩 기술을 조합해 구현했어요. 예를 들어 내일 장모님 생신 선물 뭐가 좋을까? 라고 입력하면, LLM이 문장을 분석해 감성 있는 티 세트 , 관절에 좋은 건강용품 , 소형 마사지기 같은 주제를 생성해요. 이 결과를 벡터화한 뒤, 중고거래 게시글의 텍스트 임베딩과 비교해 유사도가 높은 게시글을 추천하죠. 사용자가 어떤 질문을 입력해야 할지 막막해 하지 않도록, 초보 엄마아빠인데 육아 꿀템 뭐부터 준비해야 해? 와 같은 유즈 케이스들도 입력창 하단에 함께 제공했어요.물론 구현 과정이 순탄치만은 않았어요. 초기에 영어 전용 임베딩을 사용했을 땐 정확도가 낮아 어려움을 겪었지만, 이후 다국어 모델로 전환하면서 추천 품질을 개선할 수 있었어요. 또 민감한 표현이나 엉뚱한 질문에도 AI가 자연스럽게 반응하도록 다
6/12/2025
logo
정답 없는 AI 시대, 당근이 새로운 경험을 만드는 방식
정답 없는 AI 시대, 당근이 새로운 경험을 만드는 방식   당근 AI Show & Tell #6당근은 매주 AI Show & Tell 을 통해 각 팀의 AI 실험을 전사적으로 공유하며, 새로운 시대의 문제 해결 방식을 빠르게 찾아가고 있어요. 당근이 AI로 만드는 생생한 도전의 순간들, 지금 만나보세요. ️ 이 콘텐츠는 생성형 AI를 활용해 제작한 콘텐츠입니다.해당 이미지는 OpenAI의 이미지 생성 모델 DALL·E를 활용하여 GPT-4o에서 생성한 이미지입니다.AI 기술은 믿기 어려울 만큼 빠르게 진화하고 있고, 사용자 반응은 그만큼 예측하기 어려워졌어요. 어떤 기능이 구현 가능할지, 또 실제로 어떻게 받아들여질지는 점점 더 알기 어려운 시대죠. 그래서 중고거래실은 빠르게 실험하고 사용자 반응에 맞춰 다시 설계하는 방식을 택했어요. 그렇게 만들어진 새로운 기능은 반복적인 개선을 거치며, 사용자에게 자연스러운 경험 으로 자리 잡고 있어요. 지금 소개할 두 프로젝트는 모두 예측할 수 없는 반응 속에서 사용자 경험 중심으로 발전해 온 사례들이에요. 그 안에 담긴 고민과 설계 과정을 함께 살펴보시죠.Project 1. 물품이 보낸 편지   내가 판 물건이 편지를 써준다면?첫 번째 실험. 사용자의 호기심을 끌어내다중고거래실은 거래 경험을 개선해 이웃 간의 연결을 자연스럽게 늘릴 방법을 늘 고민하고 있어요. 최근엔 생성형 AI의 가능성을 빠르게 탐색하던 중, 중고거래실 PM인 Suzy는 이런 상상을 하게 됐죠. 내가 거래한 물건이 나에게 편지를 써준다면? 방금 판 물건이 그동안 감사했다는 인사를 전하며 후기를 써달라고 요청한다면, 사용자의 호기심과 감성을 자극해 자연스럽게 거래 후기 작성으로 이어지지 않을까 기대했어요.중고거래실은 빠르게 실행에 들어갔어요. 우선 LLM이 편지 스타일 응답을 생성하게끔 프롬프트를 설계했죠. 물품이 사용자 닉네임을 부르며 인사를 건네고, 함께 해서 행복했다 와 같은 여운 있는 문장을 일관되게 포함하도록 프롬프트를 다듬었어요. 동시에 Stark, Bada, Philip은 Claude와 Cursor를 활용해 편지가 담길 화면의 목업을 만들었어요. 그렇게 일사천리로 편지를 자동 생성하는 시스템을 구현해 냈고, 곧바로 A/B 테스트에 돌입했어요.실험군에 속한 사용자들은 거래 후기를 남겨주세요 라는 익숙한 알림 대신, 물품이 편지를 보냈어요! 라는 새로운 메시지를 받았어요. 알림을 클릭하면 웹뷰 페이지로 이동해, LLM이 생성한 거래한 물품의 작별 인사를 확인할 수 있죠. 편지 마지막 부분엔 저 대신 새로운 주인에게도 고마운 마음을 전해주실 수 있을까요? 같은 문구로 자연스럽게 후기를 작성하도록 유도했어요.테스트 결과 알림 오픈율은 기존 대비 두 배 이상 상승했지만, 정작 후기 작성률은 유의미한 변화가 없었어요. 알림을 클릭한 사용자의 다수는 후기 작성 경험이 없는 신규 사용자였죠. 평소 후기를 작성하지 않는 사용자들의 호기심은 유발했지만, 행동 전환까지는 이어지지 않았던 거예요. 기대한 성과에 도달하지 못했지만, 중고거래실은 여기서 멈추지 않았어요. 콘텐츠가 사용자의 관심을 끌어냈다는 점에 주목하고 곧바로 다음 실험을 이어갔습니다.두 번째 실험. 사용자의 관심을 행동으로중고거래실은 앞선 실패에서 중요한 인사이트를 도출했어요. 사용자가 특정 행동을 왜 해야 하는지 명확한 동기를 제공하지 못하면, 콘텐츠가 아무리 새롭고 흥미로워도 사용자 반응은 호기심에서 그칠 수 있다는 점이에요. 중고거래실은 후기까지 작성해야 할 이유를 어떻게 만들어낼지 고민한 끝에, 간단하지만 명확한 보상 구조를 설계했어요. 후기를 작성해야만 구체적인 편지 내용을 볼 수 있도록 한 거예요. 편지를 열어보고 싶다는 호기심 그 자체를 행동의 동기로 활용해 보기로 한 거죠.2차 실험을 빠르게 이어가기 위해 수정은 최소화했어요. 기존 알림 문구는 그대로 유지하되, 알림을 클릭하면 블러 처리된 편지지 위로 후기를 먼저 작성하라는 화면이 나타나도록 했죠. 기능 구조는 최대한 기존 상태를 그대로 유지하고, 사용자의 행동 순서와 조건만 변경한 셈이죠결과는 놀라웠어요. 알림 오픈율은 여전히 기존의 2배 이상을 유지하면서, 후기 작성률은 기대 이상으로 증가했어요. 게다가 SNS와 커뮤니티에서 가서 행복하게 잘 살아야 해 , 뭉클하고 귀여웠어요 같은 사용자 반응이 이어졌어요. 후기 작성 수를 높였을 뿐만 아니라, 사용자에게 따뜻한 경험을 선사했다는 점에서도 의미가 있었죠. 이후 이 기능은 국내뿐 아니라 북미와 일본 시장에도 정식으로 배포됐어요. 물품이 보낸 편지 는 실패 속에서도 유의미한 반응을 발견하고 개선한 덕분에 탄생할 수 있었어요.Project 2. AI 물품 추천   어떤 물건을 사야 할지 추천해 드려요!이어서 중고거래실은 AI를 활용해 새로운 탐색 경험을 만들어보기로 했어요. 당근은 ML 기반으로 사용자가 좋아할 만한 물건을 피드에 보여주고 있는데요. 비슷한 추천이 반복되면 새롭고 다양한 물건을 발견할 기회는 줄어든다는 한계가 있었어요. 중고거래실은 이 문제를 해결할 방법을 고민하다가, GPT 등장 이후 사람들이 AI에게 자연스럽게 질문하는 방식에 익숙해지고 있다는 점에 주목했어요. 구체적인 목적 없이도 AI와 대화하듯 새로운 물건을 탐색하는 기능을 만들어 보기로 한 거죠.이 기능은 LLM과 임베딩 기술을 조합해 구현했어요. 예를 들어 내일 장모님 생신 선물 뭐가 좋을까? 라고 입력하면, LLM이 문장을 분석해 감성 있는 티 세트 , 관절에 좋은 건강용품 , 소형 마사지기 같은 주제를 생성해요. 이 결과를 벡터화한 뒤, 중고거래 게시글의 텍스트 임베딩과 비교해 유사도가 높은 게시글을 추천하죠. 사용자가 어떤 질문을 입력해야 할지 막막해 하지 않도록, 초보 엄마아빠인데 육아 꿀템 뭐부터 준비해야 해? 와 같은 유즈 케이스들도 입력창 하단에 함께 제공했어요.물론 구현 과정이 순탄치만은 않았어요. 초기에 영어 전용 임베딩을 사용했을 땐 정확도가 낮아 어려움을 겪었지만, 이후 다국어 모델로 전환하면서 추천 품질을 개선할 수 있었어요. 또 민감한 표현이나 엉뚱한 질문에도 AI가 자연스럽게 반응하도록 다
2025.06.12
emoji
좋아요
emoji
별로에요
logo
플라이보드: AI로 4일 만에 만든 실시간 공항 정보 서비스
안녕하세요, 마이리얼트립 AI Lab입니다. 오늘은 박으뜸찬솔님의 ‘플라이보드’ 개발 사례를 소개할게요. 찬솔님은 항공권 판매 후 고객 경험의 빈틈을 깨닫고, AI 도구들을 활용해 단 4일 만에 실시간 공항 정보 서비스를 완성했어요. 자세한 내용, 함께 살펴볼까요?고객 여정의 빈틈: 항공 서비스의 한계를 발견하다여행 산업에서 항공 서비스는 여행의 시작과 끝을 담당하는 중요한 요소예요. 그런데 많은 여행 회사들이 항공권을 판매한 뒤에는 고객 경험을 잘 챙기지 못하고 있는 상황이죠. 특히 결항이나 지연처럼 예기치 못한 상황이 발생했을 때, 실시간으로 대응하기 어려운 문제도 계속되고 있고요.예전에 항공 서비스 PM을 맡았던 박으뜸찬솔님도 이런 문제들을 인식하고 있었어요. 찬솔님이 고민하던 핵심은 세 가지였죠. 여행의 시작과 끝 사이에서 마이리얼트립이 고객에게 더 좋은 경험을 줄 수 없을까? 결항이나 지연으로 인한 문의를 미리 줄일 수는 없을까? 우리가 쓸 수 있는 데이터는 뭘까? 이런 질문들이었어요.“항공은 여행의 시작과 끝을 담당하고 있잖아요. 그런데 우리는 항공권만 팔고 끝나고 있어요. 전체 여행 경험을 충분히 챙기지 못하고 있다는 생각이 들었어요.”찬솔님은 처음에 Cirium이라는 외부 서비스를 도입하는 걸 검토했지만, 월 1,000만 원이라는 높은 비용과 부족한 개발 리소스 때문에 포기할 수밖에 없었어요. 그런데 지난 5월 9일, 상황이 바뀌었어요. 공공 데이터 API를 활용해 공항 혼잡도 정보를 시각화한 사례를 보게 된 거예요.그 사례를 보고 찬솔님은 “이거 정말 제품으로 만들 수 있겠다”는 확신이 들었고, 그날부터 AI를 활용해서 직접 서비스 개발에 몰두하기 시작했어요.…AI 도구들의 조합: 4일 만에 MVP 구축해 보기, 그리고 고도화찬솔님은 다양한 AI 도구를 조합해서 정말 빠르게 서비스를 만들었어요. 인천공항과 김포공항의 실시간 항공편 정보, 공항 혼잡도, 주차 정보 등을 제공하는 서비스를 단 4일 만에 완성한 거예요.이 서비스를 개발할 때 활용한 핵심 AI 도구는 세 가지였어요:Lovable: 프로토타입이나 MVP를 만들 때 쓴 도구예요. “인천공항 실시간 정보를 보여주는 서비스를 만들어줘”라고 요청하면 디자인과 기능이 포함된 초안을 바로 제공해줬어요.n8n: 워크플로우 자동화 도구예요. 데이터 수집과 전처리를 자동화하고, 백엔드 API로도 쓸 수 있었어요.Windsurf: 코딩에 활용한 도구예요. 내장 브라우저 기능 덕분에 UI 작업도 효율적으로 할 수 있었죠.n8n 에 구현한 API 및 데이터 정제 워크플로우처음엔 Lovable 하나로 개발을 시작했는데, 무료 사용량을 금방 다 써버렸어요. 그래서 GitHub랑 코드 동기화를 설정하고 Windsurf를 통해 계속 개발을 이어갔어요.나중에는 서비스 안정화를 위해 Lovable을 계속 쓰는 건 어렵겠다고 판단해서, Netlify로 호스팅을 옮겼어요. Netlify도 GitHub 연동이 잘되고, 프로젝트 구조나 기술 요소를 자동으로 감지해서 빌드와 배포를 자동으로 해줘서 편했어
6/11/2025
logo
플라이보드: AI로 4일 만에 만든 실시간 공항 정보 서비스
안녕하세요, 마이리얼트립 AI Lab입니다. 오늘은 박으뜸찬솔님의 ‘플라이보드’ 개발 사례를 소개할게요. 찬솔님은 항공권 판매 후 고객 경험의 빈틈을 깨닫고, AI 도구들을 활용해 단 4일 만에 실시간 공항 정보 서비스를 완성했어요. 자세한 내용, 함께 살펴볼까요?고객 여정의 빈틈: 항공 서비스의 한계를 발견하다여행 산업에서 항공 서비스는 여행의 시작과 끝을 담당하는 중요한 요소예요. 그런데 많은 여행 회사들이 항공권을 판매한 뒤에는 고객 경험을 잘 챙기지 못하고 있는 상황이죠. 특히 결항이나 지연처럼 예기치 못한 상황이 발생했을 때, 실시간으로 대응하기 어려운 문제도 계속되고 있고요.예전에 항공 서비스 PM을 맡았던 박으뜸찬솔님도 이런 문제들을 인식하고 있었어요. 찬솔님이 고민하던 핵심은 세 가지였죠. 여행의 시작과 끝 사이에서 마이리얼트립이 고객에게 더 좋은 경험을 줄 수 없을까? 결항이나 지연으로 인한 문의를 미리 줄일 수는 없을까? 우리가 쓸 수 있는 데이터는 뭘까? 이런 질문들이었어요.“항공은 여행의 시작과 끝을 담당하고 있잖아요. 그런데 우리는 항공권만 팔고 끝나고 있어요. 전체 여행 경험을 충분히 챙기지 못하고 있다는 생각이 들었어요.”찬솔님은 처음에 Cirium이라는 외부 서비스를 도입하는 걸 검토했지만, 월 1,000만 원이라는 높은 비용과 부족한 개발 리소스 때문에 포기할 수밖에 없었어요. 그런데 지난 5월 9일, 상황이 바뀌었어요. 공공 데이터 API를 활용해 공항 혼잡도 정보를 시각화한 사례를 보게 된 거예요.그 사례를 보고 찬솔님은 “이거 정말 제품으로 만들 수 있겠다”는 확신이 들었고, 그날부터 AI를 활용해서 직접 서비스 개발에 몰두하기 시작했어요.…AI 도구들의 조합: 4일 만에 MVP 구축해 보기, 그리고 고도화찬솔님은 다양한 AI 도구를 조합해서 정말 빠르게 서비스를 만들었어요. 인천공항과 김포공항의 실시간 항공편 정보, 공항 혼잡도, 주차 정보 등을 제공하는 서비스를 단 4일 만에 완성한 거예요.이 서비스를 개발할 때 활용한 핵심 AI 도구는 세 가지였어요:Lovable: 프로토타입이나 MVP를 만들 때 쓴 도구예요. “인천공항 실시간 정보를 보여주는 서비스를 만들어줘”라고 요청하면 디자인과 기능이 포함된 초안을 바로 제공해줬어요.n8n: 워크플로우 자동화 도구예요. 데이터 수집과 전처리를 자동화하고, 백엔드 API로도 쓸 수 있었어요.Windsurf: 코딩에 활용한 도구예요. 내장 브라우저 기능 덕분에 UI 작업도 효율적으로 할 수 있었죠.n8n 에 구현한 API 및 데이터 정제 워크플로우처음엔 Lovable 하나로 개발을 시작했는데, 무료 사용량을 금방 다 써버렸어요. 그래서 GitHub랑 코드 동기화를 설정하고 Windsurf를 통해 계속 개발을 이어갔어요.나중에는 서비스 안정화를 위해 Lovable을 계속 쓰는 건 어렵겠다고 판단해서, Netlify로 호스팅을 옮겼어요. Netlify도 GitHub 연동이 잘되고, 프로젝트 구조나 기술 요소를 자동으로 감지해서 빌드와 배포를 자동으로 해줘서 편했어
2025.06.11
emoji
좋아요
emoji
별로에요
logo
Custom LLM Agent 구축하기(From Scratch)
이번 포스팅은 Langchain이나 Langgraph의 도움 없이LLM을 통해서 자연어로 질문하고, 질문에 맞는 function이 실행되게 만드는 예제입니다.Agent는 특정 행동에 특화된 LLM 서비스를 의미합니다.이때 특정 행동은 특정 영역에 대한 행동 뿐만 아니라 인터넷을 검색하던가, DataBase에서 Data를 찾아온다거나 하는 Function을 실행하는 행동 역시 포함됩니다.이러한 Agent의 경우 현재 Multi turn을 통해서 LLM과의 소통 후에질문, [생각, 행동]🔁, 결과도출 과정을 통해서 유저의 자연어에서 함수에 필요한 내용과, 함수를 실행하기 위한 매개변수를 찾아냅니다.이러한 Agent를 ReAct(Reasoning, Action) Agent라고 불립니다.기본적으로 Agent를 구현하기 위해서는 LLM에 질문을 주고, 답변을 받고, 다시 질문을 주는 Multi turn을 구현해야 하는데,근데 위 친구들을 사용할 경우, ReAct Agent가 어떻게 동작하는지 이해하기 어려울 수가 있습니다.그래서, 이 친구들을 Python의 Requests를 사용해서 간접적으로 구현해 봅니다.위 코드의 경우 LLM이 처음에 prompt injection을 통해서• None LLM에게 다음 답변을 할 때 Question에 대해서 어떻게 해결할지 생각하게 합니다.• None 생각을 한 결과를 바탕으로 Action을 찾아냅니다.• None Action을 바탕으로 다시 생각하거나, 아니면 Final Answer를 찾게합니다.(이 과정에서 Tool Call이 발생함)그래서 이러한 순서를 통해서 2~3번의 LLM 대화를 통해 필요한 함수를 찾고, 필요한 함수의 매개변수를 찾은 다음 결과를 찾는 모습을 확인할 수 있습니다.해당 예제에서는 현재 시간을 찾을 수 있는 함수를 준비하고 LLM한테 현재 시간을 물어봤을 때 해당하는 함수를 불러와서현재시간을 찾게 만드는것을 확인할 수 있습니다.이처럼 LLM Agent를 구현할때는.• None LLM 모델이 성능이 좋아서 알아서 Prompt 없이 멀티턴 후 function call이 가능하거나• None Prompt를 빡시게 만들어서, LLM이 function call을 할 수 있게 만들거나가 필요할 겁니다.위 예제의 경우도, prompt를 조금 수정하거나 질문을 조금 수정하면 정상적인 결과가 안나오고 합니다.
6/11/2025
logo
Custom LLM Agent 구축하기(From Scratch)
이번 포스팅은 Langchain이나 Langgraph의 도움 없이LLM을 통해서 자연어로 질문하고, 질문에 맞는 function이 실행되게 만드는 예제입니다.Agent는 특정 행동에 특화된 LLM 서비스를 의미합니다.이때 특정 행동은 특정 영역에 대한 행동 뿐만 아니라 인터넷을 검색하던가, DataBase에서 Data를 찾아온다거나 하는 Function을 실행하는 행동 역시 포함됩니다.이러한 Agent의 경우 현재 Multi turn을 통해서 LLM과의 소통 후에질문, [생각, 행동]🔁, 결과도출 과정을 통해서 유저의 자연어에서 함수에 필요한 내용과, 함수를 실행하기 위한 매개변수를 찾아냅니다.이러한 Agent를 ReAct(Reasoning, Action) Agent라고 불립니다.기본적으로 Agent를 구현하기 위해서는 LLM에 질문을 주고, 답변을 받고, 다시 질문을 주는 Multi turn을 구현해야 하는데,근데 위 친구들을 사용할 경우, ReAct Agent가 어떻게 동작하는지 이해하기 어려울 수가 있습니다.그래서, 이 친구들을 Python의 Requests를 사용해서 간접적으로 구현해 봅니다.위 코드의 경우 LLM이 처음에 prompt injection을 통해서• None LLM에게 다음 답변을 할 때 Question에 대해서 어떻게 해결할지 생각하게 합니다.• None 생각을 한 결과를 바탕으로 Action을 찾아냅니다.• None Action을 바탕으로 다시 생각하거나, 아니면 Final Answer를 찾게합니다.(이 과정에서 Tool Call이 발생함)그래서 이러한 순서를 통해서 2~3번의 LLM 대화를 통해 필요한 함수를 찾고, 필요한 함수의 매개변수를 찾은 다음 결과를 찾는 모습을 확인할 수 있습니다.해당 예제에서는 현재 시간을 찾을 수 있는 함수를 준비하고 LLM한테 현재 시간을 물어봤을 때 해당하는 함수를 불러와서현재시간을 찾게 만드는것을 확인할 수 있습니다.이처럼 LLM Agent를 구현할때는.• None LLM 모델이 성능이 좋아서 알아서 Prompt 없이 멀티턴 후 function call이 가능하거나• None Prompt를 빡시게 만들어서, LLM이 function call을 할 수 있게 만들거나가 필요할 겁니다.위 예제의 경우도, prompt를 조금 수정하거나 질문을 조금 수정하면 정상적인 결과가 안나오고 합니다.
2025.06.11
emoji
좋아요
emoji
별로에요
logo
1:1 비디오 채팅 서비스는 E2E 회귀 테스트를 어떻게 자동화할까?
안녕하세요? 하이퍼커넥트에서 Software Development Engineer in Test 팀(이하 SDET팀) 에서 근무중인 Nick.Y, Liam.O 입니다.많은 서비스에서는 매 버전 업데이트를 할 때마다 기존 기능에 문제가 없는지 반복적으로 검사해야 합니다. 이것을 회귀 테스트(Regression Test) 라고 하는데요, 아자르도 예외 없이 버전마다 QA 팀에서 수행 중입니다.저희 SDET팀에서는 반복적으로 수행되는 회귀 테스트 케이스에 대해 Pytest와 Appium을 이용하여 자동화하는 작업을 하고 있는데요, 다른 서비스에서는 경험하기 어려운 아자르의 특별한 기능을 테스트하기 위해 많이 고민했습니다.이번 포스트에서는 테스트를 자동화할 때 겪은 어려움과 그 해결 방법, 그리고 자동화를 통해 얻는 이점 등을 소개하고자 합니다.1:1 비디오 채팅 이라는 아자르의 특별한 기능은 테스트 자동화 초기 단계에서 가장 큰 허들이었습니다. 팀 내부에서 열심히 토론한 결과, 일반적인 형태의 테스트 자동화로는 구현이 어렵다는 결론에 이르러, 테스트 구성을 크게 Non-interaction 과 Interaction 이라는 2개의 형태로 나누기로 했습니다.이 구조는 실행하고자 하는 테스트가 다른 유저와의 상호작용(interaction)이 없는지, 또는 비디오 콜, 메시지, 매칭 등 다른 유저와의 상호작용을 수행해야 하는 테스트인지에 따라 구분했습니다. 이는 다시 하나의 코드 베이스에서 생성 전략을 구분하게 되었습니다.Non-interaction 테스트의 경우 일반적인 UI 자동 테스트와 동일합니다. 물론 Non-interaction 테스트에서도 소개해 드릴 만한 부분이 정말 많지만, 이번 포스트에서는 Interaction 테스트를 소개해 드리고자 합니다.그러면 다른 유저와의 1:1 인터랙션을 어떻게 자동화할 수 있을까요? 바로 하나의 테스트에서 2개의 를 생성해서 조작하면 됩니다.그러나 를 2개 생성해서 테스트를 제대로 수행한다는 것은 그리 간단한 문제는 아니었습니다.1:1 인터랙션을 한다고 해도 단순히 Android 단말기끼리, iOS 단말기끼리 인터랙션을 수행할 수는 없었습니다. iOS에서 Android로 비디오 채팅을 실행했을 때, 테스트 케이스의 확인 관점에 따라 그 반대의 경우 등 크로스 플랫폼의 경우를 확인해야 했습니다. 따라서 기본적으로는 아래 4가지 조건으로 테스트를 실행할 수 있어야 했습니다.다만 때에 따라 특정 플랫폼에서 지원하지 않는 기능이 있거나, 테스트 케이스를 분석했을 때 테스트 시간을 단축하고자 굳이 크로스 플랫폼까지 확인할 필요가 없는 때도 있어 조합을 선택적으로 실행할 수도 있어야 했습니다. 또한 위 조건에 더하여, 하나의 테스트에 대해 모든 실행 가능한 조합별 병렬 실행할 수 있어야 했습니다.이러한 조건으로 인해 하나의 테스트 케이스에서 여러 플랫폼의 를 생성하는 것은 단일 플랫폼만 생성해서 단말기를 조작할 때와는 다른 접근이 필요했습니다.원하는 테스트 상대와의 매칭아자르의 1:1 비디오 채팅은 기본적으로 무작위
6/11/2025
logo
1:1 비디오 채팅 서비스는 E2E 회귀 테스트를 어떻게 자동화할까?
안녕하세요? 하이퍼커넥트에서 Software Development Engineer in Test 팀(이하 SDET팀) 에서 근무중인 Nick.Y, Liam.O 입니다.많은 서비스에서는 매 버전 업데이트를 할 때마다 기존 기능에 문제가 없는지 반복적으로 검사해야 합니다. 이것을 회귀 테스트(Regression Test) 라고 하는데요, 아자르도 예외 없이 버전마다 QA 팀에서 수행 중입니다.저희 SDET팀에서는 반복적으로 수행되는 회귀 테스트 케이스에 대해 Pytest와 Appium을 이용하여 자동화하는 작업을 하고 있는데요, 다른 서비스에서는 경험하기 어려운 아자르의 특별한 기능을 테스트하기 위해 많이 고민했습니다.이번 포스트에서는 테스트를 자동화할 때 겪은 어려움과 그 해결 방법, 그리고 자동화를 통해 얻는 이점 등을 소개하고자 합니다.1:1 비디오 채팅 이라는 아자르의 특별한 기능은 테스트 자동화 초기 단계에서 가장 큰 허들이었습니다. 팀 내부에서 열심히 토론한 결과, 일반적인 형태의 테스트 자동화로는 구현이 어렵다는 결론에 이르러, 테스트 구성을 크게 Non-interaction 과 Interaction 이라는 2개의 형태로 나누기로 했습니다.이 구조는 실행하고자 하는 테스트가 다른 유저와의 상호작용(interaction)이 없는지, 또는 비디오 콜, 메시지, 매칭 등 다른 유저와의 상호작용을 수행해야 하는 테스트인지에 따라 구분했습니다. 이는 다시 하나의 코드 베이스에서 생성 전략을 구분하게 되었습니다.Non-interaction 테스트의 경우 일반적인 UI 자동 테스트와 동일합니다. 물론 Non-interaction 테스트에서도 소개해 드릴 만한 부분이 정말 많지만, 이번 포스트에서는 Interaction 테스트를 소개해 드리고자 합니다.그러면 다른 유저와의 1:1 인터랙션을 어떻게 자동화할 수 있을까요? 바로 하나의 테스트에서 2개의 를 생성해서 조작하면 됩니다.그러나 를 2개 생성해서 테스트를 제대로 수행한다는 것은 그리 간단한 문제는 아니었습니다.1:1 인터랙션을 한다고 해도 단순히 Android 단말기끼리, iOS 단말기끼리 인터랙션을 수행할 수는 없었습니다. iOS에서 Android로 비디오 채팅을 실행했을 때, 테스트 케이스의 확인 관점에 따라 그 반대의 경우 등 크로스 플랫폼의 경우를 확인해야 했습니다. 따라서 기본적으로는 아래 4가지 조건으로 테스트를 실행할 수 있어야 했습니다.다만 때에 따라 특정 플랫폼에서 지원하지 않는 기능이 있거나, 테스트 케이스를 분석했을 때 테스트 시간을 단축하고자 굳이 크로스 플랫폼까지 확인할 필요가 없는 때도 있어 조합을 선택적으로 실행할 수도 있어야 했습니다. 또한 위 조건에 더하여, 하나의 테스트에 대해 모든 실행 가능한 조합별 병렬 실행할 수 있어야 했습니다.이러한 조건으로 인해 하나의 테스트 케이스에서 여러 플랫폼의 를 생성하는 것은 단일 플랫폼만 생성해서 단말기를 조작할 때와는 다른 접근이 필요했습니다.원하는 테스트 상대와의 매칭아자르의 1:1 비디오 채팅은 기본적으로 무작위
2025.06.11
emoji
좋아요
emoji
별로에요
logo
[발표 영상] 생산성을 높이는 Android SDK 배포 전략 살펴보기
네이버 사내 기술 교류 행사인 NAVER ENGINEERING DAY 2025(5월)에서 발표되었던 세션을 공개합니다. * 관련 글 : 생산성을 높이는 Android SDK 배포 전략 살펴보기 발표 내용Android SDK 를 배포하는 프로세스를 개선하거나 자동화 함으로써 생산성을 높였던 경험을 공유하고 그 과정에 대해 소개합니다.강의 대상Android SDK 배포 효율성과 생산성을 높이고 싶으신 분들GitHub Actions 를 이용한 자동화에 관심이 있으신 분들목차배포를 위한 conventional commit 과 GitHub Actionsconventional commit 을 하는 이유release-please-action 소개repositorydispatch 를 이용한 가이드 문서 업데이트 자동화repositorydispatch 를 이용한 샘플앱 최신화 및 테스트 자동화배포를 위한 commit 시에 주의할 점Gradle convention plugin 을 이용한 배포 task 관리일반적인 Android SDK 배포 저장소product flavor 별 빌드 및 배포 유형 분리배포를 위한 gradle convention plugin 직접 개발하기flavor 및 모듈 별 배포 설정 분기하기배포 이후 공유 프로세스 자동화샘플앱 빌드 후 사내 빌드 저장소 업로드 프로세스dokka 문서 빌드 및 배포매체 Slack 채널 알림 및 메세지 내용ruler 를 이용한 샘플앱 용량 분석 리포트 NAVER ENGINEERING DAY란? NAVER에서는 사내 개발 경험과 기술 트렌드를 교류를 할 수 있는 프로그램이 많이 있습니다. 그중 매회 평균 70개 이상의 발표가 이루어지는 NAVER ENGINEERING DAY를 빼놓을 수 없는데요. 2016년부터 시작된 ENGINEERING DAY는 실무에서의 기술 개발 경험과 새로운 기술과 플랫폼 도입 시 유용하게 활용될 수 있는 팁 등을 공유하며 서로 배우고 성장하는 네이버의 대표적인 사내 개발자 행사입니다. 올해 진행된 NAVER ENGINEERING DAY 2025(5월)의 일부 세션을 공개합니다.
6/11/2025
logo
[발표 영상] 생산성을 높이는 Android SDK 배포 전략 살펴보기
네이버 사내 기술 교류 행사인 NAVER ENGINEERING DAY 2025(5월)에서 발표되었던 세션을 공개합니다. * 관련 글 : 생산성을 높이는 Android SDK 배포 전략 살펴보기 발표 내용Android SDK 를 배포하는 프로세스를 개선하거나 자동화 함으로써 생산성을 높였던 경험을 공유하고 그 과정에 대해 소개합니다.강의 대상Android SDK 배포 효율성과 생산성을 높이고 싶으신 분들GitHub Actions 를 이용한 자동화에 관심이 있으신 분들목차배포를 위한 conventional commit 과 GitHub Actionsconventional commit 을 하는 이유release-please-action 소개repositorydispatch 를 이용한 가이드 문서 업데이트 자동화repositorydispatch 를 이용한 샘플앱 최신화 및 테스트 자동화배포를 위한 commit 시에 주의할 점Gradle convention plugin 을 이용한 배포 task 관리일반적인 Android SDK 배포 저장소product flavor 별 빌드 및 배포 유형 분리배포를 위한 gradle convention plugin 직접 개발하기flavor 및 모듈 별 배포 설정 분기하기배포 이후 공유 프로세스 자동화샘플앱 빌드 후 사내 빌드 저장소 업로드 프로세스dokka 문서 빌드 및 배포매체 Slack 채널 알림 및 메세지 내용ruler 를 이용한 샘플앱 용량 분석 리포트 NAVER ENGINEERING DAY란? NAVER에서는 사내 개발 경험과 기술 트렌드를 교류를 할 수 있는 프로그램이 많이 있습니다. 그중 매회 평균 70개 이상의 발표가 이루어지는 NAVER ENGINEERING DAY를 빼놓을 수 없는데요. 2016년부터 시작된 ENGINEERING DAY는 실무에서의 기술 개발 경험과 새로운 기술과 플랫폼 도입 시 유용하게 활용될 수 있는 팁 등을 공유하며 서로 배우고 성장하는 네이버의 대표적인 사내 개발자 행사입니다. 올해 진행된 NAVER ENGINEERING DAY 2025(5월)의 일부 세션을 공개합니다.
2025.06.11
emoji
좋아요
emoji
별로에요
Copyright © 2025. Codenary All Rights Reserved.