본문 바로가기

개발일지

MySQL 성능 개선 프로젝트 3 자동으로 주문에서 배송기사를 할당해 배숭 주문 테이블에 데이터를 생성하는 배송 주문 할당 기능을 구현해야 한다.결제완료에서 상품준비중으로 상태가 변경되면 배송 주문 테이블에 데이터가 생성되어 배송기사가 배송을 시작하면 배송중으로 바뀌는 것이다.이때 배송기사와 고객간의 채팅 채널도 생성되어야 한다delimiter //DROP PROCEDURE if EXISTS insert_delivery_order;CREATE PROCEDURE insert_delivery_order(pm_order_id bigint)BEGIN DECLARE selected_storage_id BIGINT; DECLARE selected_delivery_type VARCHAR(255); DECLARE selected_worker_id BI.. 더보기
MySQL 성능 개선 프로젝트 2 배송에 관한 이벤트와 장비의 데이터가 들어가있는 두 테이블이 있다.여기서 각각 활성화 여부, 점검 필요 유무 컬럼은 다른 컬럼과 오늘의 날짜를 비교해 컬럼의 상태가 변해야 한다.이 과정을 자동으로 처리해주기 위해서 처음에는 Generated Columns를 활용해볼 생각이었다.delivery_event 테이블을 예로들자면 `is_active` TINYINT(1) AS (  CASE    WHEN `start_date` NOW() AND ( `end_date` IS NULL OR `end_date` >= NOW() )      THEN 1      ELSE 0  END) STORED와 같이 컬럼을 구성하였다.하지만 이와 같이 짠다면 에러가 발생한다. 그 이유는 Generated Column에 NOW()와.. 더보기
MySQL 성능 개선 프로젝트 1 주문 배송 시스템에 대해 데이터베이스 설계부터 성능 개선까지를 목표로하는 프로젝트를 시작했다. 요구사항에 맞춰 기능명세서를 작성하고 필요한 테이블들을 구성했다. 도메인은 고객, 상품, 주문, 배송으로 나눠져 있으며 기능이 많아 DB의 크기가 생각보다 크게 설계되었다.   내가 맡은 배송부분의 기능 중에 배송 우선순위를 정하는 프로세스가 가장 난감했는데, 이 프로젝트는 DB만으로 진행되는 프로젝트라서 우선순위를 정하기 위한 위치정보와 거리계산이 어려울 것 같았다. 고민끝에 두가지 방법을 생각해봤는데,첫번째는 고객의 주소가 입력될 때 위도와 경도를 같이 입력하여 이를 활용한 거리계산을 하는것이다. 이 방법을 쓰면 정확한 거리계산을 통해 우선순위를 정할 수 있겠지만 상당히 복잡한 데이터들이 들어가야 하고 입력.. 더보기
20240125 SSE를 통해 알림 기능 구현 @RestController @RequiredArgsConstructor @RequestMapping("/api/notification") public class NotificationController { private final NotificationService notificationService; public static Map sseEmitters = new ConcurrentHashMap(); @GetMapping( "/subscribe") public SseEmitter notification(@AuthMember Member member) { SseEmitter sseEmitter = notificationService.subscribe(member.getId.. 더보기
20240118 세션 기반의 인증방식은 클라이언트의 인증정보를 서버측에서 저장하고 관리한다. 이때 세션을 식별하기위한 Session ID를 기준으로 정보를 저장하고 해당 Session Id는 쿠키로 저장된다. 장점으로는 상대적으로 안전하고 서버에서 로그인 상태확인이 굉장이 유용하다는 점이 있지만 단점으로는 유저들의 세션에 대한 정보를 서버 메모리에 들고 있기 때문에 이를 조회하는 과정이 이용자가 많아질 경우 부담이 갈 수 있다는 점이있다. 토큰기반의 인증방식은 유저가 로그인 후 서버에서 정보를 기록하는 대신에 토큰을 발급한다. 클라이언트는 발급받은 토큰을 저장해 요청마다 Header에 토큰을 담아 보내고 서버에서는 해당 토큰을 확인한다. 장점으로는 서버 메모리에 부담이 되지않는다는 점이 있지만 반대로 데이터자체의 길이가.. 더보기
20240116 GET 데이터를 조회할 때 사용되는 방식으로 URL을 통해 파라미터를 전달한다. 따라서 주소창에 파라미터가 노출되기 때문에 보안상 중요한 정보를 다루면 안 된다. 여러 번 같은 요청을 보내도 결과가 달라지지 않는다. POST 데이터를 생성할 때 사용되는 방식으로 Http Body에 데이터를 포함해서 전달한다. 브라우저에 파라미터가 노출되지 않는다. 여러 번 요청을 보낸다면 데이터가 계속 생성되므로 결과가 달라진다. OSI 7계층이란 네트워크 통신이 일어나는 과정을 7단계로 나는 것을 말한다. 1. 물리 계층 전기적 신호가 나가는 물리적인 장비를 뜻한다. 데이터를 전기적인 신호로 변환해서 주고받는 기능만 한다. 2. 데이터 링크 계층 정보의 오류와 흐름을 관리해 안전한 정보의 전달을 수행할 수 있도록 도와.. 더보기
20240115 RDBMS 데이터가 테이블 형태로 저장됨. 스키마가 명확하게 정의되어있으며 데이터 무결성을 보장한다. 데이터들이 중복없이 저장된다. SQL언어를 사용 유연성이 떨어지며 여러 관계로 인해 조인이 많이 일어나 쿼리가 복잡해 질 수 있음 수직적 확장만 가능 NoSQL RDBMS와 반대로 데이터가 테이블 형태로 저장되지 않음. 스키마가 없기 때문에 유연성이 높다. 데이터 처리속도가 빠르다. 확장에 있어 자유롭다. 데이터 중복처리를 계속 해주어야 한다. 데이터의 중복으로 인해 수정 시 모든 컬렉션에서 수정이 이루어져야 한다. 더보기
20240113 DI란 의존성 주입이라는 뜻으로 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입시켜 주는 방식이며 이를 통해 객체간 결합도를 줄이고 코드의 확장성과 유지보수성을 향상할 수 있습니다. IoC란 제어의 역전을 뜻하며 DI도 IoC를 구현하기 위한 방법중 하나입니다. 메서드나 객체의 호출 작업을 개발자가 결정하는것이 아니라 외부에서 결정되는 것을 의미합니다. IoC가 적용된 대표적인 기술로 프레임워크를 들 수 있습니다. 프레임 워크는 개발자가 작성한 코드를 제어하고 대신 실행해 줍니다. 이를 통해 객체 간 결합도를 줄이고 유연한 코드 작성이 가능하며 , 가독성 향상, 코드 중복 방지, 유지 보수에 있어 용이함 등을 기대할 수 있습니다. 객체지향 프로그래밍이란? 프로그램을 객체들의 모임으로 보는 프로그.. 더보기