Java/Spring Boot

View에 사용자 이름을 전달하는 Controller 중복 코드 제거

amungstudy 2024. 3. 19. 14:05

문제

현재 Header메뉴에 사용자 이름을 표시하고자 사용자 인증이 완료된 경우 GET요청을 처리하는 ViewController에서 Model에 사용자 이름을 담아 view에 전달하고 있는데, 

이 코드가 로그인이 필요한 메서드에 모두 포함되고 있어서 filter를 활용하여 코드 중복을 제거하고자 함

상기 코드에서 Model.addAttribute(“username”,findUsername); 부분이 중복되고 있습니다.

 

 

해결 과정

  • OncePerRequestFilter Class 활용

  Http Request의 한 번의 요청에 대해 한 번만 실행하는 Filter인 OncePerRequestFilter를 상속받아 UsernameFilter Class를 생성했습니다. 이를 활용하여 request에 data(사용자 이름)를 전달합니다.

  Filter는 Spring의 관리대상이 아니므로 UserRepository를 주입받아 사용했습니다.

 

 


/**
 * Http request요청을 받으면
 * 사용자 인증 정보를 토대로 사용자 이름 조회 후
 * 사용자 이름을 view에 전달하는 filter
 */
@RequiredArgsConstructor
@Transactional
public class UsernameFilter extends OncePerRequestFilter {

    private final UserRepository userRepository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        // 인증 정보를 가져옵니다
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        // 인증된 상태인 경우 사용자 로그인 아이디로 repository에서 사용자 이름 조회 및 request에 전달
        if(authentication != null && authentication.isAuthenticated()){
            String loginId = authentication.getName();
            String findUsername = userRepository.findUsernameByLoginId(loginId);
            request.setAttribute("username",findUsername);
        }

        // 필터체인에 연결
        filterChain.doFilter(request,response);
    }

}

  

Security Config 파일에 연결

/**
 * 사용자 이름 전달 filter 등록
 */
@Bean
public UsernameFilter usernameFilter(){
    return new UsernameFilter(userRepository);
}