본문 바로가기
Java/Spring Boot

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

by amungstudy 2024. 3. 19.

문제

현재 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);
}