# dev

[배포] 8. NginX & Gunicorn
팀 프로젝트에서 저는 백엔드 및 AI 개발을 맡았고, FastAPI 와 python 을 이용해 백엔드 서버 개발을 마쳤습니다. 이제 클라우드 담당 팀원으로부터 전달받은 서버 인스턴스에 개발한 백엔드 코드를 배포하여 프론트엔드 담당 팀원이 API를 이용할 수 있게 해야 합니다. 이 때, 프론트엔드 팀원의 요청으로 SSL 을 지원해야 했고요. (https 이용 가능하도록.) NginX 백엔드 서버 코드를 배포하기 위해 웹 서버가 필요한데, 다양한 웹 서버 중 NginX 를 사용하겠습니다. Nginx는 특히 파이썬 웹 프레임워크인 Django나 Flask 와 함께 사용되므로 마찬가지로 파이썬 웹 프레임워크인 FastAPI 와 함께 사용하기에 적합하다고 생각했기 때문입니다. Why NginX? NginX 공식 홈페이지에서는 NginX 를 이렇게 한 줄로 설명하고 있네요. `NGINX: Advanced Load Balancer, Web Server, & Reverse Prox

개발자인 나에게 영감을 준 말들
최근에 개발자로서 참 많이 와닿고 오래도록 마음에 새기고 싶은 그런 말들을 듣게 되어 까먹기 전에 몇 글자 적어보려고 한다. 2023.08.15 운 좋게 인프콘에 당첨이 되어 다녀오게 되었다. 그간 다녔던 개발 컨퍼런스와 달리 굉장히 유명한 네임드(!) 개발자 분들이 연사로 많이 오셔서 연예인을 보는 그런 기분이었다. (개발바닥 구독자라서 더 그럴지도?🤔) 그 중에서 김영한 님의 세션을 듣게 되었는데 점심 시간 직후 타임이었는데도 불구하고 그의 엄청난 인기를 실감할 수 있었다. 김영한 님의 백엔드 개발자이시지만 주된 내용은 주니어 개발자의 성장을 위한 조언이었기 때문에 편안한 마음으로 강연에 집중할 수 있었다. > 1년차를 10번 반복한 개발자가 될 수도 있다. 성장하지 못하고 매일 같은 일을 반복하는 제자리 개발을 하게 되면 10년이 지났을 때 1년차의 능력치를 10년 동안 반복하는 결과로 이어질 수 있다는 말은 너무 아프지만 무릎을 탁 치게 만드는 그런 말이

개발 환경(local, production, staging)
웹어플리케이션에서의 개발 환경 구분 개발, 테스트, 운영 단계에서 발생하는 요구사항 및 상황을 관리하고 처리하기 위함 크게 프로덕션(production), 로컬(local), 스테이징(staging)으로 나뉨 그외에도 개발(dev), 테스트(QA), 통합(Integration) 환경이 있음 조직에 따라 환경이 상이 (이미지 출처 - https://shuu.tistory.com/41) Local -> Dev -> QA -> Staging -> Prod 환경 구분 1. 프로덕션(Production) 환경 사용자 들이 접근하는 운영 환경 application이 최종 배포되는 환경 안정성, 성능이 최우선 에러 및 예외처리가 잘 되어 있어야 함 로그와 모니터링을 통한 문

Flutter Dev Explore - FL Charts (1)
출처 : Flutter: IOS style datepicker in flutter 출처 : Flutter에서 Locale을 적용하는 법에 대해 알아보자 출처 : UI Challenge 7 – Dashboa

Github Action으로 Testflight 배포 자동화하기
안녕하세요 :) 오늘은 Github Actions으로 Testflight으로 앱을 배포하는 걸 정리해보도록 하겠습니다 제가 처음에 목표로 했던 플로우입니다 태그 푸쉬 Github Actions workflow 트리거 푸쉬된 태그에서 앱 버전 추출 추출된 버전으로 빌드 생성 생성된 빌드 Testflight으로 배포 작업하면서 수정된 플로우입니다 태그 푸쉬 환경 변수 설정 Git 체크아웃 (코드 체크아웃) 푸쉬된 태그에서 앱 버전 추출 추출된 앱 버전으로 현재 프로젝트를 앱 버전 변경 키체인 초기화 인증서 복호화 및 설치 앱 아카이브 아카이브에서 ipa 추출 Testflight으로 업로드 인증서 사이닝쪽이 추가되고 작은 작업들이 늘어났습니다 0. 워크플로우 파일 생성 
Flutter Dev Explore - FL Charts
Flutter - #34. AspectRatio Flutter Charts - Data Visualization with Line Chart, Pie Chart and Bar Chart [Flutter] 필수 위젯 - 반응형 화면 처리 LayoutBuilder Flutter 강좌 - [Form] 텍스트필드에 포커스 주기 <a href="https://velog.io/@udong85/

[Flutter] Flavor 빌드 변형 (Firebase, Naver, Kakao, Apple, Google, GCP, API , App Icon)
Flavor 빌드 변형 (Firebase, Naver, Kakao, Apple, Google, GCP, API , App Icon) Create Flavors of a Flutter app Google Cloud Platform Naver Developers Kakao Developers Kakao Dev Talk Singleton Pattern 이란 ? [Firebase 세팅하기 - Flutter 3.0 이후](h
[NMT] 7. CTranslate
번역 모델 서빙 프레임워크로 당초 TorchServe 를 이용할 계획이었는데요, OpenNMT 에서 제공하는 CTranslate 를 먼저 이용하여 간단히 서빙해 보겠습니다. Why CTranslate? > CTranslate2 is a C++ and Python library for efficient inference with Transformer models. OpenNMT 를 이용해 학습한 번역 모델을 서빙하고 추론하려니(번역 문장을 생성하려니) 몇 가지 문제가 있었는데요, OpenNMT 에서 제공하는 기본 추론 시 input/output 포맷 = 텍스트 파일 제가 원한 형태는 문장 1개를 바로 모델에 입력하여 번역 문장을 얻는 것이라 iput/output 코드를 수정해야 합니다. GPU 없이 빠르게 서빙해야 함 현재 개인 GPU 가 없어서 CPU 에서 번역을 수행해야 하는데, 경험상 CPU 환경에서의 추론 속도는 GPU 환경의 약 10배에 가깝습니다.

[FastAPI] 6. Database & CRUD
앞서 포스팅에서 DB에 CRUD 를 하기 위한 SQLAlchemy 모델과 데이터를 검증하기 위한 Pydantic 모델을 다루었는데요, 이어서 CRUD 메소드 중 Create 와 Read 를 구현해 보겠습니다. Create 번역 언어 정보 및 문장 쌍을 DB에 저장하는 메소드를 만들어 보겠습니다. 메소드 동작 순서는 다음과 같습니다. SQLAlchemy 모델 인스턴스를 만들고 데이터를 넣습니다. (1.5. db = MysqlSession : 저는 db 세션을 여기서 지정했습니다.) add : query라는 쿼리를 db 세션에 추가합니다. 이는 데이터베이스에 새로운 데이터를 추가하거나 업데이트하는 작업을 수행할 수 있습니다. commit : 데이터베이스에 대한 변경 사항을 저장합니다. refresh : query에 대한 데이터베이스의 최신 상태를 다시 가져옵니다. 이는 변경된 데이터가 올바르게 반영되었는지 확인하기 위해 사용될 수 있습니다.

Juniverse Dev Diary 002
Juniverse 개발 다이어리 002 > 프로젝트 재구성! 01. 기존 프로젝트를 재구성하자! 🚀   요놈은 2022년 7월 10일에 시작했던 프로젝트라서 그런지, 이번에 새로이 다시 시작하고자 그동안 빌드했던 것들을 보니.. 여러모로 바꿔야 할 것들이 완전 산더미였다.   게다가, 생각보다 진행된 것들도 많이 없었고 (사실 아예 없다고 보는게 맞을지도 모른다.) 기능 구현은 커녕 기본적인 구조조차 영 맘에 들지 않아서 한 2일정도 고민하다가 아예 새로 밀어버리고 시작하자 라는 결론이 내려졌다.   물론 그렇다고 해서 레포 자체를 밀어버리자니 정든 친구를 한방에 보내버리는 느낌이 들어서, 기존 레포에 설정되어 있던 **이슈 네이밍
[FastAPI] 5. Database & SQLAlchemy & Pydantic
번역 서비스의 백엔드에서는 문장을 번역하는 일 이외에 번역 결과를 저장하는 DB 작업도 수행합니다. 사용자가 입력한 문장과 번역 결과 등을 DB에 저장해 두었다가 추후에 모델 추가 학습 또는 품질 개선에 이용할 수 있거든요. 이번 토이 프로젝트에서는 CRUD 작업 중 Create, Read 만 구현하려 합니다. (참고) 간략한 SQLAlchemy 정리 RDBMS 저는 간단한 토이프로젝트이기 때문에 RDBMS 로 MySQL 을 이용하겠습니다. MongoDB 는 문서를 다루기에 좋지만 저의 프로젝트에서는 문서를 이용하지 않으므로 장점이 될 수 없고, Postgre 도 널리 사용되고 FastAPI 공식문서에서 이용하고 있지만 제가 써 본 적이 없어서 따로 익혀서 써야 합니다. 결과적으로 이번 토이프로젝트는 아주 작은 프로젝트이므로 새 RDBMS 를 사용하는 것이 리소스 대비 효율이 좋지 않다고 판단했고,

[FastAPI] 4. Route - Query Parameters
어제에 이어 라우트에 대해 마저 다뤄 보겠습니다. 프론트로부터 parameter 를 이용해 정보를 전달받을 수 있는데요, 공식 튜토리얼에서는 Path parameter 와 Query parameter 크게 가지로 나눠서 소개합니다. Path parameter 먼저 빠르게 설명하자면 파이썬 포맷 문자열이 사용하는 동일한 문법으로 "매개변수" 또는 "변수"를 경로에 선언할 수 있습니다. 쉽게 말해 http://127.0.0.1:8000/items/3 과 같이 path parameter 를 백엔드로 전달하는 방법이지요. Result: ` 우리의 목적은 Google Translate 클론 코딩이므로 구글번역은 어떻게 서버로 번역 요청이 전달되는지 확인해 보니 다음과 같네요. https://translate.google.com/?sl=ko&tl=en&text=&op=translate 저도 똑같이 Query parameter 로 한번 구현해 보겠습니다. Que

[FastAPI] 3. Main & Route
저의 오랜 로망은 번역기를 만드는 것입니다 💁🏻♀️ 그래서 번역 모델에 대한 연구를 주로 해 왔는데 백엔드에 대해 조금 배우고 나니 개발 관점에서 번역 서비스를 만들어 보고 싶어졌어요. 우선 파이썬으로 백엔드를 개발하려니 Django, Flask, FastAPI 중에 고르면 되겠고... 가장 최근에 공개된 FastAPI 만 아주 간단히 해 보았는데 이번 기회에 제대로 복습하려고 합니다. 마침 8월에 간단한 백엔드 강의를 할 일이 생겼고, 갑작스레 백엔드 스터디를 하게 되었네요. 😉 요약하면... 이번 공부의 목표는 '구글 번역 클론코딩' 토이 프로젝트입니다! FastAPI 에 대한 아주 간단한 요약은 예전에 제가 아주 작은 프로젝트를 할 때 작성한 포스팅을 참고해 주세요. [FastAPI] 1. Summary (이번 토이 프로젝트는 file tree 가 다릅니다!) Why FastAPI? Fas

Juniverse Dev Diary 001
Juniverse 개발 다이어리 001 > 개발 시작 전에 미니멀한 소감을 스근스근! 01. 미루고 미뤄왔던 프로젝트를 드디어!   이런저런 사유로 미뤄왔던 개인 프로젝트를 드디어 시작하려고 합니다. 미뤄진 사유에 대해서는 나중에 따로 끄적끄적 정리하기로 하고... 일단은 나아가야 할 두근두근한 미래를 기록합시다! > 이번에 만들려는 프로젝트는 항상 바래왔던 프로젝트인 만큼, 애정과 심혈을 기울이려고 합니다 :) 02. 그래서 뭘 만드는가!   이번에 만들건 바로... 두구두구... > 웹툰 사이트!   웹툰과 저는 분리하고 싶어도 분리할 수 없는 Dependency 그자체인 관계이므로, 당연하게도 저는

[Proj. SARAMARA] 📝 개발일지 3
Pull Request Link: [Feat/게시글상세조회] 하나의 게시글 가져오기 #39 이번 주차에서는 작성된 게시글에서 게시글을 눌렀을 때 해당하는 게시글의 정보를 뱉어주기 위한 API를 개발하기로 했다. 게시글 작성때와 마찬가지로 가장 먼저 설계한 ERD와 API 명세서를 통해서 Entity 확인과 API path를 확인했다. 설계한 Entity를 확인을 한 이후, 하나의 게시글 조회에 필요한 Dto를 작성했다. 작성과는 다르게 RequestDto가 아닌 DataBase에 작성된 데이터를 불러오는 작업을 위해 ResponseDto으로 클래스를 만들었다. BoardResponseDto 클래스를 생성하여 Inner Class인 ReadOneBoardResponseDto를 작성하여 게시글 조회 결과를 담는 DTO를 구현하였다. 그리고

[내일 출근인데 어떡하지] MLOps : Triton 으로 모델 배포하기 🪐
앞서 TorchServe 를 소개했는데요, 이번에는 Nvidia 에서 발표한 Inference server 인 'Triton' 을 소개합니다. Triton Triton 의 풀네임(?) 은 Triton inference server 인데요, 저는 TorchServe 에서는 쓰이지 않던 ‘Inference server’ 라는 명칭에 주목했습니다. 과연 'Inference server' 는 일반 모델 서빙 프레임워크와 어떤 차이가 있을까요? Triton 공식 홈페이지에서 내세우는 장점은 다음과 같습니다. TF, pytorch, onnx, TensorRT 프레임워크 지원 *앞서 소개한 TorchServe 는 pytorch 로 개발한 모델 내지 torchscript 로 변환한 모델만 배포 가능한데 Triton 은 다양한 프레임워크로 개발한 모델을 지원할 수 있는 장점이 있네요. 하드웨어 활용 극대화 *같은 WS에서 torchserve 는 CUDA

[내일 출근인데 어떡하지] MLOps : TorchServe 로 모델 배포하기 🔥
저는 기계번역 연구 및 개발을 하다가 백엔드를 잠시 배웠어요. 백엔드를 배운 이유는 몇 가지 궁금증과 문제점을 해결하고 싶어서였어요. 우리의 번역 서비스가 고객에게 어떻게 제공되는지 알고 싶었고 번역 성능을 향상시키기 위해서는 이따금씩 백엔드 서버 코드를 고쳐야 했고 개발팀과 함께 일하기 위해서는 개발 지식이 필요했기 때문이었어요. 그런데.... 한 가지가 빠졌던 것 같아요. 바로, '내가 만든 모델이 어떻게 서빙되는가' 라는 점이지요. 이번 기회에 마지막 하나의 퍼즐 조각을 채워 보려 합니다. 🧩 MLOps? MLOps란 머신 러닝(Machine Learning)과 운영(Operations)을 합친 용어로 프로덕션 환경에서 머신 러닝(ML) 모델이 지속적이고 안정적으로 배포되도록 유지, 관리, 모니터링 해주는 것입니다. MLOps란 단순히 ML 모델뿐만 아니라, 데이터를 수집하고 분석하는 단계(Data Collection, Ingest

[Proj. SARAMARA] 📝 개발일지 2
👨🏻💻 현재 팀원들의 코드리뷰가 진행중인 사항으로 포스트에 작성된 일부 코드가 후에 수정될 수 있습니다. 자세한 코드는 깃헙을 통해 확인이 가능합니다. Link: [Feat/게시글작성] 게시글 작성 #30 내가 맡은 게시글 서비스를 개발하기 위해 먼저 게시글 작성에 대한 API를 개발했다. API 개발 시작에 앞서 설계한 ERD와 API 명세서를 통해서 Entity 확인과 API path를 확인했다. 설계한 Entity를 확인을 한 이후, 게시글 작성에 필요한 Dto를 작성했다. 하지만, 이전에 불필요한 코드를 1차적으로 확인하고 삭제하거나 주석처리를 했음에도 불구하고 누락된 코드를 확인해고 이 부분들을 제거해주었다. 그리고나서, 전에는 Dto의 이해가 부족해서 Entity의 모든 값을 똑같이 넣어줘서 사용했으나, 현재
python class 정리 🐍
Why? > OOP (Object Oriented Programming) For Object Oriented Programming It helps to structure and modularize your code to improve maintainability and make your code more reusable How? Instance & Method Data : Instance Function : Method Create instance & call method Get parameter when creating instance Inheritance Get inheritance Private attribute & method Private attribute that is not accessible from outside the class and can only be used inside

[Proj. SARAMARA] 📝 개발일지 1
카카오 클라우드 스쿨에 참여하고 있을 당시에 별도로 팀을 형성해서 프로젝트를 진행하기로 기획했었다.하지만, 당시에 교육과 프로젝트를 병행하는데는 상당히 어려워서 프로젝트를 완성하지 못한채로 카카오 클라우드 스쿨에서 정규 프로젝트가 진행되었다. 현재는 카카오 클라우드 스쿨을 수료해서 다시 이 프로젝트를 시작하려 한다. > ##### 🔗 [SARAMARA]Github: 무언가를 구매할 때 사야할지 말아야할지 고민되는 것들을 공유하는 구매 고민과 관련된 커뮤니티 Saramara 프로젝트의 Backend 저장소 입니다. 많은 기간이 지났고, 다시 시작하기 위해서 Git Clone을 받아왔다. 그러나, 당혹스러운 빨간줄의 에러가 반겨주었다. 🚨 JDK Version Issue ![](https://velog.velcdn.com/images/it