logo
기술 블로그
logo
코드 품질 개선 기법 9편: 왔던 길을 되돌아가 보자
안녕하세요. 커뮤니케이션 앱 LINE의 모바일 클라이언트를 개발하고 있는 Ishikawa입니다.저희 회사는 높은 개발 생산성을 유지하기 위해 코드 품질 및 개발 문화 개선에 힘쓰고 있습니다. 이를 위해 다양한 노력을 하고 있는데요. 그중 하나가 Review Committee 활동입니다.Review Committee에서는 머지된 코드를 다시 리뷰해 리뷰어와 작성자에게 피드백을 주고, 리뷰하면서 얻은 지식과 인사이트를 Weekly Report라는 이름으로 매주 공유하고 있습니다. 이 Weekly Report 중 일반적으로 널리 적용할 수 있는 주제를 골라 블로그에 코드 품질 개선 기법 시리즈를 연재하고 있습니다.이번에 블로그로 공유할 Weekly Report의 제목은 '왔던 길을 되돌아가 보자'입니다.왔던 길을 되돌아가 보자네트워크나 파일 시스템 같은 I/O를 사용하는 경우 I/O의 데이터 표현과 코드의 데이터 표현을 상호 변환해야 합니다. 대표적인 예 중 하나가 인터페이스 정의 언어(IDL)나 데이터베이스 스키마 등 외부에서 정의된 데이터와 코드에서 정의된 모델 클래스를 상호 변환하는 것입니다. 이때 '상태'나 '타입'을 의미하는 값을 사용한다면 코드에서 열거형(enumeration)을 사용하기도 합니다.다음 코드에서는 데이터베이스에서 사용되는 값과 열거자(enumerator)를 상호 변환하기 위해 을 사용합니다.위 코드에 문제가 있을까요?평행한 두 개의 도로위 코드에서는 데이터베이스 값에서 열거형으로 변환하는 것과 그 반대로 변환하는 것이 각각 별도로 정의돼 있기 때문에 다음 두 가지 문제가 발생합니다.• 사양 변경 시 두 을 모두 업데이트해야 한다.• 두 변환 간에 서로 대응이 잘 이뤄지고 있는지 보장할 수 없다.이 문제를 해결하려면 '역방향 변환'은 기존 변환으로 유도하는 것이 좋습니다. 특히 열거자 속성이나 / 식을 사용할 수 있는 경우 이를 대신 사용하면 모든 열거자를 포괄하는 것을 보장하기 쉽습니다.열거자 속성을 사용하면 모든 열거자가 그에 대응하는 데이터베이스 값을 갖도록 할 수 있습니다. 예를 들어 Kotlin의 경우 함수를 사용해 에서 으로 을 만들 수 있습니다. 다른 많은 언어에서도 과 같은 함수나 열거자에 대한 반복문을 작성해 같은 작업을 수행할 수 있습니다.다음 코드는 변환을 수행하는 예제입니다.위 구현 방법은 단순하다는 장점이 있지만, 이 광범위하게 사용되는 모델의 경우 도 광범위하게 보인다는 점이 문제가 될 수 있습니다. 또한 여러 데이터 표현 간에 상호 변환이 필요한 경우 에 해당하는 값을 여러 개 정의해야 하므로 혼란을 초래하기 쉽습니다.다음 구현은 여러 변환을 위한 값을 가지고 있는데요. 이대로 변환 대상과 변환 원본이 늘어나면 클래스 정의가 금세 비대해질 것이라는 것을 쉽게 예상할 수 있습니다. 이런 경우에는 다음에 소개할 '구현 예제 2' 적용을 고려해 보는 게 좋습니다.구현 예제 2: 개별 레이어 내에서 변환 구현 및 역변환 맵변환을 사용하는 코드가 기능이나 레이어, 스코프 내에 국한되어 있다면 해당 범위 내에서 변환을 정의하는 방법이 있습니다. 다음 코드는 와 의 상호 변환을 에 국한된 범위로 정의합니다. 이때 에서 로 변환하는 것에는 식을 사용해 모든 열거자를 포괄하는 것을 보장합니다.또 다른 방법은 나 와 같은 클래스를 별도로 정의하는 것입니다. 플랫폼에 따라 이를 쉽게 구현할 수 있는 플랫폼이 있습니다. 단, 나 를 구현하는 경우에도 순방향 변환과 역방향 변환은 같은 파일이나 클래스에서 정의해야 합니다.위 구현 예제는 둘 다 모든 열거자에 대응하는 값이 있다는 것(열거자가 정의역일 것)을 보장합니다. 단, 값이 중복되지 않는다는 것(단사일 것)은 보장하지 않습니다. 값이 중복되지 않음을 보장하려면 다음과 같은 테스트를 작성하면 됩니다.
라인
·
하루 전
logo
하루 6시간을 되찾다: 서비스 운영팀의 AI 자동화 여정
AI Lab은 모든 직원이 일정 예산 안에서 원하는 AI 툴을 자유롭게 구독할 수 있도록 지원하는 일도 하고 있어요. 이번엔 격무에 시달리던 서비스 운영팀이 AI 를 통해 생산성을 혁신하고 업무의 본질에 더 다가가게 된 사례를 소개합니다.반복 업무의 늪: 서비스 운영팀이 직면한 도전여행 서비스 업계에서 고객 경험은 모든 것의 중심이지만, 이를 지원하는 운영 업무는 반복적이고 시간을 많이 소모하는 작업들로 가득 차 있어요. 서비스 운영팀은 이런 현실에 직면해 있었죠.“회사 내에 대부분의 팀들이 그러하겠지만 저희 팀도 매일 접수되는 업무, 요청 오는 업무로 대부분의 리소스가 투입되고 있는 상황이에요.”팀은 본래 운영 리스크를 줄이고 운영 정책을 고도화하는 중요한 업무에 집중해야 했지만, 현실은 달랐어요. 하루의 대부분을 후기 권리침해 대응, 부정거래 계정 관리, 외부거래 모니터링 같은 일상적인 반복 업무에 소비하고 있었죠.문제 해결을 위해 이 팀은 업무의 일부를 운영법인에 이관하거나 제품 개발팀에 개발을 요청하는 방법을 고려했어요. 하지만 다른 모든 조직도 마찬가지로 리소스가 제한되어 있고 각자의 우선순위가 있었기에, 이런 방식으로는 상황을 개선하기 어려웠어요.결국 팀은 스스로 문제를 해결해야 한다는 결론에 도달했고, 여기서 AI를 활용한 자동화의 가능성에 주목하게 되었어요.비개발자의 AI 자동화 도전기: 모두의 AI에서 찾은 희망해결책을 찾던 중, 서비스 운영팀은 회사 내에서 진행되는 ‘AI 리터러시’ 향상 프로그램인 “모두의 AI” 세션에서 중요한 인사이트를 얻게 되었어요.“모두의 AI 섹션이 저한테는 한줄기의 빛이었어요. 모두의 AI 세션은 조직의 비슷한 고민을 하고 있는 팀들이 자동화한 경험을 들려주었기에 더 와닿더라구요.”이 세션을 통해 팀은 구글 확장 프로그램, 클로드(Claude) AI(Claude for Sheets), 구글 Apps Script등의 도구를 활용하면 비개발자도 업무 자동화가 가능하다는 것을 알게 되었죠. 특히 유튜브나 다른 채널에서 볼 수 있는 일반적인 AI 활용사례보다 같은 회사 내에서 유사한 고민을 가진 팀들의 경험이 더 실질적인 도움이 되었어요.팀은 이 인사이트를 바탕으로 가장 시간이 많이 소요되는 세 가지 핵심 업무부터 자동화하기로 결정했어요:후기 권리침해 처리: 매일 약 1시간씩 소요되는 업무로, 권리침해 신고 접수부터 후기 블라인드 처리, 메일 발송까지 모든 과정이 수작업으로 진행되었어요. 한 건 처리에만 평균 10분이 소요되었죠.부정거래 계정 관리: 부정거래가 의심되는 계정을 확인하고, 판단하고, 메일을 발송하고, 계정을 정지하는 작업으로 역시 많은 수작업이 필요했어요.외부거래 모니터링: 하루에 150–200건의 메시지를 검토해 플랫폼 외부로 결제를 유도하는 행위를 식별하는 업무였어요.자동화 과정에서 가장 중요했던 것은 각 업무에서 가장 시간이 많이 소요되는 부분을 정확히 파악하고, 그 부분에 집중하는 것이었어요. 예를 들어 후기 권리침해 업무에서는 메일 발송과 후기 내용 요약 부분이 가장 시간이
마이리얼트립
·
하루 전
logo
GPT로 5분 만에 완성한 여행 업무 혁신 도구
클릭의 바다에서 헤매는 여행 상품 담당자들의 이야기여행 패키지 상품을 만드는 과정은 생각보다 복잡해요. 항공, 숙박, 관광 상품을 묶어 하나의 패키지로 제공하기 위해서는 수많은 옵션을 검토하고 선택해야 하죠. 또한 예약 일정이 변경되는 경우에는 수작업이 많았는데, 특히 항공편 탐색 과정은 가격 차이가 크기 때문에 비슷한 가격에 같은 클래스의 좌석을 찾는 것이 담당자들에게 큰 부담이었어요.복잡하고 불편한 항공편 검색 화면“항공 구성 상품을 탐색할 때 굉장히 많은 리소스가 투입되고 있었어요. 그리고 고객이 예약하고 나서 고객 사정으로 대체 항공편을 찾아야 될 때도 굉장히 많은 리소스가 투입되고 있었어요.”여행 상품 담당자들은 매일 이런 반복적인 작업에 시간을 쏟고 있었어요. 예를 들어, 오전 6시에서 8시 사이에 출발하고 돌아올 때는 오후 6시에서 8시 사이에 출발하는 항공편을 찾기 위해서는 여러 필터를 조합해야 했죠. 그런데 기존 시스템의 필터는 6시간 단위로만 구분되어 있어서 원하는 시간대만 정확히 볼 수 없었어요.또한 성인 일반가만 보기 위해서는 여러 할인 옵션을 하나하나 해제해야 했고, 좌석이 충분히 남아있는 항공편을 찾는 것도 쉽지 않았어요. 이런 반복적인 작업들이 담당자들에게 많은 스트레스를 주고 있었죠.GPT와 함께 웹 구조 분석하기: 코딩 없이도 가능한 크롬 확장 프로그램 개발이 문제를 해결하기 위해 패키지 담당 PM(Product Manager)은 세 가지 솔루션을 검토했어요. 특정 계정으로 더 고도화된 필터를 제공하는 방법, 슬랙 항공편 검색봇을 만드는 방법, 내부 관리 시스템에 검색 기능을 추가하는 방법이었죠. 하지만 모두 개발 비용이 너무 크거나 사용성이 떨어진다는 문제가 있었어요.ChatGPT 에게 웹 페이지 구조를 전달하며 크롬 익스텐션을 개발하는 모습 (예제)그래서 담당 PM은 컴퓨터 전공 지식을 살려 새로운 접근법을 시도했어요. GPT의 도움을 받아 웹사이트 구조를 분석하고 크롬 확장 프로그램을 개발하기로 한 거죠.“GPT랑 함께 웹 구조를 분석하고 크롬 확장 프로그램을 통해서 필터를 만들어 보자라는 생각을 하게 되었습니다.”GPT에게 웹 페이지의 HTML 구조를 보여주고, 자신이 원하는 기능을 설명했어요. 예를 들어 할인카드 필터에서 ‘성인’ 옵션만 남기고 나머지를 자동으로 해제하는 스크립트를 요청했죠. GPT는 이 요청을 바탕으로 바로 실행 가능한 코드를 생성했고, PM은 이를 테스트해 효과를 확인했어요.“여기 디비전에서 성인, 체크박스를 제외하고 모두 해제할 거야. 개발자 도구에서 테스트할 수 있도록 스크립트를 줘.”라고 요청하면 GPT가 바로 코드를 만들어줬고, 실제로 잘 작동했어요.이렇게 다양한 기능을 하나씩 개발하여 최종적으로는 크롬 확장 프로그램 형태로 패키징해 팀원들에게 배포했어요. 놀라운 점은 이 모든 과정에서 PM이 직접 코딩을 거의 하지 않았다는 거예요. GPT와의 대화만으로 필요한 기능을 구현할 수 있었죠.“이전과는 완전히 달라졌어요”: 담당자들이 체감한 업무 혁신새롭게 개발된 크롬 확장 프
마이리얼트립
·
하루 전
logo
비전공자 PM 의 AI 자동화: 여행 상품 제목 2,500개 최적화
마이리얼트립 AI Lab은 모든 마리터들이 AI를 더 가깝고 편안하게 활용할 수 있도록 많은 일을 하고 있어요. 그 활동중 하나로, 매주 한두 번 ‘모두의 AI’라는 시간을 마련해 우리가 직접 시도해 본 경험과 깨달음을 나누고 있지요. 덕분에 직무 구분을 넘어 서로의 아이디어가 자연스럽게 이어지고, 곳곳에서 새로운 임팩트가 싹트고 있어요. 이 블로그에서도 그런 이야기를 하나씩 담아보려 합니다.“21시간” -> ”5분”. 여정의 시작여행 상품 플랫폼을 운영하는 커머스팀은 1분기에 중요한 미션을 가지고 있었어요. 바로 상품에 대한 신뢰도를 높여 고객의 구매 결정을 돕고 전환율을 개선하는 것이었죠. 이를 위해 고객이 가장 먼저 접하는 메인홈 화면 개편이 필요했어요.문제는 메인홈에 노출되는 수천 개의 상품 제목이었어요. 파트너들이 직접 등록한 이 제목들은 가독성이 떨어지고 일관성이 없었어요. 괄호나 대괄호를 사용하거나, 지나치게 긴 제목으로 사용자 경험을 저해하고 있었죠.“실제 T&A(Tours and Activities)상품의 제목을 메인홈에 딱 올려봤더니 왼쪽 화면처럼 보이더라고요. 즉 여행자들이 대문에 딱 들어와서 보는 제목이 가독성이 굉장히 떨어지게 되는 거죠.”파트너의 상품 입력 타이틀을 그대로 사용한 경우(좌) / 상품 제목을 일관되게 수정(우)이 문제를 해결하기 위해 메인홈 노출용 상품 제목을 별도로 만들기로 결정했어요. 하지만 주요 도시 78개, 인기 상품만 2,500개… 상품 하나당 30초씩만 수정해도 21시간이 필요한 계산이 나왔어요. 또한 도시와 상품은 계속 확장될 예정이었기에, 이는 일회성이 아닌 반복적으로 발생할 비효율이었지요.시행착오를 거쳐 찾아낸 AI 활용법처음에는 GPT를 활용해 상품 제목을 자동으로 변환하는 방법을 시도했어요. 중화중문학과 출신의 PM이 AI에 처음 도전한 순간이었죠.기존 상품 제목과 카테고리 정보 (예시)“가독성을 향상시키기 위해서는 일단 짧아야 된다고 생각을 했어요. 그래서 15자 이내라는 조건을 한번 GPT한테 줘봤어요. 그랬더니 수정 퀄리티가 굉장히 낮더라고요.”첫 시도는 실패했지만, 포기하지 않고 프롬프트를 변경하며 테스트했어요. 상품 유형인 카테고리 정보를 함께 제공하자 퀄리티가 크게 향상됐어요. 가이드 투어나 프라이빗 투어 등 카테고리별 특성을 반영한 15자 이내의 제목이 잘 생성되었죠.그러나 2,500개 전체 리스트를 한꺼번에 처리하려 했을 때 다시 문제가 발생했어요. 대량의 데이터를 한 번에 처리하니 GPT가 맥락을 잃고 엉뚱한 결과를 내놓기 시작했던 것이죠.2500개 상품 제목이 있는 스프레드시트를 올려서 다건 처리를 시도하는 장면 (예시)“GPT가 대답을 할 때 우리가 준 질문에 어떤 부분이 중요한지를 판단을 한다고 합니다. 그런데 우리의 질문이 점점 길어지면 길어질수록 뭐가 중요한지를 잃어버리는 거예요. 2500개의 상품들 중에는투어, 티켓, 교통 등 여러가지 상품들이 섞여 있기 때문에, 축약된 제목에는 다른 상품의 맥락이 섞여 있을 수 있죠. 큰 데이터를 한꺼번에 주면 처리를
마이리얼트립
·
하루 전
logo
LLM 기반 서비스의 부하테스트
웹 서비스를 준비하는 과정에서 부하테스트는 서비스 운영 중 발생할 수 있는 문제를 미리 파악하는 데 필수적인 단계입니다.특히 LLM(Large Language Model)을 활용하는 서비스는 기존 웹 서비스와는 다른 특성을 가지고 있기 때문에,이에 맞는 지표(Metric)를 정확히 이해하고 적절한 테스트를 진행하는 것이 매우 중요합니다.이 글에서는 LLM 기반 서비스의 부하테스트에서 반드시 확인해야 하는 주요 Metric과 간단한 예제를 함께 정리하여 설명합니다.여기서는 대표적으로 많이 사용되는 프레임워크인 vLLM을 기준으로 설명하나, 다른 프레임워크를 사용하더라도 핵심 원리와 지표 측정 방식은 크게 다르지 않으므로 참고하시면 좋을 것 같습니다.LLM을 이용한 서비스는 일반적으로 대화형(Chat) 기반으로 설계됩니다.기존 API 서비스가 요청 처리 후 최종 데이터를 JSON 형태나 바이너리 등 완결적 결과를 주로 전달하는 반면, LLM 서비스는 생성되는 답변을 실시간으로 스트리밍 형태로 제공합니다.이에 따라 사용자의 첫 번째 응답까지 걸리는 시간(TTFT), 각 토큰 생성 시간, 평균 응답 길이 등과 같이 전통적인 웹 서비스와는 차별화된 Metric을 사용하여 테스트해야 합니다.또한 이 새로운 Metric들을 기존 서비스와 비교하기 위해 다른 형태로 환산하거나 분석하는 경우도 흔히 발생합니다.부하테스트에서 중요하게 측정하는 MetricLLM 서비스를 제공할 때 가장 중요한 두 가지 요소는 지연 시간(Latency)과 처리량(Throughput)입니다. 세부적인 Metric을 살펴보면 다음과 같습니다.• None TTFT(Time To First Token): 사용자가 요청 후 첫 번째 토큰을 받을 때까지 걸리는 시간으로, 체감 응답 속도를 가장 잘 나타냅니다. vLLM에서는 로 측정합니다.• None 총 대기 시간: 요청이 시작되어 최종 응답까지 걸리는 전체 시간으로, 긴 출력이 예상되는 서비스에서는 특히 중요합니다. vLLM에서는 로 확인합니다.• None 토큰당 생성 시간: 각 토큰 생성에 걸리는 평균 시간을 나타내며, vLLM에서 로 측정됩니다.• None 토큰 처리량: 초당 생성되는 토큰 수(tokens per second, TPS)로 서비스의 성능을 평가할 때 가장 흔히 사용하는 지표입니다.• None 요청 처리량: 초당 처리 가능한 요청 수를 의미하며, 시스템 전체 성능을 평가하는 데 매우 중요합니다.만약 vLLM 을 사용해서 서비스를 구성한다면, vLLM 기반 부하테스트는 vLLM에서 제공하는 benchmark_serving.py를 사용해 쉽게 진행할 수 있습니다. 샘플 스크립트는 다음과 같습니다.각 인자의 의미는 다음과 같습니다.• None dataset-name: 사용 데이터셋 유형( 는 Hugging Face 데이터셋 사용 시 지정)부하테스트의 예시 결과는 아래와 같습니다.이 중 주요하게 봐야 할 Metric은 Mean TTFT, Mean ITL, Request throughput, Output token throughput입니다.예를 들어 평균 100 토큰을 생성하는 서비스라면, 사용자가 최종적으로 답변을 받기까지 약 4.5초 정도 소요될 것으로 예상할 수 있습니다(598.11ms + 100 토큰 × 41.94ms).여기서 **TPOT(Time per Output Token)**는 토큰 자체의 순수 생성 시간이고, **ITL(Inter-token Latency)**은 생성된 토큰이 사용자에게 실제 전달될 때까지 걸리는 지연 시간입니다.따라서 ITL이 실질적인 사용자 체감 속도를 더 정확히 나타냅니다.특히, 평균값과 중간값 간 큰 차이가 있을 경우 스파이크 등 외부 요인으로 인한 성능 저하 가능성을 염두에 두고, 추가 분석을 진행해야 합니다.또한, 높은 P99 값(예: TPOT 43.4ms 대비 ITL 326.1ms)이 나타날 경우 네트워크나 시스템 구성에 잠재적 문제가 있는지 점검하는 것이 필요합니다.LLM 서비스를 준비할 때는 기존 웹 서비스와는 차별화된 지표들을 명확히 이해하고, 이를 바탕으로 철저한 부하테스트를 진행해야 합니다.특히 TTFT와 ITL, 토큰 처리량 등의 데이터를 면밀히 분석하여 사용자 체감 성능을 최적화하는 것이 중요합니다.또한 Metric을 통해 도출된 데이터를 토대로 시스템 전반의 문제점을 파악하고, 네트워크 환경을 포함한 다양한 요소를 점검한다면, 보다 견고한 서비스로 발전시킬 수 있을 것으로 생각됩니다.
SK텔레콤
·
2일 전
logo
Simplicity 25 : 한 번쯤 이상을 꿈꿔본 모두에게
일하면서 한 번쯤, 이상을 꿈꿔본 적이 있나요?빠른 문제해결이 중요한 토스에서도, 그 너머의 이상을 그리는 사람들이 있어요. 디자이너, 리서처, 라이터, 엔지니어링 등 다양한 분야에서 정교하고 아름다운 UX를 실현하기 위해 새로운 시도를 이어가고 있죠.하지만 현실은 쉽지만은 않아요.이번 시즌에서는, 일하는 누구나 꿈꿔본 이상을 현실로 만들기 위해 고군분투한 토스팀의 여정을 들려드려요. 우리는 어떤 고민을 했고, 어떻게 답을 찾았을까요?그래픽, 인터랙션, 엔지니어링, UX 라이팅, 리서치, 플랫폼 디자인까지, 총 14개의 이야기가 준비되어 있어요. 잠깐 들여다보실래요?토스다움을 완성하는 순간들이토록 아름다운 새로고침화면을 아래로 당기면 나오는 그래픽, Pull To Refresh. 그 짧은 찰나에 아름다움을 담기 위한 고민을 들려드려요.인터랙션으로 첫인상 만들기토스를 처음 써보는 외국인에게 토스를 어떻게 소개해야 할까? 모두가 감탄한 온보딩, 그 중심에는 인터랙션이 있었어요.IT 업계에 3D 그래픽이 넘쳐나는 시대. 토스는 어떻게 '토스다움'을 만들어냈을까요? 그 여정을 보여드려요.인터랙션 개발의 매력은 무엇일까요? 아름다움과 감각을 설계하는 세 명의 인터랙션 개발자가 답해드릴게요.2,800만 명이 쓰는 앱에서 7,000명의 스크린 리더 사용자 경험까지 챙기기 위해, 토스는 어떤 노력을 하고 있을까요?시각 장애인이 토스를 더 쉽게 쓰려면, 무엇이 달라져야 할까요? 리서치를 통해 얻은 세 가지 인사이트를 공유할게요.토스가 사용자 경험과 마주하는 법사용자가 원하는 기능을 잘 찾는지, 정성적인 경험도 이제 수치로 말할 수 있어요. 토스만의 새로운 기준으로요.모두가 유저를 만나는 순간까지일하느라 사용자를 만날 시간이 없다면, 점심시간은 어떨까요? 식사하며 사용자의 목소리를 듣는 토스 팀의 이야기를 들려드릴게요.UX가 AI를 만났을 때AI시대에 라이터로 살아남기AI는 UX라이터에게 위기이자 기회예요. 다크패턴을 계기로, 라이터에서 프롬프트 엔지니어로 성장한 이야기를 들려드려요.AI봇을 만들면서 배운 3가지사용자를 만나기 전에 가볍게 의견을 물어볼 수 있는 AI UT봇. ‘휴리봇’ 을 만들면서 배운 3가지들 알려드릴게요.토스 그래픽을 10초 만에 그리는 AI‘토스트’를 소개합니다. 인간이 3일 걸려 만드는 3D 그래픽을 10초 만에 만든다니, 퀄리티까지 따라올 수 있을까요?익숙함 너머, 본질을 보다동의 화면도 간결해질 수 있을까각종 법적 제한 때문에 자유롭지 않은 동의 화면 디자인. 관성을 깨면 얼마나 달라질 수 있을까요?토스가 디자인툴을 만든 이유스케치, 피그마, 프레이머… 모두 써봤지만 우리에게 딱 맞는 건 없었어요. 그래서 만들었습니다. 토스만의 디자인 툴, 데우스.아무도 쓰지 않는 디자인 시스템새로운 컴포넌트를 배포했는데, 왜 아무도 안 쓰지? 컴포넌트를 넘어서, 일하는 방식 자체를 바꿔보기로 했어요.Simplicity 25는 거창한 해답보다는, 현실 속에서도 이상을 놓지 않으려 한 태도에 대해 이야기 하려고 해요. "정말 이런 게 가능할까?
비바리퍼블리카
·
2일 전
기술 블로그 더 보기
Copyright © 2025. Codenary All Rights Reserved.