대한민국 모든 맛집이 한 곳에! 맛집 리뷰 플랫폼
- 맛집 리뷰 플랫폼 "맛조은테이블"
- 다양한 맛집 정보가 분산되어 있어 한눈에 비교하기 어려운 현실
- 신뢰할 수 있는 실사용자 리뷰 기반 맛집 추천 서비스의 필요성
- 카테고리별(한식/중식/일식/양식) 맛집 탐색 및 사용자 리뷰 공유 플랫폼 구축
- 사장님 권한으로 직접 맛집 등록 및 메뉴 관리가 가능한 양방향 서비스
- 사용자는 카테고리별 맛집을 탐색하고, 리뷰와 평점을 통해 맛집을 선택할 수 있습니다.
- 사장님 회원은 자신의 가게를 직접 등록하고 메뉴를 관리할 수 있습니다.
- 실리뷰 기반의 신뢰도 높은 맛집 정보 제공
- 지역 소상공인의 온라인 홍보 채널 확보
| 구분 | 기능 |
|---|---|
| 🏠 메인 | 인기 맛집 / 신규 맛집 / 리얼 리뷰 / 배너 슬라이드 |
| 🍴 맛집 | 카테고리별(한식/중식/일식/양식) 맛집 목록 / 인기 맛집 |
| 📍 맛집 상세 | 가게 정보 / 메뉴 / 리뷰 / 위치 표시 |
| 📝 리뷰 게시판 | 리뷰 CRUD / 평점 / 댓글 / 이미지 첨부 |
| 👤 회원 | 회원가입 (일반/사장님) / 로그인 / 마이페이지 / 정보수정 |
| 🔐 인증 | 세션 기반 인증 / 자동 로그인 (Remember Me) / 쿠키 토큰 |
| 🗺️ 지도 | 맛집 위치 지도 표시 |
| 🍜 메뉴 관리 | 사장님 메뉴 등록 / 메뉴 이미지 |
| 📢 공지사항 | 공지 목록 / 조회 |
메뉴 구조도 펼치기
맛조은테이블
├── 메인 페이지
│ ├── 인기 맛집 (Top 10)
│ ├── 신규 맛집 (최신 6개)
│ ├── 리얼 리뷰 (최신 5개)
│ └── 배너 슬라이드
├── 맛집
│ ├── 맛집소개 (카테고리별 목록)
│ ├── 맛집지도
│ └── 인기맛집
├── 맛집 상세
│ ├── 가게 정보
│ ├── 메뉴 목록
│ ├── 리뷰 목록
│ └── 리뷰 작성 / 댓글
├── 커뮤니티
│ └── 공지사항
├── 회원서비스
│ ├── 로그인 / 로그아웃
│ ├── 회원가입 (일반 / 사장님)
│ └── 아이디 저장
└── 마이페이지
├── 내 정보 확인
└── 회원정보 수정
| 이름 | 역할 | 담당 업무 |
|---|---|---|
| 최영우 | 팀장 | • 프로젝트 총괄 • 주요 문서 작성 • 게시판 기능 구현 • 데이터베이스 연동 및 처리 • 기능 테스트 및 오류 수정 |
| 정성준 | 팀원 | • 기능 구현 및 데이터 처리 • ERD 설계 • 회원가입 및 로그인 기능 구현 • 데이터베이스 연동 및 처리 • 기능 테스트 및 오류 수정 |
| 이효미 | 팀원 | • 화면 설계 및 UI 구성 • 화면 설계도 작성 • 전반적인 UI 구성 • 기능 테스트 |
💡 인원 : 3명 | 기간 : 2025.12 ~ 2026.01
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개 테이블)
쿠키 기반 토큰으로 자동 로그인을 처리하는 서블릿 필터
코드 보기
// 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);
}
}음식 카테고리(한식/중식/일식/양식)별 맛집 필터링 서블릿
코드 보기
// 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);
}
}로그인 검증 후 맛집에 대한 리뷰와 평점을 등록하는 서블릿
코드 보기
// 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
);
}
}
}- Jakarta Servlet 6.0 기반 MVC 패턴을 적용하여 컨트롤러/서비스/DAO 계층을 분리하고, 유지보수성을 확보함
- 쿠키 + 토큰 기반의 자동 로그인(Remember Me) 기능을 필터로 구현하여 서블릿 라이프사이클에 대한 이해를 심화함
- 초기 기획 단계에서 깔끔한 화면 설계가 개발 과정의 시행착오를 줄여준다는 점을 체감함
- 데이터의 흐름을 구조적으로 파악하고, 보안과 세션 관리의 중요성을 실습을 통해 학습함
- 기획 단계의 설계 완성도가 개발 속도와 결과물에 큰 영향을 미친다는 점을 뒤늦게 체감함
- UI/UX적 고민을 초반부터 충분히 반영하지 못해 중간에 수정이 발생함
- 실제 서비스 환경에서 보완해야 할 보안 요소(권한 관리, 세션 처리)를 더 강화할 필요가 있음
- 팀원 간 소통과 협업 프로세스를 체계화하여 오류 대응 속도를 높일 필요가 있음
| 이름 | 후기 |
|---|---|
| 이효미 | 사용자에게 가장 먼저 보이는 화면을 설계하면서, 단순히 예쁜 디자인보다는 '사용자가 얼마나 편하게 정보를 얻을 수 있는가'에 대한 UI/UX적 고민을 많이 할 수 있었습니다. 또한, 초기 기획 단계에서 깔끔한 화면 설계가 개발 과정의 시행착오를 줄여준다는 점을 깊이 배웠습니다. |
| 정성준 | 이번 팀프로젝트를 통해 데이터의 흐름을 구조적으로 파악하는 법을 다시 한 번 되새겨보는 계기가 되었습니다. 또한 회원가입과 로그인 기능을 직접 구현하고 권한을 부여함으로써 보안과 세션 관리의 중요성을 배우고, 실제 서비스 환경에서 보완해야 할 점을 파악해볼 수 있는 좋은 계기가 되었습니다. |
| 최영우 | 이번 프로젝트를 통해 기획 단계에서의 설계가 개발 속도와 완성도에 얼마나 큰 영향을 미치는지 배울 수 있었습니다. 또한, 팀원들과의 소통과 협업을 통해 발생한 오류들을 해결해 나가면서도 한 단계 성장할 수 있는 계기가 되었습니다. |

