TIL/2023

[TIL] 23.07.31

깃짱 2023. 7. 31. 22:00
반응형

 

💋 오늘 공부한 내용

 

  • 일요일에 해야했던 코드리뷰를 방 청소로 미룬 바람에 오늘 했다. 대신 방청소는 기가 막히게 되었다. 
  • 지난 주부터 작성했던 코드를 모두 머지했다. 이제 조금 찜찜한 이슈들이 남아있긴 하지만, 기능은 모두 완료됨
  • 내 인수테스트 작성하다가, 새로 배운게 좀 있다. 
  • 문제가 된 테스트코드는 아래와 같다
@Test
void 여러_개의_쿠폰이_있는_경우_ACCUMULATING인_쿠폰만_조회된다() {
    // given

    // TODO: Owner에 대한 회원가입 로직이 생기면 요청으로 대체한다.
    Owner gitchan = ownerRepository.save(GITCHAN);
    Owner jena = ownerRepository.save(JENA);

    Long customerId = 전화번호로_임시_고객_등록_요청하고_아이디_반환(gitchan, TEMPORARY_CUSTOMER_CREATE_REQUEST);

    Long gitchanCafeId = 카페_생성_요청하고_아이디_반환(gitchan, gitchan.getId(), CAFE_CREATE_REQUEST);
    Long jenaCafeId = 카페_생성_요청하고_아이디_반환(jena, jena.getId(), CAFE_CREATE_REQUEST);

    Long gitchanCafeCouponId = 쿠폰_생성_요청하고_아이디_반환(gitchan, new CouponCreateRequest(gitchanCafeId), customerId);
    Long jenaCafeCouponId = 쿠폰_생성_요청하고_아이디_반환(jena, new CouponCreateRequest(jenaCafeId), customerId);
    accumulateCouponUntilRewarded(gitchanCafeCouponId);

    // when
    ExtractableResponse<Response> response = 고객의_쿠폰_카페별로_1개씩_조회_요청(gitchan, customerId);

    // then
    assertAll(
            () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()),
            () -> assertThat(response.jsonPath().getList("coupons")).isNotEmpty(),
            () -> assertThat(response.jsonPath().getList("coupons").size()).isEqualTo(1),
            () -> assertThat(response.jsonPath().getLong("coupons[0].cafeInfo.id")).isEqualTo(jenaCafeId),
            () -> assertThat(response.jsonPath().getLong("coupons[0].couponInfos[0].id")).isEqualTo(jenaCafeCouponId)
    );
}

 

  • JPA에서 find를 통해서 받은 프록시 객체가 지연 로딩될 때, 트랜잭션 위에서 + 영속성 컨텍스트의 관리를 받아야만 정상동작함. 이 경우가 아니면 LazyInitializationException을 만날 수 있음. (만남)
    • 우리 프로젝트에서도 @Transactional 어노테이션을 붙이지 않아서 계속 에러가 나고 있었다.
  • 그.런.데 @Transactional 어노테이션을 붙이는 순간 에러가 발생한다.
    • 인수테스트지만, 아직 회원가입 절차가 만들어지지 않아서 repository에 save하는 것으로 대체했다. (대체되었다고 생각했다가 정확할듯)
    • 근데, 테스트코드에 @Transactional을 붙이니 owner를 저장했음에도 불구하고 바로 아래의 API 호출에서 owner를 찾을 수 없다는 예외가 발생한다.
    • 테스트와 실제 환경이 분리되어 동작하기 때문에 실제 환경을 사용하는 API 호출에서는 테스트 환경에서 사용하는 데이터베이스 내부의 값을 조회할 수 없는거라고 내 어시스턴트가 알려주긴 했는데 흠.. 테스트 환경에 대해서 좀 더 공부를 해봐야할 것 같다...

 

 

💋 감정 회고

 

  • 충격적이게도 오늘이 먼가 7월의 마지막 날인 것 같다(?) 
    • 뭔가 지난 1주 간 급격히 게을러진 것 같은데, 그전에 안 게으르게 살았던 시절이 잘 기억이 안난다. 역시 인간은 최근 2일이 성장했다는 기분에 제일 중요한 것 같다. 긍까 지금 내가 기분이 자체가 값이 음수인 건 아닌데 미분값이 음수라서 뭔가 방향성이 마이너스인 느낌??? 얼릉 벗어나야겠다. 

 

💋 오늘의 포스팅

https://engineerinsight.tistory.com/148

 

[JPA] 프록시와 지연 로딩

💋 프록시의 등장 배경 아래와 같이 생긴 엔티티가 있다고 생각해보자. (자세히 다 읽을 필요는 없음) @Getter @NoArgsConstructor(access = PROTECTED) @Entity public class Coupon extends BaseDate { @Id @GeneratedValue(strate

engineerinsight.tistory.com

 

 

반응형

 

반응형