[Salle] 2-1. 로그인 회원정보 Session 저장

2020. 12. 14. 23:48프로젝트/Salle(살래) 중고거래 웹

728x90

로그인 시 회원정보를 Session에 저장해 서비스 사용 시 유지시킬 수 있는 기능구현을 1주일 정도 붙잡고 있었다. 오늘 드디어 Interceptor와 Webconfig, Controller와 jsp간의 상호작용과 작동에 대한 이해를 거쳐 구현해냈다.

집중이 아주 잘된 날이었고, 매일 이랬으면 좋겠다. 혹시 내 자신이 참고가 될 수도 있는 오늘의 생활패턴(새벽 2시 취침, 7시 45분 기상, 10시 커피 1샷, 12시 점심, 2시 커피 1샷, 5시 샤워, 8시 조깅, 9시 샤워

요약

  • TODO - 로그아웃 기능추가, 로그인 했을 때 호출되는 home 화면 정리하기
  • 오늘 session이란 산을 드디어 넘었다.

진행사항

  • 로그인 화면 회원가입 버튼 추가
    • 버튼<button>에 링크를 걸려면 <a href ="#">을 쓰면 안되구요. 버튼 태그안에 onclick = "location.href = '#' "을 넣어줘야 해요.
  • 로그인하면 main페이지 로그인/회원가입 버튼 전환 → 000님(nickName) 안녕하세요 :)
    • Session이 not null이면 DB에 접근해 nickName 불러와 쏴주는 방식
    • Controller 전후로 동작하는 Interceptor를 이용하는 방식(참고블로그)
      • Logger slf4j - 잘 설명된 블로그 링크
  • Login과 Member(Register) Vo 클래스를 나눈 이유가 뭐였지? DB 접근할 때 login에 필요한 정보만 뽑아오고 Register Vo랑 겹치지 않게 하기 위해서 > autoLogin, RememberId 얻어오려고 > 일단 Login Vo도 지우지는 말고 Member로 이관해주자
    • .jsp에 커멘드 객체 설정해주지 않은 login을 Service에서 어떻게 받는지? 가설 검증해보기
      • Vo 전역변수명과 .jsp <input> 변수명이 일치하면 자동으로 객체에 저장됨
    • 결국 이유는 찾지 못함. 로그인 시 출력할 nickName을 DB에서 받아와야 하므로 Member 객체에 모든 정보를 담에 Session에 저장해주기로 함.
  • Interceptor 작동
    • login Request가 왔을 때에만 동작하도록 .addpath를 맞게 설정 해줘야 됨 → login POST returning URI를 "login/done"으로 만들고 변경을 .jsp와 Controller에 적용시켜줌(Requestmapping과 action)
    • posthandle 메서드는 Controller에서 정상적인 login이 될 경우 model.addattribute에 담은 member 객체를 받는다. member가 null이 아닐 경우 session에 member 객체를 "member" 이름으로 담는다. end
  • .jsp에서 session에 담긴 member 객체의 정보 꺼내기
    • JSTL과 EL을 사용 - jstl은 .jsp파일에서 Java 문법를 깔끔하게 사용할 수 있는 기능이고, el은 서블릿에 저장된(httpsession, servletrequest 등) 프로퍼티를 꺼낼 때 사용하는 간결화된 기술이다.
    • Interceptor의 session.setAttribute("name", value) 중 "name"을 EL에 넣는다. ${name} 그럼 spring에서 value를 찾아 반환해준다.

이슈

  • Sql문 바인딩 오류:

    Invalid bound statement (not found):om.example.demo.mapper.MemberMapper.memberInfoorg.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    • 이클립스로 옮기면서 workspace 변경됨 > datasource.url도 변경해줘야 할 것 같음
    • mapper.xml 디렉토리 명이 예전 경로로 되어 있어서 변경해 줌
  • **Error parsing Mapper XML. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberService': Unsatisfied dependency expressed through field 'memberMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating... mapper.xml 파싱 오류 뜸**

    • xml파일 오타여부 확인 - 이상없음
    • DB파일(h2)를 eclipse workplace로 복붙해주고 properties파일 datasource url 경로를 바꿔줌 - 해결안됨
    • alias가 잘못되어 있다고 나와있길래, application에 sqlsessionfactory 설정한 코드 중 Member 클래스 alias 를 예전 것으로 설정한 오류 확인함
    • setTypeAliasesPackage 는 mapper.xml파일의 parametertype, resulttype 경로를 축약해 작성할 수 있도록 설정해주는 alias

     

  • Validator - 갑자기 동작을 하지 않음 > message properties 설정 확인할 것
  • WebserviceConfig(Interceptor 작동시키기 위한 Configuration)에 Autowired로 의존주입된 LoginInterceptor가 bean 타입으로 주입이 필요하다고 함
    • Autowired 없이 객체 선언(new LoginInterceptor)하니 해결됨