{"id":25122863,"url":"https://github.com/f-lab-edu/eattofit","last_synced_at":"2025-04-23T01:11:28.799Z","repository":{"id":251930740,"uuid":"838841635","full_name":"f-lab-edu/EatToFit","owner":"f-lab-edu","description":"EatToFit: 음식을 운동으로 🍔","archived":false,"fork":false,"pushed_at":"2024-10-30T16:27:13.000Z","size":533,"stargazers_count":4,"open_issues_count":22,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2025-03-29T20:44:05.982Z","etag":null,"topics":["backend","healthcare","java-21","jpa","mysql","querydsl","spring-ai","spring-boot-3"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/f-lab-edu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-06T12:57:54.000Z","updated_at":"2024-12-10T22:56:09.000Z","dependencies_parsed_at":"2024-10-29T19:51:35.934Z","dependency_job_id":null,"html_url":"https://github.com/f-lab-edu/EatToFit","commit_stats":null,"previous_names":["f-lab-edu/eattofit"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2FEatToFit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2FEatToFit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2FEatToFit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2FEatToFit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/f-lab-edu","download_url":"https://codeload.github.com/f-lab-edu/EatToFit/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250349059,"owners_count":21415914,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","healthcare","java-21","jpa","mysql","querydsl","spring-ai","spring-boot-3"],"created_at":"2025-02-08T07:15:30.500Z","updated_at":"2025-04-23T01:11:28.785Z","avatar_url":"https://github.com/f-lab-edu.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/419eeb62-c629-4e2d-937b-7bd9a89c63a9\" width=\"200px\" height=\"200px\"\u003e\n  \u003cbr\u003e\n  \u003cb\u003eEatToFit: 음식을 운동으로\u003c/b\u003e\n  \u003cbr\u003e\n  \u003cp\u003eEatToFit 서비스는 먹은 음식의 칼로리에 해당되는 운동 플랜을 생성해줌으로써 심리적 부담감을 낮춰줄 수 있는 서비스입니다.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\u003ch3\u003e🍔 개발 기간\u003c/h3\u003e\n24.08.06 ~ ing\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003ch3\u003e🍔 사용 기술\u003c/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eJava 21 (LTS)\u003c/li\u003e\n  \u003cli\u003eSpring\n    \u003cul\u003e\n      \u003cli\u003eSpring boot 3.3.2\u003c/li\u003e\n      \u003cli\u003eSpring Data JPA 3.3.2\u003c/li\u003e\n      \u003cli\u003eSpring AI 1.0.0 M2\u003c/li\u003e\n      \u003cli\u003eSpring REST Docs 3.0.1\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eQuerydsl 5.1.0\u003c/li\u003e\n  \u003cli\u003eJasypt 3.0.5\u003c/li\u003e\n  \u003cli\u003eJJWT 0.12.6\u003c/li\u003e\n  \u003cli\u003eDatabase\n    \u003cul\u003e\n      \u003cli\u003eRedis (Spring Data Redis 3.3.2)\u003c/li\u003e\n      \u003cli\u003eMySQL 8.3.0\u003c/li\u003e\n      \u003cli\u003eFlyway-MySQL 10.8.1\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eTest\n    \u003cul\u003e\n      \u003cli\u003eH2 2.2.224\u003c/li\u003e\n      \u003cli\u003eMockito 5.11.0\u003c/li\u003e\n      \u003cli\u003eRestAssured 5.5.0\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cbr\u003e\n\u003ch3\u003e🍔 실행 방법\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e로컬 MySQL에서 \u003ccode\u003eeattofit\u003c/code\u003e 데이터베이스를 생성해둡니다. (url을 다르게 하실 거라면 데이터베이스를 다르게 생성하셔도 됩니다.)\u003c/li\u003e\n\u003cli\u003ejasypt 환경 변수를 관리자에게 전달받습니다.\u003c/li\u003e\n\u003cli\u003e인텔리제이의 환경 변수 안에 1번의 값을 \u003ccode\u003eENCRYPT_KEY={VALUE}\u003c/code\u003e 형태로 넣습니다.\u003c/li\u003e\n\u003cli\u003e서버를 실행한 뒤, 아래 링크를 통해 OAuth 코드를 얻습니다.\u003c/li\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://kauth.kakao.com/oauth/authorize?response_type=code\u0026amp;client_id=a4b1f62f6ee5ff7808de3fbdc9fd025d\u0026amp;redirect_uri=http://localhost:8080/oauth/kakao\"\u003eKAKAO\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://accounts.google.com/o/oauth2/v2/auth?client_id=153893114774-fki8eqg7uiukvr0sqmk992odbb1l9rem.apps.googleusercontent.com\u0026redirect_uri=http://localhost:8080/oauth/google\u0026response_type=code\u0026scope=openid%20email%20profile\"\u003eGOOGLE\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003cli\u003eOAuth 코드 및 provider를 선택하여 \u003ccode\u003e/api/auth/login\u003c/code\u003e에 아래처럼 request body를 요청하여 액세스 토큰 및 리프레시 토큰을 획득하고, 해당 토큰을 Bearer 방식으로 보내 다른 API들을 이용합니다.\u003c/li\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e\n{\n    \"provider\" : \"kakao\", // kakao | google\n    \"code\": \"3번 과정을 거쳐 얻은 OAuth 기관의 코드\"\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/ol\u003e\n\n\u003cbr\u003e\n\u003ch3\u003e🍔 개발 과정\u003c/h3\u003e\n\u003ca href=\"https://devwriter.tistory.com/category/%E2%9C%A8%20%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/EatToFit%20%5BF-Lab%5D\"\u003e개인 블로그\u003c/a\u003e에 프로젝트 소개 및 기술적 고민 과정을 담았습니다.\n\u003cbr\u003e\n\u003cul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/52\"\u003e프로젝트 아이디어 소개\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/53\"\u003eAPI 설계 과정에서의 고민 (1)\u003c/a\u003e\u003c/li\u003e\n    \u003cul\u003e\n      \u003cli\u003e사진 업로드 방식을 PresignedURL로 한 이유\u003c/li\u003e\n      \u003cli\u003e이미지 분석 과정을 POST 대신 GET으로 한 이유\u003c/li\u003e\n      \u003cli\u003e커서 페이지네이션을 선택한 이유\u003c/li\u003e\n      \u003cli\u003e삭제 방식을 Soft delete로 한 이유\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/54\"\u003eAPI 설계 과정에서의 고민 (2)\u003c/a\u003e\u003c/li\u003e\n    \u003cul\u003e\n      \u003cli\u003eDELETE 시 200 OK와 204 No Content의 사용 시점 고민\u003c/li\u003e\n      \u003cli\u003ePresignedURL 획득 API를 통일한 이유\u003c/li\u003e\n      \u003cli\u003eChatGPT에게 전달할 쿼리 파라미터 값 선택 과정\u003c/li\u003e\n      \u003cli\u003eid 반환 방식과 response body 반환 방식 선택의 확실한 기준\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/56\"\u003eDB 설계 과정에서의 고민\u003c/a\u003e\u003c/li\u003e\n    \u003cul\u003e\n        \u003cli\u003eMySQL의 CHAR와 VARCHAR 사용 시점에 대한 고민\u003c/li\u003e\n        \u003cli\u003eMySQL의 정수형 타입을 각각 언제 사용할지에 대한 고민\u003c/li\u003e\n        \u003cli\u003eENUM의 단점 고민\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/57\"\u003e[Spring AI 🤖] 이미지를 분석하고 JSON 포맷팅을 해보자! (feat. EatToFit)\u003c/li\u003e\n    \u003cul\u003e\n        \u003cli\u003eBeanOutputConverter 클래스 소개 및 사용법 작성\u003c/li\u003e\n        \u003cli\u003eSpring AI 이미지 (url) 분석 요청 방법 작성\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/58\"\u003e[Spring \u0026 Github] Pull Request를 할 때 마다 테스트 커버리지를 확인하자 (feat. Jacoco)\u003c/li\u003e\n    \u003cul\u003e\n        \u003cli\u003eJacoco 학습\u003c/li\u003e\n        \u003cli\u003e프로젝트에 적용하며 마주친 트러블슈팅 (버전 이슈, 커버리지의 정확도 부족) 기록\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003cli\u003e\u003ca href=\"https://devwriter.tistory.com/59\"\u003e[EatToFit] 매개변수가 매우 많을 때에는 도메인 생성 로직을 어떻게 작성해야 할까? (feat. 빌더 패턴, DDD)\u003c/li\u003e\n    \u003cul\u003e\n      \u003cli\u003eFood 도메인 생성 시 많은 매개변수로 인한 문제 상황 개선\u003c/li\u003e\n      \u003cli\u003e매개변수가 많은 도메인을 생성할 시에 대한 본인만의 기준 확립\u003c/li\u003e\n    \u003c/ul\u003e\n\u003c/ul\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff-lab-edu%2Feattofit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ff-lab-edu%2Feattofit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff-lab-edu%2Feattofit/lists"}