Coder Social home page Coder Social logo

recipetory's Introduction

🥘 RECIPETORY

Recipe(레시피)와 Repository(리포지토리)의 합성어로, 회원들이 레시피를 공유하고 리뷰와 댓글을 통해 소통할 수 있는 레시피 공유 사이트입니다. 기본적인 소셜 인증, 컨텐츠에 대한 CRUD, 알림 기능 등이 존재합니다.

  • 자바 버전 : JAVA 17, Spring Boot 3.1.2
  • 서버 스펙 : vCPU 2코어, 1GB 메모리(GCP e2-micro) Scale-out 구성
  • 가용 TPS : 600

🎯 프로젝트 목표

  • 단순히 구현이 아닌 부하 테스트를 통해 트래픽이 몰리는 상황에서도 안정적인 서비스를 제공하는 것을 목표
  • RESTful한 API 설계
  • git flow 전략(참고)을 활용한 브랜치 관리
  • 객체지향적인 설계와 테스트하기 좋은 코드를 달성
  • 각 도메인 기능에 대한 단위 테스트 코드를 작성
  • 기획 및 설계부터 클라우드 서버 배포 자동화까지 어플리케이션 서비스가 제작되는 일련의 과정 실습
  • UI와 자바스크립트 API 호출 코드를 직접 작성하여 사용자와 협업자 관점에서 서버 코드 이용

❗️주요 기술적 이슈


📃 프로젝트 구조

⚙️ CI/CD 파이프라인 : 클라우드 서버로 GCP와 Vultr를 이용했습니다.

👩‍💻 사용자 요청 흐름

image

📮 컨텐츠 post시 시퀀스 다이어그램

image

💾 프로젝트 ERD

  • 레시피와 연관 관계를 맺는 재료(M:N), 태그(1:N), 단계(1:N), 리뷰와 댓글(1:N)
  • 유저와 연관 관계를 맺는 레시피(1:N), 팔로우 관계(M:N), 알림(M:N), 리뷰와 댓글(1:N)

🎆 프론트 페이지

  • api 요청에 axios, UI 구성을 위해 bootstrap을 사용했습니다.

recipetory's People

Contributors

buchukim avatar f-lab-bot avatar

Stargazers

Doyeovski avatar MIN UK JUNG avatar Dab avatar  avatar

Watchers

정종은 | Brian | JJ  avatar  avatar

recipetory's Issues

📊 조회수 기능

목표

  • 레시피 조회수 기능을 구현합니다.

고려 사항

  • 조회 단위를 어떻게 가져갈 것인지 .. 고민

📄 로그 포맷 관리

지난 리뷰에서 로그 레벨에 대해서 이야기 헀었죠?
로그 레벨을 통해 결국 모니터링 및 알람을 통해 개발자의 개입이 필요한 상황을 식별해낼 수 있었습니다.
여기서 더 나아가서, 로그는 단순히 레벨로만 나뉠 수 있는게 아닙니다.
로그로 찍히는 데이터를 모니터링해서 알람을 받기 위해서는 여러 서버에서 발생하는 알람들을 한곳으로 모아야해요.
그럴 때 정형화된 데이터가 아니라면 로그를 파싱하여 좀 더 의미있게 사용하기 어려울겁니다.
파싱하면 단순히 로그 레벨 뿐만 아니라 로그가 가진 값을 기준으로도 모니터링과 알람 대상이 되도록 만들 수 있을겁니다.

나중에 로그를 취합하는걸 고려한다면 로그를 JSON으로 만들고 필요하다면 정형화된 포맷을 가지도록 만들어보세요.

Originally posted by @f-lab-fi in #11 (comment)

✉️ 리뷰 및 댓글 CRUD 구현

목표

  • 레시피에 대한 리뷰 및 댓글 CRUD 진행합니다.
  • 리뷰에는 별점을 추가할 수 있습니다.

할 일

  • Comment 엔티티 구성
    • 댓글 CRUD
  • Review 엔티티 구성
    • 리뷰 CRUD
  • 리뷰의 "별점"을 통해 Recipe의 ratings를 업데이트해야합니다.

고려 사항

  • Review.ratings 계산에 대한 성능이슈?

⚙️ 테스트 / 배포 / 로컬 설정파일 분리

목표

  • 테스트, 배포, 로컬 환경에서의 application.yml 파일을 분리합니다.
  • Spring profile별 active할 빈 설정도 바꿉니다..

할 일

  • test
  • local
  • prod

고려 사항

  • 일단 설정파일 자체에 대한 공부

📂 데이터 캐시 적용하기

목표

DB connection이 필요한 사용자 Request마다 직접 쿼리를 날리는 것은 매우 비효율적입니다. 캐시 적용

할 일

  • Spring Data Redis 적용
  • cache 구현체 결정 (Lettuce? Redisson?)
  • 적절한 method에 캐싱

고려 사항

  • 어떤... 것에.. 캐시를.. 붙이는..것이..좋을지.. 공부..고민..

🧑‍🍳 유저간 팔로잉 기능 구현

목표

  • 특정 유저를 팔로우하는 기능 구현
  • 팔로우하는 유저가 레시피를 올렸을 때 '알람'을 받기 위함

할 일

  • Follow 연관 테이블 구성

고려 사항

📚 Recipe에 딸린 `Step`엔티티 구성

  • Step은 Recipe와 일대다 관계를 가집니다.
  • Step은 Recipe가 삭제될 때 같이 삭제됩니다.
  • 특정 Recip에 대한 Step의 개별 수정 및 추가가 가능합니다.

🤖 CI/CD 구성

목표

GitHub WebHook -> Jenkins + Docker를 사용한 지속적 통합 및 배포 환경을 구성합니다.
DB도 GCP로 올린 서버를 사용합니다! H2 -> MySQL

할 일

  • DB migration (MySQL 인스턴스)
  • jenkins build & deploy구성
    • WAS, jenkins 인스턴스 환경 구성
    • github webhooks
    • gradle build
    • docker build & push & pull

고려 사항

  • 다음 구조를 목표로 합니다.
    image

🍳레시피 업로드 기능

목표

  • 로그인한 사용자가 레시피를 업로드할 수 있는 기능을 구현합니다.
  • 레시피는 제목, 설명, 소요시간, 난이도, 기타 태그 등으로 이루어져 있습니다.
  • 한 개의 레시피에 한 개 이상의 "단계"가 존재합니다.
  • 레시피와 연관된 "재료" 관계가 존재합니다. 이미 이름이 존재하는 재료가 매핑되고, 없을 경우 새로운 재료 데이터가 생성됩니다.

할 일

  • 레시피와 단계로 이루어진 애그리거트 구성
    • Recipe
    • #7
  • 레시피 업로드 기능
    • 업로드한 사용자와 Member - Recipe 관계를 맺도록 구성
    • 이름이 일치하는 Ingredient가 이미 존재할 경우 매핑하고, 없을 경우 새로운 데이터 생성
    • Step이 한 개 이상 존재해야함
  • 난이도, 태그 항목에 대한 enum 클래스 구성

고려사항

  • 레시피 엔티티와 연관된 단계, 재료 엔티티를 어떻게 구성할 것인지 고민
  • 추후 레시피와 단계 각각에 추가될 사진 업로드 기능에 대한 고민
  • 업로드된 데이터 필드와 연관관계 각각에 대한 적절한 validation 고민

🏷️ 레시피 태그 기능 추가

목표

  • 레시피에 붙을 수 있는 태그 기능을 추가합니다.
  • 태그는 카테고리 역할도 하며, "해당 카테고리" 혹은 "해당 태그가 붙은" 레시피를 검색하기 위한 기능을 수행합니다.

할 일

  • Tag 엔티티 구성
  • Recipe와의 연관관계 추가
  • Tag에 대한 조회

고려 사항

  • Tag를 DB에 저장되는 엔티티로 본다면 레시피와의 다대다 연관관계를 갖게 되는데..
  • 그렇다면 RecipeTag라는 연관 테이블을 따로 빼는게 맞는지? 컬렉션 밸류 값으로 두는게 맞는지?

💾 DB 인덱스 걸기 / ES 사용

목표

n0만개 데이터가 쌓인 프로젝트의 레시피 검색 기능을 개선합니다.

할 일

  • MySQL 인덱스에 대한 공부
  • 인덱스 걸기 전 / 후의 get 응답시간 비교
  • title 검색에 대한 개선을 위해 ES 솔루션 사용
    • ES 클러스터 구성
    • 데이터 쌓기 (ㄱ-)...

고려 사항

  • MySQL, Elastic Search에 대한 공부를 더 해야할 것 같습니다.

💿 부하 상황에서 데드락 타파하기

목표

초당 30회 이상의 요청이 들어왔을 때, @TransactionalEventListener + @Transactional(propagation = REQUIRES_NEW)에서 하나의 return 과정에 2개의 DB 커넥션이 필요하여 connection deadlock이 발생하는 상황을 해결합니다. 부하 테스트 과정 블로그 글입니다.

할 일

  • 어떤 해결방안을 사용하는 것이 좋을지?
  • hibernate에서 사용하는 hikariCP에 대한 공부

고려 사항

  • MQ를 사용하는 것이 일단은 좋을 것 같다는 생각! 알림을 보내는 것은 필요한 일이지만 각 과정에 횡단적으로 일어나는 일이므로, eventPublisher는 계속 사용하되 해당 publisher가 mq에 메세지를 쌓는 일을 하도록 구성하면 좋겠네요?

🔀 다중서버 + 로드밸런싱 적용 (nginx)

목표

ES + redis를 사용함에 따라, WAS 자체가 병목이 되고 있습니다. 톰캣 서버를 늘려서 스루풋을 늘려봅시다!!
현재) 초당 150건 요청이 1분을 넘어가면 timeout이 발생합니다..
image

할 일

  • recipetory 어플리케이션 서버를 여러개 구축
  • nginx instance 구축, 로드밸런싱 설정

공부해볼것

  • 엔진엑스가 어떻게 로드밸런싱을 하는지 / 아파치와의 차이점
  • 다중 서버에서 세션 불일치 문제를 해결해봅시다.

🔍 Basic 검색 기능 구현

목표

유저, 레시피에 대한 Search기능을 만듭니다.

할 일

  • 유저 조회
  • 레시피 조회

고려 사항

  • ES를 통한 성능 개선 & 기능 확장
  • 레시피의 경우 @OneToMany연관 관계가 여러개 있는데 이를 어떻게 해야 효율적인 처리가 가능할지?

🔔 알림 기능 추가

목표

특정 유저를 팔로우하는 유저들에게 알림을 보내는 기능을 추가합니다.

할 일

  • Notifcation 엔티티 구성
    • sender, receiver, isRead, notificationType 등

고려 사항

  • 나중에 MQ같은걸 도입할 경우를 생각

🥬 재료 기본 기능 구현

목표

  • 재료 업로드 및 검색 기능 구현
  • 재료는 unique한 이름 필드를 가지며, 이름으로 검색 가능
  • 이름으로 검색했을 때, 일치하는 재료가 없을 경우 재료 자동 생성

할 일

  • Ingredient Entity
  • Ingredient 기능 설정
    • create
    • read(조회)

고려 사항

  • 차후에Recipe와의 다대다 연관관계를 맺습니다

🖼️ 기본적인 프론트 페이지 작성

목표

bootstrap + xhr(혹은 fetch api)를 이용한 기본적인 프론트 html 코드를 생성합시다..

할 일

  • index.html

고려 사항

  • 아마 프론트 전용 어플리케이션을 따로 띄우지 않을까? 싶긴 한데.

👩‍🍳 OAuth 기반 회원가입 및 로그인 기능 구현

목표 : 회원 가입 및 로그인 기능 구현

  • "recipetory"의 레시피는 방문자 모두가 볼 수 있지만, 레시피를 공유하거나 리뷰/댓글 등을 남기기 위해선 회원 권한이 필요합니다.
  • "recipetory"는 기본적으로 OAuth2 기반 인증만을 지원합니다.
  • 닉네임, 프로필 사진, 자기소개 문구 등을 프로필 정보로 가집니다.
  • ID는 회원 가입시에 필수로 지정해야하고, 나머지 프로필 정보는 회원 본인이 원할 때 언제든 수정할 수 있습니다.
  • 일단은 구현이 간단한 세션 기반 인증을 사용합니다.

할 일

  • 회원(User) 애그리거트 구성
  • 회원 동작 구성
    • 회원 가입 : 중복된 ID 검사
    • 프로필 수정 : 로그인된 본인의 회원 정보만 수정 가능
  • OAuth2 Resource Server 연동
    • google
    • naver
    • kakao

고려 사항

  • Security 관련한 공부 : 인증과 인가, Spring Security
  • OAuth가 무엇이고, 어떻게 동작하는지에 관한 공부
  • 토큰기반 vs 세션기반 인증에 대한 차이 공부

📑 같은 region에서 cache, 다중서버 부하 테스트

목표

#36 에서 엔진엑스와 레디스가 도쿄 리전에 있는 바람에, 기존에 캐시와 다중 서버를 이용했던 환경과 비교하기 어려웠습니다...
때문에 새로운 클라우드 환경에서 같은 region에 모든 인스턴스를 띄우고 부하 테스트를 다시 실행해볼 예정입니다 !!
클라우드 비용 때문에 치고빠지기가 중요할 것 같습니다?

할 일

  • https://www.vultr.com
  • WAS, MySQL, Nginx, kafka, ES, Redis 인스턴스 구축
  • post, cache get, get 차이 관찰

🎮 컨트롤러 테스트 코드 작성

목표

mockMvc를 이용한 컨트롤러 테스트를 작성 시도해봅니다. 대부분의 컨트롤러 코드가 로그인된 유저에 대한 @LogInUser parameter가 있는데, 이와 관련한 공부도 진행합니다!

할 일

  • HttpSession, argumentResolver가 달린 컨트롤러의 테스트 방법 공부
  • mocking service

고려 사항

  • 통합 테스트시에 유저 auth를 지정하는 방법도 있었는데, 이것도 나중에 공부합니다!

🔖 레시피 북마크 기능 추가

목표

  • 유저가 레시피를 북마크할 수 있는 기능을 추가합니다.
  • Recipe - User는 다대다 관계를 가집니다.
  • 몇 명의 유저가 레시피에 북마크를 표시했는지 확인할 수 있습니다.

할 일

  • BookMark 연관 엔티티와 연관관계 셜정
  • User 측에서의 BookMark 생성 / 조회 / 삭제 기능
  • User 측에서 자신이 북마크한 레시피를 볼 수 있는 기능

고려 사항

  • 북마크 수, 조회수에 대해 레시피의 순위를 매기는 기능을 추가할 예정인데 많은 데이터에 대한 sort 기능 구현에 공부?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.