배달의 민족 클론코딩 프로젝트 "먹물의 민족🦑"
1️⃣ 개요
프로젝트 주제💡
: 배달의 민족 서비스 클론코딩 및 디버깅
프로젝트 목표🚀
주요 목표
- 백엔드 시스템에서 발생하는 에러/버그의 탐지 및 해결
- 소프트웨어 배포와 유지보수 프로세스 이해
- 팀 협업을 통한 문제 해결 능력 강화
- 개발 프로세스의 전반적인 최적화 경험
하위 목표
- 로그 분석을 통해 시스템 에러 식별
- 단위 및 통합 테스트 케이스 작성
- 성능 저하 문제를 진단하고 최적화 방안 적용
- 보안 취약점 평가 및 보안 패치 적용
- 지속적 통합/배포(CI/CD) 파이프라인 설정
- API 문서화 관리
프로젝트 내용📝
- 실제 시장에서 사용되는 소프트웨어의 버전을 기반으로 한 클론 코딩 및 디버깅 진행
- 소프트웨어 배포 연습 및 배포 후 버그와 에러 탐지 및 해결
- 버그 발견 및 리포트 작성
수행 방법
- 에러/버그 탐지 및 보고
- 클론 코딩 소프트웨어 실행 및 로그 분석
- 발생한 에러/버그의 원인 분석 후 리포트 작성
- 테스트 최적화
- 단위/통합 테스트 케이스 작성
- 성능 진단 및 최적화 실행
- 보안 평가와 보안 패치 적용
- 협업 기반 문제 해결
- 작성된 에러/버그 리포트를 팀원과 교환
- 해결 방안 공유 및 해설지 작성
- 결과물 제작
- 운영 방식
- 스프린트 기간에 나오는 모든 산출물은 노션을 통해 제출
- 정기적인 회의를 통해 진행 상황 공유 및 문제를 해결
프로젝트 배경🖼️
- 협업을 통한 실시간 버그 해결 프로젝트는 실제 시장에서 사용되는 소프트웨어를 클론 코딩하여 디버깅과 최적화를 수행하는 것을 목표로 합니다.
- 백엔드 시스템에서 발생하는 버그와 성능 문제를 발견하고 해결하는 방법을 학습하며, 배포 및 유지보수 과정을 포함한 소프트웨어 개발 전 과정을 경험합니다.
- 팀 협업을 기반으로 문제를 해결하며, 에러 보고서와 해설지를 작성해 서로의 작업을 평가하고 개선합니다.
2️⃣ 일정
프로젝트의 시작일과 종료일📆
시작일: 2024년 12월 12일
휴뮤일: 2024년 12월 23일 ~ 2025년 1월 5일
종료일: 2025년 1월 10일
실제 프로젝트 기간: 12일
작업 계획🗓️
2024/12/12
2024/12/13 ~ 2024/12/16
2024/12/17
- 어플리케이션 마이그레이션 (Java, Spring boot, Gradle)
2024/12/18 ~ 2024/12/20
2025/01/06 ~ 2025/01/07
2025/01/08 ~ 2025/01/09
2025/01/09 ~ 2025/01/10
3️⃣ 프로젝트 팀 구성
팀 구성원들의 역할과 책임👑
공통 작업
- ERD 리팩토링
- Maven ➡️ Gradle 변경
노현이(팀장) : 진행 상황 관리, 일정 준수 확인
김지민(본인): Admin
김중환: Delivery
김효민: Restaurant
노현이: Restaurant
박지은: Order
순진호: Customer
이렇게 각자 도메인을 맡아 아래 역할을 진행한다.
- 버깅/디버깅
- 클린 코드 수정
- 테스트 코드 작성 이후 다같이 코드 리뷰 후 배포 및 테스트 진행
4️⃣ 기술 스택 및 사용 도구
- 기술 스택
- Server
- Database
- Infra
- Security
- 사용 도구
- IDE
- Database Management
- Test & QA(Quality Assurance)
- SCM(Software Configuration Management)
5️⃣ 아키텍처

- 사용자 앱에서 음식점 검색 후, 원하는 메뉴를 선택하여 주문을 생성합니다.
- 주문은 백엔드 API를 통해 음식점 서버로 전달됩니다.
- 음식점 서버는 주문을 수락하고, 메뉴와 주문 정보를 확인합니다.
- 배달 기사 앱은 배달 요청을 수락하고, 주문을 배달하기 시작합니다.
- 결제 시스템 & 알림은 결제 처리를 진행하고, 사용자는 결제 완료 알림을 받습니다.
6️⃣ 기능 설명
가게 관련
배달 관련
주문 관련
- 장바구니 관리
- 주문 상태 조회
- 주문 리뷰 관리
쿠폰 관련
- 등급별 정기 쿠폰 관리
- 이벤트 쿠폰 관리
- 고객별 보유 쿠폰 관리
고객 관련
관리자 관련
7️⃣ 도전과제 및 해결책
발생한 문제
- maven 에서 gradle로 마이그레이션 후 실행되지 않는 코드 발생
- admin 패키지의 컨트롤러, 서비스, 엔티티 코드에서 보완점 발견
- intellij와 jdk 간의 호환성 문제가 발생하여 빌드 실패
- 테스트 코드 오류 수정 필요
목표
- 마이그레이션 후 코드에서 발견된 오류 수정
- 논리 삭제 또는 물리 삭제를 고려하여 코드 수정 진행
- 컨트롤러, 서비스, 엔티티 코드의 보완점 수정
- intellij와 jdk간의 호환성 문제 해결
- 테스트 코드 오류 수정
리팩토링 수행 결과
AdminController.java


1. ResponseEntity 통일
- 기존 코드 내에 통일이 되어있지 않아 ResponseEntity를 사용하여 HTTP 상태 코드를 명시적으로 설정하기 위해 통일하였습니다.
2. 로그 추가
- 애플리케이션의 동작 상태를 기록하고, 문제를 진단하거나 디버깅하여, 시스템의 성능과 동작을 모니터링 하기 위해 로그를 추가하였습니다.
- AdminService 코드에도 로그 추가하였습니다.
AdminService.java



1. 입력 유효성 추가
중복된 loginId를 확인하기 위해 입력 유효성 추가
2. 중복 코드 제거
3. 메서드 명을 명시적으로 수정
findAdmin → getAdminInfoByLoginId
updateAdmin → updateAdminPassword
deleteAdmin → removeAdminByLoginId
findAdminEntity → getAdminByLoginId
permitRestaurant → authorizeRestaurant
AdminCreateRequest.java

1. 입력 유효성 추가
- 클라이언트에서 잘못된 형식의 데이터를 서버로 보내는 것을 방지하기 위해 AdminCreateRequest에 입력 유효성을 추가
AdminUpdateRequest.java

BaseLoginEntity.java

Admin.java

1. 비밀번호 검증 책임을 DTO에서 BaseLoginEntity로 이동
- DTO는 데이터를 전달하는 역할만 수행
- BaseLoginEntity는 공동 로그인 엔티티이기 때문에 Admin, User, Customer 등 다양한 하위 엔티티에서도 재사용 가능
- 중복 제거, 코드 유지보수성 증가
AdminController.java

AdminControllerTest.java

1. 테스트 코드 에러 수정
- AdminController 에서 createAdmin 메서드가 리소스 생성에 성공하면 201(Created)을 반환하고 있다. 그러나 AdminControllerTest에서는 200(OK)를 예상하고 있었기에 에러가 발생하여
.andExpect(status().isOK))
↓
.andExpect(status().isCreated))
해당 부분을 수정하였다.
8️⃣ 결과 및 성과
ERD

테스트 수행 결과



개선 사항
- 테스트 코드 개선
- 예외 처리 부족한 부분 추가 및 수정
- deprecated 된 애너테이션 최신 애너테이션으로 변경
- 물리 삭제 vs 논리 삭제 토의 후 데이터 보존이 필요한 엔티티에 대해 논리 삭제 적용
- 객체 지향 설계 원칙 SOLID를 목표로 코드 리팩토링
- 성능 향상을 위한 자료구조 변경
버그리포트
버그
AdminControllerTest 에러
버그 상세 내용
테스트 코드와 실제 코드 간의 기대값 불일치로 인한 에러
발생 원인
"AdminController에서 createAdmin 메서드가 리소스 생성에
성공하면 201(Created)을 반환하고 있음.
그러나 테스트에서는 200(OK)를 예상하고 있음.
수정 계획
테스트 코드에서
.andExpect(status().isOK))
↓
.andExpect(status().isCreated))
해당 부분 수정
수정 코드
mockMvc.perform(
post("/api/v1/admins")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(adminCreateRequest))
.with(csrf().asHeader())
)
.andExpect(status().isCreated())
9️⃣ 향후 계획
- 단위 테스트로 분리하여 테스트 속도 향상
- 성능 최적화를 위한 queryDSL 적용
- 성능 최적화 이후 성능 테스트를 통한 지표 측정
🔟 후기 및 배운 점
기존에 프로젝트를 진행할 때는 postman, swagger 등을 이용하여 기능
테스트를 진행했었는데 이번에 처음으로 테스트 코드를 이용해서 테스트를
진행해보며 테스트 코드의 필요성을 느끼게 되었다. 또한 클린 코드 기반의
리팩토링을 진행하며 앞으로 어떻게 코드를 짜야하는지 방향성에 대해 다시
생각해보는 계기가 되었다.
📌 마무리
"배달의 민족 서비스 클론 코딩"이라는 주제로 프로젝트를 진행하며 테스트 코드의 중요성을 깨닫고, 레거시 코드를 분석하고 리팩토링 하는 과정에서 앞으로 코드를 작성할 때 어떻게 클린코딩을 해나가야되는지 방향성에 대해 생각해보는 계기가 되었다. 이번 프로젝트에는 성능 최적화 이후 성능 테스트를 통한 지표 측정까지는 하지 못했지만 향후 단위 테스트로 분리하여 테스트 속도를 향상시키고 성능 최적화를 위한 queryDSL을 적용하여 성능 최적화 이후 성능 테스트를 통해 지표를 측정해보면 좋을 것 같다.
🔗 참고 자료 및 링크
Project Repository
https://github.com/mukmul/BE-02-Woowa
forked from
https://github.com/prgrms-be-devcourse/BE-02-Woowa?tab=readme-ov-file