몬그로이

팀프로젝트 12일차 본문

Dev입성기/Dev 입성기_중기

팀프로젝트 12일차

Mon Groy 2024. 7. 29. 19:42

Feed 좋아요 등록 or 취소 기능을 구현한 뒤 테스트를 하는데

 

{
  "code": 500,
  "message": "Cannot invoke \"cohttp://m.example.fantreehouse.domain.artistgroup.repository.ArtistGroupRepository.findByGroupName(String)\" because \"this.artistGroupRepository\" is null",
  "httpStatus": "INTERNAL_SERVER_ERROR"
}

 

라는 에러가 발생함

 

테이블 열 이름을 잘못 지정해줘서 발생했던 거였음

 


 

 

failed to lazily initialize a collection of role: cohttp://m.example.fantreehouse.domain.user.entity.User.feedLikeList: could not initialize proxy - no Session

 

user 가 트랜젝션 밖에서 처리되는 경우에 발생하는 에러

@Transactional 을 Servicesupport에도 설정해 줌

 


메서드 수행은 완료되어 Controller 로 돌아와 status.OK 까지 나오는데,

테이블에는 정보가 들어가지 않는다

 

FeedLike feedLike = FeedLike.builder()
        .feed(foundFeed)
        .user(loginUser)
        .build();

loginUser.getFeedLikeList().add(feedLike);

 

까지 만들어놓고 FeedLikeRepository 에 저장하도록 설정하지 않아서 발생한 것으로 추측

 

feedLikeRepository.save(feedLike);

를 작성하였으나, ServiceSupport 내에 static 메서드로 작성한 거라서 repository 를 불러올 수 없었다

 

변경하고 메서드를 부르면 

 

failed to lazily initialize a collection of role: cohttp://m.example.fantreehouse.domain.user.entity.User.feedLikeList: could not initialize proxy - no Session

 

라는 오류가 발생

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<FeedLike> feedLikeList = new ArrayList<>();

 

처럼 EAGER 로 변경했더니 정상 작동

 

그런데 User 를 불러내는 일이 다반사이므로 EAGER 가 아닌 다른 방법이 필요함

 

다른 방법은 아직 찾지 못했고,

아마 try ~ catch 문을 사용해서 그런 것 아닌가 하고 의심하는 중

 

프록시 객체, 지연로딩에 대한 공부가 더 필요함


UserRepository 에 @Query 어노테이션을 사용해서 해결하려 시도하였다

        User loginUser = userRepository.findByIdWithFeedLike(userDetails.getUser().getId())
                .orElseThrow(() -> new NotFoundException(UNAUTHORIZED));
@Query("SELECT u FROM User u LEFT JOIN FETCH u.feedLikeList WHERE u.id = :id")
Optional<User> findByIdWithFeedLike(@Param("id") Long id);

하지만 insert 문이 나가지 않음

 

그래서 한 튜터님께 조언을 구했고,

User 엔티티에 FetchType.EAGER 를 사용해도 될 것 같다고 판단하셨다

왜나하면 Column 이 별로 없고,

데이터도 숫자이기 때문에 (id값) 부하에 별로 영향을 미치지 않는다고 한다

현업에서도 FetchType.EAGER 를 사용하기도 한다고 하셔서 안심하고 사용하기로 했다

 

근데 왜 도대체 안 되는 건지 아직까지 모르겠다


좋아요 기능 구현 후

이번엔 좋아요 카운트를 feed 에 반영하도록 변경했는데

feed 를 조회할 때

 

{
  "code": 500,
  "message": "Specified result type [int] did not match Query selection type [cohttp://m.example.fantreehouse.domain.feedlike.entity.FeedLike] - multiple selections: use Tuple or array",
  "httpStatus": "INTERNAL_SERVER_ERROR"
}

 

라고 뜬다


"code": 500,
  "message": "Specified result type [cohttp://m.example.fantreehouse.domain.user.entity.UserStatusEnum] did not match Query selection type [cohttp://m.example.fantreehouse.domain.user.entity.User] - multiple selections: use Tuple or array",
  "httpStatus": "INTERNAL_SERVER_ERROR"

 

라는 에러가 떠서 찾아보았으나 발견할 수 없었다

그래서 실행창을 보니

An internal error occurred while trying to authenticate the user

라고 뜬다

 

검색해도 나오질 않고

디버깅 해도 회원가입 관련해서 잘 모르겠어서

결국은 다음 테스트를 진행해야하는 급한 마음에 튜터님을 찾아갔다

블랙리스트 검증하는 기능이 추가되면서 발생한 오류인 것을 확인했고

 

user를 email, status 를 넘겨서 찾아서
있으면 리턴, 없으면 그대로 진행하는 게 좋을 것 이라고 하심

 

// 블랙리스트 검증
if (userRepository.getStatusFindByEmail(email).get().equals(UserStatusEnum.BLACK_LIST)) {
    throw new CustomException(ErrorType.BLACKLIST_EMAIL);
}

 

Optional<UserStatusEnum> getStatusFindByEmail(String email);

디버그로 돌린 후

 

블랙리스트 구현된 것을 pull 받은 후 발생한 거라는 걸 알 수 있었다

 

Optional<User> 로 고치니 해결


그렇게 해결하고 커멘트 like 는 별 무리없이 테스트를 끝냈다

드디어 파일 업로드를 공부할 수 있게 되었다!

팀에서 업로드 기능 마감을 수요일 오전까지로 정해줘서

내일 면접있는데.. 포기해야겠다

'Dev입성기 > Dev 입성기_중기' 카테고리의 다른 글

토이프로젝트 5 ~ 6일차  (0) 2024.07.16
토이프로젝트 Kanban _ KPT 회고  (0) 2024.07.16
토이프로젝트 4일차  (1) 2024.07.14
토이 팀프로젝트 3일차  (1) 2024.07.14
토이팀프로젝트 2일차  (0) 2024.07.12