📅날짜

2025/08/13 ~ 2025/08/18

📖프로젝트 내용

주요 고려 사항

  • 현실 세계에 적용하여 개발
  • MVC 패턴을 고려하여 개발
  • 예외처리를 고려하여 개발

패키지 구조 설계 이유

  1. DDD 기반 도메인 패키지 구분
    • View: 사용자 입력 및 출력(프린트) 담당
    • Model: JSON 변환 및 데이터 형식 관리
    • Service (Model1): 프로젝트가 작아 고도화된 로직은 적지만, 핵심 비즈니스 로직 배치
    • Repository (Model2): JSON 저장/탐색 담당 (findAll, findById 등)
    • 각 클래스가 단일 책임 원칙(SRP)을 갖도록 설계
  2. 재사용성 확보
    • util 패키지를 만들어 날짜 입력, 검증 등 공통 로직 모듈화
    • 중복 코드 최소화 및 유지보수 용이성 강화
  3. 구조적 역할 분리
    • Home: 프로그램 시작점이자 UI 진입점 → 메뉴 선택 및 전체 흐름 제어
    • Trip: 여행 단위 관리 (생성, 조회, 저장 등) → Itinerary와 연결
    • Itineraries: 여행 안의 개별 여정 관리
      • 이동, 숙박 등 다양한 일정 타입 포함
      • 공통 로직은 Itinerary에서 관리
    • MoveInfo / AccommodationInfo: 여정 타입별 세부 관리
      • 이동/숙박 정보 입력 및 조회 담당
    • utils: 여러 패키지에서 공통 사용되는 기능 모음
      • 입력 검증(Validator), 예외 처리(Exception), 날짜/문자열 처리 등

클래스 구조

├── data
│   └── itineraries
│       ├── itinerary_857142c0-3909-46bc-b680-c0476aef658e.json
│       ├── itinerary_86dab5be-df64-4e9a-8574-35f1c0157cea.json
│       ├── itinerary_a256bf02-e9c8-4c08-8915-d367f9ca9c23.json
│       ├── itinerary_cc89071f-09ec-46cd-9f38-0c77c9fd3d47.json
│       ├── itinerary_e65e4f84-3540-4fd5-942c-7deb8a037fb6.json
│       └── itinerary_ed5c5732-3f7d-4bb0-a311-e251fff1bb87.json
├── src
│   ├── AccommodationInfo
│   │   ├── AccommodationInfoController.java
│   │   ├── AccommodationInfoView.java
│   │   └── AccommodationItinerary.java
│   ├── Home
│   │   ├── HomeController.java
│   │   └── HomeView.java
│   ├── Itineraries
│   │   ├── ItinerariesController.java
│   │   ├── ItinerariesRepository.java
│   │   ├── ItinerariesService.java
│   │   ├── ItinerariesView.java
│   │   └── Itinerary.java
│   ├── Main.java
│   ├── MoveInfo
│   │   ├── MoveInfoController.java
│   │   ├── MoveInfoView.java
│   │   └── MoveItinerary.java
│   ├── Trip
│   │   ├── TripController.java
│   │   ├── TripModel.java
│   │   ├── TripRepository.java
│   │   ├── TripService.java
│   │   └── TripView.java
│   └── utils
│       ├── DataLoader.java
│       ├── DateValidator.java
│       ├── InputValidator.java
│       ├── InvalidMenuSelectionException.java
│       ├── ItineraryInputHelper.java
│       ├── StringValidator.java
│       └── ValidationException.java
└── travelLog.iml

JSON 형식

  {
    "trip_id": "857142c0-3909-46bc-b680-c0476aef658e",
    "trip_name": "얼렁뚱땅 부산여행",
    "start_date": "2020-5-3",
    "end_date": "2020-5-5",
    "itineraries": [
      {
        "itinerary_id": "13aw3f-ds32-wfd3wq-3f3w-3wfdwfcsef",
        "departure_place": "서면",
        "destination": "해운대",
        "departure_time": "2020-05-03T10:00:00",
        "arrival_time": "2020-05-04T10:00:00"
      },
      {
        "itinerary_id": "21232d-vsd4tgd-4e4g-4wf-sdbthrgw4w32",
        "accommodation": "하야트호텔",
        "check_in": "2020-05-03T12:00:00",
        "check_out": "2020-05-04T10:00:00"
      },
      {
        "itinerary_id": "27ce2889-1832-420f-9c2b-02f6d3ffcc77",
        "departure_place": "해운대",
        "destination": "광안리",
        "departure_time": "2020-05-03T01:01:00",
        "arrival_time": "2020-02-04T02:02:00"
      }
    ]
  }

이슈 및 해결방안

1. 여정(Itinerary) 구조 설계

  • 이슈: 상속 vs 개별 클래스 설계 선택
  • 해결방안: 상속 구조 채택 → 공통 로직 재사용, 확장성 확보

2. ID 관리

  • 이슈: 단순 ID 사용 시 고유성 부족
  • 해결방안: UUID 적용 → 충돌 방지 및 유일성 보장

3. 중복 코드

  • 이슈: 이동/숙박 관리 시 중복 발생
  • 해결방안: 입력 로직을 공통 유틸 클래스로 분리

4. JSON 저장 의존성

  • 이슈: Trip ↔ Itinerary 간 의존성 꼬임
  • 해결방안: Trip 중심 저장 구조로 재설계 예정

5. 클래스/구조 불일치

  • 이슈: 생성자·View/Controller 구조 불일치
  • 해결방안: 코드 리뷰 및 컨벤션 문서화로 통일

다른 조와 공유 후 개선사항

피드백

  • 숙박/이동을 상속으로 구분한 방식이 참신했다.
  • 프로그램 시작 시 JSON 전체 로딩 후, 프로그램 내에서 수정·저장하는 흐름이 깔끔했다.

추가 개발 및 개선

  • Trip ↔ Itinerary 저장 로직 단순화
  • JSON 초기 로딩 시 데이터 전처리

📝 프로젝트 회고 (KPT)

🏆KEEP

  • 상속 구조 채택
    • 공통 로직을 재사용할 수 있고, 일관성을 유지하기 용이했음
    • 새로운 여정(Itinerary) 타입 추가 시 확장성이 높아 유연하게 대응 가능
  • 패키지 구조 분리 (DDD 기반)
    • View, Model, Service, Repository, Utils로 역할을 분리
    • 각 클래스가 단일 책임을 가지도록 설계하여 유지보수 용이
  • 공통 입력 처리 클래스 활용
    • 날짜 입력, 검증 로직 등을 utils로 분리하여 재사용성 강화
    • 중복 코드 감소 효과

❗PROBLEM

  • ID 관리 문제
    • UUID를 사용했으나, 사용자 입장에서 직관적으로 확인하기 어려움
    • ID 생성 및 사용 시 일관성 부족
  • JSON 저장 시 의존성 문제
    • Itinerary에서 Trip에 접근해야만 저장이 가능했음
    • ItineraryRepository ↔ TripRepository 간 의존성이 꼬여 코드 복잡도 ↑
  • 클래스 구조 불일치
    • 같은 자식 클래스 간에도 생성자 구조, View/Controller 작성 방식이 달라 혼란 발생
    • 프로젝트 중간까지 통일되지 않아 유지보수 시 어려움

🔧TRY

  • ID 생성/표기 개선
    • UUID는 내부적으로 사용하되, 사용자에게는 별도의 가독성 높은 표시 ID 제공
  • 저장 로직 재구조화
    • TripRepository 중심으로 Itinerary를 관리하도록 리팩토링
    • Repository 간 의존성 최소화, 단일 책임 원칙 강화
  • 코드 컨벤션/구조 통일
    • 생성자, View, Controller 형태를 통일하는 코딩 컨벤션 문서화
    • 주기적인 코드 리뷰 및 회의를 통해 일관성 유지
profile
takeitEasy

0개의 댓글