개발 프로젝트/2024 제로베이스 프로젝트 (18) 썸네일형 리스트형 제로베이스 연습프로젝트 : 매장 테이블 예약 서비스4 - MQ, Websocket 기능확장 도입 필요성 : 비즈니스 시나리오 매장주인이 예약을 거절할 경우에 손님은 즉시, 이 내용에 대해서 알림을 받을 필요성이 있다. 이를 위해서 웹소켓 방식을 도입하여 서버에서 request가 없는 상황에서도 알림을 발송하게끔 하고자 한다.또한, 매장 주인이 예약을 거절할 경우에 DB에 status 변경작업도 일어나야 하기 때문에, 웹소켓 발송 서비스와 DB 저장 서비스를 비동기적으로 실행시켜서 결합도를 느슨하게 하고자한다. 설계검토 : 동기화할 task와 비동기 task 식별동기화할 작업 : DB저장과 MQ Task Produce는 동기화 되어야된다. 왜냐하면, 예약상태 변경과 DB저장은 핵심적인 비즈니스 로직이기 때문에 이 작업이 미완료 되었는데 MQ task Produce는 생성되면 거짓 알람이 되는.. 제로베이스 팀프로젝트 진행록4 - 리팩토링 & 멘토 피드백 Transactional 사용에 대한 멘토 피드백과 리팩터링 Transaction 사용에 대해서 대용량 환경에서는 deadlock이나 트래픽 수용성이 떨어지기 때문에 최대한 사용을 피하는 것이 좋다고 하셨다. Trasnaction을 사용할때 방지하고자하는 위험한 케이스가 1. 실제로 일어나는 일인가? 2. 막아야하는 일인가? 3. 다른 방법은 없는가 세가지 질문을 먼저 던져보라고 조언해주셨다. (1) Fail-fast를 통한 rollback 상황 최소화 실제로 내 코드에서 Trasnaction을 사용했던 케이스들을 보면 Trasnaction 없이 코드의 구조만 조금 변경하면 데이터 무결성을 보장할 수 있는 구조였다. 기존에는 Entity상태를 변경하고 저장한후에, API 통신이 실패하면 Paymen.. 제로베이스 팀프로젝트 진행록3 - 협업하여 개발하기 팀프로젝트로 배운 협업코딩여태까지는 혼자서 개발을 해왔기 때문에 문서를 특별히 작성할 필요도 없었고, 다른 사람의 코드를 볼 필요도 없었고, 보여줄 필요도 없었다. 그렇기에 내게 Git은 단지 저장수단이었으며 PR과 Branch는 왜 사용하는지 몰랐고 제대로 테스트코드도 작성하지 않았다. 이 모든 것이 Code Review와 Merge라는 팀 협업행위가 도입되는 순간 큰 혼란을 야기하였고 이 기회를 통해서 협업의 툴과 방법론에 대해 제대로 숙지하고자 아래와 같이 깨달은점을 정리한다. 협업을 위한 개발원칙1. 태도 : 남들을 보여주기위한 코드와 문서, 협업툴 사용하기2. Git 사용법 아주 상세하게 숙지하기3. Continuous Integration 시행하기3.1 PR은 의미있는 기능, 최소 단위로 자.. 제로베이스 팀프로젝트 진행록2 - 기능구현 1주차에 기획문서, erd, api명세서를 확정하고나서 백엔드 내부에서 GitRepo, codeconvention, package구조, pull reqeust md를 공통적으로 합의하고서 개발에 들어가기로 했다. API 명세서 : https://www.notion.so/API-12ab4d82e56880e5b249fc4f538a326a기획문서 : https://www.notion.so/125b4d82e568804797c6c13a1a933c9aERD : https://www.erdcloud.com/d/CaMg2mhPBTcPW7js9 나는 우선 커뮤니티 > 참여기능(redis lock) > 결재기능(redis lock) 순서대로 구현하기로 하였다. 커뮤니티 기능- 크게 어려움이 없었고 작성과 조회시.. 제로베이스 팀프로젝트 진행록1 - 개발기획과 팀프로젝트 팀프로젝트에 들어가며(24.10.21~) 첫주차 프로그램 기획단계에 들어와있는데, 처음부터 개인 프로젝트와 팀 프로젝트는 확연히 다르다는 것을 느낀다. (1) 매일 특정 시간에 만나서 회의를 하며, 매 안건마다 타인의 동의와 의견을 받고서 진행한다.- 개인프로젝트에서는 내가 원하는 시간과 속도로 기획/개발하고서 어떻게 기획할지 심도있게 고민하는 방식으로 진행하였다면 팀프로젝트에서는 현장에서 즉각 즉각 Idea Pitching 형태에 좀 더 가까운방식으로 좀더 깊이있는 고민을 하기에는 어려웠다. (2) 내가 할 수 없는 기술들을 배우고 개발에 적용할 수 있음, 반대로 내가 알고 있는 부분을 다른 사람들에게 적용시켜줄 수 있음.- MSA 설계에 대해서 관심이 있었으나 시도를 해보지 못했는데 MSA에 대해서.. 제로베이스 개인프로젝트 진행록6 - 성능개선 리팩터링/캐쉬 캐쉬도입도입검토기준1. 자주 사용될 것으로 예상되는 데이터2. 변동이 잦지 않을 것으로 예상되는 데이터위의 두가지 기준으로 캐쉬하고자 하는 데이터를 선택하고자 한다. 가장 빈번한 예상쿼리 : Map조회 기능 관련 쿼리 본 어플리케이션에서 가장 자주 사용될 것으로 예상되는 조회는 Map에 대한 조회라고 생각하였다. Map에 대한 조회는 한번 이루어지는 것이 아니라, 최초 Default Map에서 유저의 입맛에 맞게 축척을 변경하던지 Map의 Bounding Box를 변경하여 원하는 위치를 변경하여 여러번 조회하게 된다. Client가 요구하는 Bounding Box가 변경될때마다 DB에서 데이터를 꺼내는 것을 지양하고자 한다. 유저의 방문 유적지 정보를 캐슁로그인 하였을 때 방문한 유적지를 캐쉬에 로딩.. 제로베이스 개인프로젝트 진행록5 - 성능개선 리팩터링/멀티스레드 멀티스레드 도입 도입검토기준1. I/O 대기시간이 큰 것으로 예상되고 I/O대기를 병렬적으로 처리할 수 있는 작업은 멀티스레드로 처리한다.2. Ram 안에 이루어지는 작업의 경우에 특히, Critical Section의 경우 가급적이면 싱글스레드로 처리한다. 멀티스레드 도입검토위와 같은 관점에서, 멀티스레드 도입전 코드는 두가지 파트로 나눌 수 있다. 1번 : 각 For loop마다 HeritagePoint List를 접근하고 이를 활용하여 외부 API를 사용하여 결과를 받는 파트2번 : 1번파트에서 받은 값을 사칙연산을 통해서 원하는 값으로 조정하고 비교하여 최종적으로 최대값을 return하는 연산 2번의 경우 단순한 연산이며 비교를 통해 return값을 결정하는 변수들 Critical Secti.. 제로베이스 개인프로젝트 진행록4 - 기능구현 기능구현 (1) : 외부API데이터 내부DB저장1. XML 데이터를 Javabean으로 변환하여 쓰는 변환하기 : Jackson API를 사용해서 변환하는법 배우기2. x,y좌표를 Point라는 MYSQL에서 인식할 수 있는 데이터 객체로 변경: geometry factory 사용법 배우기3. Point라는 객체를 MYSQL에 전달하기 위해서 필요한 Dependency 추가 : Hibernate Spatial에 대해서 배우기4. whil문을 통해서 외부 API가 더이상 존재하는 레코드가 없을때까지 반복하여 외부 API의 레코드를 entity로 변환하여 repo에 saveAll() 시행 Trouble외부API의 데이터 구성이 불완전하여 여러가지 중복되는 레코드가 존재하여 saveAll() 할 시 Du.. 이전 1 2 3 다음 목록 더보기