Code Monkey home page Code Monkey logo

music-everywhere's Introduction

music-everywhere

취미 연주자들을 위한 플랫폼

취미로 악기를 다루다보면 다른 사람과 함께 연주하고 싶어집니다.
이 서비스는 취미로 음악을 즐기는 것의 보편화를 위해 연주자들 간의 커넥션을 잇는 것을 목표로 합니다.

네이버 밴드와 같이 그룹 단위의 커뮤니티 서비스를 개발합니다.

✅개발 시 신경 쓴 것들

- 문서를 통한 커뮤니케이션 실천하기

  • API 문서 작성하기 --> 문서 링크
  • 카프카 토픽 네이밍 규칙 --> 문서 링크
  • 발생했던 문제, 장애에 대해 원인 -> 해결과정 -> 결론 형식으로 정리하여 동일한 문제 발생을 막기

- 객체 지향 프로그래밍에 대해 고려하여 개발하기

  • 추상화 비용에 대해 고려하기

- 기술 적용 시 Trade-off를 고려하여 적용 기술 선택하기

- 가독성 좋은 코드(리뷰어가 읽기 좋은 코드)를 작성하기 위해 노력하기

- 좋은 테스트 코드를 작성하기 위해 노력하기

  • 효율적인 test fixture 재사용에 대해 고민하기

✅사용 기술 및 개발 환경

image

✅서비스 아키텍처

image

✅Application UI

image 카카오 오븐 에서 볼 수 있습니다.

✅Database ERD

image

✅프로젝트를 진행하며 고민한 TOPIC

1. 트랜잭션 전파 전략과 UnexpectedRollbackException 발생

2. 마이크로서비스에 API Gateway 패턴 도입하기

3. Facade 패턴을 도입해 순환 의존 문제 해결 / 복잡한 의존 관계 개선하기

4. 동시성 문제 발생과 해결 과정

5. Consumer 도입으로 냄새나는 switch 구문 리팩토링하기

6. Jenkins build strategy 적용기 - 배포 프로세스를 마이크로서비스별로 실행되도록 설정해보자!

7. 커서 기반 페이징을 선택한 이유 (feat. 성능 테스트 with JMeter)

8. 마이크로서비스 간 통신을 진행하며 한 고민들(분산 트랜잭션, 이벤트 기반 아키텍처)

music-everywhere's People

Contributors

hyeok-kong avatar f-lab-bot avatar

Stargazers

chanhyeoKingOfDev avatar JEON TAEHEON avatar Dr.meteor avatar 유진 avatar

Watchers

 avatar  avatar chanhyeoKingOfDev avatar

music-everywhere's Issues

공통 로직 추출

구현 사항

각각의 마이크로서비스에 존재하는 공통된 로직을 공통 모듈로 추출합니다.

구현 내용

  • 공통된 예외 및 예외처리 로직 추출
  • JWT 분석 등 utility class 추출
  • entity 클래스에 공통 사용되는 BaseTimeEntity 추출

회원 CRUD 추가

개발 내용

  • API 문서 제작 (openAPI Spec, Swagger)
  • repository, service, controller 구현

ETC

  • 핵심 비즈니스 로직 개발 전 간단한 회원 도메인 개발
  • 인증, 인가 등의 부가 로직은 이후 별도의 이슈로 다룰 예정

설정 정보 분리하기

개발 내용

  • spring cloud config 를 도입해 여러 마이크로서비스에 분포되어 있는 설정 정보를 모아서 관리합니다

Jenkins 적용

개발 내용

Jenkins를 통한 CI / CD Pipeline 구축

그룹 인원제한 기능 개발

구현 기능

그룹 당 가입 가능한 인원을 제한합니다.

개발 코멘트

  • 기본 제한을 10명으로 하며, 변경이 가능하도록 설계할 예정입니다.
  • 다른 사람이 보기 쉬운 코드를 작성하기 위해 노력합니다.

API 문서

API 문서 작업

  • 마이크로 서비스의 모든 API를 통합해 관리합니다.
  • API 문서는 OpenAPI Spec을 지키며 Swagger 를 통해 작성합니다.
  • git을 통해 코드와 함께 버전 관리를 진행합니다.

목표

  • 기능 개발 / 변경 발생 시 문서를 업데이트합니다.
  • 필요한 정보를 누락 없이 작성하여, 문서만 보고도 front 개발이 가능하게끔 하는 것을 목표로 합니다.

불필요한 테스트 제거

개발 내용

  • 불필요한 테스트 메소드를 제거합니다
  • ex) 동시성 테스트를 위한 테스트 메소드 등

그룹 가입 기능 구현

구현 기능

그룹 가입 flow에 따른 기능들을 구현합니다.

  1. 그룹 가입 기능
  2. 그룹의 Join Condition이 수락 후 가입이라면 request 생성
  3. 이미 가입한 경우에 대한 처리

개발 시 신경 쓸 것들

  • 테스트 중 실패 케이스를 생각
  • 객체 지향을 고려해서 프로그램 작성

그룹 생성 기능 구현

개발 내용

  • 새로운 그룹을 생성하는 API 개발

개발 시 신경써야 하는 것들

  • API 문서화
  • 객체 지향적인 프로그램 제작을 위한 고민
  • 좋은 테스트를 작성하기 위해 노력

게시글 조회 기능 개발

개발 내용

  • 게시글 조회 API 개발

개발 시 신경쓸 내용

  • N+1과 같은 슬로우쿼리 경계하기
  • 동적 쿼리를 위한 QueryDSL 도입하기
  • 커서 기반 페이징 적용 후 성능 테스트해보기

결제 서비스 구현

개발 내용

  • 비즈니스 모델(그룹 최대 인원 수 증가)를 실현하기 위한 결제 서비스 구현
  • 서비스 간 통신에 kafka 도입 고려중

임시 jwt 기능 리팩토링

개발 내용

  • 무조건 1을 반환하는 기존의 기능을 수정합니다.
  • 변경 사항 : header의 userid 를 읽어 반환
  • 사유 : 그룹 가입 테스트를 위함

그룹 가입요청 처리 기능 개발

구현 기능

생성된 가입 요청을 처리하는 기능을 개발합니다.

  1. 가입 요청 조회 기능
  2. 가입 승인 / 거절 기능

개발 코멘트

  • 가입 요청 처리는 그룹의 MANAGER만 가능합니다.

기술부채 목록

필요 작업

  • 1. API 경로 규칙 변경하기
  • 2. MSA 필수 구성요소 추가하기 (Circuit breaker, etc..) -> 별도의 이슈로 관리
  • 3. 서버 설정 분리하기
  • 4. human error 발생이 쉬운 @GroupOnly 어노테이션 사용 방식 수정하기
  • 5. kafka를 통해 전달되는 이벤트 규칙 설정하기

계층 구조 변경하기

문제 사항

  • 현재 Service 내부에서 JwtReader를 직접 사용하는 클래스들이 존재합니다.
  • 계층 경계가 허물어져 통ㅎ바 테스트 작성에 어려움을 겪고 있습니다.

변경 사항

  • Controller 계층에서 JwtReader 사용하도록 변경
  • 변경에 따른 단위 테스트 재작성

Jwt를 통한 인증 구현

구현 기능

JWT를 이용한 인증을 구현합니다.

user-service

  • 회원을 확인하고 토큰을 발급합니다.
  • refresh 토큰을 이용해 토큰 재발급 요청을 받습니다.

common-library

  • 토큰을 검증합니다.

게시판 기능 구현

구현 기능

  • 게시글 엔티티 구현
  • 게시판 CRUD 구현
  • 권한 관리 구현

개발 시 신경 쓸 것들

  • 효율적인 테스트 코드 작성하기
  • 계층 구조를 고려하여 개발하기
  • 리뷰하기 편한 코드를 작성하기 위해 노력하기

도커 이미지 생성

개발 사항

도커 이미지 생성을 위한 Dockerfile 생성

개발 외 사항

  • 도커 기본 원리 공부
  • MSA 환경에서의 컨테이너 관리에 대한 고려 필요

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.