GithubHelp home page GithubHelp logo

twitch-clone's Introduction

twitch-clone

Wiki

서버 실행 시 주의사항

default

  • 환경 변수로 비밀번호 입력이 필요합니다.
    • --spring.datasource.password={password}

local

  • local DB 정보 입력이 필요합니다.
    • DATASOURCE_URL
    • DATASOURCE_USERNAME
    • DATASOURCE_PASSWORD

APM 실행

Problem Solving

트랜잭션 설계

image

  • 이 모델은 Choreographed SAGA 패턴과 유사합니다.
    • 메시지 브로커 활용 대신 트랜잭션을 잡고 있는 점이 달라 장애 처리는 비교적 용이하지만, 복수 개의 서비스에 연쇄적인 트랜잭션이 생기고 있어 관리와 추적이 힘들다는 단점이 같습니다.
    • 반면 2PC 패턴은 트랜잭션의 관리 주체가 한 곳으로 집중되어 트랜잭션 관리가 용이합니다.
  • 반면 2PC 패턴은 트랜잭션의 관리 주체가 한 곳으로 집중되어 트랜잭션 관리가 용이합니다.
  • api-module만이 Spring 의존도를 가지며 그 외 module은 도메인 로직을 가지도록 설계했습니다.
    따라서 usecase에 따라 각 module에서 생성된 결과를 api-module에서 영속시킵니다.
  • 사이드 프로젝트이기에 복잡도가 높지 않기에 로직의 추가가 api-module에 영향을 주어도 괜찮다고 생각했습니다.

아마 실무였다면 트랜잭션 타임을 줄이기 위해 MQ를 도입하고 Orchestration Saga 패턴을 고려했을 것 같습니다.
하지만 사이드 프로젝트에 MQ까지 고려하는 것은 힘들었고, 도메인 분리와 모듈 프로그래밍에 집중하기 위해 2PC 패턴의 구성을 선택했습니다.

좀 더 많은 예시와 생각은 블로그를 참고 부탁드립니다. 분산 트랜잭션 설계하기 (초급)

twitch-clone's People

Contributors

dolilu avatar hyune-c avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

twitch-clone's Issues

어드민 기능 구현

  • 스트리머 등록을 승인, 거절할 수 있다.

    • 스트리머 요청 리스트를 확인할 수 있다.
    • 스트리머 등록 요청을 승인할 수 있다.
    • 스트리머 등록을 거절할 수 있다.
  • 모든 회원 정보를 조회 할 수 있다.

    • 비밀번호는 조회할 수 없다.
    • 조회 옵션은 이메일, 닉네임, 유저 상태가 있다.
  • 모든 회원을 정지시킬 수 있다.

  • 스트리머의 스트리밍 권한을 정지시킬 수 있다.

  • 모든 회원의 비밀번호를 초기화할 수 있다.

CI/CD 를 위한 Infrastructure 구성

AWS or NAVER Cloud 를 이용합니다.

  • CI Server 설치
  • 프로젝트에 Detekt 환경설정
  • Github actions 에 detekt 와 test 연동해서, PR 단계에 사전 실행하도록 환경 설정하기
  • PR merge 후 alpha 서버에 자동 배포

PR 생성했을 때, Github checks 를 모두 돌린 후, Code review 를 가능하게 하고 싶음

CI/CD를 하기 위한 Infrastructure 구성

Naver Cloud에 젠킨스를 통하여 배포

  • Naver Cloud 인프라 환경 구축
  • CI Server 설치
  • PR merge 후 서버에 자동 배포
  • Mysql Server 설치 및 url 소스 반영

프로젝트 초기화

  • 프로젝트 local 기동
  • module-user 구현
    • user, streamerUser 구현
  • module-core 구현
    • log4j2 설정
  • branch 정리
  • main branch protection

유저 인터페이스 생성 및 도메인 모델 구조 변경

  • 유저 인터페이스 생성을 통한 도메인 모델 구조 변경
    • User -> NormalUser Rename
    • User Interface 생성 및 인터페이스 확장을 통하여 NormalUser 생성
    • User Interface 확장하여 StreamerUser 생성
    • User Interface 확장하여 AdminUser 생성

API에서의 usecase 사용 고민 작성

  • 하나의 api는 기능적으로 복수개의 module 연동이 필요할 수 있다.
  • 이것을 단일 모듈에서 위임하여 해결하는 방법이 있고
    • usecase의 덩치가 커진다.
  • 또는 controller에서 복수개의 usecase를 조합하여 사용할 수 있다.
    • 변경에 강한 대신 transacation의 정의가 모호해 진다.
  • 본 프로젝트에서는 controller에서 복수개의 usecase를 조합하여 사용하는 것을 선택했습니다.
  • 이 생각을 README에 기록합니다.

module-api 초기 세팅 - 추가 작업

  • exception이 너무 상세하다. 증류탑을 세운다는 생각으로 조절해보자.
  • controller의 annotation 표준 정하기
  • detekt을 root 레벨에서 정상 작동하도록 수정
  • 샘플 API 정상화
    • module-api의 일부를 수정해야함

image

스트리머 회원 기능 구현

  • BFF를(Backend for Frontend) 고려한 흐름도 작성
    • 스트리머 회원
  • 도메인 기능 구현
    • 스트리머 회원 등록
    • 스트리머 회원 조회
    • 스트리머 고유 정보 수정

상품 판매 기능 추가

  • 스트리머 상품 판매 기능 추가
    • 상품 판매 - Table, Entitiy 생성
    • 상품 판매 - JPA lock mode

module-api 초기 세팅

  • module-api 생성
  • spring-boot-starter-web 설정
  • 샘플 api 구현
  • 표준 에러 객체 구현
  • slf4j log 설정

프로젝트 전체 코드 리팩토링

로직 변경은 없는 코드 리팩토링 입니다.

  • apply 적용을 통한 코드 간소화
  • TestUserGenerator 개선
    • Test에 Faker적용
  • repo영역까지 연속적으로 사용되는 Query를 web영역에서만 사용하게 분리한다.
  • web영역의 usecase를 적당히 패키지로 묶는다.
  • UseCase -> Usecase
  • Service -> UseCaseImpl

일반 회원 기능 구현

  • BFF를(Backend for Frontend) 고려한 흐름도 작성
    • 미인증 회원
    • 일반 회원
  • 도메인 기능 구현
    • 회원 등록
    • 회원 조회 - 보류
    • 회원 정보 수정
    • 비밀번호 수정
  • 커스텀 예외 구현
    • 존재하지 않는 엔티티

자잘한 버그 수정

  • SubscribeStreamerUserController 잘못된 API 수정
  • 사용되지 않는 Bean 파라미터 제거

JPA 적용

JPA 적용을 통하여 mysql에 데이터 저장

  • JPA 환경 구축
  • NormalUser 관련 기능 JPA적용
  • StreamerUser 관련 기능 JPA적용
  • AdminUser 관련 기능 JPA적용

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.