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