개발놀이터

세션 Authentication 객체로 관리하기 본문

사이드 프로젝트/온라인 쇼핑몰 ver.5

세션 Authentication 객체로 관리하기

마늘냄새폴폴 2024. 3. 24. 01:14

요즘 공부할게 딱히 없을 때 포트폴리오로 작성했던 사이드프로젝트 온라인 쇼핑몰의 고도화를 진행하고 있습니다. 

 

고도화라고 해봐야 별게 없지만... 버전을 4버전까지 업그레이드 하면서 대부분 성능개선 혹은 인프라적인 개선이 이루어졌습니다. 

 

블로그 카테고리 "사이드 프로젝트" 부분을 참고해주세요!

 

하지만 코드는 2년전에 작성한 그대로 유지하고 있어서 굉장히 비효율적인 코드라던가 확장에 유연하지 않다던가하는 문제가 있었습니다. 

 

이번 리팩토링은 세션 관리를 Authentication 객체를 이용해서 관리하도록 변경하였습니다. 

 

기존 코드를 먼저 보시죠!

 

        if (loginId == null)) {
            User findUser = cacheRepository.findUserAtCache(username);
            Comment comment = new Comment(null, findUser, findItem, form.getComment(), imageUrl);
            saveComment = commentRepository.save(comment);
        }

        if (userEmail == null) {
            Member findMember = cacheRepository.findMemberAtCache(username);
            Comment comment = new Comment(findMember, null, findItem, form.getComment(), imageUrl);
            saveComment = commentRepository.save(comment);
        }

 

이건 댓글과 관련된 Service 레벨 코드인데 저는 소셜 로그인 사용자와 일반 로그인 사용자를 분리해서 관리하고 있기 때문에 이렇게 둘로 나눠서 조건문을 넣어야 했습니다. 

 

때문에 일반 로그인 회원 테이블인 Member 테이블에 소셜 로그인 사용자를 동시에 관리하는 방향으로 리팩토링을 진행했습니다. 

 

더불어, 로그인시 세션에 loginId, userEmail 을 저장하여 일반 로그인 사용자는 userEmail 세션 값이 null 인 점을 이용해 로직을 구현하게 되었습니다. 

 

하지만 이러한 null 체크는 안티 패턴이라는 얘기를 듣고 이런 패턴을 리팩토링하기로 마음먹었습니다. 

 

	MemberRole memberRole = roleService.whatIsRole(authentication);
        UserDetails principal = (UserDetails) authentication.getPrincipal();
        String username = principal.getUsername();

        if (isRoleMember(memberRole)) {
            findMember = cacheRepository.findMemberAtCache(username);
            myBucket = temporaryOrderService.findTOrderListByMemberId(findMember.getId());

            totalAmount = findTotalAmountByMemberId(findMember.getId());
            role = findMember.getRole();
        }
        
    private boolean isRoleMember(MemberRole memberRole) {
        return memberRole.equals(MemberRole.ROLE_MEMBER) || memberRole.equals(MemberRole.ROLE_SOCIAL);
    }

 

@Service
public class WhatIsRoleService {

    public MemberRole whatIsRole(Authentication authentication) {
        boolean isRoleMember = authentication.getAuthorities().stream().anyMatch(role -> role.equals(MemberRole.ROLE_MEMBER));
        boolean isRoleSocial = authentication.getAuthorities().stream().anyMatch(role -> role.equals(MemberRole.ROLE_SOCIAL));

        if (isRoleMember) {
            return MemberRole.ROLE_MEMBER;
        }
        else if (isRoleSocial) {
            return MemberRole.ROLE_SOCIAL;
        }
        return MemberRole.ROLE_MEMBER;
    }
}

 

이제 세션으로 관리하는 것이 아닌 Authentication 객체를 이용해 사용자를 분류하고 알맞는 로직을 실행할 수 있게 되었습니다.