❓문제 정의 사용자가 자신이 보유한 재료를 사용하기 위해서는 레시피들을 일일이 확인해 봐야 하는 번거로움이 존재함. 커피를 직접 내려마시는 경우, 다양한 추출 조건들을 비교하기 어려움.
사용자의 보유 재료, 알레르기 정보 등을 고려한 레시피 검색, 상황에 맞는 레시피 추천 기능을 제공하며 재료 관리를 돕습니다. 커피를 내릴 때 물 온도, 원두 분쇄 정도 등을 기록하고 비교할 수 있는 커핑 노트 작성을 돕습니다.
-
재료 관리 및 구매
- 사용자 보유 재료 추가 및 삭제 가능
- 우선 소진 재료 설정 : 사용 기한이 임박한 재료 별도로 체크
- 특정 재료의 최저가 조회 및 구매 사이트 연결
-
레시피 맞춤 검색
- 사용자가 지정한 검색 옵션 기반으로 조건에 맞는 레시피 검색
- 검색 옵션 : 키워드, 카테고리, 제외 재료, 포함 재료
- 알레르기 재료를 포함하고 있는 레시피는 검색에서 자동 제외됨
- 레시피 상세 화면
- 필요한 재료와 현재 보유한 재료의 일치 여부를 가시적으로 표현
- 해당 레시피를 좋아요(북마크)할 수 있음
- 사용자가 지정한 검색 옵션 기반으로 조건에 맞는 레시피 검색
-
레시피 제안 및 보관
-
특정 레시피를 북마크(좋아요) 할 수 있음
-
인기순 레시피
좋아요 수를 기반으로 인기순 레시피 추천
-
우선 소비 재료 기반 추천
사용자가 빠르게 사용하고 싶은 재료로 체크한 재료 중, 해당 재료들을 위주의 레시피 추천
-
-
커핑 노트 기록
커핑 노트 : 커피 테이스팅 노트로, 특정 원두에 대한 추출 컨디션(추출 시간, 분쇄도, 추출 온도, 맛 평가 등)의 기록물
- 추출한 에스프레소의 맛과 향을 결정짓는 주요한 요소들을 기록해 자체적인 피드백, 다양한 도전을 도움
- 추출 방식, 원두명, 별점, 기록 날자 별 기록 미리 보기 제공
- 최신순, 별점순으로 정렬 가능
- Spring Boot, JPA, Querydsl
- AWS EC2, AWS RDS, MySQL
- Beautiful Soup
- 서버의 메인 프레임워크는 SpringBoot를 사용했습니다. MVC 기반 계층형 구조로 프로그램을 설계했습니다. 서비스 특성 상 쿼리 작성 빈도가 높을 것이라 예상했고 JPA를 활용해 객체 지향적으로 데이터를 관리하고, 재사용성을 높이고자 했습니다. 그리고 RESTful 원칙에 따라 API를 설계하고자 했습니다.
- MySQL을 사용해 관리했으며 관계형 데이터베이스 방식으로 DB를 설계했고, 테이블을 분리하며 일대일, 일대 다 매핑을 수행함으로써 데이터의 중복 최소화를 보장하고자 했습니다.
- 배포 시, 서버 호스팅을 위해 AWS EC2를 사용했고 데이터베이스 연동을 위해 RDS 서비스를 사용했습니다.
- 파이썬에서 Beautiful Soup 라이브러리를 이용해 레시피의 정보를 추출하는 크롤러 함수를 작성했습니다.
- 네이버 쇼핑 API를 활용해 사용자가 구매하기 위해 담아둔 제품에 대한 최저가 정보를 제공했습니다.
- 사용자의 편의성 개선을 위해, 현재 사용자가 소유한 재료 정보와 레시피의 재료 정보 간 일치율을 계산해 제공했습니다.
- 키워드, 카테고리, 포함 재료, 제외 재료, 알러지 유발 재료 처럼 다양한 검색 조건을 사용해 유연한 검색 기능이 주요 기능 중 하나였습니다. 따라서 검색 조건에 따른 동적 쿼리를 구성하기 위해 Querydsl 프레임워크를 활용했으며, 이때 Null값을 핸들링 하기 위해 BoolExpression을 사용했습니다.
- 서버를 구성해보며 스터디를 통해 배웠던 SpringBoot를 활용하고 익힐 수 있었습니다.
- 시스템을 계층 구조로 나타내는 방법과 전반적인 흐름을 익혔고, MVC 구조의 개괄적인 이해가 가능했습니다.
- 클라이언트-서버를 분리해 진행하는 첫 팀프로젝트 경험을 통해, Slack과 Git을 사용해 협업하는 방법에 대해 배웠습니다.
- 요구사항을 분석하고 노션으로 API 명세서를 작성해 공유하며, 그것을 바탕으로 프론트와 소통하는 방법에 대해 배웠습니다.
- 정의된 요구사항을 바탕으로 관계형 데이터 베이스를 설계하는 방법을 익혔으며, 데이터베이스를 좀 더 효율적으로 다룰 수 있게 돕는 JPA와 Querydsl을 활용했습니다.
- 효율을 결정짓는 가장 큰 요소는 데이터베이스 설계 구조라는 것을 알게 되었습니다.
- 기존에 기획했던 기능을 모두 구현할 수 있었고, 동적 검색 기능을 추가해 사용성을 개선할 수 있었습니다.