Skip to content

passtal/MSA15_Mini1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

73 Commits
 
 
 
 
 
 
 
 

Repository files navigation

프로젝트 : 맛조은테이블 🍽️

맛조은테이블 로고

대한민국 모든 맛집이 한 곳에! 맛집 리뷰 플랫폼


📌 시연 영상

⬆️ 이미지를 클릭하면 시연 영상으로 이동합니다. 시연 영상



📋 목차



1. 프로젝트 개요

1-1. 프로젝트 주제

  • 맛집 리뷰 플랫폼 "맛조은테이블"

1-2. 주제 선정 배경

  • 다양한 맛집 정보가 분산되어 있어 한눈에 비교하기 어려운 현실
  • 신뢰할 수 있는 실사용자 리뷰 기반 맛집 추천 서비스의 필요성

1-3. 기획 의도

  • 카테고리별(한식/중식/일식/양식) 맛집 탐색 및 사용자 리뷰 공유 플랫폼 구축
  • 사장님 권한으로 직접 맛집 등록 및 메뉴 관리가 가능한 양방향 서비스

1-4. 활용 방안

  • 사용자는 카테고리별 맛집을 탐색하고, 리뷰와 평점을 통해 맛집을 선택할 수 있습니다.
  • 사장님 회원은 자신의 가게를 직접 등록하고 메뉴를 관리할 수 있습니다.

1-5. 기대효과

  • 실리뷰 기반의 신뢰도 높은 맛집 정보 제공
  • 지역 소상공인의 온라인 홍보 채널 확보


2. 프로젝트 구조

2-1. 주요 기능

구분 기능
🏠 메인 인기 맛집 / 신규 맛집 / 리얼 리뷰 / 배너 슬라이드
🍴 맛집 카테고리별(한식/중식/일식/양식) 맛집 목록 / 인기 맛집
📍 맛집 상세 가게 정보 / 메뉴 / 리뷰 / 위치 표시
📝 리뷰 게시판 리뷰 CRUD / 평점 / 댓글 / 이미지 첨부
👤 회원 회원가입 (일반/사장님) / 로그인 / 마이페이지 / 정보수정
🔐 인증 세션 기반 인증 / 자동 로그인 (Remember Me) / 쿠키 토큰
🗺️ 지도 맛집 위치 지도 표시
🍜 메뉴 관리 사장님 메뉴 등록 / 메뉴 이미지
📢 공지사항 공지 목록 / 조회

2-2. 메뉴 구조도

메뉴 구조도 펼치기
맛조은테이블
├── 메인 페이지
│   ├── 인기 맛집 (Top 10)
│   ├── 신규 맛집 (최신 6개)
│   ├── 리얼 리뷰 (최신 5개)
│   └── 배너 슬라이드
├── 맛집
│   ├── 맛집소개 (카테고리별 목록)
│   ├── 맛집지도
│   └── 인기맛집
├── 맛집 상세
│   ├── 가게 정보
│   ├── 메뉴 목록
│   ├── 리뷰 목록
│   └── 리뷰 작성 / 댓글
├── 커뮤니티
│   └── 공지사항
├── 회원서비스
│   ├── 로그인 / 로그아웃
│   ├── 회원가입 (일반 / 사장님)
│   └── 아이디 저장
└── 마이페이지
    ├── 내 정보 확인
    └── 회원정보 수정


3. 팀 구성 및 역할

이름 역할 담당 업무
최영우 팀장 • 프로젝트 총괄
• 주요 문서 작성
• 게시판 기능 구현
• 데이터베이스 연동 및 처리
• 기능 테스트 및 오류 수정
정성준 팀원 • 기능 구현 및 데이터 처리
• ERD 설계
• 회원가입 및 로그인 기능 구현
• 데이터베이스 연동 및 처리
• 기능 테스트 및 오류 수정
이효미 팀원 • 화면 설계 및 UI 구성
• 화면 설계도 작성
• 전반적인 UI 구성
• 기능 테스트

💡 인원 : 3명  |  기간 : 2025.12 ~ 2026.01



4. 기술 스택

Frontend

Backend

Database

Tools

Architecture

TeamPeoject/
├── src/main/java/board/
│   ├── servlet/            ← 컨트롤러 (19개 서블릿)
│   ├── service/            ← 비즈니스 로직 (인터페이스 + 구현체)
│   ├── DAO/                ← 데이터 접근 계층 (10개 DAO)
│   ├── DTO/                ← 데이터 전송 객체 (10개 DTO)
│   ├── filter/             ← 인증 필터 (자동 로그인)
│   ├── exception/          ← 커스텀 예외
│   └── util/               ← 유틸리티
├── src/main/webapp/
│   ├── page/               ← JSP 뷰 (board, shop, user, menu, notice)
│   ├── layout/             ← 공통 레이아웃 (header, footer, gnb 등)
│   ├── static/             ← CSS, JS, 이미지
│   └── WEB-INF/web.xml     ← 서블릿 설정 (Jakarta Servlet 6.0)
└── SQL/                    ← DDL/DML 스크립트 (13개 테이블)


5. 프로젝트 수행 경과

5-1. 요구사항 정의서

요구사항 정의서 펼치기

요구사항정의서

5-2. 기능 정의서

기능 정의서 펼치기

기능정의서

5-3. ERD

ERD 펼치기

ERD

5-4. 활용 장비 및 프로그램

활용 장비 및 프로그램 펼치기

활용장비

5-5. 플로우 차트

플로우 차트 펼치기

플로우차트

5-6. 간트 차트

간트 차트 펼치기

간트차트



6. 핵심 기능 코드 리뷰

6-1. 자동 로그인 필터 (Remember Me)

쿠키 기반 토큰으로 자동 로그인을 처리하는 서블릿 필터

코드 보기
// LoginFilter.java - 자동 로그인 인증 처리
@WebFilter(description = "자동 로그인 등, 인증 처리 필터", urlPatterns = { "/*" })
public class LoginFilter extends HttpFilter implements Filter {

    PersistenceLoginsService persistenceLoginsService;
    UserService userService;

    public void init(FilterConfig fConfig) throws ServletException {
        persistenceLoginsService = new PersistenceLoginsServiceImpl();
        userService = new UserServiceImpl();
    }

    public void doFilter(ServletRequest request, ServletResponse response, 
                          FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        Cookie[] cookies = httpRequest.getCookies();

        String rememberMe = null;   // 자동 로그인 여부
        String token = null;        // 인증 토큰

        if (cookies != null) {
            for (Cookie cookie : cookies) {
                switch (cookie.getName()) {
                    case "rememberMe" : rememberMe = cookie.getValue(); break;
                    case "token"      : token = cookie.getValue(); break;
                }
            }
        }

        HttpSession session = httpRequest.getSession();
        User loginUser = (User) session.getAttribute("loginUser");

        // 자동 로그인 & 토큰 유효성 검증
        if ("on".equals(rememberMe) && token != null 
            && !token.isBlank() && loginUser == null) {

            PersistenceLogins pl = persistenceLoginsService.selectByToken(token);
            boolean isValid = persistenceLoginsService.isValid(token);

            if (pl != null && isValid) {
                loginUser = userService.selectByUserId(pl.getUserId());
                session.setAttribute("loginId", pl.getUserId());
                session.setAttribute("loginUser", loginUser);
            }
        }
        chain.doFilter(request, response);
    }
}

6-2. 맛집 카테고리별 목록 조회

음식 카테고리(한식/중식/일식/양식)별 맛집 필터링 서블릿

코드 보기
// ShopListServlet.java - 카테고리별 맛집 목록
@WebServlet("/shop/list")
public class ShopListServlet extends HttpServlet {

    private PlaceDAO placeDAO = new PlaceDAO();

    @Override
    protected void doGet(HttpServletRequest request, 
                         HttpServletResponse response) throws ServletException, IOException {
        String cate = request.getParameter("cate");
        List<Place> placeList;

        if (cate == null || cate.equals("all") || cate.isBlank()) {
            placeList = placeDAO.selectList();           // 전체 목록
        } else {
            int foodNo = Integer.parseInt(cate);
            placeList = placeDAO.selectListByFood(foodNo); // 카테고리별 필터
        }

        request.setAttribute("placeList", placeList);
        request.getRequestDispatcher("/page/shop/shop_list.jsp")
                .forward(request, response);
    }
}

6-3. 리뷰 작성 (평점 + 맛집 연동)

로그인 검증 후 맛집에 대한 리뷰와 평점을 등록하는 서블릿

코드 보기
// BoardWriteServlet.java - 리뷰 작성
@WebServlet("/board/write")
public class BoardWriteServlet extends HttpServlet {
    private BoardDAO boardDAO = new BoardDAO();

    protected void doPost(HttpServletRequest request, 
                          HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        HttpSession session = request.getSession();
        User loginUser = (User) session.getAttribute("loginUser");

        if (loginUser == null) {
            response.sendRedirect(request.getContextPath() + "/page/login.jsp");
            return;
        }

        String title = request.getParameter("title");
        String content = request.getParameter("content");
        String ratingStr = request.getParameter("rating");
        String placeNoStr = request.getParameter("place_no");

        BoardDTO board = new BoardDTO();
        board.setTitle(title);
        board.setContent(content);
        board.setUser_no(loginUser.getNo());

        if (placeNoStr != null && !placeNoStr.isEmpty()) {
            board.setPlace_no(Integer.parseInt(placeNoStr));
        }
        if (ratingStr != null && !ratingStr.isEmpty()) {
            board.setRating((int) Double.parseDouble(ratingStr));
        }

        int result = boardDAO.insert(board);

        if (result > 0) {
            response.sendRedirect(
                request.getContextPath() + "/place/view?no=" + placeNoStr
            );
        }
    }
}


7. 화면 UI

7-1. 메인 페이지

메인 페이지 펼치기

7-2. 맛집 목록

맛집 목록 펼치기

7-3. 맛집 상세

맛집 상세 펼치기

7-4. 로그인 / 회원가입

로그인 / 회원가입 펼치기

7-5. 마이페이지

마이페이지 펼치기

7-6. 맛집 지도

맛집 지도 펼치기


8. 자체 평가 의견

잘한 점

  • Jakarta Servlet 6.0 기반 MVC 패턴을 적용하여 컨트롤러/서비스/DAO 계층을 분리하고, 유지보수성을 확보함
  • 쿠키 + 토큰 기반의 자동 로그인(Remember Me) 기능을 필터로 구현하여 서블릿 라이프사이클에 대한 이해를 심화함
  • 초기 기획 단계에서 깔끔한 화면 설계가 개발 과정의 시행착오를 줄여준다는 점을 체감함
  • 데이터의 흐름을 구조적으로 파악하고, 보안과 세션 관리의 중요성을 실습을 통해 학습함

아쉬운 점

  • 기획 단계의 설계 완성도가 개발 속도와 결과물에 큰 영향을 미친다는 점을 뒤늦게 체감함
  • UI/UX적 고민을 초반부터 충분히 반영하지 못해 중간에 수정이 발생함

개선할 점

  • 실제 서비스 환경에서 보완해야 할 보안 요소(권한 관리, 세션 처리)를 더 강화할 필요가 있음
  • 팀원 간 소통과 협업 프로세스를 체계화하여 오류 대응 속도를 높일 필요가 있음

프로젝트 진행 후기

이름 후기
이효미 사용자에게 가장 먼저 보이는 화면을 설계하면서, 단순히 예쁜 디자인보다는 '사용자가 얼마나 편하게 정보를 얻을 수 있는가'에 대한 UI/UX적 고민을 많이 할 수 있었습니다. 또한, 초기 기획 단계에서 깔끔한 화면 설계가 개발 과정의 시행착오를 줄여준다는 점을 깊이 배웠습니다.
정성준 이번 팀프로젝트를 통해 데이터의 흐름을 구조적으로 파악하는 법을 다시 한 번 되새겨보는 계기가 되었습니다. 또한 회원가입과 로그인 기능을 직접 구현하고 권한을 부여함으로써 보안과 세션 관리의 중요성을 배우고, 실제 서비스 환경에서 보완해야 할 점을 파악해볼 수 있는 좋은 계기가 되었습니다.
최영우 이번 프로젝트를 통해 기획 단계에서의 설계가 개발 속도와 완성도에 얼마나 큰 영향을 미치는지 배울 수 있었습니다. 또한, 팀원들과의 소통과 협업을 통해 발생한 오류들을 해결해 나가면서도 한 단계 성장할 수 있는 계기가 되었습니다.


ALOHA CLASS   더조은   고용노동부   직업능력심사평가원

About

대한민국의 모든 맛집을 한 곳에! 맛집 리뷰 플랫폼 맛조은테이블입니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors