Giter Club home page Giter Club logo

todo-management's Introduction

프로젝트 설명

회원가입, 로그인 기능이 있는 할일관리 백엔드 서버

API 명세서

보러가기

ERD TABLE

Pasted image 20240206104436

프로젝트에서 집중한 점

인수테스트 작성

서비스로서의 기능을 테스트하기 위해 인수테스트를 구현했습니다.
사용자의 기능 사용 시나리오대로 테스트를 구현하기 위해 집중했습니다.
학습기록

JWT토큰으로 로그인 구현

로그인 시 토큰을 생성하고 응답헤더에 토큰을 넣어 반환하는 식으로 로그인을 구현했습니다.
이 과정에서 공통되는 검증로직을 ArgumentResolver추가로 파라미터화하여 중복 코드를 줄였습니다.
학습기록

디자인패턴 적용

위의 검증로직을 줄이는 과정에서 학습한 전략-어댑터패턴을 실제 비즈니스 로직내에 적용했습니다.
검색 필터를 인터페이스화하여 확장성을 확보했고,
일급컬렉션 내에서 필터 파라미터 값에 해당하는 필터를 찾아서 적용하게 작성하여 서비스 계층과 도메인 계층을 나누려 노력했습니다.

예외처리와 로깅메세지의 표준화

예외처리를 추상화하고 상세 예외를 상속, 적용하는 방식으로 예외를 분류하여 처리하였습니다.
예외 메세지를 표준화하여 예외상황발생시 일관된 정보를 받을수 있도록 작성하려 했습니다.

더 고민해볼 부분

테스트 격리

현재 테스트는 개별로 실행시 잘 작동하지만 전체 실행시 오류가 발생합니다.
이와 관련해 많은 검색과 고민을 했지만 정확한 방법을 찾지 못한 상태입니다.
현재 생각하고 있는 해결방안은

  1. @DirtiesContext 적용
  2. 각 테스트 이후 쿼리문으로 데이터 삭제
  3. 의도적으로 다른 데이터 삽입

기능 구현사항

  • 회원가입을 할 수 있다
    • username의 유효성을 검증한다
    • password의 유효성을 검증한다
    • 중복되는 username은 허용하지 않는다
  • 로그인을 할 수 있다
    • 로그인 성공 시 JWT 토큰을 발행한다
  • 할 일 카드를 작성할 수 있다 @Login
    • 제목, 내용을 저장한다
  • 전체 할일 목록을 조회할 수 있다
  • 특정 할 일 카드를 조회할 수 있다
  • 할 일 카드를 수정할 수 있다 @Login
    • 제목, 내용을 수정할 수 있다
  • 할 일 완료처리를 할 수 있다 @Login
  • 할 일 카드를 삭제 할 수 있다 @Login
  • 할 일 카드에 댓글을 남길 수 있다 @Login
  • 댓글을 수정할 수 있다 @Login
  • 댓글을 삭제할 수 있다 @Login
  • 조회시 필터를 적용한다 @Login
    • 완료된 할일을 제외한다
    • 사용자 이외의 작성자들의 할일을 제외한다
    • 제목으로 조회한다
  • 예외 발생시 400 상태코드와 메시지를 반환한다

리팩토링 사항

  1. 인수테스트에서의 테스트 격리 해결
  2. 검색조건 기능 리팩토링
  3. N+1 문제 해결
  4. 페이징 처리
  5. github actions를 통한 테스트 자동화

리팩토링 상세

인수테스트에서의 테스트 격리 문제 해결

step1에서 해결하지 못했던 테스트 격리 해결.

@DirtiesContext를 먼저 적용해보았으나 테스트 속도가 너무 느려지는 단점을 발견.

이후 테스트에 사용된 테이블을 truncate하는 클래스를 구현하여 문제 해결.

학습기록

검색조건 기능 리팩토링

전략-어댑터 패턴으로 구현하였던 검색조건 기능 개선.

QueryDSL의 동적쿼리를 이용, 검색 조건을 BooleanExpression으로 변환하여 where절에 각각 추가.

N+1 문제 해결

위의 검색조건 기능 리팩토링을 하면서 지연로딩한 객체가 반복문 내에서 초기화되며 N+1문제가 발생함을 인지.

fetch join으로 문제 해결

학습기록

페이징 처리

일대다 관계의 객체들을 fetch join하며 페이징 처리시 메모리에 '다' 쪽 컬렉션이 모두 적재됨을 발견.

id를 일반조인으로 가져오는 쿼리 + 가져온 id를 in절에 사용하는 fetch join쿼리로 문제를 해결했으나 유지보수가 힘들다 판단.

batch size 적용으로 해결

학습기록

github actions를 통한 테스트 자동화

테스트 자동화에 대한 학습을 위하여 해당 프로젝트에 적용

.github/workflows에 yml파일에 pull request마다 테스트 자동화 설정 추가

학습기록

더 고민해볼 부분

동시성 처리

좋아요 생성 api가 멀티쓰레드에서 동시에 호출되었을때 교착상태가 발생. todo- like의 연관관계를 제거하여 MySQL의 공유잠금-배타적 잠금의 교착상태를 해결. 이 후 synchronized, jpa의 낙관적 락, 비관적 락을 적용, 비교 후 비관적 락을 선택하였습니다. 하지만 db와 락에 대한 이해가 아직 부족한 것 같아 자신있게 해결했다고는 말하기 힘들 것 같습니다.

todo-management's People

Contributors

jinkshower avatar

Watchers

 avatar

todo-management's Issues

WebMvcTest 설정 환경 질문

  1. @webmvctest시 컴포넌트 스캔에서 제가 직접 빈으로 등록한 클래스들이 스캔되지 않아 ExternalConfig를 만들고 @wevmvctest시 @import로 해당 클래스를 로딩하도록 하였습니다. 다만 수동 등록 빈 중 userrepository를 주입받는 빈이 있어 config파일에 userepository를 override 하게 되었습니다..

좀 더 좋은 방법이 없을 지 궁금합니다

  1. DataJpaTest에서 생성일자대로 정렬조회 되는지 보기 위해 assert에서 객체 참조를 비교하는 방식을 해봤으나 실패하여 times()를 비교하는 방식으로 바꿨습니다. transaction환경에서 1차캐시에 save 되고 그걸 find하면 같은 참조를 받을 수 있는 걸로 아는데 작동되지 않는 이유가 뭘까요?

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.