냉메추

[냉메추] 학교에서 새로운 서비스를 만들어보게되었다..!

장아장 2024. 3. 28. 18:21

학교에서 새로운 프로젝트를 진행하게 되었다.

(캡스톤 디자인으로 시작했는데, 나중에 계속해서 빌드업을 해보면 좋겠다는 생각이 되었다. )

(곰터뷰가 이제 둘이 되겠군...?)

회원의 냉장고 데이터를 받아서, 추천해줄만한 메뉴를 만들어 반환하는 로직을 생각하고 있다.

데이터는 만개의 레시피에서 참조하기로 했다.

찾아보니, csv파일 형식으로 대략 20만건정도를 받을 수 있었다.

해당 데이터를 전처리해서 DB에 데이터를 넣어주고,

조회의 최적화 로직도 생각하게 되었다.


그래서 우리팀은?

우리팀은 프론트 둘에, 백엔드는 나 하나다.

심지어 캡스톤 디자인의 담당교수는 빅데이터, ML을 주로 가르쳐주시는 교수님시다.

즉, 나중엔 AI 관련 학습도 진행하면서 회원들의 사용내역을 모두 군집화해서 추천 알고리즘에 적용해보려고 한다.

이번 BE는 나하나로,

그 뜻은 내가 원하는 모든 것들을 해볼 수 있다는 계획이다.


기획을 해보자!(다같이)

2024년 1학기는 총 15주의 시간이 있었다.

이에 맞추어, 우리는 1차 MVP를 8주차까지 잡고, 2차 MVP를 후에 잡았다.

  • 1차 MVP
    • 회원은 네이버, 구글로만 사용한다.
    • 냉장고를 활용해 나의 재료 추가, 조회, 유통기한 임박 재료 조회, 재료 삭제
    • 레시피에서는 내가 가지고 있는 재료들로, 혹은 한두가지 재료를 추가해 만들 수 있는 모든 레시피를 종류에 맞게 반환
    • 회원의 레시피 사용 내역 기록
  • 2차 MVP
    • 회원의 레시피 사용내역을 토대로 레시피들의 군집화
      • 후에 다른 사람들의 메뉴를 추천해줄 수 있다.
    • 사용내역을 이용한 먹기록(쉽게 말하면 식단 일기장)을 구현

정도로 잡았다.


기획을 해보자!(BE, 즉 내가 할 일)

이번 BE는 나 혼자라서 사실 기획을 안해도 되지 않겠냐는 생각이 들기도 했다.

하지만, 막학기에 학교를 잘 가지 않기 시작하면서

스스로의 시간을 효율적으로 써야한다는 생각이 들었다.

그래서 조금 더 계획을 가지고, 기본적인 설계와 구상정도는 해야겠다는 생각이 들었다.

항상 EC2의 인스턴스를 두어개 쓰는게 일상이었다.

DB인스턴스와 WAS인스턴스를 분리했었다.

심지어 부스트캠프를 하면서, js에 찌든 내 백엔드 일상을 보게 되었다.

다시 스프링을 조금 더 건드려봐야겠다는 생각이 들었다.

최근에 자주 쓰던 모든 것들에서 다른 것들을 하나씩 가져와봐야겠다는 생각이 들었다.

첫 번째로, 스프링을 쓰자는 생각을 했고,

두 번째로, AWS가 아닌 Oracle을 써보자는 생각을 했다.

오라클은 한 개의 인스턴스에 대해서는 무료 서비스를 제공했다.

그래서 하나의 인스턴스를 써봐야겠다는 생각이 들었다.

NginX로드밸랜서를 달아서

블루/그린 무중단 배포를 시도해볼 계획이다.

8081, 8082포트를 WAS로 사용하고 NginX로 8080을 연결시킬 계획이다.


설계를 해보자!

사실 외부 기능에 그렇게 의존적이지 않다.

해봐야 OAuth2를 사용하는게 전부일 것이다.

이를 이용한 JWT토큰을 사용해볼 생각이다.

토큰의 페이로드는 이후에 나올 도메인 설계를 통해서 추가적으로 설명해야 할 것 같다.

이렇게 도메인, 바운디드 컨텍스트를 만들었다.

원티드 프리온보딩 때 도메인 주도 설계를 처음 접하고,

이벤트기반 DDD로 프로젝트를 만드는 것이 확실히 좋긴 하다는 것을 느꼈다.

역정규화로 가져올 데이터가 많다는 점이 뭔가 깔끔하지 못한 느낌이 들긴 하지만,

개발의 효율성이 상당히 올라가는 것을 느꼈다.

다른 도메인이 리펙토링시에 영향을 받지 않게 할 수 있다는 것이 너무 좋았다.

즉, 코드의 수정을 최소화하고 추가삭제만으로 기능적인 변화가 가능해진 것이 좋다.

또한, 바운디드 컨텍스트 단위로 스프링 멀티 모듈을 활용해볼까 했다.

원티드에서 이벤트기반 DDD를 처음 접해보았고,

곰터뷰에서 기존의 로직을 모두 이벤트화시키는 과정을 진행했었다.

단순한 이벤트기반 DDD로는 기존과는 변화가 없는 일상이다.

멀티모듈이라는 새로운 과제를 스스로 주기로 했다.

여기서 내가 해결해야 할 사항이 하나 있었다.

 

과연 회원의 재료 초기화, 냉장고 재료 데이터를 어떻게 만들어야 조회를 수월하게 할 수 있을까?

 

이에 대해 내가 가진 아이디어는, 비트스트림이었다. 

아이디어의 기원은 군집화를 공부하는 중 나타났다. 

 

머신러닝에서 군집화를 학습하면서, 특성벡터라는 것을 공부해봐야 했다. 

이 때 특성 벡터중 원핫 인코딩 방식이 있었다. 

 

각 재료를 고유 인덱스값으로 매핑하고 재료가 포함되면 1, 아니면 0으로 2진값으로 만들고 이를 벡터로 활용할 수 있다는 점이었다. 

 

그렇다면, 회원과 레시피가 모든 재료를 비트스트림의 문자열로 데이터를 가지고 있으면 어떨까?라는 생각이 들었다. 

회원의 만들 수 있는 요리를 검증하기 위해서 레시피의 비트값과 and연산을 시키면 끝이고, 

재료에서는 비트문자열에서 인덱스의 값이 1인지 검증하면 된다는 결론에 도달했다. 

 

결국, 내가 토큰에 담을 페이로드는

  • 회원 id
  • 회원의 냉장고에 존재하는 재료들의 2진수 문자열

정도가 될 것이다. 


이제 시작만 하면 된다!!!(그럴까...?)

사실 이전에 언급을 했지만,

이번 캡스톤 디자인의 교수님이 빅데이터/ML이 주 전공이신 교수님이시다. 

2차 MVP에서 회원의 레시피 조회 내역을 데이터화시켜서 이를 활용할 방안도 학습해야한다. 

또한, 냉장고의 재료들을 추가할 때 바코드를 카메라로 찍어 바로 데이터화 시킬 방안도 생각해야한다. 

 

또한, 멀티모듈/무중단배포/NginX에 대한 학습이 추가적으로 필요할 것이다. 

이를 위한 내용들도 같이 학습하면서 블로그에 올려야겠다. 

그야말로 '유하각'이다. 

(아마 NginX/무중단 배포 과정은 Infra나 DevOps카테고리로, 멀티모듈은 스프링 카테고리로 정리해야할 것 같다. )

(이러한 과정을 마무리 짓고 회고는 이 카테고리에 넣을 것이다)

 

학습과 구현이 서로 꼬리를 물기도, 서로를 괴롭히기도 할 것 같다는 생각이 든다. 

심지어 파이썬도 공부해야겠구나 인공지능해야 하니

나만의 스타트업이 되는 기분이다. 

모든 것을 내 손으로 해내야 한다는, 주위 사람들이 말하는 스타트업이 일하기 힘든 이유를 보는 것 같다. 

근데, 개꿀잼 각아닙니까?

 

오라클 클라우드 가입부터, 도커 설치까지 하러 가야겠다. 

 

그럼...twenty thousand...🔥