Skip to content

2021 07 25 회의록

Jinhong edited this page Aug 16, 2021 · 1 revision

1. 백엔드 역할 분담 회의

기능구현 팀

  • 마크 - 프로필 수정, 유저 검색
  • 코다 - 게시물 좋아요 추가/삭제
  • 다니 - 게시물 수정/삭제, 깃헙 통계 API 조회

리팩토링 팀

  • 손너잘
  • 케빈

2. 패키지 구조

test
  ㄴ unit
     ㄴ post
        ㄴ domain
        ㄴ service
        ㄴ controller
     ㄴ user
     ㄴ comment
     ㄴ tag
     ㄴ ...
  ㄴ integration
		 ㄴ post
		 ㄴ user
     ㄴ ...
  ㄴ acceptance
		 ㄴ post
     ㄴ user
     ㄴ ...
  ㄴ config

Domain / Entity

  • 웹과 관련없는 도메인 비즈니스 로직에 대한 테스트
    • 실패하는 케이스 작성 (성공 / 실패)
  • equals 및 hashCode 재정의 주의
    • Lazy loading의 경우 getter 활용해야함
  • 도메인 순서
    • 필드 - 생성자 - 로직 - (getter, setter, equals & hashCode)

주의사항

  • 당연히 통과하는 테스트를 작성하지 않기
    • 특히, JPA 관련 테스트의 경우 영속성 컨텍스트를 고려하여 테스트를 작성하자.
  • 도메인별 필요한 모든 테스트 작성
    • Acceptance Test
    • Integration Test : Service + JPA / Service + S3, Service + Github API
    • Slice Test : Service / Controller
    • Unit Test: Domain Unit / JPA Test (기본 CRUD + 사용자 정의 메소드 + unique 등의 제약조건)
  • Test Fixture
    • 팩토리 활용하여 공통 픽스쳐 사용 - Lazy 하게 생성
    • User, Post, File

순서

  1. 패키지 분리.
  2. 팩토리 설계.
  3. 각 도메인별로 시나리오, 테스트 케이스 명세를 정하기.
  4. 다른 도메인 테스트 코드 리팩토링 및 작성해주기.

Lombok

  • @NoArgsConstructor(AccessLevel=Protected)와 @Builder(생성자 위)만 사용
  • @toString, @Getter 절대 금지

게시물 테스트 코드 리팩토링

Post

  • infrastructure
    • GithubRepositoryApiRequester.java
      • 깃허브 레포지토리를 요청하면, 정상적인 반환값을 얻는다.
      • 잘못된 토큰으로 깃허브 레포지토리 요청을 하면, badCredential 예외가 발생한다.
      • 토큰 없이 깃허브 레포지토리 요청을 하면, badCredential 예외가 발생한다.
    • GihubRepositoryExtractor.java
      • 깃허브 레포지토리를 요청하면, 레포지토리를 반환한다.
      • 토큰 없이 깃허브 레포지토리를 요청하면, 예외를 반환한다.
    • S3Storage.java
      • 이미지 저장을 요청하면 url을 반환한다.
      • 이미지 없이 저장을 요청하면 빈 배열을 요청한다.
  • domain
    • content
    • like
    • Post.java
    • Posts.java
    • PostTag.java
    • PostRepository.java
  • application
    • PostDtoAssembler
    • PostService
      • write
        • 사용자는 게시물을 등록할 수 있다.
        • 존재하지 않는 사용자는 게시물을 등록할 수 없다.
        • 컨텐츠의 길이가 500보다 크면 게시물을 등록할 수 없다.
      • addComment
        • 게시물에 댓글을 정상 등록한다.
        • 게시물에 빈 댓글을 등록할 수 없다.
        • 존재하지 않는 사용자는 댓글을 등록할 수 없다.
        • 존재하지 않는 게시물에는 댓글을 등록할 수 없다.
      • showRepositories
        • 사용자는 Repository 목록을 가져올 수 있다.
        • AccessToken이 잘못되었다면, Repository 목록을 가져올 수 없다.
        • UserName이 잘못되었다면, Repository 목록을 가져올 수 없다.
      • readHomeFeed
        • 메인 홈 피드를 가져온다.
      • readMyFeed
        • 나의 홈 피드를 가져온다.
        • 잘못된 유저는 나의 홈 피드를 가져오지 못한다.
        • 게스트 유저는 나의 홈 피드를 가져오지 못한다.
      • readUserFeed
        • 다른 유저의 홈 피드를 가져온다.
        • 게스트 유저는 다른 유저의 홈 피드를 가져온다
        • 잘못된 유저는 다른 유저의 홈 피드를 가져온다
  • presentation
    • PostController.java
      • 인증된 사용자의 프로필을 가져온다.
      • 다른 사용자의 프로필을 가져온다. - 로그인
      • 다른 사용자의 프로필을 가져온다. - 비 로그인
      • 팔로잉을 한다. - 로그인
      • 언팔로잉일 한다. - 로그인
      • 팔로잉을 한다. - 비 로그인
      • 언팔로잉일 한다. - 비 로그인

Integration

  • PostServiceIntegration
    • 게시물에 댓글을 정상 등록한다.
    • 게시물에 빈 댓글은 등록할 수 없다.
    • 사용자는 게시물을 등록할 수 있다.
    • 사용자는 Repository 목록을 가져올 수 있다.
    • 토큰이 유효하지 않은 경우 예외가 발생한다. - 500 예외
    • 사용자가 유효하지 않은 경우 예외가 발생한다. - 500 예외
    • 저장된 게시물 중 3, 4번째 글을 최신날짜순으로 가져온다.
    • 내 피드 게시물들만 조회한다.
    • 로그인 사용자가 다른 사용자의 피드 게시물을 조회한다.
    • 비로그인 사용자가 다른 사용자의 피드 게시물을 조회한다.

Acceptance

  • PostAcceptance
    • [ ]

Authentication 테스트 코드 리팩토링

Unit Test

OAuthControllerTest

  1. Github 로그인 요청을 하면 Github 인증 URL을 반환한다.
  2. Github 로그인 인증 후 토큰을 발행하여 반환한다.

참고

  • AppUser나 invalid 한 인자가 없으므로 이 두가지만 테스트하도록 유지
  • invalid 한 code가 올 수 있으나, 해당 예외 처리는 깃헙에서 하므로 따로 검증하지 않음

OAuthAccessTokenDaoTest

  1. 처음 생성된 JWT 토큰과 OAuth Access Token을 맵에 성공적으로 저장하고 불러온다.
  2. 이미 있는 JWT 토큰에 대해서 새로운 OAuth Access Token을 추가해도 성공적으로 덮어씌워진다.

고민할 부분

  • JWT 토큰을 덮어 씌우는 경우는? → JWT 토큰은 유효한데 github단에서 리프레시 된 경우
  • DAO에 토큰 제거 로직 필요 → 보류

OAuthServiceTest

  1. Github 로그인 URL을 반환한다. → 지나치게 단순해서 필요한 테스트인지 모르겠으나 유지
  2. 회원가입(첫 로그인)시 Github Profile을 가져와서 DB에 insert한다.
  3. 로그인(첫 로그인이 아닌경우)시 Github Profile을 가져와서 DB에 저장된 기존 정보를 update한다. → update 된 여부를 확인하기는 어렵고 userRepository.save() 를 호출하지 않는 것으로 확인
  4. JWT 토큰을 통해 AccessTokenDB에서 LoginUser에 대한 정보를 가져온다. → Mocking 한 것을 테스트 하는 듯한 느낌이 있지만, 슬라이스 테스트이므로 단순 dto 매핑에 대한 테스트를 한다고 생각함
  5. AccessTokenDB에 저장되어 있지 않은 JWT 토큰이라면 예외가 발생한다.
  6. 빈 JWT 토큰이면 GuestUser를 반환한다.

변경 사항

  • verify를 더 큰 범위로 지정한 것을 추가

Integration Test

AuthenticationPrincipalArgumentResolverTest

  1. 유효한 토큰이면 LoginUser를 반환한다.
  2. 유효하지 않은 토큰이면 예외가 발생한다.
  3. AccessToken DB에 저장되어 있지 않은 토큰이라면 예외가 발생한다.
  4. 요청 헤더에 authorization을 추가해주지 않으면 GuestUser가 반환된다.
  • 현재 JwtTokenProvider, OAuthAccessTokenDao, OAuthService를 의존하고 있음
  • 위 3개를 모킹할 수 있으나, 그러면 테스트하는 로직이 없어서 애매함
  • 현재 있는 2, 3 의 예외케이스도 OAuthService에서 발생시키는 예외임
  • OAuthService의 슬라이스 테스트와 매우 중복됨

변경 사항

  • 현재 resolver 단위 테스트가 통합 테스트에 가까우므로 단위 테스트 → 통합 테스트로 이전하고 해당하는 예외 케이스에 대한 테스트를 작성하도록 함
  • 불필요한 @InjectMock 제거

AuthenticationInterceptorTest

  1. CORS 프리플라이트 요청이면 true를 반환한다.
  2. 유효한 토큰의 요청이면 HttpServletRequest에 토큰 정보를 저장하고 true를 반환한다.
  3. 유효하지 않은 토큰의 요청이면 예외를 던진다.
  4. 유효기간이 지난 토큰의 경우 예외가 발생한다.

변경 사항

  • 리졸버와 마찬가지로 통합 테스트로의 의미가 더 강하므로 Unit → Integeration 패키지로 이전함

IgnoreAuthenticationInterceptorIntegrationTest

  1. 유효한 토큰을 가진 회원이면 true를 반환한다. - LoginUser인 경우
  2. 토큰이 아예 없으면 true를 반환한다. - GuestUser인 경우
  3. 토큰이 존재하지만 유효하지 않으면 InvalidTokenException을 던진다.

변경 사항

  • 리졸버와 마찬가지로 통합 테스트로의 의미가 더 강하므로 Unit → Integeration 패키지로 이전함

OAuthServiceIntegrationTest

  1. Github 로그인 URL을 반환한다.
  2. 회원가입(첫 로그인)시 Github Profile을 가져와서 DB에 insert한다.
  3. 로그인(첫 로그인이 아닌경우)시 Github Profile을 가져와서 DB에 저장된 기존 정보를 update한다.
  4. JWT 토큰을 통해 AccessTokenDB에서 LoginUser에 대한 정보를 가져온다.
  5. AccessTokenDB에 저장되어 있지 않은 JWT 토큰이라면 예외가 발생한다.
  6. authentication이 Null 이라면 GuestUser를 반환한다.

변경 사항

  • OAuthProfileResponse 에 Builder 추가 및 setter삭제
  • 테스트 케이스 추가

Acceptance Test

OAuthAcceptanceTest

  1. 로그인 - Github OAuth 로그인 URL을 요청한다.
  2. 로그인 - Github 인증후 리다이렉션을 통해 요청이 오면 토큰을 생성하여 반환한다.
  3. 재 로그인 - 첫 로그인 이후로 동일한 유저로 로그인하면 정보 업데이트 후 토큰을 생성하여 반환한다.

변경 사항

  • OAuthProfileResponse 빌더로 변경
  • 테스트 케이스 추가
  • code가 invalid 한 경우를 추가하려고 했으나, OAuthClient가 모킹되어 있으므로 불가

질문

  • OAuthClient를 모킹한 이유

3. 리팩토링 후기

  • 마크

    • 단순히 테스트 케이스를 추가하고 몇개 수정한 정도를 했다.
    • Post, User쪽에 너무 많은 것을 맡고 있는것 같다는 생각이 들었다.
  • 손너잘

    • TF 팀/리팩토링 팀 따로 있었으면 좋겠다.
    • 기능을 빠르게 구현하는 팀 + 리팩토링 하는 팀
  • 케빈

    • 테스트 할 것이 별로 없었다. 테스트 몇개 추가 정도.
    • 테스트마다 도커가 돌아가야하는 것이 시간이 오래 걸렸다.
    • TF팀/리팩토링팀 투트랙에 대한 의견 - 동의함!
  • 다니

    • 몇개 추가하고, 픽스쳐 반영, 변수명 통일 등등의 일 진행
    • TF팀/리팩토링팀 투트랙에 대한 의견 - 동의하지만 리팩토링 개념 잘 잡고 가야할 듯. sync 맞추기.
  • 코다

    • 테스트 케이스를 조금 추가한 정도
    • TF팀/리팩토링팀 투트랙에 대한 의견 - 동의하나 리팩토링 팀이 감을 못잡을수도 있으니 개념을 잘 잡고 가면 좋을듯.
Clone this wiki locally