트러블 슈팅: failed to lazily initialize a collection of role

형준·2024년 3월 20일

문제 상황

사용자의 카테고리와 태그정보를 변경하기 위한 로직 작성중 발생한 오류입니다. 카테고리와 태그는 Member와 n:m 매핑이어서 MemberCategory와 MemberTag 이름의 중간 테이블을 두고 1:n, 1:n 매핑으로 사용중이었습니다.
MemberCategory와 MemberTag를 변경하려고 했지만 오류가 발생했습니다.

step 1

Fetch Lazy를 사용하려면 항상 영속성 컨텍스트 상태가 되어야하지만 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류이기 때문에 @Transactional annotation을 추가 했지만 오류가 해결되지 않았습니다.

step 2

세션에 category 엔티티를 보관하고, 또 해당 엔티티를 엮어서 그대로 Member와 함께 persist하기 때문에 category를 다시 조회할 때 세션에 보관된 member가 조회되는 현상이 발생합니다. 이 member는 프록시 기능을 상실한 상태이기 때문에 이런 문제가 발생합니다.
updateCustomInfo(Member member, MemberRequestDTO.CustomInfoDTO request)에서 updateCustomInfo(Long memberId, MemberRequestDTO.CustomInfoDTO request)로 수정하였더니 오류가 해결되었습니다.

    @Override
    @Transactional
    public void updateCustomInfo(Long memberId, MemberRequestDTO.CustomInfoDTO request) {
        memberRepository.changeInfoTerm(memberId,request.getInfoTerm());
        Member member = memberRepository.findById(memberId).orElseThrow(()-> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));
        // 카테고리 저장 로직

        List<Category> categoryList = request.getCategoryList().stream()
                .map(category -> {
                    return categoryRepository.findById(category).orElseThrow(() -> new MemberHandler(ErrorStatus.CATEGORY_NOT_FOUND));
                }).collect(Collectors.toList());

        List<MemberCategory> memberCategoryList = MemberConverter.toMemberCategoryList(categoryList);

        memberCategoryList.forEach(memberCategory -> {
            memberCategory.setMember(member);
        });



        //member tag를 두자
        List<Tag> tagList = request.getTagList().stream()
                .map(tag ->{
                    return tagRepository.findById(tag).orElseThrow(() -> new MemberHandler(ErrorStatus.TAG_NOT_FOUND));
                }).collect(Collectors.toList());

        List<MemberTag> memberTagList = MemberConverter.toMemberTagList(tagList);

        memberTagList.forEach(memberTag -> {
            memberTag.setMember(member);
        });


    }
profile
백엔드 개발자가 되기 위한 경험을 기록하는 블로그입니다.

0개의 댓글