과거 프로젝트로 작업해봤던 라이트테라피 조명 제어 앱을 복습하며, BLE 기기 탐색·연결·Service/Characteristic 기반 데이터 처리 흐름을 정리했다.iOS 백그라운드 제약, BLE/UWB/NFC 차이, 위치 기반 자동 체크인처럼 IoT 서비스로 확장할 때 필요한 센서 융합 구조도 함께 살펴본다.마지막으로 이런 기능을 SDK로 패키징하고 REST API 서버·운영자 대시보드까지 설계하는 전체 구조를 정리한다. 개념설명예시개념설명예시Central주변 BLE 기기를 찾고 연결하는 쪽iPhone 앱Peripheral자신을 광고하고 데이터를 제공하는 쪽조명, 비콘, 심박계Service기능 묶음조명 제어 서비스Characteristic실제 읽고 쓰는 데이터 단위밝기, 색온도, 전원 상태Adverti..
따로 운영중인 반복적인 네이버 블로그 발행 작업을 줄이기 위해 자동화 프로젝트를 시작했다.처음에는 글 생성 자동화에 집중했지만, 실제로는 네이버 에디터에 내용을 넣고 발행 준비를 마치는 마지막 단계가 가장 큰 병목이었다.이 글은 그 병목을 해결하기 위해 왜 크롬 익스텐션을 선택했는지, 어떤 기술 스택으로 구현했는지, 어디서 어려움을 겪고 있는지까지 전체 과정을 정리한 기록이다. 프로젝트를 시작한 배경블로그 운영 과정에서 주제 정리, 자료 조사, 본문 작성, 이미지 구성, 네이버 업로드, 발행 설정까지 반복되는 수작업이 많았다.러프한 스케치만 된 상태인데, 쉽게 말하면 아래와 같은 서비스다. (아직 구현중) 왜 크롬 익스텐션을 선택했는가네이버 블로그는 공식 글쓰기 API가 없고, 티스토리처럼 단순한 HTM..
1. Prisma란?Prisma는 Node.js/TypeScript 백엔드(서버)에서 DB를 다룰 때 쓰는 ORM(객체 관계 매핑) 라이브러리다.브라우저용이 아니라, 서버 코드에서만 사용한다.원래(전통적인) 방식은 두 가지다.직접 SQL: mysql, pg 같은 드라이버로 쿼리 문자열을 실행한다.다른 ORM: TypeORM, Sequelize, Drizzle 등.Prisma는 그중에서 스키마 파일 하나로 타입·마이그레이션·클라이언트까지 맞춰 주는 Node/TS용 ORM이라고 보면 된다.2. Prisma의 단점 (요지)러닝 커브: 스키마 문법, generate / migrate 개념, 빌드 타임과 런타임 구분을 알아야 한다.복잡한 쿼리 한계: Raw SQL보다 복잡한 조인·서브쿼리·윈도우 함수는 표현이 어..
1. 개요항목내용목적Jira의 프로젝트·이슈·스프린트·댓글·첨부파일·사용자 데이터를 CIRA DB로 일회성 이관하여, CIRA에서 기존 Jira 이력과 구조를 그대로 활용할 수 있게 함.스크립트scripts/jira-migrate.ts실행 환경Node + Prisma + tsx. .env에 CIRA DB 연결 정보와 Jira API 설정 필요. 1. 앞 주소 (Base URL)Base: https://{JIRA_DOMAIN}/rest- JIRA_DOMAIN은 .env의 JIRA_DOMAIN (예: yourcompany.atlassian.net).- 풀 URL:https://{JIRA_DOMAIN}/rest/api/3/users/search예: https://yourcompany.atlassian.net..
Prisma Query Engine과 Alpine 환경에서 발생한 DB 조회 Hang 이슈 분석 이번 글은 내가 겪은 “배포 서버에서 Prisma DB 조회가 이유 없이 멈추는(hang) 문제”를 스터디용으로 정리한 기록이다. 결론부터 말하면: Cursor(혹은 템플릿)가 node:alpine 기반 Dockerfile을 만들어줬고 Prisma는 내부적으로 네이티브 엔진(실행 파일)을 쓰기 때문에 Alpine(musl) + Prisma 엔진 + 배포 환경(특히 ARM64/AWS) 조합에서 멈춤이 터질 수 있었다 중요한 건, 이 문제가 “코드 로직 버그”라기보다 런타임 환경 호환성 문제라는 점이다. ..
최근 백엔드와 인프라를 공부하면서 낯선 개념을 한 번에 여러 개 마주했다.TerraformDocker / ContainerAWS관련 여러 서비스들 등서버 런타임, 프로세스, 메모리 구조프론트엔드 위주로 개발해오다가 인프라 레이어를 처음 접하니깐 알 수 없는 수많은 서비스와 용어들에 압도되어“어디서부터 이해해야 하지?” 라는 부담부터 먼저 왔다. 하지만 과거라면:책을 여러 권 사고블로그 글의 신뢰도를 검증하고선배 개발자에게 물어보고StackOverflow를 뒤지며 단편적인 정보를 이어 붙이고정리하는 데만 며칠이 걸렸다실제로 개념을 “이해”하기까지 걸리는 시간보다,정확한 정보를 찾는 과정이 더 오래 걸렸다.그런데 지금은 다르다. - AI가 개발자의 일자리를 대체한다는 담론은 계속 나오고 있다.실제 체감으로..
1. 도커(Docker)가 무엇인지 부터 사용 전에 한 번 더 알아두자.도커 = “이 앱이 돌아가려면 필요한 환경(Node 버전, OS 라이브러리 등)을 통째로 상자(이미지)로 만들어 두는 도구”네 PC에는 Node 18이 깔려 있는데, 이 프로젝트는 Node 20이 필요할 수 있음.그걸 “우리 프로젝트는 Node 20 + 이 OS에서 돌아가요”라고 Dockerfile로 정의해 두면,어디서든 같은 상자(Docker 이미지)만 쓰면 똑같이 돌아감 (로컬, 동료 PC, AWS 서버 모두).그래서 “배포할 때도 로컬이랑 똑같은 환경”을 쓰려고 Docker를 쓰는 거고,이 프로젝트(사내 지라 프로잭트)에서는 앱(Next.js)을 Docker 이미지로 만들어서 ECR에 올리고, 나중에 ECS에서 그 이미지를 실행..
들어가며Next.js + Prisma + PostgreSQL로 만든 사내용 프로젝트(칸반/위키 등)를 AWS에 올리면서, “어디에 어떻게 띄울까?”를 정리해 봤다.처음엔 App Runner를 쓰려다가 한국 리전(ap-northeast-2) 미지원이라 다른 선택지를 비교했고, 그 과정을 공부용으로 정리한 글이다.1. 이 프로젝트에서 고민한 것무엇을 올리는가Next.js 풀스택 앱(Docker 이미지), RDS(PostgreSQL), S3 업로드.→ “한 개의 웹앱 + DB + 스토리지” 구조.어디에 올릴 것인가 (컴퓨팅)코드는 Docker로 빌드하고 ECR에 올리는 전제.그 이미지를 어떤 AWS 서비스에서 실행할지를 정해야 함.제약서비스 지역: 한국 리전(ap-northeast-2) 사용 필요.App Ru..
사내에서 사용하는 지라를 직접 만들어보자고 파일럿 프로젝트를 제안주셔서 진행해본다. 바이브 코딩을 하다보면 내가 알지도 못하는 기술을 커서 IDE가 다 해주지만, 추후 운영을 위해서는 기술에 대한 스터디가 필요하기 때문에 Phase별로 쪼개서 스터디를 하고자한다. 플러터 개발하는 동안 뭐이리 새로운 기술이 많이 등장했는지 헷갈리는게 너무 많다.. Phase는 우선 ver1로는 총 9단계 까지가있다. Phase 1: 기반 구축Next.js 14 + TypeScript 프로젝트 초기화Prisma + PostgreSQL 설정tRPC 설정shadcn/ui 컴포넌트 설정Docker + docker-compose 환경 구성 (PostgreSQL, Redis 1. Next.js란 무엇인가 한 줄 정의Next.js..
오랜만에 회고를 쓴다.마지막 회고는 2023년 초에 작성한 2022년 회고 및 2023년 목표였고, 그 이후로 2023년과 2024년의 회고를 건너뛰었다.ChatGPT를 적극적으로 사용하면서, 블로그에 기록하고 정리하는 행위 자체에 의미를 잘 느끼지 못했다. 공부는 대부분 ‘바이브 코딩’으로 해결했고, 블로그에는 따로 남기지 않았다. 그러다 보니 블로그의 존재 자체를 잊게 되었고, 자연스럽게 회고에도 소홀해졌다.하지만 최근 회사 동료들을 보며, 공부한 내용을 기록하고 남기는 일이 자기계발과 회고 측면에서 여전히 중요하다는 생각이 들어 다시 시작하게 되었다.연도별 주요 정리2023년개발 커리어(직장) 일본 회사와 프리랜서 계약하여 일본 출장 및 체류 경험첫 Flutter 개발 경험팀원없이 혼자서 처음부터..
문제 사진 업로드시 원본사진과 썸네일 사진을 GCS에 업로드하는데, 이 때 한 게시물에서 올리는 사진 갯수가 많아짐에 따라 사용자는 아무 것도 할 수 없게 된다. 그래서 우선 아래와 같은 처리를 했다. 1. 등록 후 화면을 게시물 작성 화면을 벗어나 게시물 목록에서 다른 작업을 하거나 게시물을 읽어도 다른 스레드에서 사진이 업로드 되도록 하였다. 2. 사용자가 등록하는 사진이 10장이라면, GCS에는 썸네일 10장, 원본 파일 10장으로 총 20장이 올라간다. 이때 썸네일은 용량 축소를 위해 사진 크기와 품질을 떨어트려준다. 3. 사진이 10장이라면 10장이 업로드가 동기적으로 실행된다. 하지만 10장의 업로드를 병렬처리 한다면 시간을 축소할 수 있다. Dart의 비동기 처리 Dart의 비동기 프로그래밍..
pushAndRemoveUntil and pushReplacement are two navigation methods in Flutter's Navigator widget. pushAndRemoveUntil pushes a new route onto the navigator stack and removes all the routes below it until a specified route is encountered. It takes two arguments: The context in which the Navigator is mounted. A RoutePredicate specifies the route that should stop the removal process Navigator.pushRep..
devel이라는 개발계 브랜치에서 A라는 브랜치에 작업을 하다 커밋, 푸시, devel에 머지시켰다. 이후 A 를 devel 브랜치에 merge시킨 것을 취소하고 싶으면 아래 순서대로 진행한다. 가끔 Revoke 시킬 일이 있는데, 순서를 헷갈리지 않기 위해서 기록해둔다. To revoke a branch merge into the "devel" branch on GitHub, you will need to use the command line to create a new branch that reverts the changes made by the merge commit. Here are the steps: Checkout the "devel" branch: git checkout devel Creat..
요즘 내 머릿속엔 플러터에 익숙해지고 싶다는 생각뿐이다. 새로운 회사에서 커뮤니티 앱을 만드는 프로젝트에 참여하게 됐다. 어떤 서비스인지 보안상 자세히는 말할 수는 없지만 어린 시절 해외에서 유학하며 외롭고 힘들었던 나에게도 소개해주고 싶을 정도로 유용한 서비스가 될 것 같다. 타지에서 힘들지만 강인하게 살고 있는 사람들을 위한 앱이다. 그래서 해당 프로젝트에 더 애착이 가고 잘 해내고 싶은 욕심이 생긴다. 플러터(다트)가 아예 처음인데, 그래도 이전에 React 프론트엔드와 iOS(SwiftUI)를 해왔던 것이 플러터를 배우는데 많이 도움이 된다. 앞선 두 가지를 개발하는 방식과 플러터는 많이 닮아있다. 선언형 프로그래밍인 것과 UI를 구성하는 방식이 비슷하다. VSC를 사용하는 것은 리액트를 개발할 ..
하나 해결하면 다른거 터지고 다른거 터지고! 깃에서 이전 개발자가 만들어 놓은 프로젝트를 실행하는 것만해도 시간이 오래 걸린다. error build: Command PhaseScriptExecution failed with a nonzero exit code 터미널에서 프로젝트 경로로 가서 아래 코드 실행 rm -rf pubspec.lock flutter pub cache clean flutter clean flutter pub get ios폴더에서 아래 명령어 작성 rm -rf Podfile.lock (존재할 경우) rm -rf Pods (존재할 경우) rm -rf ~/Library/Developer/Xcode/DerivedData/* pod deintegrate pod cache clean --al..
M1/M2 Silicon Mac Cocoapod관련 오류 해결법 => I am trying to run pod install or pod update and it's failing with the error message: [!] CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/CocoaPods-version.yml Response: URL using bad/illegal format or missing URL 기본적으로 기존에 깔려있는 cocoapods을 지우고 다시 설치해야한다. 그 전에 1) 응용 프로그램에서 2) 터미널 아이콘 복제 3) 복제한 터미널 아이콘 우측 클릭하여 정보보기하여 -> 로제타로 실행 체크 4) 해당 터미널 열..
Cocoapod M2 관련 오류 때문에 아래 작업을 실행해야하는데, 권한이 없다고 나온다. gem uninstall cocoapods arch -x86_64 brew install cocoapods arch -x86_64 brew reinstall cocoapods 그래서 아래처럼 rbenv를 설치하려는데 어떤 버전으로 해도 오류가 나타난다. rbenv install 2.7.7 오류 내용은 아래와 같다. BUILD FAILED (macOS 12.6 using ruby-build 20221225) Inspect or clean up the working tree at /var/folders/9k/y7hfk9rx31x22q_jxrnjfjnh0000gn/T/ruby-build.20230108182310.122..
기존에 개발자가 간략하게 플러터 프로젝트를 생성하고 튜토리얼 화면을 만들어 놓았는데, 이를 확인하기 위해 내 노트북에서 플러터 프로젝트를 시뮬레이터로 돌리는 것부터 에러가 발생했다. Error output from CocoaPods: [!] The version of CocoaPods used to generate the lockfile (1.11.3) is higher than the version of the current executable (1.11.2). Incompatibility issues may arise. [!] Automatically assigning platform `iOS` with version `11.0` on target `Runner` because no platform ..
시뮬레이터 실행시 아래와 같은 버그 메시지가 뜰 때가 있다. You don't have an extension for debugging 'Java Properties'. Should we find a 'Java Properties' extension in the Marketplace 이때 해결 방법 .dart 파일을 선택한 후 실행을 한다. 근데 새로산 M2 + 메모리 16 조합에서 시뮬레이터가 왜이렇게 느리게 돌아갈까?ㅎㅎㅎㅎ M1 pro Max를 살걸 그랬나 싶은 생각이 많이 드는 요즘이다.
Flutter 프로젝트를 만들어 VSC에서 시뮬레이터를 돌려보았다. iOS를 선택했다. 아래와 같은 오류가 발생했다. Failed to launch iOS Simulator: Error: Emulator didn't connect within 60 seconds 해결 방법 1. 시뮬레이터를 먼저 켠다. 2. 다시 VSC로 돌아온다. Run Debug를 실행한다.
- Total
- Today
- Yesterday