-
Notifications
You must be signed in to change notification settings - Fork 3
07 22
seoki edited this page Jul 22, 2026
·
3 revisions
📄 원본(노션): https://app.notion.com/p/3a519935b8ae809a9d34d46a2ca4c813 — 최종 동기화 2026-07-22
- 현성 - 굿
- 수업듣기
- 배송 알고리즘이나 소켓 통신 공부
- 석희 - 나쁨
- 공통응답 구현체 공부 할 예정
- 웹 와이어프레임 작성 완료 후 공유
- 동혁 - 괜찮음
- 스프링과 웹소켓 전반적으로 공부
- JPA, JDBC 관련 논의
- 개인적 공부
- 현서 - 일찍일어나서 졸림
- ERD 물리 설계 다같이
- 웹소켓 공부
- 주소관련 처리 논의 Client에서 처리하고 정보만 넣는다.
- 카카오 길찾기 api 사용 연습 장소 ID, 위도 경도 둘 다 찾을 수 있음.
고려할 점: 소켓을 사용하는 경우 서버가 너무 오래 살아있으면 TIME_WAIT가 많이 걸려서 문제가 생길 수도.
-
ERD 물리 설계 다같이
- 세션? 토큰?
현성, 동혁: 분산이 아니니까 세션이 좋을 것 같음.
세션을 이용 할 예정.
서버가 한 대이면 tomcat 내장 기능을 사용하면 된다.
- Q: 서버를 중간에 재시작해야 하는 경우에는? → IP 저장? - 세션 객체 내부에 저장 가능함.
- 스프링에서 제공하는 HTTPSession 사용
- 추후 보완점
- 인메모리에 있다면 서버가 꺼져버린다면?
- 분산 서버가 필요하다면?
- 현성 - {Key:Value} 맵을,
{UserId : SessionId}(빠른 검색 용도)맵을 만들자- 세션ID(세션)을 통해 유저를 찾을 떄는 HTTPSession에서 제공해주는 관리Map을 이용하고
- 동일한 유저가 다른 세션으로 접근하는 문제를 방지하기 위해 {UserId : SessionId} 맵 체크
- 세션? 토큰?
현성, 동혁: 분산이 아니니까 세션이 좋을 것 같음.
세션을 이용 할 예정.
서버가 한 대이면 tomcat 내장 기능을 사용하면 된다.
동혁 : 아이디가 있는데 PK용 컬럼이 따로 필요할까?
- 필요한 이유
- 브라우저에서 읽어볼 수 있음
- 아이디 변경 등이 어려움
- (GPT) 개인정보 파기 및 가명화가 어렵다(?)
- 필요 없는 이유
- 클라이언트에 유출될 일이 있을까?
UUID 버전
-
v7? ⇒ 타임스탬프로 정렬이 가능함
- 하지만 현재 Spring, Java 버전에서 지원안할 수도 있으니 확인 필요
-
이메일은 VARCHAR(255) ⇒ 실제 이메일이 255자까지 허용
- JPA, JDBC 관련 논의
- 주소 처리 관련 논의
-
Client?
-
실시간
- 시간이 얼마나 지났는가 (가장 간단한 prototype)
- 이후 거리까지 고려 동혁: 사용자 좌표를 가지고 매번 길찾기 api를 요청하면 비효율적일 것 같음. 현성: 퀵, 도보 배송 API가 카카오에 있음
LoadingerDiagram USER { bigint user_id PK varchar role varchar name varchar phone varchar verification_status datetime created_at } DELIVERY_ORDER { bigint order_id PK bigint requester_id FK bigint pickup_address_id FK bigint destination_address_id FK varchar status varchar item_name varchar item_description int item_value int delivery_fee datetime requested_at datetime matching_deadline_at datetime created_at datetime updated_at } ORDER_STATUS_HISTORY { bigint history_id PK bigint order_id FK varchar previous_status varchar new_status varchar reason bigint changed_by FK datetime changed_at } MATCHING { bigint matching_id PK bigint order_id FK bigint dreamer_id FK varchar status datetime accepted_at datetime cancelled_at datetime created_at } DELIVERY { bigint delivery_id PK bigint order_id FK bigint dreamer_id FK varchar status datetime picked_up_at datetime delivery_started_at datetime completed_at datetime confirmed_at datetime updated_at } DELIVERY_STATUS_HISTORY { bigint history_id PK bigint delivery_id FK varchar previous_status varchar new_status varchar reason bigint changed_by FK datetime changed_at } DELIVERY_PROOF { bigint proof_id PK bigint delivery_id FK varchar proof_type varchar image_url varchar signature_url bigint submitted_by FK datetime submitted_at } DELIVERY_INCIDENT { bigint incident_id PK bigint delivery_id FK bigint reporter_id FK varchar incident_type varchar description varchar status datetime reported_at datetime resolved_at } INCIDENT_EVIDENCE { bigint evidence_id PK bigint incident_id FK varchar evidence_type varchar file_url datetime created_at } CLAIM { bigint claim_id PK bigint incident_id FK varchar status int requested_amount int compensation_amount varchar decision_reason bigint reviewed_by FK datetime reviewed_at datetime created_at } PARTNER_HANDOFF { bigint handoff_id PK bigint delivery_id FK bigint partner_id FK varchar status datetime requested_at datetime accepted_at datetime transferred_at datetime failed_at } RETURN_DELIVERY { bigint return_id PK bigint delivery_id FK varchar status varchar reason datetime started_at datetime returned_at } PAYMENT { bigint payment_id PK bigint order_id FK int amount varchar status datetime paid_at datetime refunded_at } SETTLEMENT { bigint settlement_id PK bigint order_id FK bigint receiver_id FK int amount varchar status datetime scheduled_at datetime settled_at } CANCELLATION { bigint cancellation_id PK bigint order_id FK bigint cancelled_by FK varchar cancellation_type varchar reason boolean penalty_applied int penalty_amount datetime cancelled_at } ADDRESS { bigint address_id PK varchar address varchar detail_address decimal latitude decimal longitude } USER ||--o{ DELIVERY_ORDER : requests USER ||--o{ MATCHING : accepts USER ||--o{ ORDER_STATUS_HISTORY : changes USER ||--o{ DELIVERY_STATUS_HISTORY : changes ADDRESS ||--o{ DELIVERY_ORDER : used_for DELIVERY_ORDER ||--o{ ORDER_STATUS_HISTORY : records DELIVERY_ORDER ||--o{ MATCHING : attempts DELIVERY_ORDER ||--o| DELIVERY : creates DELIVERY_ORDER ||--|| PAYMENT : has DELIVERY_ORDER ||--o| SETTLEMENT : settles DELIVERY_ORDER ||--o| CANCELLATION : cancelled_by DELIVERY ||--o{ DELIVERY_STATUS_HISTORY : records DELIVERY ||--o{ DELIVERY_PROOF : proves DELIVERY ||--o{ DELIVERY_INCIDENT : reports DELIVERY ||--o{ PARTNER_HANDOFF : hands_off DELIVERY ||--o| RETURN_DELIVERY : returns DELIVERY_INCIDENT ||--o{ INCIDENT_EVIDENCE : contains DELIVERY_INCIDENT ||--o| CLAIM : reviewed_asLoadingerDiagram USER { bigint user_id PK varchar email UK varchar password_hash varchar name varchar phone UK varchar status boolean dreamer_enabled datetime created_at datetime updated_at } DREAMER_APPLICATION { bigint application_id PK bigint user_id FK varchar status varchar id_verification_key varchar bank_name varchar account_number_encrypted varchar account_holder varchar rejection_reason datetime applied_at datetime reviewed_at } USER ||--o| DREAMER_APPLICATION : applies
-
- 번호 포함해서 varchar(50)을 사용
- 이메일: varchar(255)를 사용
거리 시간 예측 시:
- 부르미 - 드리미 예상 소요 시간
- 픽업 후 출발지 - 도착지 예상 소요시간
을 따로 저장해야 함.
지도 API: 카카오 도보 길찾기


- 배달보다 연락하는 것의 중요도가 더 높다고 판단해 좌 우 배치. (드리미 - 배송)
배차 수락에 쿨타임 ui

- 배달원은 보고 가야하니까 채우고, 주문자는 굳이 채우지 말자. (드리미 - 배송)
- 드리미 뒤로가기 버튼 나중에 색상 적용

- 주소 선택창에서 대면, 비대면 픽업/전달을 확인할 수 있는 창 필요. (부르미 - 배송 선택)
처음 부터 브랜드 컬러 접근성 - universal design - 색상대비가 어느 정도 이상이어야 한다. → appeal point! 아이콘 추가 작업 필요.
- 사용자가 kakao api에 악의적인 요청을 준다면?
평점(리뷰) 컬럼에서 tinyint 사용시 오버플로우 문제?
- 시나리오
- 리뷰(평점) 점수는 0.0~5.0 사이 점수로 표현할 것으로 계획함
- 평점의 평균을 계산하기 위해서는 평점 값들을 더해야함
- 하지만 tinyint타입 값들을 더하다보면 tinyint 표현 범위를 넘어갈 수 있음
- 놔둬도 괜찮은 이유
- Java로 매핑할 때는 DB의 tinyint를 Java의 int로 매핑가능
- SQL에서 sum()을 하면 반환값은 tinyint가 아님
카드 결제 내부적으로 자동으로 불가능?
- kg 이니시스 등으로 처리하려고 하면 돈 빠져나가야 할 때마다 카드 정보 다시 입력해야 함 → 포인트를 선 결제하는걸로 바꿔서 처음에만 결제해두고 비용 계산은 이 포인트로 진행. 카드 결제 시스템도 가능하지만 추가 요금 결제할 때마다 정보를 새로 입력해야하는 불편함. 이를 이용해 포인트 사용하도록 하는 유도 효과
- 시연 편의를 위해서 가입하면 3만포인트 ⇒ 시연시 "포인트 충전은 어떻게 하나요?"질문이 들어오거나 "포인트 충전 기능도 해보시겠어요?" → 그때는 결제 시연
- 환불도 방어를 고려 했다. ⇒ 자동으로 환불이 되기 때문에 테스트 상황에서는 할 수 있는 것이 많이 없음. ⇒ 원래 환불은 고객센터를 거쳐서 회사가 인지를 한 상태에서 진행되기에 방어가 가능하지만, 테스트 상황에서는 자동환불임
- 폰인증 넣자
- 실제 앱으로 껍데기 감싸는거 넣어볼거 고려 (최후 마지막에)
-
범죄경력회보서 발급 방법 배민커넥트 쿠팡이츠 부릉프렌즈
- 드림이는 범죄경력회보서를 사진과 함께 제출 해야 배달을 시작할 수 있다. - 기관이 아니라 기관 코드를 발급할 수는 없음. → 사진 한 장 더 넣는 것으로 우선 결정.
- 로그인시 정지 기간도 고려해서 정지상태에서는 로그인 못하게
CREATE TABLE `DREAMI_REVIEW` (
`review_id` uuid NOT NULL,
`score` tinyint NOT NULL,
`content` varchar(200) NULL,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_dtm` timestamp NULL,
`deleted_dtm` timestamp NULL,
`order_id` uuid NOT NULL
);
CREATE TABLE `ADDRESS` (
`address_id` uuid NOT NULL,
`address_alias` varchar(50) NULL,
`longitude` decimal(11, 8) NOT NULL,
`latitude` decimal(11, 8) NOT NULL,
`address_line_2` varchar(255) NOT NULL,
`address_line_1` varchar(255) NOT NULL
);
CREATE TABLE `PARTNER_HANDOFF` (
`partner_handoff_id` uuid NOT NULL,
`order_id` uuid NOT NULL,
`partner_id` uuid NOT NULL,
`accident_id` uuid NULL,
`handoff_dtm` timestamp NOT NULL,
`is_picked_up` boolean NOT NULL,
`note` text NULL,
`handoff_reason` varchar(50) NULL,
`picked_up_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `ORDER_STATUS_HISTORY` (
`order_status_id` uuid NOT NULL,
`previous_cd` enum NULL,
`new_cd` enum NOT NULL,
`changed_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`order_id` uuid NOT NULL
);
CREATE TABLE `ACCIDENT_PROOF` (
`proof_id` uuid NOT NULL,
`accident_id` uuid NOT NULL,
`proof_type` varchar(200) NULL,
`file_url` varchar(500) NULL,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `BOORMI` (
`boormi_id` uuid NOT NULL,
`email` varchar(255) NOT NULL COMMENT 'unique',
`password` varchar(255) NOT NULL,
`name` varchar(50) NOT NULL,
`phone_number` varchar(50) NOT NULL COMMENT 'unique',
`user_cd` enum NULL,
`is_dreami_activated` boolean NULL DEFAULT false,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_dtm` timestamp NULL,
`deleted_dtm` timestamp NULL,
`boormi_avg_score` decimal(3,2) NOT NULL DEFAULT 0
);
CREATE TABLE `PICKUP_CERTIFICATION` (
`certification_id` uuid NOT NULL,
`certification_cd` enum NULL COMMENT '대면, 비대면',
`image_url` varchar(500) NULL,
`sign_url` varchar(500) NULL,
`submitted_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`order_id` uuid NOT NULL
);
CREATE TABLE `SETTLEMENT` (
`settlement_id` uuid NOT NULL,
`settlement_amount` bigint NULL,
`settlement_cd` enum NULL,
`settlement_end_dtm` timestamp NOT NULL,
`order_id` uuid NOT NULL
);
CREATE TABLE `CANCEL` (
`cancel_id` uuid NOT NULL,
`canceled_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`cancel_reason` varchar(50) NULL,
`note` text NULL,
`is_penalty_applied` boolean NOT NULL,
`canceler_cd` enum NOT NULL,
`order_id` uuid NOT NULL
);
CREATE TABLE `RETURNS` (
`return_id` uuid NOT NULL,
`delivery_id` uuid NOT NULL,
`return_reason` text NULL,
`return_start_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`return_end_dtm` timestamp NULL,
`return_cd` enum NULL
);
CREATE TABLE `PAYMENT` (
`payment_id` uuid NOT NULL,
`payment_amount` bigint NOT NULL,
`payment_cd` enum NOT NULL,
`payment_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`refund_dtm` timestamp NULL
);
CREATE TABLE `COMPENSATION_CLAIM` (
`claim_id` uuid NOT NULL,
`request_cd` enum NULL,
`claim_amount` bigint NOT NULL DEFAULT 0,
`accident_id` uuid NOT NULL,
`compensation_amount` bigint NOT NULL DEFAULT 0,
`decision_reason` text NULL,
`audit_dtm` timestamp NULL,
`created_dtm` timestamp NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `DREAMI_REQUEST_DENIED_DETAILS` (
`reject_id` uuid NOT NULL,
`dreami_id` uuid NOT NULL,
`rejected_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`reject_detail` varchar(200) NULL
);
CREATE TABLE `DELIVERY` (
`delivery_id` uuid NOT NULL,
`delivery_cd` enum NULL,
`picked_up_dtm` timestamp NULL,
`delivery_start_dtm` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`delivery_end_dtm` timestamp NULL,
`received_dtm` timestamp NULL,
`order_id` uuid NOT NULL
);
CREATE TABLE `DREAMI` (
`dreami_id` uuid NOT NULL,
`reject_detail` varchar(255) NULL,
`request_dtm` timestamp NULL,
`review_dtm` timestamp NULL,
`request_cd` enum NOT NULL,
`photo_url` varchar(500) NOT NULL,
`dreami_avg_score` decimal(3,2) NOT NULL DEFAULT 0
);
CREATE TABLE `ORDERS` (
`order_id` uuid NOT NULL,
`boormi_id` uuid NOT NULL,
`dreami_id` uuid NULL,
`item_name` varchar(50) NOT NULL,
`item_cd` enum NOT NULL,
`item_detail` varchar(255) NULL,
`delivery_amount` bigint NULL,
`order_cd` enum NULL,
`delivery_eta` int NOT NULL COMMENT '수정 불가능 (변동 사항은 변동 예상시간)',
`origin_latitude` decimal(11, 8) NULL,
`origin_longitude` decimal(11, 8) NULL,
`origin_alias` varchar(50) NULL,
`origin_address_line_1` varchar(255) NULL,
`origin_address_line_2` varchar(255) NULL,
`destination_latitude` decimal(11, 8) NULL,
`destination_longitude` decimal(11, 8) NULL,
`destination_alias` varchar(50) NULL,
`destination_address_line_1` varchar(255) NULL,
`destination_address_line_2` varchar(255) NULL,
`payment_id` uuid NOT NULL,
`delivery_request` varchar(255) NULL,
`image_url` varchar(500) NULL,
`delivery_request_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `DELIVERY_CERTIFICATION` (
`certification_id` uuid NOT NULL,
`delivery_id` uuid NOT NULL,
`is_contact` enum NULL,
`image_url` varchar(500) NULL,
`sign_url` varchar(500) NULL,
`submitted_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `PAYMENT_METHOD` (
`payment_method_id` uuid NOT NULL,
`billing_key` varchar(255) NOT NULL COMMENT 'unique',
`pg_name` varchar(255) NOT NULL,
`payment_method_cd` enum NULL,
`masking_no` varchar(20) NOT NULL,
`is_default_payment` boolean NOT NULL DEFAULT false,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_dtm` timestamp NULL,
`deleted_dtm` timestamp NULL,
`boormi_id` uuid NOT NULL
);
CREATE TABLE `DELIVERY_ACCIDENT` (
`accident_id` uuid NOT NULL,
`delivery_id` uuid NOT NULL,
`accident_type` varchar(50) NULL,
`accident_details` text NULL,
`processing_cd` enum NULL,
`report_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`resolution_dtm` timestamp NULL
);
CREATE TABLE `BOORMI_REVIEW` (
`review_id` uuid NOT NULL,
`score` tinyint NOT NULL,
`detail` varchar(200) NULL,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_dtm` timestamp NULL,
`deleted_dtm` timestamp NULL,
`order_id` uuid NOT NULL
);
CREATE TABLE `MATCHING` (
`matching_id` uuid NOT NULL,
`accepted_dtm` timestamp NULL,
`canceled_dtm` timestamp NULL,
`created_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`order_id` uuid NOT NULL
);
CREATE TABLE `PARTNER` (
`partner_id` uuid NOT NULL,
`phone_number` varchar(50) NULL,
`address` varchar(255) NULL,
`name` varchar(255) NULL
);
CREATE TABLE `SETTLEMENT_DETAILS` (
`settlement_id` uuid NOT NULL,
`dreami_id` uuid NOT NULL,
`settlement_account` varchar(50) NOT NULL,
`registered_dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`settlement_bank` varchar(50) NULL
);
CREATE TABLE `BOORMI_REJECT_HISTORY` (
`reject_id` uuid NOT NULL,
`reject_dtm` timestamp NOT NULL,
`reject_detail` varchar(255) NULL,
`boormi_id` uuid NOT NULL
);
ALTER TABLE `DREAMI_REVIEW` ADD CONSTRAINT `PK_DREAMI_REVIEW` PRIMARY KEY (
`review_id`
);
ALTER TABLE `ADDRESS` ADD CONSTRAINT `PK_ADDRESS` PRIMARY KEY (
`address_id`
);
ALTER TABLE `PARTNER_HANDOFF` ADD CONSTRAINT `PK_PARTNER_HANDOFF` PRIMARY KEY (
`partner_handoff_id`
);
ALTER TABLE `ORDER_STATUS_HISTORY` ADD CONSTRAINT `PK_ORDER_STATUS_HISTORY` PRIMARY KEY (
`order_status_id`
);
ALTER TABLE `ACCIDENT_PROOF` ADD CONSTRAINT `PK_ACCIDENT_PROOF` PRIMARY KEY (
`proof_id`,
`accident_id`
);
ALTER TABLE `BOORMI` ADD CONSTRAINT `PK_BOORMI` PRIMARY KEY (
`boormi_id`
);
ALTER TABLE `PICKUP_CERTIFICATION` ADD CONSTRAINT `PK_PICKUP_CERTIFICATION` PRIMARY KEY (
`certification_id`
);
ALTER TABLE `SETTLEMENT` ADD CONSTRAINT `PK_SETTLEMENT` PRIMARY KEY (
`settlement_id`
);
ALTER TABLE `CANCEL` ADD CONSTRAINT `PK_CANCEL` PRIMARY KEY (
`cancel_id`
);
ALTER TABLE `RETURNS` ADD CONSTRAINT `PK_RETURNS` PRIMARY KEY (
`return_id`
);
ALTER TABLE `PAYMENT` ADD CONSTRAINT `PK_PAYMENT` PRIMARY KEY (
`payment_id`
);
ALTER TABLE `COMPENSATION_CLAIM` ADD CONSTRAINT `PK_COMPENSATION_CLAIM` PRIMARY KEY (
`claim_id`
);
ALTER TABLE `DREAMI_REQUEST_DENIED_DETAILS` ADD CONSTRAINT `PK_DREAMI_REQUEST_DENIED_DETAILS` PRIMARY KEY (
`reject_id`
);
ALTER TABLE `DELIVERY` ADD CONSTRAINT `PK_DELIVERY` PRIMARY KEY (
`delivery_id`
);
ALTER TABLE `DREAMI` ADD CONSTRAINT `PK_DREAMI` PRIMARY KEY (
`dreami_id`
);
ALTER TABLE `ORDERS` ADD CONSTRAINT `PK_ORDERS` PRIMARY KEY (
`order_id`
);
ALTER TABLE `DELIVERY_CERTIFICATION` ADD CONSTRAINT `PK_DELIVERY_CERTIFICATION` PRIMARY KEY (
`certification_id`
);
ALTER TABLE `PAYMENT_METHOD` ADD CONSTRAINT `PK_PAYMENT_METHOD` PRIMARY KEY (
`payment_method_id`
);
ALTER TABLE `DELIVERY_ACCIDENT` ADD CONSTRAINT `PK_DELIVERY_ACCIDENT` PRIMARY KEY (
`accident_id`
);
ALTER TABLE `BOORMI_REVIEW` ADD CONSTRAINT `PK_BOORMI_REVIEW` PRIMARY KEY (
`review_id`
);
ALTER TABLE `MATCHING` ADD CONSTRAINT `PK_MATCHING` PRIMARY KEY (
`matching_id`
);
ALTER TABLE `PARTNER` ADD CONSTRAINT `PK_PARTNER` PRIMARY KEY (
`partner_id`
);
ALTER TABLE `SETTLEMENT_DETAILS` ADD CONSTRAINT `PK_SETTLEMENT_DETAILS` PRIMARY KEY (
`settlement_id`,
`dreami_id`
);
ALTER TABLE `BOORMI_REJECT_HISTORY` ADD CONSTRAINT `PK_BOORMI_REJECT_HISTORY` PRIMARY KEY (
`reject_id`
);
ALTER TABLE `ACCIDENT_PROOF` ADD CONSTRAINT `FK_DELIVERY_ACCIDENT_TO_ACCIDENT_PROOF_1` FOREIGN KEY (
`accident_id`
)
REFERENCES `DELIVERY_ACCIDENT` (
`accident_id`
);
ALTER TABLE `DREAMI` ADD CONSTRAINT `FK_BOORMI_TO_DREAMI_1` FOREIGN KEY (
`dreami_id`
)
REFERENCES `BOORMI` (
`boormi_id`
);
ALTER TABLE `SETTLEMENT_DETAILS` ADD CONSTRAINT `FK_DREAMI_TO_SETTLEMENT_DETAILS_1` FOREIGN KEY (
`dreami_id`
)
REFERENCES `DREAMI` (
`dreami_id`
);
Team 3 · 석희 · 현성 · 동혁 · 현서
Softeer Bootcamp 8th · WEB Team 3 · 이 위키는 팀 노션에서 동기화됩니다 📄
🏠 시작하기
🤝 협업
📋 기획안
🧠 기술 결정 기록 (ADR)
- 세션 vs 토큰
- 세션 및 다중 탭 처리 정책
- 실시간 배달 상태 전달에 SSE를 선택한 이유
- SSE 연결은 왜 1개였다가 5개가 되고, 다시 1개가 되었을까
- 드리미 GPS 끊김 감지 정책
- Redis 기반 로그인 대기열 도입기
- 카카오 API 응답 Redis 캐시 설계
- 활동 내역 조회를 커서 기반 페이지네이션으로 진행
- 알림 - WebPush 도입 이유와 SSE의 한계
- S3 Presigned URL 도입 결정
- 포인트, 머니 시스템 설계
🕸️매칭 시스템
- 매칭 시스템 설계
- Command와 Producer Consumer를 조합한 single writer 구조의 매칭 엔진
- 제안은 누구에게 해야 할까
- 쉼, 부름의 부르미‐드리미 매칭은 어떻게 동작할까
- 배정 정책에 Greedy 배정을 선택한 이유
- 매칭 시스템 구현
🧪 부하 테스트
- 매칭 부하테스트
- 매칭 부하테스트 보고서 (8.12)
- 매칭 부하테스트 보고서 (8.13)
- 매칭 부하테스트 보고서 (8.13 · 외부 API 트랜잭션)
- 매칭 부하테스트 보고서 (8.18 · 배포환경 720명)
🔧 트러블슈팅
- UploadSession - 옛 키 재사용 공격 방어 설계
- 8/6 · EC2 SSH 접속 불가
- 8/7 · 매칭 확정 후 Delivery가 생성되지 않는 고아 Order 문제
- 8/8 · 영속성 컨텍스트 detach로 dirty checking 미반영 문제 (@Modifying(clearAutomatically = true))
- 매칭 확정 후 Delivery가 생성되지 않는 고아 Order 문제
- 매칭이 성공하지 않았음에도 Orders 테이블에 PENDING으로 상태 변경하는 문제
- 부르미 확인 타임아웃 시 주문 DB·매칭 메모리 불일치
- 주변 콜 조회 시 반복되던 주문 조회 개선
- 드리미 오프라인 조회에 필요한 복합 인덱스 추가
- 매칭 단계 취소시 포인트 이중 환불 문제
- 로컬 DevStorage 사용시 로그인 상태에서도 401 UNAUTHORIZED 뜨던 문제
🗓️ 데일리 스크럼