개발팁

    Nginx와 Docker Compose로 무중단 배포하기

    Nginx와 Docker Compose로 무중단 배포하기

    안녕하세요, codedbyjst입니다. 이번에는 무중단 배포에 대해 이야기해보려 합니다. 다들 무중단 배포를 들어보신 적은 있으리라 생각이 되지만, 이게 왜 필요한 걸까요? 이를 저희 팀이 겪은 상황을 통해 알려드리려 합니다. 뭐가 문제였나요? 저희 팀은 Github Action을 통해 CI/CD를 적용해놓은 상태입니다. 따라서 PR이 승낙되면, 자동으로 빌드, 테스트 및 배포가 진행되도록 구성되어 있습니다. 따라서 배포를 할 때에는 늘 Github Action을 보면서 마음의 평온을 얻고 있었습니다. 직접 손으로 옮길 필요도 없고, 볼 때마다 뿌듯해지는 게 이 맛에 CI/CD 파이프라인 구축하는구나 싶습니다. 그런데 분명 문제없이 배포는 매번 성공하는데, 프론트엔드측에서 가끔 문의가 들려옵니다. 바로 ..

    Certbot HTTPS용 SSL 인증서 발급 / Nginx로 적용하기

    Certbot HTTPS용 SSL 인증서 발급 / Nginx로 적용하기

    안녕하세요, codedbyjst입니다. 이번엔 HTTPS 배포를 위한 첫 단계로써, API 서버에 HTTPS를 적용하는 방법을 알려드리도록 하겠습니다. SSL 인증서는 어디에 있는가? 우선 시작하기에 앞서, SSL 인증서가 어디에 존재하면 되는지 생각해보겠습니다. 예를 들어, 저희가 ohmycarset.com 이라는 도메인을 구매했다고 생각해보겠습니다.(정확히는, '빌린' 것이지만, 그냥 구매했다고 하겠습니다.) 도메인을 구매할 수 있는 곳은 다양하기에, 꼭 AWS Route 53이 아니더라도 가비아, 클라우드플레어 등의 업체에서 구매하셨을 것입니다. 이 때, SSL 인증서는 어디에 있으면 될까요? 해당 구매한 업체의 설정창에서 등록하면 되는 걸까요? 일종의 A, CNAME 등의 레코드처럼 그냥 등록하면..

    스프링 부트 CORS 설정법 정리

    스프링 부트 CORS 설정법 정리

    안녕하세요, codedbyjst입니다. 이번에는 스프링 부트에서 어떻게 하면 CORS를 설정할 수 있는지, 그리고 문제가 발생한다면 그 이유가 무엇인지 말씀드리려 합니다. 본 글은 스프링 부트에서의 트러블 슈팅에 집중하고 있으므로, CORS 자체의 이해를 위해선 아래의 글을 참조해주세요. https://developer.mozilla.org/ko/docs/Web/HTTP/CORS 교차 출처 리소스 공유 (CORS) - HTTP | MDN 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라 developer.mozilla.org ..

    Spring Boot + Redis Cache 사용법 정리

    Spring Boot + Redis Cache 사용법 정리

    정합성이 크리티컬하지 않고, 로직 처리에 시간이 오래 소요되는 경우 캐싱을 이용해 처리시간 문제를 해결할 수 있습니다 (물론 SQL/DB레벨 최적화가 최우선입니다!) 그런데 다른 블로그 글들을 따라하니 Cannot construct instance of... 오류가 많이 발생해서, 동료 개발자들에게 도움이 되도록 해결한 내용을 정리했습니다. 기본 참조 자료 : https://kim-oriental.tistory.com/28 1단계 : 의존성 추가 build.gradle : implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2단계 : Redis 서버 Host, Port 정보 입력 application.properties : s..

    [Fastapi]파라미터 올바르게 다루기

    [Fastapi]파라미터 올바르게 다루기

    지난 글을 통해 fastapi에서도 pymysql을 이용해서 DB와 통신이 가능하다는걸 확인했습니다. 이어서 CRUD를 구현해야 하는데요, fastapi에서 파라미터를 다루는 것에 대해 정리된 곳이 많지 않아 한 번 정리가 필요할 것 같습니다. 기존에 다루던 방법 Fastapi는 구현 철학에 따라, 대충 만들어도 '그냥 작동되는' 구조를 띄고 있습니다. 하지만 더욱 안정적으로 구성하고, 추후 문서화 작업에서 이해하기 쉽도록 하기 위해선 더 좋은 방법이 있습니다. 1. path(type) from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") def read_item(item_id): return {"item_id": item_id..

    [Fastapi]sqlalchemy말고, pymysql로 데이터베이스(Mysql)와 통신하기

    [Fastapi]sqlalchemy말고, pymysql로 데이터베이스(Mysql)와 통신하기

    API 서버를 개발하다보면, 반드시 DB와 통신이 필요한 순간이 찾아오게 됩니다. 애초에 대부분의 API 서버는 DB와 연동하여 작업하기 위해 만들게 되니까요. 하지만 DB와 통신하기 위해 직접 규약서를 읽고 순수 TCP 통신으로 구현하는 것은 그닥 좋지 않은 생각입니다. 그럴거면 파이썬을 쓰기보단 전부 C로 다 짜는게 낫지 않겠어요? 이와 같은 생각은 저희만 하는 건 아니기에, DB와 통신하는 일은 보통 2가지 방법 중 한가지를 택하게 됩니다. DB와 통신하는 두 가지 방법 1. pymysql과 같은 DB 통신 보조 라이브러리 활용 https://github.com/PyMySQL/PyMySQL GitHub - PyMySQL/PyMySQL: Pure Python MySQL Client Pure Pytho..