필터링(Filtering)

·2024년 11월 4일

스프링

목록 보기
7/33

저번시간에는 db로 값을 넘겼을 때 한글이 깨져서 넘어오는 현상이 발생했는데 오늘은 그걸 해결할 필터링을 적용해보기로 한다.

필터링(Filtering)이란?

사용자가 브라우저에 URL 을 입력하면 요청이 컨테이너에 전달되고,
web.xml 의 서블릿 매핑에서 해당 URL 에 상응하는 서블릿을 찾아, 그 서블릿에 요청을 전달한다.
요청을 처리한 후에는 사용자에게 응답을 전송한다.
필터는 J2EE 표준 스펙에 나와있는 Servlet 기술중 일부라서 web.xml에 기술되는것으로 판단되고, 인터셉터는 비슷한 기술이지만, Spring에 포함되어있는것.
스프링 기반으로 한다면 당연히 필터보단 인터셉터를..
스프링없이 단순 Servlet구현이라면 필터를 사용해 유사하게 구현가능

보통 전송을 통해서 넘어오는 데이터의 조합방식인 인코딩 설정으로 사용된다

  • 어려운 말이라고 해서 그냥 넘겨듣지 말고 나중에 사회에 나가서 사용할 수 있기 때문에 용어들을 잘 익히세용...

필터링 적용하기

한글 처리를 위해 UTF-8 인코딩을 설정하는 CharacterEncodingFilter 필터를 설정해야 한다.
web.xml 파일로 이동해서 맨 아래에 코드 넣기.

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

<filter-name>
필터의 이름을 설정하는 부분. encodingFilter라는 이름으로 필터를 구분할 수 있게 해주고, 필터 매핑 할 때 같은 이름으로 매핑해야 한다.

<param-value>UTF-8</param-value>:
encoding 매개변수의 값을 UTF-8로 설정한다. 이 설정으로 인해 요청과 응답의 문자 인코딩이 UTF-8로 지정되고, 한글이나 다른 특수 문자가 깨지지 않고 올바르게 표시된다.

<filter-name>encodingFilter</filter-name>:
필터 매핑 시 사용하는 필터의 이름으로 filter-name 요소에서 설정한 encodingFilter와 같은 이름을 사용해야 필터가 올바르게 매핑된다.

<url-pattern>/*</url-pattern>:
필터가 적용될 URL 패턴을 설정으로 /*로 모든 요청과 응답에 대해 UTF-8 인코딩을 적용하겠다고 설정한다.


아이디 중복체크 기능 활성화 하기

저번 시간에 memberjoin에서 주석처리 했던 아이디 중복체크 구문을 먼저 해제해준다.

1. MemberController로 가서 메서드 만들기. 대충 형식만 만들어준 뒤에
MemberService가 Dao역할을 하기 때문에 이제 실제 메소드를 만들기 위해 MemberService로 이동한다.

public int memberIdCheck(String memberId);

2. 인터페이스 파일은 메서드의 정의만 제공하고 구현은 제공하지 않기 때문에 메서드만 정의해두기. 저장을 하면 impl에서 빨간줄이 뜨는데 그대로 이동해서 add를 눌러 실제 메소드 생성해주면 된다.

	@Override 
	public int memberIdCheck(String memberId) {
		int value= mm.memberIdCheck(memberId);
	
		return value;
	}

3. 실제로 MemberService 인터페이스를 구현하는 역할.

  • @Override는 이 메서드가 인터페이스 MemberService에 정의된 memberIdCheck 메서드를 구현한다는 것을 나타내준다.

  • public int memberIdCheck(String memberId):
    String 타입의 memberId를 매개변수로 받아서 그 결과를 int 타입으로 반환한다. ID가 중복되면 1을 반환하고 중복되지 않으면 0을 반환.

  • int value = mm.memberIdCheck(memberId);:
    데이터베이스와 연결된 mm.memberIdCheck(memberId)를 호출해서 memberId가 이미 존재하는지 확인하고 여기서 얻은 결과를 value에 저장한다.

이 코드는 MemberMapper를 통해 데이터베이스와 통신하여 memberId가 중복되는지 확인하는 역할을 수행?????

4. MemberMapper에서 마이바티스용 메서드를 생성해준다.

<select id="memberIdCheck" parameterType="String" resultType="int">
select count(*) as cnt from member where memberid =#{memberid}
</select>  

5. MemberMapper.xml 파일로 가서 쿼리문을 작성해야 한다. id는 마이바티스용 메서드와 동일하게!

		<!-- 제이슨을 심플하게 사용하기 위한 라이브러리들 ajax 필요 라이브러리 -->
		<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.8.4</version>
		</dependency>
		
		<dependency>
		<groupId>com.googlecode.json-simple</groupId>
		<artifactId>json-simple</artifactId>
		<version>1.1.1</version>
		</dependency>
		<!-- ajax 필요 라이브러리 끝-->  

6. 제이슨 라이브러리를 다운을 받기 위해 pom.xml에 가서 새로 생성하고 저장.

	@ResponseBody
	@RequestMapping(value="memberIdCheck.aws", method=RequestMethod.POST)
	public JSONObject memberIdCheck(@RequestParam("memberId") String memberId) {
		
		int cnt = memberService.memberIdCheck(memberId);
		
		JSONObject obj = new JSONObject();
		obj.put("cnt", cnt);
		
		return obj;
	}  

7. MemberController로 가서 이제 제이슨 타입으로 보낸다는 설정을 해야한다.

  • @ResponseBody:
    이 어노테이션은 메서드가 반환하는 값을 HTTP 응답 본문으로 직접 보낼 때 사용한다. 여기서는 JSONObject를 반환하고 있어서 JSON 형식의 데이터가 응답 본문에 포함된다. 페이지가 아닌 JSON 데이터를 직접 응답하게 된다.
  • @RequestMapping(value="memberIdCheck.aws", method=RequestMethod.POST):
    어노테이션은 요청 URL과 HTTP 메서드를 지정.

  • value="memberIdCheck.aws"는 이 메서드가 memberIdCheck.aws URL로 들어오는 요청을 처리하게 한다.

  • @RequestParam("memberId") String memberId:
    @RequestParam은 요청에서 특정 파라미터를 가져오는 데 사용.

  • JSONObject obj = new JSONObject();:
    응답 데이터를 JSON 형식으로 만들기 위해 JSONObject 객체를 생성한다.

  • obj.put("cnt", cnt);:
    JSONObject에 중복 여부를 나타내는 값 cnt를 cnt라는 키로 추가한다.
    cnt가 1이면 JSON 객체는 {"cnt": 1} 형식이 되고, 0이면 {"cnt": 0} 되는 형식.

0개의 댓글