DAY-78 Spring Session 이용, FormData 프로필 변경, Interceptor
💻2022-06-23
❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음
1️⃣ Session (Autowired로 주입 받기)
MemberController.java
- 로그인을 하면 해당 아이디의 Session을 유지해야 한다.
- Session을 사용하기 위해서 Autowired 사용(session은 bean 생성 안해도 spring에서 자동적으로 만들어서 container에 넣어줌)
2️⃣ 로그인 세션, 프로필 이미지 가져오기
servlet-context
- 즉 해당 프로젝트의 경로에서 profile 아래의 모든 파일들을 읽는다는 mapping을 해주는 것
- *을 하나만 사용해도 되는 이유는 사진의 경로가 profile안에 하위폴더에 들어가는게 아니라 바로 profile의 폴더로 들어가기 때문이다.
MemberController.java
❗ MemberController에서 welcome.jsp로 dto를 안보냈는데 어떻게 welcome.jsp에서 받을 수 있는걸까? → 로그인 할때 세션을 생성해주고 그 세션값은 톰캣이 가지고있다 그래서 그 값을 다른 jsp에서도 사용가능(단 로그인이 성공했을 때 전제를 두고)
- 로그인이 성공 할 때만 session이 형성 되어야 하므로 login메서드 에서 session을 만든다
welcome.jsp
3️⃣ 로그아웃
- 로그아웃을 하기 위해서는 세션을 종료시켜야 한다.
welcome.jsp
- logout 컨트롤러로 이동
memberController.java
4️⃣ 자바스크립트 FormData
- html의 form 대신해서 사용
- 객체를 생성해서 사용
let formData = new FormData(document.getElementById('폼 아이디'));
💡 사용 이유
HTML상에서 <form> 태그를 사용해서 submit 버튼을 만들어서 전송한다.
ajax로 비동기로 데이터를 전송 해야 할 때는 보통 json 데이터를 전송한다.
하지만 파일을 전송해야 하거나, 이미지를 전송해야 하는데, 비동기로 전송 하고 싶은 경우에는 어떻게 해야 할까? 이럴 때 FormData 객체를 활용 한다.
❗ 전송 방식은 ajax의 비동기 방식을 사용하고 전송 데이터 포맷은 json이 아닌 form의 포맷
❗ 에러
- 파일의 값을 보내는데 contentType: false, processData: false 를 사용하지 않았을 떄 발생
🔔 활용(프로필 변경)
welcome.jsp
- jquery의 serialize 함수를 이용해서 form을 전송할 수 있는 형태로 변환
- 파일을 전송해야 하는 경우에는 serialize로 데이터를 변환해도 파일 데이터가 정상적으로 변환
- 자바스크립트의 FormData 객체에 우리가 만들어준 form을 자바스크립트 객체로 넘겨서 만든 변수를 ajax의 data 영역에 셋팅
🔔 FormData 활용 프로필 변경
- 프로필 변경 시 사진 업데이트를 안 하면 기존 현재 id의 세션 값이 그대로 들어가고, 사진 업데이트를 하면 if문으로 들어가 세션의 이미지 경로와 파일명을 합친 sys_name 값이 profile_image의 값으로 들어간다
- 프로필 메세지는 반드시 작성해야 한다고 가정 한 코드다(즉 사진 변경과 별개로 반드시 값이 들어와야함) 메세지를 현재 id의 세션값을 바꿔준다.
- 그 후 service.modifyProfile()에 모든 게 바뀐 현재의 session 값을 넣어준다.
❗ 즉 위의 코드들은 현재 로그인한 id의 세션값을 변경하여서 그 세선들의 데이터로 dao와 service를 통해 업데이트 하는 방식이다.
MemberService.java
MemberDAO.java
5️⃣ Interceptor (로그인 시 필요)
Interceptor : Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
용도 : 특정 그룹의 사용자는 어떤 기능을 사용하지 못하는 경우가 있는데, 이러한 작업들은 컨트롤러로 넘어가기 전에 검사해야 하므로 인터셉터가 처리하기에 적합하다.
servlet-context.java
- 로그인이 된후 작업을 할 수 있게 하기 위해 사용(즉 로그인 유무 용도) → controller 전에 먼저 실행 해서 판단
- /** : 모든 요청값에 매핑
- 어떤 인터셉터 클래스를 사용할건지 빈 등록
- 만약 인터셉터가 동작할 필요가 없는 요청 값이라면 그 url은 제외 → exclude 사용
- exclude 된 페이지들은 로그인을 안해도 사용 가능 해야한다
AuthLoginInerceptor.java
- dispatcherServlet과 controller 사이에서 요청 / 응답을 가로채서 추가적인 처리를 해줄 수 있는 클래스
- HandlerInterceptor를 implements 해준다
- preHandle() : D.S이 controller에게 요청을 보내기 전에 실행되는 메서드
- postHandle() : controller가 D.S에게 응답을 보내기 전에 실행되는 메서드
- loginSession이라는 key값이 session에 들어있는지 아닌지를 검사
- true 반환 -> Interceptor가 동작한 후에 Controller/D.S 요청/응답을 정상적으로 전달
- false 반환 : Interceptor 동작 후 Controller/D.S 요청/응답을 전달 X
Leave a comment