2023.06.20 TIL

2023. 6. 20. 20:13TIL(Today I Learned)

filter>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<filter-name>abc</filter-name>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<url-pattern>/*</url-pattern>
		<filter-name>abc</filter-name>
	</filter-mapping>

(1) SSR(서버 사이드 렌더링)

- 보통 forward, redirect를 사용하는데 forward할 때(jsp로 넘겨줄 때) req에 값을 담고 넘긴다.

- 스프링에서는 어떻게 사용할까?

 

- 이렇게 Model을 사용하면 servlet의 request와 같다.

- 마찬가지로 redirect를 할 때도, model에 addAttribute를 하면 알아서 그 값이 담긴다. 다른 페이지로 넘어갈 때도 알아서 담긴다. 

@GetMapping(value = {"/", "home"})
	public String home(Model model) {
		model.addAttribute("nick", "jjonse");
		return "home";
	}

 

- 개발자는 req, session에 담을지 상관하지 말고 스프링이 알아서 해주도록 한다.

- req에 담는 것은 다 model에 담으면 된다.

- pageContext, session 영역은 그대로 쓰면 된다. req 대신에 model에 담기!!!

- model에 담고 redirect를 하면 queryString이 된다.

 

 

(2) 필터(Filter) - 스프링과 servlet의 차이

- 가능하면 전부 다 스프링이 관리하게 만들어줘야 작업하기 편리하다.

- filter 객체는 spring보다 바깥쪽에 존재한다.

 

- filter는 bean이랑 자동으로 연결되지 않는다. 왜냐하면 filter는 spring 밖에 존재하기 때문이다.

- filter가 spring 내부의 것을 필요로 하는데 스프링은 filter가 밖에 위치하니까 신경쓰지 않는다.

- 그래서 필터를 사용할 때는 스프링이 관리하는 객체가 될 수 있도록 해야한다.

- 이 어플리케이션을 전부다 스프링이 관리했으면 좋겠다 생각한다. 

- 필터를 세운다.(실제로 필터 역할을 하는 것은 따로 있다)

- 명목상 필터는 존재하고 실제로는 다른 것을 사용하면 된다. 겉으로 볼 때는 홍길동이라는 친구가 있다. 명단에는 홍길동이라고 적고, 실제로 홍길동이라 적은 애는 김철수가 들어와 있는 것이다.

- 그래서 스프링이 filter로 쓸 객체 하나를 만든다. 그 다음에 filter를 명목상 세워준다. 필터한테 요청 들어오면 아무것도 하지 말고 대체되는 애한테 넘겨주면 된다고 한다. 

- 그럼 스프링 입장에서는 관리하는 객체가 사실상 필터의 역할을 하게 된다.

- 그럼 필터도 스프링이 관리하는 객체가 되었다고 볼 수 있다.

- validatingFilterProxy라는 게 있는데 이를 이용하면 자동으로 스프링 내의 필터를 만들어준다.

 

(3) 필터를 등록하는 방법

1. @WebFilter를 통해 등록

- 훨씬 편리하다. 

- 웬만하면 이 방법을 사용한다.

- 하지만 만약에 내가 만든 클래스를 아닌 걸 가지고 filter를 등록하고 싶을 때는 사용할 수 없다.

- 그렇기 때문에 xml을 사용해야 한다.

@WebFilter("/*")
public class EncodingFilter implements Filter {
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("필터 동작~~~~");
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}	
}

 

2. XML 사용

- 예시를 들자면 이렇다.

- 스프링은 이런 것들도 다 만들어져 있다.

<filter>
		<filter-class>com.kh.app.filter.EncodingFilter</filter-class>
		<filter-name>abc</filter-name>
	</filter>
	
	<filter-mapping>
		<url-pattern>/*</url-pattern>
		<filter-name>abc</filter-name>
	</filter-mapping>

- 이 필터는 이미 spring에 존재하기 때문에 그저 스프링 프레임워크의 라이브러리를 추가하면 되는 것이다.

- 이렇게 해도 작동하지 않는다. 생성자에다 encoding 방식을 추가해야 한다.

 

<filter>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<filter-name>abc</filter-name>
	</filter>
	
	<filter-mapping>
		<url-pattern>/*</url-pattern>
		<filter-name>abc</filter-name>
	</filter-mapping>

 

 

- root-context에 이것도 추가해줘야 한다.

<bean id="abc" class="com.kh.app.filter.EncodingFilter"></bean>