사용자의 카테고리와 태그정보를 변경하기 위한 로직 작성중 발생한 오류입니다. 카테고리와 태그는 Member와 n:m 매핑이어서 MemberCategory와 MemberTag 이름의 중간 테이블을 두고 1:n, 1:n 매핑으로 사용중이었습니다.
MemberCategory와 MemberTag를 변경하려고 했지만 오류가 발생했습니다.
Fetch Lazy를 사용하려면 항상 영속성 컨텍스트 상태가 되어야하지만 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류이기 때문에 @Transactional annotation을 추가 했지만 오류가 해결되지 않았습니다.
세션에 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);
});
}