회원가입, 로그인 기능이 있는 할일관리 백엔드 서버
서비스로서의 기능을 테스트
하기 위해 인수테스트를 구현했습니다.
사용자의 기능 사용 시나리오대로 테스트를 구현하기 위해 집중했습니다.
학습기록
로그인 시 토큰을 생성하고 응답헤더에 토큰을 넣어 반환하는 식으로 로그인을 구현했습니다.
이 과정에서 공통되는 검증로직을 ArgumentResolver추가로 파라미터화하여 중복 코드를 줄였습니다.
학습기록
위의 검증로직을 줄이는 과정에서 학습한 전략-어댑터패턴을 실제 비즈니스 로직내에 적용했습니다.
검색 필터를 인터페이스화하여 확장성을 확보했고,
일급컬렉션 내에서 필터 파라미터 값에 해당하는 필터를 찾아서 적용하게 작성하여 서비스 계층과 도메인 계층을 나누려 노력했습니다.
예외처리를 추상화하고 상세 예외를 상속, 적용하는 방식으로 예외를 분류하여 처리하였습니다.
예외 메세지를 표준화하여 예외상황발생시 일관된 정보를 받을수 있도록 작성하려 했습니다.
현재 테스트는 개별로 실행시 잘 작동하지만 전체 실행시 오류가 발생합니다.
이와 관련해 많은 검색과 고민을 했지만 정확한 방법을 찾지 못한 상태입니다.
현재 생각하고 있는 해결방안은
- @DirtiesContext 적용
- 각 테스트 이후 쿼리문으로 데이터 삭제
- 의도적으로 다른 데이터 삽입
- 회원가입을 할 수 있다
- username의 유효성을 검증한다
- password의 유효성을 검증한다
- 중복되는 username은 허용하지 않는다
- 로그인을 할 수 있다
- 로그인 성공 시 JWT 토큰을 발행한다
- 할 일 카드를 작성할 수 있다 @Login
- 제목, 내용을 저장한다
- 전체 할일 목록을 조회할 수 있다
- 특정 할 일 카드를 조회할 수 있다
- 할 일 카드를 수정할 수 있다 @Login
- 제목, 내용을 수정할 수 있다
- 할 일 완료처리를 할 수 있다 @Login
- 할 일 카드를 삭제 할 수 있다 @Login
- 할 일 카드에 댓글을 남길 수 있다 @Login
- 댓글을 수정할 수 있다 @Login
- 댓글을 삭제할 수 있다 @Login
- 조회시 필터를 적용한다 @Login
- 완료된 할일을 제외한다
- 사용자 이외의 작성자들의 할일을 제외한다
- 제목으로 조회한다
- 예외 발생시 400 상태코드와 메시지를 반환한다
- 인수테스트에서의 테스트 격리 해결
- 검색조건 기능 리팩토링
- N+1 문제 해결
- 페이징 처리
- github actions를 통한 테스트 자동화
step1
에서 해결하지 못했던 테스트 격리 해결.
@DirtiesContext를 먼저 적용해보았으나 테스트 속도가 너무 느려지는 단점을 발견.
이후 테스트에 사용된 테이블을 truncate하는 클래스를 구현하여 문제 해결.
전략-어댑터 패턴으로 구현하였던 검색조건 기능 개선.
QueryDSL의 동적쿼리를 이용, 검색 조건을 BooleanExpression으로 변환하여 where절에 각각 추가.
위의 검색조건 기능 리팩토링을 하면서 지연로딩한 객체가 반복문 내에서 초기화되며 N+1문제가 발생함을 인지.
fetch join으로 문제 해결
일대다 관계의 객체들을 fetch join하며 페이징 처리시 메모리에 '다' 쪽 컬렉션이 모두 적재됨을 발견.
id를 일반조인으로 가져오는 쿼리 + 가져온 id를 in절에 사용하는 fetch join쿼리로 문제를 해결했으나 유지보수가 힘들다 판단.
batch size 적용으로 해결
테스트 자동화에 대한 학습을 위하여 해당 프로젝트에 적용
.github/workflows에 yml파일에 pull request마다 테스트 자동화 설정 추가
좋아요 생성 api가 멀티쓰레드에서 동시에 호출되었을때 교착상태가 발생. todo- like의 연관관계를 제거하여 MySQL의 공유잠금-배타적 잠금의 교착상태를 해결. 이 후 synchronized, jpa의 낙관적 락, 비관적 락을 적용, 비교 후 비관적 락을 선택하였습니다. 하지만 db와 락에 대한 이해가 아직 부족한 것 같아 자신있게 해결했다고는 말하기 힘들 것 같습니다.