티스토리 뷰
개발 동기
초기에 생각한 프로젝트의 방향성은 영국의 한 스타트업에서 영감을 받았다.
https://www.pet-news.or.kr/news/articleView.html?idxno=2177
[펫타트업 특집]해외 반려동물 스타트업 기업, 어떻게 성공했나 - 한국반려동물신문
최근 반려동물 양육 인구가 전 세계적으로 늘어남에 따라 다양한 반려동물 관련 스타트업이 글로벌 펫시장에 참여해 펫산업 또한 급진적인 성장세를 보이고 있다.실제로, 미래에셋증권의 글로
www.pet-news.or.kr
기사에서 언급되는 '버터넛박스'라는 스타트업은 구독형 팻푸드 배송 시스템으로
반려견을 위한 팻푸드를 정기구독형 서비스로 제공해준다.
이런 시스템을 개발해보고싶어 생각하던차 반려동물이 아닌 사람을
대상으로 만들어보고 싶단 생각이 들었고 선행되야할 프로그램인 식단생성기부터 개발하잔 생각으로
개발을 진행하게 되었다. 그리고 추후 배송 시스템 구축까지 확장해 나갈 생각이다.
개발도구
이번 프로젝트는 초기 설계 단계부터 차근 차근 그 과정을 기록해 나갈 예정이다.
팀원간 회의 끝에 사용하기로한 개발도구는 Spring, Java8, Oracle 11g를 사용해 진행하고,
AWS를 사용해 배포까지 해보기로 했다.
추후에 사용되는 개발도구는 지속적으로 기록되는 다른 포스팅에서 언급될듯하다.
먼저 Spring,Git의 초기 설정은 하단의 포스팅에 기록해두었다.
https://0bliviat3.tistory.com/69
스프링 프로젝트 초기 설정_자바 버전, DB, encoding 설정
이번에 새로 진행하는 팀프로젝트의 도구로 스프링을 사용하기로 결정했다. 그래서 초기 설정과 git연동하는 부분에 대해 정리하도록 하겠다. 먼저 프로젝트 생성은 다음과 같은 순서로 진행된
0bliviat3.tistory.com
https://0bliviat3.tistory.com/70
스프링 프로젝트 초기설정_ Git 연동
지난 포스팅에 이어 스프링 프로젝트 초기설정에서 git 연동하는 파트를 다뤄보도록 하겠다. 프로젝트 생성, DB, 자바버전설정등의 초기 설정 파트는 하단의 링크를 참조하도록 하자. https://0blivia
0bliviat3.tistory.com
핵심기능의 flowchart
핵심기능인 식단 생성기의 흐름을 먼저 파악해보도록 하겠다.
사용자로부터 입력받는 정보를 토대로 식단생성을 하는게 큰흐름이고,
조금 세부적으로 들어가자면 정보에 따라 단계적으로 진행이 될것이다.
먼저 사용자의 키/몸무게/성별/나이의 입력을 통해 기초대사량을 계산할수 있겠고,
사용자의 평소 운동량에 대한 선지를 통해 사용자의 입력을 강제해 권장 섭취량을 계산할수 있을것이다.
그리고 마지막으로 사용자의 식습관의대한 입력을 통해 생성할 식단의 칼로리를 나눠 생성이 가능할것이다.
이를 순서도로 표현하면 다음과 같다.
초기 데이터 베이스 설계
먼저 핵심기능인 식단생성기부터 만들어 나가기로 했으므로 해당 부분에 대한 DB 설계를 먼저 진행했다.
초기에 직접 그린 ERD부터 살펴보도록 하겠다.
만들어야 할 테이블은 우선 4개로
식재료테이블, 식재료의 상세정보를 저장할 테이블, 메뉴 테이블, 메뉴의 상세 정보를 저장할 테이블
이렇게 4개의 테이블을 생각할수 있을것이다.
식재료는 이름과, 유통기한, 알러지 유무, 현재 단가에 대한 정보를 갖고
식재료 상세에서는 (사실 이 테이블은 추후에 확장을 위해 만든 테이블이라 핵심기능에서는 필요없다)
식재료 기본키를 외래키로 참조, 입고된 개수, 입고일을 저장한다.
메뉴 테이블은 메뉴이름, 메뉴의 칼로리, 메뉴의 단가를 저장하고,
메뉴 상세테이블은 메뉴의 기본키를 외래키로 참조하고, 식재료의 기본키를 외래키로 참조한뒤,
필요 식재료의 수량을 저장하도록 했다.
이때 식재료의 단가는 유동적이라 지속적으로 크롤링을 통해 업데이트를 할것이라
이부분에 대해서는 변경이 될수 있을듯 하다.
또 단가에 따라 메뉴의 가격역시 유동적으로 변경될수 있으므로 일단 체크만 해두고 넘어가도록 했다.
앞서 언급했듯 식자재의 단가에 따라 메뉴의 가격은 유동적으로 변경될것이다.
그럼이를 DB에 저장하고 싶다면, 흐름은 다음과 같다.
메뉴테이블 - 메뉴이름 , 메뉴 칼로리 저장
메뉴상세 테이블 - 메뉴에 따른 식재료 개수 저장
>> 식재료에 따른 현재 단가 업데이트
>> 식재료의 단가와 메뉴의 필요 개수의 연산
메뉴테이블 - 메뉴 가격 저장
즉 메뉴 테이블의 메뉴가격은 메뉴 상세테이블 저장 이후가 되는 셈이다.
이 과정을 함수화해 DB에 저장하고 싶어서
두가지 함수를 만들어 주었다.
첫번째로 파라미터로 식자재 번호를 넘겨주어
내부에서 식재재의 번호로 식자재의 단가를 검색하는 쿼리를 실행,
그리고 식자재의 단가를 리턴해주는 함수이다.
--식자재 단가 리턴하는 함수 생성
create or replace function get_food_cost(find_food_no number)
return number
is
food_num number;
begin
select ft.food_cost
into food_num
from food_tbl ft
where food_no = find_food_no;
return food_num;
end;
두번째로 첫번째로 정의한 함수를 내부에서 호출해 현재 메뉴에 대한 식재료의 단가 * 식재료의 수 의 총합을
구해 리턴해주는 함수이다.
-- 메뉴가격을 리턴하는 함수 생성
create or replace function calculate_menu(find_menu_no number)
return number
is
menu_sum number;
begin
select sum(get_food_cost(mdt.food_no) * mdt.food_cnt)
into menu_sum
from menu_detail_tbl mdt
where menu_no = find_menu_no;
return menu_sum;
end;
이때 주의할 점은 두 함수를 같은 창에서 생성하려한다면,
"ora-06575 패키지 또는 함수 은 부적당한 상태입니다" 와 같은 에러를 만나게 될 수 있으니
만약 발생한다면 함수 하나는 다른 창에서 생성하면 된다.
그리고 이제 더미데이터를 통해 테스트 해보도록 하겠다.
테스트용 더미 데이터)
메뉴 이름 : aa
필요 식자재 :
a-3-300
b-2-500
c-10-1000
예상 결과값 :
11900
실행시켜보면 예상한 기댓값을 잘 가져옴을 확인할수 있다.
이제 update 구문을 통해 메뉴의 가격을 업데이트 해줄수 있으면 된다.
--메뉴 가격 갱신
update menu_tbl set menu_cost = calculate_menu(?) where menu_no = ?;
이 구문은 추후에 크롤링을 통해 식자재의 단가를 업데이트 할쯤 실행시킬 프로시저의
내부에서 사용해 자동으로 업데이트하도록 하면 될듯하다.
마지막으로 Sql Developer에서 지원해주는 기능인 ERD 생성을 통해
내가 작성한 ERD와 비교해보도록 하겠다.
예상해 작성한 ERD와 동일한것을 확인할수 있다.
'웹 개발 > 식단 생성기 프로젝트' 카테고리의 다른 글
Spring frame work에서 JUnit5 적용 시행착오 기록 (0) | 2023.12.09 |
---|---|
DAO interface 설계 (2) | 2023.12.06 |