팀프로젝트일기/SKKUNION

SKKUNION - 프로젝트 과정에서 예상되는 오류 설명 1

Recfli 2023. 11. 3. 23:35

오류 해결 1

AccessToken에서 UserEmail 정보를 가지고 올 수 있는데 그거로 Users를 받아오고 userTag 목록으로 가져오는 걸 findByUserEmail 같은 방식으로 가져와버리시면 문제가 userTag를 가져오고 싶을 때에 문제가 일어나요. 오류가 아마 LazyInitializationException이라고 뜨면서 에러가 날텐데 아마 동아리 정보에서 UnionTag 가져올 때도 싹 다 LAZY로 지금 우선 해둬서 똑같은 문제가 일어날 수 있거든요?? 

 

    public ResponseEntity<?> getUserInfomation(String AccessToken){

        // 1. Access Token 에서 User email 을 가져옵니다.
        Authentication authentication = jwtTokenProvider.getAuthentication(AccessToken);

        // 2. fetch join 단일 user join 해오는 거는 좀 있다가 할게요 일단은 LAZY로 만듭니다.
        final Users users = loginRepository.findUserWithUserTagsByUserEmail(authentication.getName());

        if(users == null || !jwtTokenProvider.validateToken(AccessToken))
            return response.fail("유효하지 않은 AccessToken입니다", HttpStatus.BAD_REQUEST);

        // 화면용 정보 중 enum 타입들 string 변환
        String userGender = users.getUserGender().toString();
        String userSchool = users.getUserSchool().toString();

        // Tag들 string 목록으로 변환
        List<String> userTags = new ArrayList<>();
        List<UserTag> userTagList = users.getUserTags();

        for(int i = 0; i < userTagList.size() ; i++){
            userTags.add(userTagList.get(i).getUserTag().toString());
        }

 

 

그래서 제가 드리는 솔루션은 UNION이 복잡하지 않으면 어차피 성능 신경 안써도 되니까 EAGER로 해도 되는데 문제는 UNION에 연결된 Table이 한 개가 아니면 Aplication 작동과정에서 문제가 생겨요. 그러니까 Fetch join을 어쩔 수 없이 써야됩니다.

 

제일 쉬운 방법은 저희 Entity 코드를 gpt에 복붙해서 User를 조회할 때 UserTag까지 fetch join으로 가져오는 방법 알려줘. 이런 식으로 물어보시면 바로 답을 알려줍니다. @Query로 해서 직접 쿼리를 작성해도 되는데 제 생각에는 @EntityGraph(attributePaths = "userTags") 이게 더 편할 것 같아서 둘 다 공유를 하겠습니다!

 

@Repository
public interface LoginRepository extends JpaRepository<Users, Long> {

    @Query("SELECT u FROM Users u JOIN FETCH u.userTags WHERE u.userEmail = :userEmail")
    Users findUserWithUserTags(@Param("userEmail") String userEmail);

    @EntityGraph(attributePaths = "userTags")
    Users findUserWithUserTagsByUserEmail(String userEmail);
    
}

 

오류 해결 2

 

 코드를 github에서 병합하고 나서 다시 코드를 돌려보는데 오류가 생기는 데... 아 변수명 바꿨으면 Readme에 변수 바꾼 걸 설명을 해야 할 것 같습니다. 원래 이름이랑 다르게 바뀌어 있어서 Dto에서 null로 감지되니까 에러는 안나는데 계속 코드가 안 돌아가서 타입이나 변수명 바뀐 것에 대해서는 기록을 해놨다가 Readme에 작성해주셨으면 좋겠습니다.

 

문제 찾느라고 2시간 넘게 걸렸어요.