GithubHelp home page GithubHelp logo

dnd-side-project / dnd-5th-5-backend Goto Github PK

View Code? Open in Web Editor NEW
22.0 3.0 2.0 723 KB

:koala: [ALA] 내가 모르던 나를 알아가는, 나를 표현하는 한 줄 SNS :koala:

Java 83.07% Dockerfile 0.04% HTML 16.44% Shell 0.45%
springboot gradle junit5 spring-data-mongodb kubernetes restdocs devops

dnd-5th-5-backend's Introduction

[ALA] dnd-5th-5-backend

"ALA" 프로젝트 소개

내가 모르던 나를 알아가는, 나를 표현하는 한 줄 SNS

아키텍처

architecture

[More] AWS DevOps Version
* 비용문제로 AWS -> GCP로 변경

architecture

기술스택

기술 버전
Google kubernetes Engine
Google Cloud Registry
Google Cloud Load Balancer
Docker
SpringBoot 2.5.2
Spring Rest Docs
Gradle 7.1.1
JPA
Junit5
MongoDB

Git 브랜치 전략

자세히 보기
참고) 우아한 형제들 기술 블로그 - 우린 Git-flow를 사용하고 있어요

  • main : 배포시 사용하는 브랜치
  • develop : 다음 출시 버전을 개발하는 브랜치
    • 다음 릴리즈를 위해 언제든 배포될 수 있는 상태
    • 하나의 기능 구현이 끝나면, develop 브랜치로 병합할 것
  • feature : 기능을 개발하는 브랜치
    • 기능을 완성할 때 까지 유지하며, 완성시 develop브랜치로 merge
    • feature는 이슈번호를 기준으로 생성
    • Ex) feature-2/example
  • release : 릴리즈를 준비하는 브랜치(QA)
  • hotfix : 배포 버전에서 생긴 문제로 긴급한 트러블 슈팅이 필요할 때 개발이 진행되는 브랜치

Branch Strategy

Commit Message 컨벤션

자세히 보기
  • Add : 클래스, 설정파일 등의 새로운 파일 추가
  • Feat : 새로운 기능 추가
  • Docs : 문서 수정
  • Test : 테스트 코드 작성
  • Chore : 기타 변경 사항(빌드 스크립트 수정 등)
  • Fix : 올바르지 않은 코드를 고친 경우
  • Update : 수정, 추가, 보완(주로 코드가 아닌 버전 업데이트)
  • Refactor : 코드의 리팩토링
  • Remove : 코드의 삭제
ex) Feat: jwt 토큰 발행 기능

코딩 컨벤션

자세히 보기

General, Clean Code

  1. 메소드의 네이밍은 의도를 분명히 알 수 있도록 작성해야 한다.
  2. 변수를 정의할 때에는 의미 있는 이름으로 정의해야 한다.
  3. 변수, 메소드는 CamelCase로 작성한다.
  4. 클래스의 첫 글자는 영어 대문자로 작성한다.
  5. 패키지명은 영어 소문자로 작성한다.
  6. 메소드는 동사가 앞에 와서 어떠한 행동을 하는지 명시한다.
  7. 컬렉션(List)는 복수형(members) 또는 컬렉션을 명시(memberList)해준다.
  8. 최대한 문자열의 하드코딩은 피해야 한다.(static String들을 관리하는 클래스을 사용)
  9. 불필요한 주석을 지양하고, 주석 대신 코드로 의도를 표현한다.
  10. 한 메소드의 길이가 너무 길어진다면, 내포된 여러 의도들을 각각의 메소드로 분리한다.

Structure, Testing

  1. Controller에서는 최대한 어떤 Service를 호출할지 결정하는 역할과 Exception 처리만을 담당한다.(비즈니스 로직이 포함되지 않도록 한다.)
  2. 하나의 메소드와 클래스는 하나의 목적을 두도록 한다.
  3. 메소드와 클래스는 최대한 작게 만든다.
  4. 서비스는 인터페이스로 작성하고 서비스를 구현하는 Impl 클래스를 정의하여 약한 결합력을 유지한다.
  5. Rest API의 반환형은 커스텀하게 정의한 ResponseDto를 사용한다.
  6. 데이터를 받고 보내는 객체는 무조건 엔티티가 아닌 Dto 혹은 일반 변수여야 한다.
  7. 엔티티와 Dto를 매핑할 때에는 Mapstruct의 Mapper를 이용한다.
  8. 컨트롤러에서 dto를 통한 validation을 하도록 한다.
  9. Controller와 Mapper는 반드시 개발 전에 테스트 코드를 작성해야 하며, Service 또한 테스트 코드를 작성하는 것을 권장한다.
  10. F.I.R.S.T. 규칙을 따르는 테스트코드를 작성한다.

출처: https://jobc.tistory.com/212, Clean Code(책)

dnd-5th-5-backend's People

Contributors

alertjjm avatar catnap421 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

dnd-5th-5-backend's Issues

[기능] DB 관리

편하게 DB에 단어를 관리할 수 있는 방법을 찾아야 한다.
(선택)

  • 관리 페이지 만들기
  • 엑셀 파일로 채울 수 있는 방법 모색하기

[기능] 키워드(단어) 선택

  • 회원 가입 시 문장을 N(4~5)개 랜덤하게 사용자에게 할당
  • 사용자에게 할당된 문장들 중에서 중복되지 않게 단어들을 제공(M개), 요청을 받을 때마다 중복되지 않게 단어들을 제공(M개)
  • Submit 요청을 받으면 통계에 반영

[설정] 필요한 라이브러리 설치

할 일

필요한 라이브러리를 설치한다.

  1. MapStruct
  2. DBunit (nosql은 지원하지 않기 때문에, DataMongoTest같은 다른 방법 적용해야 할 듯?)
  3. MongoDB - (추후에 데이터 정해지면 AWS로 마이그레이션)
  • mongoDB로 하게 될 경우, embedded Mongo 설치하기

[기능] WordList 중복 처리

  • 프론트엔드, 기획에서 요구할 경우, WordList에서 중복된 wordname을 제거하고 반환하도록 추가 구현이 가능함

[REFACTOR] Member Service의 분리

  • 현재 Member Service에 많은 메소드들이 들어가고 있음
  • Member Service를 세부적인 서비스(MemberCRUDService, MemberCardService, MemberSettingService 등등)으로 쪼개서 Responsiblity를 분산하는 리팩토링이 필요함
  • 우선순위 낮음

[기능] RestDocs 설정

현재 RestDocs관련 설정 중 build.gradle만 설정되어있는데, 그 이외 추가적으로 설정 필요

  • asciidoc template 작성
  • test 작성
  • github action 수정

[기능] 카드 단어 목록 제공 엔드포인트

사용자한테 할당된 카드들의 단어 목록을 제공하는 엔드포인트

  • 프론트엔드에서 갯수 전달 받기
  • 캐싱 기능 구현
  • 더보기 클릭 시, 이전에 제공한 단어 이후의 단어 제공

(사용가 지닌 카드들의 단어 -> 셔플 -> 캐싱 -> 갯수 입력받고 준 거를 제거)

(사용자ID, 카드 ID, 단어 ID : 갯수) 추후 생각

(알라카드의 objectid : 중분류의카테고리 : 단어스트링) 키 생성

[기능] JWT 토큰 생성 및 발행

  1. JWT 토큰
    1.1 소셜로그인 이후 얻을 수 있는 이메일, 닉네임 등의 정보로 사용자 정보 알아오기
    1.2 사용자 정보를 이용한 JWT 토큰을 발행하여 제공하기

[기능] 카드가 완성되지 않았을 때 로직 추가

  • 현재 카드가 완성되지 않아도 제공함
  • 카드가 완성되지 않은 기준을 정하고
  • isCompletable 메소드를 작성
  • isCompletable 메소드를 통해 분기하여 완성되지 않았을 경우 ???로 주고, Completed flag를 false 로 준다

[기능] 엔티티 설정

할 일

  1. 도메인을 파악하고, nosql 데이터 모델링을 해야 함
  2. 이후 엔티티를 설정하고, 폴더링할 것

[기능] 소셜로그인 기능 구현

  1. OAuth2를 이용하여 Google, Naver에 대한 소셜 로그인 구현
    1.1 Google Developer, Naver Developer에 Meme-Ala 등록
    1.2 Frontend와 협업하여 소셜로그인 가능하도록

[기능] 폴더링

폴더링을 어떻게 할 지, 지금 생각나는 방법에는 두 가지가 있다.

  1. 레이어 별로 묶기(ex: controller, service, entity 등)
  2. 도메인 별로 묶기(domain - 글, 사용자 등으로 나누고 이 안에 controller, service, entity 등)

1번 예시

2번 예시

[BUG] mongodb cannot use a complex object as a key value

image

백엔드에서 Map 관련 에러 발생. Complex Object를 Key로 사용한 것이 문제

해결방법

  1. AlaCard에 hashcode를 구현하면 해결될 것 같다
  2. AlaCard, CardSetting을 필드로 가지는 클래스를 만들어서 리스트로 넣자.
  3. 별도의 Configurer를 설정(구글링 결과)

결론
Map을 고수할 이유가 없기 때문에 2번 방식으로 해서 새로운 클래스를 리스트로 가지도록 변경

[기능] jwt 토큰을 Mock하는 방법 in Test

Member Controller이 제대로 동작하기 위해서는 jwt token을 이용하여 사용자 정보를 가져올 수 있어야 함.
이 때, jwt 토큰을 어떻게 mocking 할 수 있을 지 찾아서 config해주어야 함

[REFACTOR] Service Layer간의 종속성을 줄이자

  • Problem: Service 객체들(AlaCardService, MemberService, MemberCardService ...)들끼리 서로가 서로를 참조하는 과정이 있다. 특정 operation을 하는 데에 필요한 정보를 다른 서비스에서 가져오는 것이다. 그런데 이 과정에서 순환 참조 문제가 발생하였다.
  • 도메인에 딱 맞게 메소드가 들어가도록하여 서비스간의 종속성을 좀 끊어 리팩토링하여 순환참조를 우선 해결하였으나, 아직도 코드에 Service 끼리의 종속성이 보임
  • 이 경우, 잠재적인 순환참조 문제가 있으며, 스프링 상으로 어떠한 문제가 있을 지 찾아보았는데 나와 같은 고민을 한 블로그가 있었음

https://velog.io/@sumusb/Spring-Service-Layer%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

https://www.bottlehs.com/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EA%B5%AC%EC%A1%B0/

  • 결론: Service가 다른 Service를 호출하도록하면 안되고, 필요하면 Controller에서 여러 서비스로부터 정보를 받아와서 한번에 operation을 수행

[요청] Issue#11 Issue#10 해결 요망

0b20a28

위에서 jwt 토큰 기능 완료했으나
배포시 운용중인 MongoDB가 없어 프론트엔드에서 해당 API가 사용 불가

Issue#11가 해결되어야 추후 작업이 가능하며,
테스트 코드와 API 문서화를 위한 RestDocs 설정도 필요함(jwt 기능 관련 테스트 코드 현재는 미작성되어 있음)

[기능] 선택된 단어 제출 엔드포인트

선택된 단어들을 입력받을 수 있는 엔드포인트

  • 카운팅을 어떻게 할 지 생각해 봐야 함
  • 어떤 형식으로 넘겨받을 지 정해야 함(프론트엔드 이슈)

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.