본문 바로가기

Proj

(38)
TourAPI를 이용하여 축제 데이터 수집하기 1. 개요 이번에는 다음의 기능을 구현할 계획에 있다. 금일 진행하는 팝업스토어와 축제 리스트를 지도에 위치를 나타냄과 같이 보여주고, 해당 정보를 확인할 수 있는 기능이다. 필자는 축제 리스트 조회를 맡았고, 이를 구현하고자 한다.2. API 축제 정보는 공공데이터 API에서 가져오도록 하고, 다음의 두 데이터셋이 눈에 띄었다.2-1. 전국문화축제표준데이터https://www.data.go.kr/data/15013104/standard.do#/tab_layer_open 전국문화축제표준데이터국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datasewww.data.go.k..
Trouble Shooting - @Mock vs @Spy 1. 개요현재 소셜로그인은 관련 제공사의 확장에 대응하기 위해 다음과 같아 전략 패턴을 사용하고 있다. private final List oAuth2MemberStrategies; /** * OAuth2 과정을 프론트 단에서 처리 * @param response * @param oAuth2LoginDto * @param provider * @return */ public CheckActiveMemberDto oauth2Login(HttpServletResponse response, OAuth2LoginDto oAuth2LoginDto, OAuth2Provider provider) { OAuth2UserInfo userInfo = ge..
k6을 이용한 성능 테스트 1. 개요 이번에는 원활한 유지보수를 위해 성능 테스트를 해보고자 한다. 성능 테스트를 통해 가상의 사용자를 만들어 서비스를 이용시킨 후 그 성능을 측정할 수 있다. 만약 생각하는 성능에 못 미칠 경우 개선하는 방향을 생각해볼 수 있다. 이번에는 처음 사용하는 만큼 로컬에서 스크립트를 구성하고, 실행해볼 것이다. 2. K6 vs Jmeter 성능 테스트 툴은 여러 가지가 있지만, 두 가지 도구를 놓고 비교하였다.2-1. K6 Go 기반으로 Grafana Labs에서 개발된 성능 테스트 툴상대적으로 리소스를 덜 사용함javascript를 사용한 스크립트 작성 및 실행 가능2-2. JmeterJava 기반으로 개발된 오픈 소스 성능 테스트 툴리소스를 많이 사용함GUI가 잘 되어있어 러닝커브가 상대적으로 낮음..
모니터링 구축(feat. Prometheus, Grafana) 1. 개요 운영을 하게 되면 항상 로직이 잘 돌아갈 수는 없다. 문제가 발생하면, 이를 해결해야 하는데 그 전에 원인을 빨리 파악하는 것이 중요하다. 이번에는 모니터링 구축을 위해 프로메테우스와 그라파나를 사용해보고자 한다. 2. 프로메테우스와 그라파나 서버를 운영할 때, CPU 사용률, 메모리 사용률, 요청 등 성능 측정을 위한 수치를 메트릭이라 하는 데 이를 저장하는 DB이다.  간단히 보면 Prometheus targets에서 메트릭을 가져와서 Prometheus server에 저장한다. 이를 Data visualization에 있는 대시보드로 편하게 볼 수 있는 데, 이 역할을 Grafana가 한다. 3. 적용 우선 다음 두 dependencies를 추가한다. 본 멀티 모듈 프로젝트에서는 API ..
MySQL 백업하기 1. 개요 Tripot 운영을 시작했다. 실제로 운영을 시작한 만큼 유저들의 정보가 있을 것이고, 모종의 이유로 DB 데이터가 손실된다면 치명적이다. 이를 방지하기 위해 매일 운영 DB를 백업하고자 한다. 2. 백업 현재 서비스는 mysql 8.0을 사용하여 운영중에 있다. 이는 mysqldump를 사용하여 다음과 같이 백업이 가능하다.mysqldump -uroot -p{password} {db이름} > {백업경로} 현재 서비스에서 mysql은 도커 컨테이너 위에 올라가 있다. 컨테이너 외부로 덤핑 파일을 확인하기 위해 우선 다음과 같이 볼륨을 설정했다. mysql: container_name: mysql image: mysql:8.0 ... volumes: ..
Trouble Shooting - nginx 용량 늘리기(feat. 스토리 등록 오류) 1. 개요 Tripot 프로젝트를 운영하던 중 스토리가 정상적으로 등록되지 않는 오류가 발생했다. 이를 해결하는 과정을 기술하고자 한다.2. 증상세부적인 증상은 다음과 같다.사진을 등록하는 경우 오류 발생개발서버에는 없는 증상, 운영서버에서 스토리를 등록하는 경우에만 발생서버에서 INVALID_TOKEN 예외 발생이를 기반으로 우선 프론트 측에서 토큰이 정상적으로 오지 않을것이라는 생각을 1차적으로 하여 요청 및 응답을 받았다. 다음은 이의 일부이다.413 Request Entity Too Largenginx/1.27.3... "status": 413, ... 3. 원인 및 해결 현재 스토리 작성 로직은 다음과 같이 이루어진다.사용자가 스토리를 작성한다. 작성중이고, 확정되지 않았으므로 스토리의 사진은 ..
앱 버전 저장 및 관리하기 1. 개요 Tripot 프로젝트는 모바일 서비스이다. 어플을 운영하다 보면 버그가 생길 수 있다. 만약 치명적인 버그라면? 이를 수정했는데 업데이트 없이 그대로 사용하는 유저가 있다면? 업데이트를 한 사용자와 하지 않은 사용자는 UX적으로 큰 차이를 경험하게 될 것이다. 이를 방지하기 위해 버전을 서버에 저장하고, 사용자의 버전에 따라 업데이트를 권장하거나 강제하는 기능을 만들고자 한다.2. ERD ERD는 다음과 같다. 개인적으로 처음 구현해보는 기능이라 설계에서 애를 좀 먹었다. 필드를 하나씩 살펴보자.version_id: 해당 정보의 PK이다.version: 앱 버전을 기술한다. 1.0.1, 1.0.2와 같이 앱 버전이 들어갈 수 있다. 원활한 버전 비교 및 저장을 위해 문자열로 저장했다.(1.2...
소셜 로그인 - 애플 identity_token에서 사용자 정보 가져오기 1. 개요 Tripot 프로젝트는 우선 아이폰 용으로 개발되었다. 기능 구현을 다 마치고 앱스토어에 올리려는데, 소셜 로그인을 사용하는 아이폰 앱 서비스는 애플 로그인을 필수로 구현해야 하는 조건이 있었다. OAuth2 자체는 프론트에서 구현을 해줬는데, 서버에서는 유저 고유id와 닉네임을 받아 회원 정보를 생성한다. 하지만 애플에서는 다음과 같이 응답이 전달된다.{ "authorizationCode": "인증 코드", "email": "이메일@....appleid.com", "fullName": { "familyName": "성", "givenName": "이름", "middleName": null, "namePrefix": null, "nameSuffix": null,..