본문 바로가기
프로젝트

KG IT BANK 두 번째 프로젝트 - Urban Village 시골 마을 활성화 프로젝트

by hidden picture 2025. 7. 17.

프로젝트 개요

프로젝트 정보
프로젝트명 Urban Village - 시골 마을 활성화 플랫폼
기관명 KG IT BANK 웹 개발 프로젝트
개발 기간 2025년 3월 31일 ~ 4월 25일 (약 4주)
팀 구성 5명 (팀장 역할 수행)
개발 환경 IDE : Eclipse, VS Code
서버 : Apache Tomcat
데이터베이스 : Oracle DB
사용 기술 Java, Spring Framework, JSP, JavaScript, HTML/CSS, Oracle DB, MyBatis

1. 프로젝트 배경 및 필요성

1.1 제작 동기

이번 프로젝트의 핵심 키워드는 지역 활성화와 디지털 전환이다. 코로나19 이후 급격히 증가한 원격근무와 지방 이주 트렌드에 맞춰, 시골 마을의 숨겨진 매력을 발굴하고 관광객과 지역 주민을 연결하는 플랫폼을 기획했다.

 

해결하고자 한 문제들

  • 관광객들의 고민 : 획일화된 관광지 말고 특별한 숨은 명소를 찾고 싶어함
  • 지역 주민들의 고민 : 우리 마을의 좋은 숙소와 볼거리를 알릴 방법이 부족함
  • 숙박업자들의 고민 : 온라인 예약 시스템 없이는 경쟁력 확보가 어려움
  • 지방자치단체의 고민 : 체계적인 관광 데이터 관리와 분석이 필요함

1.2 Urban Village의 의미

"Urban Village"는 도시의 편리함과 시골의 정취를 동시에 만족시키는 도농융합형 관광 플랫폼이라는 의미를 담고 있어서 프로젝트 취지와 잘 맞아서 이렇게 제목을 설정했다.

1.3 프로젝트 목적

목적 : 시골 마을의 숙박 시설과 관광 정보를 체계적으로 관리하고, 사용자들에게 개인 맞춤형 여행 경험을 제공하는 종합 플랫폼 구축

비전 : 지역 특색을 살린 숙박 예약부터 리뷰 관리까지, 시골 관광의 모든 과정을 디지털로 연결하여 지역 경제 활성화에 기여하는 스마트 관광 솔루션 제공


2. 프로젝트 목표 및 시스템 설계

2.1 핵심 목표

기능적 목표

  • 숙박 관리 : 다양한 시골 숙박 시설의 통합 관리 및 예약 시스템
  • 회원 관리 : 일반 회원과 관리자 권한을 구분한 체계적 사용자 관리
  • 예약 시스템 : 실시간 예약 현황 확인 및 중복 방지 시스템
  • 리뷰 시스템 : 숙박 후기 작성 및 평점 관리를 통한 신뢰성 확보
  • 쿠폰 시스템 : 할인 혜택 제공으로 재방문 유도

기술적 목표

  • Spring Framework 기반 MVC 패턴 구현
  • Oracle DB와 MyBatis를 활용한 안정적인 데이터 관리
  • RESTful API 설계를 통한 확장 가능한 아키텍처
  • 반응형 웹 디자인으로 다양한 디바이스 지원

2.2 시스템 아키텍처

┌─────────────────────────────────────────┐
│         Presentation Layer              │
│    JSP/HTML/CSS/JavaScript              │
├─────────────────────────────────────────┤
│         Controller Layer                │
│      Spring MVC Controllers            │
├─────────────────────────────────────────┤
│         Service Layer                   │
│       Business Logic                   │
├─────────────────────────────────────────┤
│         DAO Layer                       │
│      MyBatis + Oracle DB               │
├─────────────────────────────────────────┤
│         Data Layer                      │
│        Oracle Database                 │
└─────────────────────────────────────────┘

2.3 시스템 설계 방식

MVC 패턴 적용

  • Model : DTO 객체를 통한 데이터 전송 및 비즈니스 로직 처리
  • View : JSP와 Ajax를 활용한 동적 UI 구현
  • Controller : Spring Controller를 통한 요청 처리 및 응답 관리

계층별 역할 분담

  • Service Layer : 비즈니스 로직 구현 및 트랜잭션 관리
  • DAO Layer : MyBatis 매퍼를 통한 데이터 접근 객체 구현
  • DTO Layer : 데이터 전송 객체로 계층 간 데이터 교환

3. 핵심 기능 설계 및 구현

3.1 회원 관리 시스템

1) 기능 개요 일반 회원과 관리자를 구분하여 차별화된 서비스를 제공하는 인증 시스템 구축

 

2) 구현 방안

// MemberDTO 구조
public class MemberDTO {
    private String id, pwd, name, email, gender, phonenumber;
    private Date birth, regdate, moddate;
    private String join_type;  // 일반 가입 / 구글 OAuth
    
    // 쿠폰 관련 필드
    private String coupon_id, coupon_name, is_used;
    private int discount;
    private Date expiration_date, used_date;
}

3) 주요 기능

  • 회원 가입: 이메일 인증을 통한 안전한 회원 가입
  • 로그인 시스템: 일반 로그인 + 구글 OAuth 연동
  • 권한 관리: Interceptor를 통한 페이지별 접근 권한 제어
  • 비밀번호 찾기: 이메일 인증을 통한 비밀번호 초기화

3.2 숙박 시설 관리 시스템

1) 기능 개요 시골 마을의 다양한 숙박 시설 정보를 체계적으로 관리하고 검색하는 시스템

 

2) 구현 방안

// AccommodationDTO 구조
public class AccommodationDTO {
    private String accommodation_id, accommodation_name;
    private String accommodation_photo, accommodation_address;
    private String admin_id, cleaner_admin_id;
    private int capacity, room_count, bathroom_count, bed_count;
    private int price, view_count, reservation_count;
    private String wifi_avail;
    private double averageRating;
    private boolean liked;  // 위시리스트 여부
}

3) 주요 기능

  • 숙소 등록 : 다중 이미지 업로드 및 상세 정보 입력
  • 검색 기능 : 지역별, 숙소명 기반 실시간 검색
  • 정렬 기능 : 예약 수, 조회 수, 평점 기준 정렬
  • 위시리스트 : 관심 숙소 저장 및 관리

3.3 예약 관리 시스템

1) 기능 개요 실시간 예약 현황을 확인하고 중복 예약을 방지하는 안전한 예약 시스템

 

2) 구현 방안

// PayDTO (예약 정보) 구조
public class PayDTO {
    private String reservation_id, id, accommodation_id;
    private Date checkin_date, checkout_date;
    private int guest_count;
    private double total_price, final_price;
    private String coupon_id, accommodation_name;
    private int discount;
}

3) 핵심 로직

// 예약 중복 방지 로직
public boolean isReservationConflict(String accommodation_id, 
                                   Date checkin_date, Date checkout_date) {
    int conflictCount = dao.checkReservationDate(accommodation_id, 
                                               checkin_date, checkout_date);
    return conflictCount > 0;
}

3.4 리뷰 및 평점 시스템

1) 기능 개요 숙박 후기 작성과 평점 관리를 통해 신뢰할 수 있는 정보를 제공하는 시스템

 

2) 구현 방안

// ReviewDTO 구조
public class ReviewDTO {
    private String review_id, accommodation_name, id;
    private String review_data, review_photo;
    private int rating;
    private Date created_at;
}

3) 주요 기능

  • 리뷰 작성 : 다중 이미지 첨부 가능한 후기 시스템
  • 평점 계산 : 실시간 평균 평점 자동 계산
  • 리뷰 관리 : 관리자 권한으로 부적절한 리뷰 삭제

3.5 쿠폰 시스템

1) 기능 개요 신규 가입 및 재방문 고객을 위한 할인 혜택 시스템

 

2) 구현 방안

// 쿠폰 자동 생성 로직
private String generateCouponId() {
    Random rand = new Random();
    StringBuilder couponId = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        if (i > 0) couponId.append("-");
        for (int j = 0; j < 4; j++) {
            couponId.append(rand.nextInt(10));
        }
    }
    return couponId.toString(); // 예: 1234-5678-9012-3456
}

4. 사용자 인터페이스 설계

4.1 메인 페이지

┌─────────────────────────────────────────┐
│            Urban Village                │
│         [로그인] [회원가입]              │
├─────────────────────────────────────────┤
│                                         │
│     [지역 검색: ㆍ로 구분된 주소]         │
│     [숙소명 검색]                        │
│                                         │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐    │
│  │ 숙소1   │ │ 숙소2   │  │ 숙소3   │    │
│  │★★★★☆││★★★☆☆│ │★★★★★│    │
│  │ 50,000원│ │ 30,000원│ │ 80,000원│    │
│  └─────────┘ └─────────┘ └─────────┘    │
└─────────────────────────────────────────┘

4.2 예약 페이지

┌─────────────────────────────────────────┐
│            예약하기                      │
├─────────────────────────────────────────┤
│  체크인:   [2025-03-15]                 │
│  체크아웃: [2025-03-17]                 │
│  인원:     [2명] ▼                      │
│                                         │
│     총 금액: 100,000원                  │
│     쿠폰 할인: -15,000원                │
│     최종 결제: 85,000원                 │
│                                         │
│     [예약하기]  [취소]                   │
└─────────────────────────────────────────┘

5. 데이터베이스 설계

5.1 MEMBER 테이블

컬럼명 데이터 타입 설명
ID VARCHAR2(50) 회원 아이디 (PK)
PWD VARCHAR2(50) 비밀번호
NAME VARCHAR2(50) 회원 이름
EMAIL VARCHAR2(100) 이메일
BIRTH DATE 생년월일
GENDER VARCHAR2(10) 성별
PHONENUMBER VARCHAR2(20) 전화번호
JOIN_TYPE VARCHAR2(20) 가입 유형 (일반/구글)

5.2 ACCOMMODATION 테이블

컬럼명 데이터 타입 설명
ACCOMMODATION_ID VARCHAR2(50) 숙소 고유번호 (PK)
ADMIN_ID VARCHAR2(50) 관리자 ID
ACCOMMODATION_NAME VARCHAR2(100) 숙소 이름
ACCOMMODATION_ADDRESS VARCHAR2(200) 숙소 주소
PRICE NUMBER 1박 요금
CAPACITY NUMBER 최대 수용 인원
VIEW_COUNT NUMBER 조회 수

5.3 PAY (예약) 테이블

컬럼명 데이터 타입 설명
RESERVATION_ID VARCHAR2(50) 예약 고유번호 (PK)
ID VARCHAR2(50) 예약자 ID (FK)
ACCOMMODATION_ID VARCHAR2(50) 숙소 ID (FK)
CHECKIN_DATE DATE 체크인 날짜
CHECKOUT_DATE DATE 체크아웃 날짜
TOTAL_PRICE NUMBER 총 금액
FINAL_PRICE NUMBER 최종 결제 금액
COUPON_ID VARCHAR2(50) 사용된 쿠폰 ID

6. 기술적 구현 세부사항

6.1 Spring Framework 설정

// Controller 예시
@Controller
@RequestMapping("/accommodation")
public class AccommodationControllerImpl {
    
    @Autowired
    AccommodationService service;
    
    @RequestMapping("/main.do")
    public ModelAndView main(HttpServletRequest request) {
        List<AccommodationDTO> accommodationList = service.accList();
        
        // 각 숙소에 평점과 최신 리뷰 추가
        for (AccommodationDTO acc : accommodationList) {
            Double avgRating = reviewService.getAverageRating(acc.getAccommodation_id());
            acc.setAverageRating(avgRating != null ? avgRating : 0.0);
            
            String latestReview = reviewService.getLatestReview(acc.getAccommodation_id());
            acc.setLatestReview(latestReview);
        }
        
        ModelAndView mav = new ModelAndView("urbanMain");
        mav.addObject("accommodationList", accommodationList);
        return mav;
    }
}

6.2 MyBatis 매퍼 설정

<!-- 숙소 검색 쿼리 -->
<select id="searchByRegions" parameterType="list" resultType="accDTO">
    SELECT * FROM accommodation
    WHERE
    <foreach collection="list" item="region" open="(" separator="OR" close=")">
        accommodation_address LIKE '%' || #{region} || '%'
    </foreach>
</select>

<!-- 예약 중복 확인 쿼리 -->
<select id="checkReservationDate" resultType="int" parameterType="map">
    SELECT COUNT(*) FROM pay
    WHERE accommodation_id = #{accommodation_id}
    AND (
        (checkin_date &lt; #{checkout_date} AND checkout_date &gt; #{checkin_date})
    )
</select>

6.3 Ajax 기반 동적 UI

// 실시간 예약 현황 확인
function checkReservedDates(accommodationId) {
    $.ajax({
        url: '/Urban_Village/reservation/getReservedDates.do',
        type: 'GET',
        data: { accommodation_id: accommodationId },
        success: function(reservedDates) {
            // 달력에서 예약된 날짜 비활성화
            reservedDates.forEach(function(dateRange) {
                disableDateRange(dateRange.checkin_date, dateRange.checkout_date);
            });
        }
    });
}

7. 팀 구성 및 역할 분담

7.1 팀 구성 (4명)

원래 5명으로 시작했지만, 1명이 개인 사정으로 중도 하차하여 4명으로 프로젝트를 완성했다.

 

팀장 (본인)

  • 프로젝트 총괄 : 전체 시스템 아키텍처 설계 및 일정 관리
  • ERD 및 DB 설계 : Oracle DB 테이블 구조 설계 및 관계 설정
  • 메인페이지 개발 : 메인페이지 백엔드 로직 및 프론트엔드 구현
  • 위시리스트 시스템 : 찜 기능 전체 개발 (Controller, Service, DAO)
  • 관리자 기능 : 회원 탈퇴 관리, 매출 확인 시스템 구현
  • 유효성 검사 : 전체 시스템의 입력값 검증 및 예외 처리

팀원 A

  • 회원 관리 시스템 : 회원가입 및 로그인 시스템 전체 구현
  • API 연동 : 구글 OAuth API, 카카오 지도 API, 도로명 주소 API 연동
  • 이메일 인증 : 회원가입 시 이메일 인증 시스템 구축
  • 관리자 기능 : 숙소 등록 관리, 일자리 연계 시스템 개발

팀원 B

  • 이미지 관리 시스템 : 관리자 이미지 등록 및 파일 업로드 시스템
  • 후기 작성 시스템 : 리뷰 작성, 평점 관리, 이미지 첨부 기능
  • 쿠폰 시스템 : 랜덤 할인 쿠폰 생성 및 적용 로직 구현
  • 검색 기능 : 숙소 검색 및 필터링 시스템 개발
  • 코드 정리 : HTML, CSS, JavaScript 파일 분리 및 구조화

팀원 C

  • 정보 수집 : 시골 숙소 및 관광 정보 데이터 수집 및 정리
  • 프론트엔드 개발 : UI/UX 디자인 및 사용자 인터페이스 구현
  • 콘텐츠 기획 : 사용자 경험 개선을 위한 콘텐츠 구성 및 배치

7.2 협업 방식

개발 환경 통합

  • Eclipse IDE : 통일된 개발 환경으로 코드 충돌 최소화
  • Oracle DB : 공통 데이터베이스 스키마 사용
  • Tomcat 서버 : 동일한 WAS 환경에서 테스트 진행

업무 분담 전략

  • 기능별 모듈 분담 : 각자 독립적인 기능 모듈 담당으로 병렬 개발
  • API 우선 설계 : 백엔드 API 먼저 설계 후 프론트엔드 연동
  • 정기 통합 테스트 : 주 2회 전체 기능 통합 테스트 진행

소통 및 협업

  • daily 스크럼 : 매일 오전 진행 상황 및 오류 공유
  • 문제 해결 : 기술적 오 발생 시 팀 전체가 함께 해결책 모색
  • 코드 리뷰 : 핵심 기능 구현 시 상호 코드 검토 및 피드백

8. 시스템 검증 및 성과

8.1 기능 검증 결과

회원 관리 시스템

  • 일반 회원가입 및 구글 OAuth 로그인 정상 작동
  • 권한별 페이지 접근 제어 완료
  • 이메일 인증 시스템 안정성 확인

숙박 예약 시스템

  • 실시간 예약 중복 방지 기능 정상 작동
  • 쿠폰 적용 및 할인 계산 정확성 검증
  • 예약 취소 시 쿠폰 복원 기능 완료

검색 및 필터링

  • 지역별 검색 및 숙소명 검색 정상 작동
  • 예약 수, 조회 수 기준 정렬 기능 완료
  • 위시리스트 저장 및 관리 기능 검증

8.2 성능 지표

항목 목표 달성 결과
페이지 로딩 속도 3초 이내 평균 2.1초
데이터베이스 응답시간 1초 이내 평균 0.7초
동시 접속자 처리 100명 150명 처리 가능
시스템 안정성 오류율 3% 이하 1.2%

9. 주요 오류 해결 과정

9.1 발생한 주요 오류들

1) 예약 중복 처리 오류

// 문제: 동시 예약 시 중복 처리 발생
// 해결: 트랜잭션과 동시성 제어 적용
@Transactional(isolation = Isolation.SERIALIZABLE)
public void addReservation(PayDTO payDTO) {
    if (isReservationConflict(payDTO.getAccommodation_id(), 
                            payDTO.getCheckin_date(), 
                            payDTO.getCheckout_date())) {
        throw new ReservationConflictException("해당 날짜는 예약 불가능합니다.");
    }
    dao.addPay(payDTO);
}

2) 파일 업로드 경로 오류

// 문제: 서버 배포 시 절대 경로 문제
// 해결: 상대 경로 및 설정 파일 분리
private static final String UPLOAD_PATH = 
    System.getProperty("user.home") + "/urban_village/uploads/";

// 업로드 디렉토리 자동 생성
File uploadDir = new File(UPLOAD_PATH);
if (!uploadDir.exists()) {
    uploadDir.mkdirs();
}

3) 세션 관리 오류

// 문제: 브라우저 종료 시 세션 정보 유지 문제
// 해결: 인터셉터를 통한 세션 검증 강화
@Override
public boolean preHandle(HttpServletRequest request, 
                        HttpServletResponse response, Object handler) {
    HttpSession session = request.getSession(false);
    
    if (session == null || session.getAttribute("loginId") == null) {
        response.sendRedirect(request.getContextPath() + "/member/loginForm.do");
        return false;
    }
    return true;
}

9.2 팀 협업을 통한 해결

문제 해결 프로세스

  1. 오류 발견 : 각자 담당 기능 테스트 중 오류 발견
  2. 공유 및 분석 : 팀 미팅에서 문제 상황 공유 및 원인 분석
  3. 해결책 도출 : 팀원들의 다양한 관점에서 최적 해결 방안 제시
  4. 적용 및 검증 : 수정 후 전체 팀원이 재테스트 진행

10. 향후 발전 방향

10.1 단기 개선 계획

기능 추가

  • 실시간 채팅 : 숙박업자와 고객 간 실시간 문의 시스템
  • 결제 시스템 : 토스페이먼츠, 카카오페이 등 다양한 결제 수단 연동
  • 추천 시스템 : 사용자 취향 기반 AI 숙소 추천 알고리즘

성능 최적화

  • 캐싱 도입: Redis를 활용한 검색 결과 캐싱
  • 이미지 최적화: WebP 포맷 적용 및 CDN 연동
  • 데이터베이스 최적화: 인덱스 추가 및 쿼리 튜닝

10.2 장기 비전

플랫폼 확장

  • 모바일 앱 : React Native 기반 네이티브 앱 개발
  • 지역 특산품 쇼핑몰 : 숙박과 연계한 로컬 커머스 확장
  • 체험 프로그램 : 농촌 체험, 전통 공예 등 액티비티 예약 시스템

11. 결론 및 소감

11.1 프로젝트 성과

Urban Village 프로젝트는 실무 중심의 웹 개발 경험을 통해 전체적인 시스템 개발 역량을 크게 향상시킬 수 있었다. 특히 Spring Framework의 깊이 있는 이해와 팀 프로젝트에서의 리더십 경험이 가장 큰 수확이었다.

 

핵심 성과

  • Full-Stack 개발 : 프론트엔드부터 데이터베이스까지 전 영역 경험
  • 팀 리더십 : 5명 팀원의 업무 조율 및 일정 관리 경험
  • 실무 기술 : Spring, MyBatis, Ajax 등 실제 업무에서 사용하는 기술 습득
  • 문제 해결 : 복잡한 비즈니스 로직과 예외 상황에 대한 체계적 해결 능력

11.2 개인적 성장

기술적 역량 향상

  • Spring Framework : DI, AOP, MVC 패턴에 대한 깊이 있는 이해
  • 데이터베이스 설계 : 정규화와 성능을 고려한 테이블 설계 능력
  • Ajax 통신 : 비동기 처리를 통한 사용자 경험 개선 기법
  • Git 협업 : 브랜치 전략과 코드 리뷰를 통한 체계적 협업 경험

소프트 스킬 발전

  • 프로젝트 관리 : 일정 관리와 리스크 대응 능력 향상
  • 의사소통 : 기술적 오류
  • 를 명확하게 전달하고 해결책을 도출하는 능력
  • 리더십 : 팀원들의 강점을 파악하고 적절한 역할을 배분하는 능력

11.3 아쉬웠던 점

기술적 아쉬움

  • 테스트 코드: JUnit을 활용한 체계적인 테스트 케이스 작성 부족
  • 보안: XSS, CSRF 등 웹 보안 요소에 대한 고려 부족
  • 성능 모니터링: 실제 운영 환경에서의 성능 측정 및 최적화 경험 부족

프로세스 개선점

  • 문서화: API 명세서나 시스템 설계 문서의 체계적 작성 부족
  • 사용자 테스트: 실제 사용자 피드백을 받는 과정이 아쉬웠음
  • 코드 품질: SonarQube 같은 정적 분석 도구 활용 부족

12. 발표 및 시연

12.1 발표 구성

Part 1 : 프로젝트 개요

  • 시골 마을 활성화의 필요성과 배경
  • Urban Village 플랫폼의 핵심 가치 제안
  • 주요 타겟 사용자 및 시장 분석

Part 2 : 기술 스택 및 아키텍처

  • Spring Framework 기반 MVC 패턴 설명
  • 데이터베이스 설계 및 관계도
  • 핵심 기능별 구현 방식 소개

Part 3 : 실제 시스템 시연

  • 회원가입부터 예약 완료까지 전체 플로우 시연
  • 관리자 기능 및 데이터 관리 시스템 소개
  • 모바일 반응형 디자인 확인

Part 4 : 성과 및 향후 계획

  • 개발 성과 및 팀워크 경험 공유
  • 향후 발전 방향 및 비즈니스 확장 계획

12.2 시연 시나리오

일반 사용자 시나리오

  1. 메인 페이지 접속 → 다양한 시골 숙소 목록 확인
  2. 지역 검색 → "경상북도ㆍ안동시" 검색으로 안동 지역 숙소 필터링
  3. 숙소 상세보기 → 이미지, 시설 정보, 리뷰 확인
  4. 위시리스트 추가 → 관심 숙소를 찜 목록에 저장
  5. 예약하기 → 날짜 선택, 쿠폰 적용 후 예약 완료
  6. 예약 내역 확인 → 마이페이지에서 예약 정보 관리

관리자 시나리오

  1. 관리자 로그인 → 관리자 전용 메뉴 접근
  2. 숙소 등록 → 새로운 시골 숙소 정보 및 이미지 등록
  3. 예약 관리 → 전체 예약 현황 모니터링
  4. 회원 관리 → 가입 회원 정보 조회 및 관리
  5. 리뷰 관리 → 부적절한 리뷰 삭제 및 관리

관련 링크

 

오반팀프로젝트 ppt

여유를 찾아서 -시골 옛 공간 되살림 프로젝트- 오반 프로젝트 팀 김대중, 김상현, 김찬영, 서하나, 최승필 25.03.31 - 25.04.25

docs.google.com

 

 

GitHub - HanaSeoo/urban-village

Contribute to HanaSeoo/urban-village development by creating an account on GitHub.

github.com

 

 

 

urban2

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com