본문 바로가기

Project16

40주간 진행한 사이트 프로젝트 후기 MANNALGA 코드 오픈 안녕하세요 에릭입니다. 오늘은 8개월간 진행한 사이드 프로젝트를 여러분께 소개하러 왔습니다! MANNALGA는 사람들과 모임을 밀접하게 연결해주는 서비스입니다. 이 프로젝트는 학습을 목표로 제작한 프로젝트입니다.그만큼 학습을 목표로 진행하는 사이드프로젝트를 어떻게 시작하고, 어떻게 진행하면 좋을지 참고할 수 있도록 저희가 진행한 모든 과정을 오픈하고자 합니다 개발 팀원 Eric Project leader & Backend developer Sight Backend developer Pompitzz Frontend developer 030ii Designer & Frontend developer 우리가 보여주고싶은 것들 MANNALGA 이용해보기! 백엔드팀의 영혼이 담긴 API .. 2021. 4. 18.
Java Version 변경 후 Gradle Build가 되지 않을 때 개요 Super Invention은 Kotlin 기반으로 제작되는 Rest API 서비스입니다. 개발을 진행하다가 Java/Kotlin/Gradle의 버전업을 진행하였고, 버전업 직후부터 빌드가 되지 않는 이슈가 생겼습니다. Java 및 Kotlin의 새로운 버전 설치는 IntelliJ에게 맡겨두고 버전 업된 버전을 설정파일에 명시해주기만 하면 되는 간단한 작업이었습니다. 소스코드는 아래와 같이 수정하였습니다. 새롭게 깔린 자바 버전으로 제 윈도우 데스크탑의 환경변수 JAVA_HOME 경로를 변경해주었고 gradle도 새로운 버전에 따라 새로 설치하였습니다. 새로운 자바가 잘 설정되었는지 확인하는 것에는 CMD창을 연 후 자바 버전을 확인하는것 만큼 확실한 방법이 또 없습니다. 바로 자바 버전을 확인하니.. 2021. 3. 15.
Super Invention 프로젝트 소개 프로젝트 기획과 팀원 모집 회사에 입사를 한 후 느낀 것은 사용하고 싶은 기술을 모두 사용하기는 어렵다는 점입니다. 기존 프로젝트의 기술 스택을 따라가야 하기도 하고, 추가적으로 적용하는 기술과 기존 기술의 호환성 문제도 따져보아야 하며 적용한 코드를 나만 관리하는 것이 아니기 때문입니다. 그렇기 때문에 신 기술을 익히고 적용하는 최고의 방법은 개인적인 사이드 프로젝트를 통해 개발하고, 적용하며 시행착오를 겪어보는 것이라 생각합니다. 이번 프로젝트는 '쓰고 싶은 기술을 다 써보자'라는 마음으로 시작한 프로젝트입니다. 평소에 사용해보고 싶었지만 사용하지 못했던 기술, 배우고 싶었던 기술, 실전에서 쓰기 전 연습이 필요한 기술들을 이 프로젝트를 통해 익히고자 하는 원대한 꿈(?)을 꾸며 시작하였습니다. 회사.. 2020. 9. 29.
[DelFood] Ngrinder로 진행한 성능 테스트 개요 Delfood의 0.1버전을 배포하였습니다. 제가 만든 프로젝트가 실제로 트래픽을 받았을 때 어느정도의 퍼포먼스를 보여주는지 측정해보기로 했습니다. 사용한 부하 발생기는 Ngrinder입니다. 정석 대로라면 직접 Tomcat에 설치하고 각종 환경을 세팅해야 하지만 보다 간편하게 만들어져 있는 Docker 이미지를 받아 사용하였습니다. Ngrinder의 부하 발생 구조 Ngrinder는 크게 Controller, Agent 두 가지로 구성되어 있습니다. 실제 트래픽은 Agent에서 발생시키고 그 Agent를 Controller에서 관리합니다. 그림으로 보면 다음과 같이 볼 수 있겠네요. 스크립트 작성 과정 Ngrinder에서 부하를 발생시키기 위해서는 Groovy Script 작성이 필요합니다. 회원.. 2020. 2. 13.
[Delfood] CI/CD 서버 구축과 첫 배포 CI/CD의 필요성 프로젝트가 거의 완성이 되어가며 배포와 테스트 자동화의 필요성을 느꼈습니다. 이전에 했던 프로젝트는 직접 jar파일을 빌드한 후, FTP를 사용하여 서버에 올린 후 java -jar로 직접 실행시켰던 기억이 납니다. 자잘한 변경사항이 생긴다면 또다시 빌드 - 전송 - 직접 실행.. 을 반복해야 했죠. 서버에 올라간 후 문제가 없는지 직접 url을 기반으로 테스트까지 해야 했습니다. 했던 테스트를 또 반복하는게 상당히 귀찮은 일이였습니다. 최근 CI/CD의 개념을 배우며 위와 같은 귀찮은 문제를 쉽게 해결할 수 있다는 것을 알게 되었습니다. Github에 commit을 push하면 자동으로 소스코드를 통합하여주고, 배포까지 할 수 있는 편리한 툴이였죠. 바로 Jenkins였습니다. 이러.. 2020. 2. 11.
[이슈 #10] 푸시 메세지를 비동기로 처리하여 성능 개선하기 개요 DelFood에 드디어 푸시 메세지 전송 기능이 추가되었습니다. Firebase Cloud Messaging(이하 FCM)을 기반으로 앱, 웹으로 사용자에게 푸시 메세지 전송 기능을 제작하였습니다. 여러 사용자에게 순차적으로 푸시 메세지를 전송할 수도 있고, 한 명의 사용자에게 푸시 메세지를 전송할 수도 있습니다. 원한다면 하나의 topic을 따르는 사용자들에게도 일괄적으로 전송할 수 있습니다. 당장 구현을 할 때는 몰랐지만 구현을 다 마치고 곰곰히 코드를 보며 생각해 보니 의문점이 떠올랐습니다. '푸시메세지를 보낼 사용자가 엄청 많아지면 어떻게 되는거지?' 라는 생각이 들었습니다. 변경 전 로직 한 사용자에게 푸시 메세지를 전송하는 로직은 다음과 같습니다. 1. 사용자가 가지고 있는 토큰들을 조회.. 2019. 12. 31.
[이슈 #9] Mybatis <collection> 태그 N+1 문제 없이 사용하기 개요 DelFood 주문 기능에 있는 '가격 계산' 로직에서 N+1 쿼리 문제가 발생하는 것을 확인하였습니다. 주문 전 가격을 계산하는 기능이었는데 for문을 돌며 select query를 날리고, 또 mybatis의 collection 태그를 잘못 사용하여 꽤 느린 로직이었습니다. 변경 전 요청과 결과 값 [ { "menuId": "1", "count": "1", "options": [ { "optionId": "1" }, { "optionId": "9" } ] }, { "menuId": "4", "count": "2", "options": [ { "optionId": "4" } ] } ] { "menus": [ { "id": 1, "name": "바사칸치킨", "price": 3000, "option.. 2019. 12. 18.
[이슈 #8] 1:N:M 관계 INSERT 시 N + M번의 쿼리 발생을 리팩토링하기 개요 DelFood의 주문 로직을 작성하던 도중 발생하는 1 : N : M의 쿼리 이슈를 해결해 보려고 합니다. 주문 진행 로직 고객이 메뉴를 선택합니다. 해당 메뉴에 대한 옵션을 선택합니다. 여러 메뉴를 선택한 고객이 주문을 진행합니다 이 과정에서 주문 - 주문 메뉴 - 주문 메뉴 옵션은 1 : N : M의 관계를 가집니다. 이 관계를 다중 for문을 돌며 쿼리를 호출하게 된다면 많은 DB요청이 발생하게 됩니다. 처음 만든 다중 for문을 단 3번의 insert문을 호출하는 것으로 변경해보겠습니다. 개선 방향 1. 데이터베이스 스키마상 문제가 있는 테이블을 수정할 것입니다. 관계가 있는 테이블 입력 시 (주문메뉴 - 주문메뉴 옵션) 해당 부모 데이터의 PK가 필요합니다. 하지만 변경 전 DB 테이블은 .. 2019. 12. 18.
[이슈 #7] 서버 부하를 줄이기 위한 캐싱 적용 부하 증가 고려 저번 이슈에서 주소 데이터 조회 속도를 인덱스를 적용하여 개선하였습니다. 하지만 주소 조회를 계속해서 진행할수록 DB성능이 점점 떨어지는 것이 느껴졌고 이를 개선하기 위하여 주소 캐시를 적용하기로 하였습니다. 인덱스 적용 포스팅 https://deveric.tistory.com/68 [이슈 #6] 주소 데이터의 빠른 조회를 위해 인덱스 설정하기 얼마 전 주소데이터를 DB에서 관리하도록 변경하였는데, 데이터가 100,000,00건정도 되어서 검색이 정말 느렸습니다. 인덱스를 걸지 않은 상태로 조회를 하면 검색에만 10초가 넘게 걸리는 무시무시한 상황이었습.. deveric.tistory.com 캐싱 전략별 특징 Local Cache와 Global Cache중 어떤 전략을 사용할지 생각해보았.. 2019. 11. 21.