일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- static
- 내일배움캠프
- TiL_1st_0419
- 생성자
- 포맷은 최후의 보루
- #내일배움캠프
- #스파르타내일배움캠프
- 성장기록
- 스파르타내일배움캠프TIL
- KPT
- 변수의 다양성
- 회고록
- Java
- #스파르타내일배움캠프TIL
- Java의 이점
- 인스턴스
- 클래스
- GitHub
- diary
- 스파르타내일배움캠프
- Github_token
- 객체지향 언어
- 스레드
- 메서드
- Token
- Diary 해우소
- 해우소
- Git
- JVM
- 감사기록
- Today
- Total
몬그로이
팀프로젝트 12일차 본문
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 |