프로젝트

📌 고민사항 재고 증가/감소 로직에서 동시성 문제가 발생하였고, 해당문제를 해결하기 위해서 뮤텍스, 세마포어, 원자적연산등의 방법들을 고려하였다. 자바에서 뮤텍스 방식을 활용하기 위해 synchronized를 지원하는데, 동시성 문제가 발생할 수 있는 임계영역에 락을 걸어서 다른 스레드가 접근하지 못하도록 막는 방식이다. 락 방식을 사용할 때 가장 생각해봐야 할 점은 하나의 스레드에서 락을 걸어버리는 순간 다른 스레드는 해당 자원에 접근하지 못하기 때문에 대기를 하게되고, 병목현상이 발생될 수 있다는 점이다. 그래서 synchronized를 적용시킬 때에는 적용시킬 영역을 최소화 하는것이 중요하다. 📌 기존의 재고 감소 로직 아래는 동시성 문제가 발생할 수 있는 재고 수량 감소 메서드이다. @Transa..
📌 목표 3주 차는 실제로 계획한 테이블을 생성하고, 데이터를 옮기는 작업을 수행하는 것이었다. 테이블의 데이터를 새로운 테이블로 옮기기 위하여 옮길 새로운 데이터베이스를 연결하고, 데이터를 옮긴 후 테스트까지 작성해 보는 것이 목표였다. 4주 차 과제의 목표는 하나의 채팅서버에 API와 소켓서버가 통합되어 있어서 API 배포 시 소켓 서버의 세션이 끊기는 문제가 있는데, 이를 해결해 나가는 과제였다. 📌 데이터베이스 dual update 먼저 서버에 새로운 Database를 연결하여 하나의 서버에 2개의 데이터 베이스를 연결하는 것이 목표였다. NestJS에 PostgreSQL을 연결하는 방법은 2가지를 고려하였다. 1. ts-postgres 2. typeORM Spring 환경에서 JDBC를 사용할지..
📌 직무부트캠프 채팅 마이그레이션 백엔드 직무 체험 2주차 회고 2주차 부터는 본격적으로 프로젝트를 분석하고, 마이그레이션 계획을 세우는 것 이었다.(두근두근) 📌 어떤 테이블을 마이그레이션 해야할까? # 마이그레이션 테이블 선정 마이그레이션 테이블 선정함에 있어서 말도 안되는 실수를 저질렀다. "그냥 데이터 많이 쌓이는 테이블을 옮기면 되는거 아니야?" 부끄러운 수준의 생각이다.. 그냥 같은 건 없다. "데이터가 많이 쌓이는 테이블을 옮겨야한다" 라는건 맞는 말이겠지만 조금 더 구체적인 기준과 이유가 정리되어야 한다. 최종적으로 나는 chat, chat_like, user 테이블을 선정하였고, chat과의 연관관계(join을 통한 결합 등)를 근거로 제시하였다. chat데이터 응답이 user, chat..
📌 직무부트캠프 채팅 마이그레이션 백엔드 직무 체험 1주차 회고 채팅프로젝트 마이그레이션이라는 주제로 직무 체험에 참여했다. 주차별로 과제를 수행하고 제출 후 피드백을 받으며 진행된다. 과제를 수행하며 고민했던 내용들, 그리고 배웠던 점을 남겨놓으려고 한다. 📌 새로운 환경과 기술에 빠르게 적응하는 연습 # NestJs와 PostgreSQL 개발환경 세팅 프로젝트를 분석하고 앞으로의 마이그레이션 계획을 세우기 위해서는, 프로젝트를 내 로컬 환경에 세팅하고 프로젝트에 적응된 기술을 빠르게 습득해야 했다. 앞으로 개발자를 하면서 수많은 기술을 새로 접하게 될 것이고, 취업 후 직무에 투입된다면 빠르게 적응해 나가야 할 것이니, 이번 직무를 실전이라고 생각하고 수행하였다. 현재 나는 Java/Spring 환경..
📌 1. 문제상황 주문API에 대해 검토하던 중, 주문 상태 변경에 대해 데이터 경쟁 문제가 발생할 수 있다고 판단하였다. 마치 멀티쓰레드 환경에서 동시성 문제가 발생하는 것 처럼, 주문수락과 주문취소가 동시에 발생했을 때 운이 좋지 않으면 사용자에게는 주문 취소 요청이 되었다고 응답될 것이고, 음식점은 주문 취소된지 모르고 수락하여 처리해버리는 사태가 발생할 수 있다. 📌 2. 분석 실제로 이러한 데이터 경쟁문제가 발생하는지 확인하는 과정이 필요했다. 그래서 아래와 같이 주문수락 요청 후 10초정도 대기하면서, 주문 취소요청을 수행하도록 하였다. 1. 판매점 계정으로 주문 수락 하기 -> 2. 주문 수락 요청 후 10초안에 주문 요청자 계정으로 주문 취소하기 @Transactional public Or..
Security의 crypto라이브러리 사용하기 비밀번호 암호화를 위한 라이브러리 추가 회원 도메인의 회원가입 기능을 구현할 때, 비밀번호를 그냥 저장하기보다는 암호화를 해서 저장하면 보안성이 더 뛰어날 것이다. 암호화를 위해서 제공되는 여러 라이브러리들이 있는 것 같다. 대표적으로 crpto라이브러리가 있는데, spring-security모듈에도 포함되어있기 때문에, spring-security 의존성을 추가하였다. 우선 spring-security라는 모듈을 추가할 때, spring-boot의 자동설정 기능이 적용이 된다. 나는 여기서 암호화 기능만을 우선 적용하고 싶고, 별도의 security기능을 적용시키지 않을 예정이므로, 자동으로 설정되어있는 기능들중 필요없는 기능은 초기화해주던가 새로 설정을..
Food id값을 통해서 DB의 Food를 가져오는 서비스 로직이다. 이때 id에 해당하는 Food가 존재하지 않으면 예외를 발생시키도록 하였다. public FoodResponse get(Long foodId) { final Food food = foodJpaRepository.findById(foodId).orElseThrow(() -> new IllegalArgumentException(foodId + "id의 Food가 존재하지 않습니다."); } 이 상태로 어플리케이션을 실행시키고 존재하지 않는 id의 Food를 조회하도록 요청하면 아래와 같이 에러가 발생한다. 별도로 try-catch처럼 예외가 발생했을 때 어떻게 처리해 줄지 구현하지 않았기 때문이다. 응답데이터로는 아래처럼 받을 수 있는데,..
페이지 GET요청을 확인 중 지도페이지에 두번 이상 접속 하면 페이지 로딩시간이 굉장히 길어지고, websocket의 지도좌표값이 갱신되지 않는 현상 발견. 처음에는 단순히 컴퓨터의 렉때문에 느린것이라고 판단하고 내버려 두었지만, 생각보다 과하게 페이지 로딩이 되지 않아 의문을 가지고 지도 요청 시 websocket동작에 대해 한번 더 살펴보기로 함. 한이음 콜드론 프로젝트를 진행중 websocket을 통하여 http://127.0.0.1:8000/app1/page3 접속 시 실시간 지도 좌표정보를 보내 주었다. 브라우저로 실시간 좌표값을 보내주는 django의 파이썬 코드는 다음과 같다. # 장고 서버 실행시 WSConsumer class가 생성된다. class WSConsumer(AsyncWebsoc..
사용자가 목적지 정보 post 요청을 보내면, 그 목적지 데이터를 좌표값으로 변환 후 drone(jetson nano)로 전송해준다. 이때 views.py 함수에서 공유변수를 통해 manage.py에서 사용할 수 있도록한다. manage.py의 드론과 연결된 socket객체를 통해 목적지 데이터를 드론에게 전송한다. 사용자 post요청시 목적지 정보를 공유 변수 send_data_to_drone에 넣는다. ※ 이떄 send_data_to_drone 은 deque()자료구조이다. manage.py에서 views.py의 공유변수를 사용하기 위하여 import 해준다. 이전 포스팅에서 드론으로부터 실시간으로 수신대기하는 스레드 listen_data_from_jetson이다. 이 함수에 조건문을 이용하여 pos..
드론으로부터 실시간 위치정보를 받기 위해 Django server에 socket server를 열어 드론 클라이언트가 접속할 수 있도록 하였다. 드론으로부터 받은 실시간 GPS데이터는 곧바로 Websocket 실시간방식을 통하여 브라우저의 지도정보에 표시된다. Django 서버 시장시 socket서버를 실행시키고 프로젝트용 드론(클라이언트)가 들어 올때 까지 수신하도록 코드를 수정하였다. 프로젝트용 드론(클라이언트)가 접속했다면 드론으로부터 data를 수신할 수 있는 스레드를 한개 생성한다. listen_data_from_jetson함수는 항상 드론(jetson_nano)로부터 데이터를 받을 수 있도록 대기하는 역할 을 한다. 데이터가 들어온다면 Websocket 공유변수인 data_from_drone에..
Don't stop 훈
'프로젝트' 카테고리의 글 목록 (2 Page)