
이미지 출처: 인프런 인스타
3차과 과제가 주어졌다
지난 과제에서 기능적, 비기능적 요구사항이 추가되었다.
기능
여행의 좋아요
여행 댓글
좋아요한 여행들 목록 반환
비기능
junit + mockito
jpa
restdocs
openapi
jwt
ERD는 이렇게 늘어났다
나는 jwt + security, 테스트 코드 작성을 담당했다
세션 과 토큰 방식의 차이는 아래와 같다.
| 세션 | 토큰 | |
| 정의 | 데이터베이스 서버에 저장되는 인증 방식 | 클라이언트 측에서만 저장되는 인증 방식 |
| 장점 | 세션 ID가 담겨 있는 쿠키가 외부에 노출되더라도 사용자의 정보는 담겨있진 않음 | 별도로 조회하는 시간과 리소스를 절약할 수 있으며, 모바일과 원활하게 결합하기 쉽습니다 |
| 단점 | 서버에서 클라이언트의 상태를 모두 유지하고 있어야 하므로, 클라이언트 수가 많으면 메모리나 DB에 부하가 심함 | 서버가 트래킹하지 않고, 클라이언트가 모든 인증정보를 가지고 있음 |
나는 이렇게 구현했다.
로그인 후 토큰 발급
쿠키 저장(쿠키 만료 시간 MaxAge> 토큰 헤더 만료 시간)
토큰이 만료된 것을 확인하면 쿠키 및 헤더 만료시간 연장
쿠키가 사라지면 로그아웃
refresh 토큰까지 구현하고 동작 로직을 바꾸려 했는데, 기간내 다른 로직과
계층별 테스트 검증하는데 시간분배를 잘 못해서 손대지 못했다.
기업 연계에서는 1달 넘게 시간 주니까 꼭 구현하려고 한다.
테스트 코드는 junit + mockito를 사용했다.
백기선 선생님의 강의를 보고 공부했다
https://www.inflearn.com/course/the-java-application-test/dashboard
public interface DummyObjectForService {
...
default UserLike dummyUserLike() {
return UserLike.builder()
.user(dummyUser())
.trip(dummyTrip())
.build();
}
...
}
여러 종류의 더미를 가져오거나 기본 값을 커스터마이징 할 수 있게끔 interface로 선언해보았다.
@ExtendWith(MockitoExtension.class)
class UserLikeServiceImplTest implements DummyObjectForController {
@Mock
UserLikeRepository userLikeRepository;
@Mock
TripRepository tripRepository;
@InjectMocks
UserLikeServiceImpl userLikeServiceImpl;
@Test
@DisplayName("유저가 좋아요한 여행지 조회")
void testBringUserLike() {
// given
given(userLikeRepository.findByUser(any())).willReturn(List.of(dummyUserLike()));
// when
var actual = userLikeServiceImpl.bringUserLike(dummyPrincipalDetails());
// then
var expected = List.of(dummyUserLikeGetTripsResponse());
Assertions.assertEquals(expected, actual);
then(userLikeRepository).should().findByUser(any());
}
.....
}
when() 은 헷갈릴 것 같아서 BDDMockito 를 사용해봤다
이번 과제에서 Mockito를 처음 써봤는데,
데이터베이스에 물리적으로 확인하지 않고도 검증을 할 수 있다는 점에서 좋았다.
다음 미니 프로젝트때 프론트 분들과 협업하는데, 사용자 시나리오에 따른
기능/비기능적 요소를 검증하는 데 쓰려고 한다.
끝


