Conversation
- BusinessException class 생성 (RuntimeException) - ErrorCode interface 생성
- findById 추가 - update 추가
- insert 구현 - findAllByUserId 구현
c453b4e to
7033b43
Compare
- Charge 생성 test code - Use 생성 및 validation test code - GetUserPoint 생성 및 validation test code
| if (userId == null) { | ||
| throw new BusinessException(PointErrorCode.INVALID_USER_ID); | ||
| } |
There was a problem hiding this comment.
validatior 객체를 만든다면 이 부분에서 호출하는 형식이 되는 걸까요?
There was a problem hiding this comment.
생성자로 만든다면 힘들수도 있지만, 제가 옛날에 봤던 코드는 validator를 함수 매개변수로 전달해서 그 함수 안에서 해당 validator를 호출하는 형식이었습니다.
예를 들면 checkUserId(UserValidator validator) { validator.checkUserId(userId); }
이런식이였던 것 같습니다. 방법은 다양하겠지만 command를 bean으로로 만들수는 없으니 위 방법으로 해결한 것 같았습니다.
| final var userPoint = pointRepository.findById(command.userId()) | ||
| .orElseThrow(() -> new BusinessException(PointErrorCode.USER_POINT_NOT_FOUND)); |
There was a problem hiding this comment.
userPoint를 못찾았을 때의 에러처리를 JPA 컨벤션 처럼 find가 아닌 get이라는 prefix로 repository에 메소드를 만들어서 관리하는 게 좋았을 지 의문입니다.
| // NOTE: Test 간의 의존성을 없애기 위해 DirtiesContext를 사용합니다. | ||
| @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) |
There was a problem hiding this comment.
테스트간의 순서에 대한 의존성을 주기 싫어서 @DirtiesContext 어노테이션을 사용했습니다.
데이터를 지우는 메소드가 있었으면 @BeforeEach를 썼을 것 같은데 DirtiesContext은 빈을 새로 띄우는 걸로 알고 있어서 비용에 문제가 있을 것 같은데 좋은 패턴일지가 의문입니다.
There was a problem hiding this comment.
저도 데이터 지우는 메소드가 없어서 조금 고민했었는데
@ BeforeEach 를 사용해서 유저를 세팅하고 테스트가 시작될 때마다 동일한 초기 상태를 가지게 해봤습니다.
@ DirtiesContext 이건 몰랐었는데 하나 배워갑니다!
There was a problem hiding this comment.
저도 같은 고민을 했는데, DirtiesContext는 컨텍스트를 다시 띄워서 전체 테스트 실행 속도가 느려진다고 알고 있어서, @beforeeach에서 ReflectionUtils를 사용해서 UserPointTable의 내부를 비우는 식으로 작성했습니다. 이건 저희가 받은 프로젝트의 제한사항 때문에 위처럼 가져가도 크게 상관없지 않을까 생각되네요
| import org.springframework.boot.test.context.SpringBootTest; | ||
| import org.springframework.test.annotation.DirtiesContext; | ||
|
|
||
| @SpringBootTest |
There was a problem hiding this comment.
통합 테스트를 작성할 때 classes 를 지정해주는게 좋을까요?
예를 들어 서비스의 통합테스트의 경우
@SpringBootTest(classes = {PointService.class, PointRepository.class, PointHistoryRepository.class})
이런식으로 명시를 해주는게 큰 의미가 있을 지 의문입니다.
서비스의 의존성이 바뀔때마다 해당 구문이 수정이 되어야해서 유지보수 측면에선 안좋지않을까 싶은데 성능적으로 유의미할지도 궁금합니다.
|
|
| INVALID_AMOUNT(HttpStatus.BAD_REQUEST, "유효하지 않은 금액입니다."), | ||
| INVALID_UPDATE_MILLIS(HttpStatus.BAD_REQUEST, "유효하지 않은 업데이트 시간입니다."), | ||
| ; | ||
|
|
변경 사항
포인트 기능 구현
포인트 기능 테스트 코드 작성
STEP1 요구사항 일부 구현
리뷰 포인트
TODO
ps. force push 의 경우 기존에 작업중인 브랜치를 다시 master 기준으로 되돌려서 작업하는데 사용했습니다. (갈아 엎었어요 ㅠ)