Skip to main content

Command Palette

Search for a command to run...

3차 토이프로젝트 후기

[패스트캠퍼스X야놀자: 백엔드 부트캠프 1기]

Updated
2 min readView as Markdown
3차 토이프로젝트 후기
O

SW엔지니어 호소인

이미지 출처: 인프런 인스타

3차과 과제가 주어졌다

지난 과제에서 기능적, 비기능적 요구사항이 추가되었다.

기능

  • 여행의 좋아요

  • 여행 댓글

  • 좋아요한 여행들 목록 반환

비기능

  • junit + mockito

  • jpa

  • restdocs

  • openapi

  • jwt

ERD는 이렇게 늘어났다

나는 jwt + security, 테스트 코드 작성을 담당했다

세션 과 토큰 방식의 차이는 아래와 같다.

세션토큰
정의데이터베이스 서버에 저장되는 인증 방식클라이언트 측에서만 저장되는 인증 방식
장점세션 ID가 담겨 있는 쿠키가 외부에 노출되더라도 사용자의 정보는 담겨있진 않음별도로 조회하는 시간과 리소스를 절약할 수 있으며, 모바일과 원활하게 결합하기 쉽습니다
단점서버에서 클라이언트의 상태를 모두 유지하고 있어야 하므로, 클라이언트 수가 많으면 메모리나 DB에 부하가 심함서버가 트래킹하지 않고, 클라이언트가 모든 인증정보를 가지고 있음

나는 이렇게 구현했다.

  1. 로그인 후 토큰 발급

  2. 쿠키 저장(쿠키 만료 시간 MaxAge> 토큰 헤더 만료 시간)

  3. 토큰이 만료된 것을 확인하면 쿠키 및 헤더 만료시간 연장

  4. 쿠키가 사라지면 로그아웃

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를 처음 써봤는데,
데이터베이스에 물리적으로 확인하지 않고도 검증을 할 수 있다는 점에서 좋았다.
다음 미니 프로젝트때 프론트 분들과 협업하는데, 사용자 시나리오에 따른
기능/비기능적 요소를 검증하는 데 쓰려고 한다.