Filter (근데 이제 롬복을 곁들인)

* filter : 프레임워크에서 클라이언트에게 오는 요청 /응답의 최전방에 있는 web Application에서 관리되는 영역

           ㄴ 이를 통해 요청 /응답의 정보를 변경하거나 spring에 의해 객체 등으로 변환되기 전의 순수한 request, response를 얻을 수 있다.

           ㄴ 유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.

           ㄴ 스프링에서는 주로 req/resplogging이나 인증에 관한 logic을 여기서 처리한다

 

- user

@Data   //getter,setter,toString, 그외(equals,hashCode)등을 자동 생성해주는 롬복~
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

-controller

@Slf4j  //log를 찍기 위함, 이제 system.out.println은 안녕~~
@RestController
@RequestMapping("/api")
public class ApiController {

    @PostMapping("/user")
    public User post(@RequestBody User user){
        log.info("User : {}",user); //{}안에 user가 들어가는 것.(sytem + 했던 과거는 안녕~)
        return user;
    }

    @PostMapping("/temp")
    public User temp(@RequestBody User user){
        log.info("User : {}",user); //{}안에 user가 들어가는 것.(sytem + 했던 과거는 안녕~)
        return user;
    }
}

 

- Globalfilter

@Slf4j
@WebFilter(urlPatterns = "/api/user/*") //특정 컨트롤러 주소에만 filter를 적용하기 위함
public class GlobalFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ContentCachingRequestWrapper cachingRequestWrapper=new ContentCachingRequestWrapper((HttpServletRequest) request);
        ContentCachingResponseWrapper cachingResponseWrapper=new ContentCachingResponseWrapper((HttpServletResponse) response);
        //↑전처리지만 아직 리퀘스트 가지고 뭘 할순 없음(길이만큼 공간만 할당된 상태이기 때문)

        chain.doFilter(cachingRequestWrapper,cachingResponseWrapper);   //컨트롤러에서 처리를 마친 상태

        //후처리
        String url=cachingRequestWrapper.getRequestURI();
        String reqBody=new String(cachingRequestWrapper.getContentAsByteArray());
        log.info("request url: {}, request body : {}",url,reqBody);

        int status= cachingResponseWrapper.getStatus(); //200,400 ...
        String respBody=new String(cachingResponseWrapper.getContentAsByteArray());     //string으로 안감싸주면 웬 숫자들 나옴;


        cachingResponseWrapper.copyBodyToResponse();    //컨트롤러가 응답으로 객체를 잘 보낼 수 있도록 처음 값을 복사.
        log.info("response status: {}, response body : {}",status,respBody);
        //위에서 응답을 다 처리하고 끝을 가리키기 때문에 이거 안해주면 클라이언트에게 응답body로 no-content
    }
}

 

+) springbootApplication

@ServletComponentScan   //특정 컨트롤러 주소에만 filter를 적용하기 위함
@SpringBootApplication
public class FilterApplication {

    ….

}

 

 

 

'BackEnd > 패캠' 카테고리의 다른 글

Rest Template (Server to Server 통신)  (0) 2022.01.25
Intercepter  (0) 2022.01.24
Exception 처리  (0) 2022.01.22
Validation  (0) 2022.01.21
AOP 실무 사례 알아보기  (0) 2022.01.20