DAY-78 Spring Session 이용, FormData 프로필 변경, Interceptor

2 minute read

💻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의 포맷

출처

❗ 에러

1.png

  • 파일의 값을 보내는데 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)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공

용도 : 특정 그룹의 사용자는 어떤 기능을 사용하지 못하는 경우가 있는데, 이러한 작업들은 컨트롤러로 넘어가기 전에 검사해야 하므로 인터셉터가 처리하기에 적합하다.

Interceptor 참고

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

Categories:

Updated:

Leave a comment