
SqlSession 정보(객체)를 저장하기 위한 필드 작성 - @RequiredArgsConstructor 어노테이션(final 제한자가 작성된 필드만 최기화)을 이용해 생성자 레벨의 의존성 주입
sqlSession 객체로 getMapper() 메소드를 호출하여 Mapper 인터페이스를 불러와(바인딩) 데이버베이스의 쿼리 실행
DAO 클래스의 메소드를 호출하여 데이터 처리 기능을 구현 - DAO 클래스 필드 생성하여 객체 저장(@RequiredArgsConstructor 어노테이션을 이용해 생성자 레벨의 의존성 주입)
예외를 명확히 구분하여 예외 처리시 사용하기 위해 예외클래스를 작성해 예외 발생





예외 처리는 RuntimeException 상속받아 작성 클래스를 상속받은 예외 처리, 안 받은 예외 처리 두가지로 나뉜다.
RuntimeException 클래스를 상속받으면 try catch나 extends 예외 처리를 하지 않아도 됨.
매개변수가 없는 기본 생성자, 매개변수(String message, Userinfo userinfo)가 있는 생성자 작성
Service 클래스에서 사용




session에 저장된 로그인 정보를 매개변수로 작성하여 로그인 정보를 반환받아 Userinfo 객체에 저장
클라이언트가 /write 페이지를 GET 방식으로 요청하였을 때 loginUserinfo 값이 없거나(비로그인) 9가 아니면(관리자가 아닌 경우) 비정상적인 방법으로 간주하여 에러 메세지 출력
userinfo 폴더에 있는 user_write.jsp 반환

➡️설명 : user_write.JSP에서 회원정보를 입력하고 회원등록을 누르면 userCreate() 함수가 실행되면서 /userinfo/write를 요청하여 post 방식으로 write() 메소드가 실행된다.
JSP 문서에서 입력한 값을 매개변수인 Userinfo 객체에 저장
매개변수로 전달받은 회원정보의 아이디가 중복될 경우 ExistsUserinfoException 발생
userinfoService 객체로 addUserinfo() 메소드를 호출하여 jsp 문서에서 입력받은 값이 저장된 userinfo 객체를 행에 삽입. 그 후 리다이렉트 이동으로 userinfo 폴더에 있는 login 페이지 반환


➡️설명 : user_login.jsp 문서에서 아이디와 비밀번호를 입력하고 로그인을 클릭하면 userLogin() 함수가 실행되면서 userinfo 폴더에 있는 login을 요청
입력받은 아이디와 비밀번호를 저장할 userinfo 객체와 loginUserinfo값을 전달해줄 HttpSession 객체를 매개변수로 작성
매개변수로 전달받은 회원정보로 인증이 실패한 경우 LoginAuthFailException 발생
인증된 로그인 정보를 authUserinfo 객체에 저장
세션에 인증된 로그인정보로 변경
user_login.jsp 요청
loginUserinfo가 없다면 아이디, 비밀번호 입력 창이 표시되고 있다면 로그인 회원에 대한 환영메세지 출력
로그인 회원의 권한이 관리자일 경우 회원등록 버튼 활성화


HttpSession.invalidate() : 사용자의 세션을 종료시켜 사용자의 세션 정보를 모두 삭제
리다이렉트 이동으로 login 페이지 요청
login 페이지 요청시 loginUserinfo 데이터가 모두 삭제되어 아이디, 비밀번호 입력창이 표시된다.

/list 페이지 요청시 처리되는 메소드
전달받을 값은 없고 뷰에 전달해줄 값을 model 객체로 인해 전달하기 위해 매개변수로 작성. 로그인 정보를 확인해야하기 때문에 HttpSession 객체를 매개변수로 작성
로그인 정보가 없다면 비정상적인 요청으로 에러 발생
model 객체에 userinfoList라는 이름으로 userinfoService 클래스의 getUserinfoList() 메소드 호출하여 전체 회원목록을 저장
user_list.jsp 요청

/view 페이지를 요청하면 처리되는 메소드
아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 뷰에 검색한 행을 전달해야하기 때문에 Model 객체 매개변수로 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록
로그인 정보가 존재하지 않으면 비정상적인 방법으로 요청하여 예외 발생
model 객체에 userinfo 라는 이름으로 userinfoService 클래스의 getUserinfo() 메소드를 호출해 매개변수로 전달받안 userid에 해당하는 행을 검색하여 저장
user_view 페이지 요청

/modify 페이지를 GET 방식으로 요청하였을 때 처리되는 메소드
아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 뷰에 검색한 행을 전달해야하기 때문에 Model 객체 매개변수로 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록
세션에 저장된 로그인 정보를 loginUserinfo 객체에 저장
페이지를 요청한 사용자가 비로그인 사용자이거나 관리자가 아닌 경우 인위적 예외 발생
userinfo라는 이름으로 전달받은 아이디에 해당하는 행을 검색하여 model 객체에 속성값으로 저장
user_modify.jsp 페이지 반환

변경할 행을 저장하기 위해 userinfo 객체를 매개변수로 등록, 로그인 정보로 권한을 확인해야하기 때문에 로그인 정보가 저장되어있는 session 객체 매개변수로 등록
userinfoService 클래스의 modifyUserinfo() 메소드 호출하여 매개변수로 userinfo 행을 수정
로그인 사용자와 변경 처리된 사용자가 동일한 경우 세션에 저장된 권한 관련 속성값 변경
리다이렉트 이동으로 view 페이지로 userid값을 가지고 이동
비밀번호를 제외한 기존 회원정보를 input 태그의 기본 text 값으로 지정(value 속성값)
수정 클릭 시 userModify() 함수 실행되어 modify 페이지 요청 - ⑨

아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록
세션에 저장된 로그인 정보를 loginUserinfo 객체에 저장
페이지를 요청한 사용자가 비로그인 사용자이거나 관리자가 아닌 경우 인위적 예외 발생
userinfoService 클래스의 removeUserinfo() 메소드 호출하여 해당 userid의 행 삭제
로그인 사용자와 삭제 처리된 회원정보의 아이디가 동일한 경우 로그아웃 페이지로 리다이렉트 이동 처리
아닐시 list 페이지로 리다이렉트 이동 처리

@ExceptionHandler : 예외 처리 기능을 제공하는 메소드를 설정하기 위한 어노테이션 → Controller 클래스의 요청 처리 메소드에서 예외가 발생될 경우 예외 처리를 위해 Front Controller가 자동으로 호출되는 메소드 - 예외 처리 메소드(Spring AOP 기능 사용)
@ControllerAdvice : 예외 처리 메소드만 작성된 Controller 클래스를 Spring Bean으로 등록하기 위한 어노테이션 → 모든 Controller 클래스의 요청 처리 메소드에서 발생된 예외를 제공받아 예외 처리 가능

필터는 Front Controller의 이전 위치에 존재하여 실행되고 인터셉터는 Front Controller의 다음 위치에 존재하여 실행
필터 클래스는 web.xml(WAS 환경설정파일)에 등록
인터셉터는 front controller에 의해 관리되기 때문에 spring bean으로 등록(servlet-context.xml)


bean 엘리먼트를 이용해 AdminAuthInterceptor, LoginUserAuthInterceptor 클래스를 Spring Bean으로 등록
스프링 컨테이너가 두 개의 클래스를 객체로 만들어놓으면 Front Controller가 객체를 달라고해서 사용

interceptors : interceptor 엘리먼트를 등록하기 위한 엘리먼트
interceptor : Front Controller로 Interceptor 객체의 메소드를 호출하기 위한 규칙을 제공하기 위한 엘리먼트
mapping : 인터셉터가 동작될 요청 페이지 경로를 제공하는 엘리먼트 - path 속성 : 요청 페이지 경로

ref : Front Controller에 의해 사용될 Interceptor 객체를 제공하기 위한 엘리먼트 - bean 속성 : Interceptor 클래스의 Spring Bean 식별자(beanName)

➡️설명 : mapping 엘리먼트에 요청 페이지의 경로를 작성하여 작성된 페이지가 요청될 때 adminAuthInterceptor 클래스의 메소드 호출. userinfo 폴더의 login 페이지를 제외한 모든 페이지를 요청할 때 LoginAuthInterceptor 클래스의 메소드 호출