스프링

chapter 07 인터셉터

Kiwisae 2022. 10. 4. 17:41

 

 

환경설정 살펴보기

 

 

pom.xml

 

pom.xml에는 여러가지 의존 라이브러리가 추가되어 있다.

한번 잘 구축해두면 계속 복사-붙여넣기 사용이 가능하다.

 

그 중 새로 추가한 것은

jsp의 파일 업로드를 해결해주는 cos 라이브러리와 MultipartRequest 객체의 역할을 수행하는 의존 라이브러리이다.

 

 

 

 

web.xml

이 환경설정 파일에는 세 가지 내용이 들어가있다.

 

 

1) 한글 인코딩

 

get방식 전송은 아파치 톰캣이 자동으로 인코딩 설정을 해주기 때문에 신경쓰지 않아도 되지만

post방식은 개발자가 신경을 써주어야 한다.

그러나 기본 환경설정 파일인 web.xml에 한글 인코딩 설정을 해준다면 크게 신경쓸 필요가 없다.

 

 

2) root-context.xml과 servlet-context.xml을 불러오는 내용이 들어가있다.

 

실무에서는 기본값으로 설정된 WEB-INF가 아닌 resources로 기본 경로를 설정할 때도 있다.

왜냐면 WEB-INF/spring/appServlet... 경로가 복잡하기 때문이다.

이럴 때 resources 하위의 파일을 읽어오려면 classpath:를 사용해야 한다.

 

 

root-context.xml은 db연동과 관련된 내용이므로,

연동을 하지 않을 때에는 크게 신경쓰지 않는다.

 

 

3) servlet-mapping

 

모든 ~.do 요청값을 받게 된다.

 

 

 

 

 

 

 

servlet-context.xml

 

com.ch.ch07 패키지 하위의 폴더를 읽어온다.

패키지 하위의 파일들에는 어노테이션이 붙어있다.

 

prefix는 view파일이 저장될 최상위 디렉토리의 경로를 설정한다.

suffix는 prefix에서 읽어올 파일의 확장자를 설정한다.

그러니까 /WEB-INF/views/ 하위의 파일 중 jsp 확장자 파일을 view 페이지로 읽어온다는 뜻이 된다.

 

또한 여러가지 세부설정에 대한 기본 경로를 설정할 수 있다.

매핑이 잡혀 있어야 view 파일을 제대로 불러올 수가 있다.

 

 

class로 설정된 com.ch.ch07 패키지의 LoginCheck가 인터셉트를 구현할 파일이다.

 

bean 객체를 생성하면서 id값과 ref 값을 일치시킨다.

upload.do 요청이 들어올때만 LoginCheck를 실행하게 된다.

 

 

 

 

 

 

LoginCheck.java

 

HandlerInterceptor를 상속받고 인터셉터 메소드 3가지를 오버라이딩 하여

경우에 따른 인터셉트를 구현하고 잇다.

 

 

 

preHandle 메소드를 로그인 과정에 많이 사용한다.

 

부모 인터페이스의 형식을 그대로 가져와야 하기 때문에

session 객체로 세션을 구해와야 한다.

만약 id == null 이라면, 다시 말해 세션에 공유되는 id값이 없는 비정상적 접근이라면

loginForm.do를 실행해 로그인폼으로 다시 돌아가게 한다.

그리고 return false를 실행하여 if문을 벗어난다.

 

그러나 id != null 이라면 true 값을 돌려주어 계속 원래의 요청을 실행하게 된다.

 

 

 

 

 

 

최상단에는 include 태그로 header.jsp를 불러오고 있는데, header에는 공통으로 사용하는 내용이 들어있다.

여러가지 라이브러리 파일, 부트 스트랩 적용, 제이쿼리 라이브러리 등.

 

현재 프로젝트의 경로를 구해와서 path 변수에 저장하고 있다.

 

 

 

 

UploadController.java

인터셉트가 가로채지 않는다면

컨트롤러 파일로 넘어와 요청값 (~.do) 에 따른 메소드를 실행하게 된다.

 

 

 

 

loginForm.jsp의 입력 양식의 name 값이 id, pass 이고,

값을 받는 변수명 또한 id, pass로 일치할 때에는 @RequestParam을 생략할 수 있다.

하지만 일치하지 않는다면 @RequestParam을 반드시 붙여 주어야 한다.

 

 

특별한 경우가 아니라면 메소드의 자료형은 String 클래스를 사용한다.

 

회원 인증에 성공했다면 이 값을 session으로 공유 해야 한다.

jsp에서는 session 객체를 생성하여 따로 코드를 작성해주어야 하지만,

스프링에서는 매개변수 자리에 선언만 해주어도 된다.

로그인에 성공하면 프로젝트 전체에 세션 공유가 된다.

 

model 객체는 뷰 페이지에 값을 가져가주는 역할을 한다.

 

반면 로그인에 성공하지 못하면 else 구문이 실행된다.

이 msg는 loginForm에 EL로 출력된다.

 

 

class "err"은 header 파일에서 불러오게 된다.

 

 

 

 

 

loginSuccess.jsp

 

 

 

 

업로드를 누르면 upload.do를 실행하게 되는데 

만약 이 곳에서 세션 공유가 안된채 로그인 정보 값을 갖고 가지 못하면 인터셉터가 실행된다.

 

 

 

 

 

 

로그인에 성공 후 파일 업로드 페이지로 진입이 가능하다. 

 

 

 

 

업로드 버튼을 누르면 upload.do를 실행하는데

컨트롤러에서는 이 값을 받으면 uploadForm을 실행하는 메소드를 실행한다.

 

 

 

 

jsp에서는 MultipartRequest로 파일 업로드에 대한 내용을 처리했는데,

스프링에서는 MultipartFile 로 파일 업로드를 처리하게 된다.

 

만약 작성자, 글제목, 내용 같은 게시판 형태의 프로젝트라서 다른 값을 함께 처리해야 할 때는

model 객체를 이용하여 값을 처리하면 된다.

 

 

 

 

 

submit 하면 콘솔창에 path를 출력하도록 했기 때문에 파일이 저장되는 경로가 나타난다.

 

 

 

 

업로드가 잘 실행됐다.

 

 

 

 

브라우저에 출력되는 내용은 다음과 같다.