목차 1 MYMEMBER 테이블 2 MyMemberDto 3 MyMemberDao 4 로그인 화면과 로그인 처리 5 Session을 이용한 로그인 유지 6 관리자 페이지 흐름 7 회원 목록 조회 8 회원 등급 변경 9 일반 회원 페이지 흐름 10 마이페이지 조회 11 회원 정보 수정 12 회원 탈퇴 13 result.jsp 공통 결과 처리 14 logincontroller.jsp 중심 흐름 15 오늘 실습의 핵심 정리
1 MYMEMBER 테이블
1) MYMEMBER 테이블의 역할
(1) 회원 정보 저장 테이블
MYMEMBER 테이블은 로그인과 회원 관리를 위한 회원 정보를 저장하는 테이블이다.
아이디, 비밀번호, 이름, 주소, 전화번호, 이메일, 가입 여부, 회원 등급 정보를 관리한다.
(2) 로그인 실습용 테이블
오늘 실습에서는 MYMEMBER 테이블을 이용해 로그인, 로그아웃, 관리자 페이지, 일반 회원 페이지, 회원 정보 수정, 회원 탈퇴, 회원 등급 변경 기능을 구현했다.
(3) 권한 구분
MYROLE 컬럼을 이용해 ADMIN, USER, MANAGER 같은 회원 등급을 구분한다.
로그인한 사용자의 등급에 따라 관리자 페이지로 보낼지, 일반 회원 페이지로 보낼지 결정한다.
2) MYMEMBER 컬럼
(1) MYNO
MYNO는 회원 번호이다.
PRIMARY KEY로 설정되어 회원 한 명을 구분하는 고유한 값으로 사용된다.
(2) MYID
MYID는 로그인할 때 사용하는 아이디이다.
NOT NULL과 UNIQUE가 설정되어 있어서 반드시 입력되어야 하고 중복될 수 없다.
(3) MYPW
MYPW는 로그인할 때 사용하는 비밀번호이다.
NOT NULL이 설정되어 있어 반드시 값이 들어가야 한다.
(4) MYNAME
MYNAME은 회원 이름을 저장하는 컬럼이다.
로그인 성공 후 화면에서 “OO님 환영합니다”처럼 사용자 이름을 보여줄 때 사용한다.
(5) MYADDR
MYADDR은 회원 주소를 저장하는 컬럼이다.
일반 회원이 마이페이지에서 수정할 수 있는 정보이다.
(6) MYPHONE
MYPHONE은 회원 전화번호를 저장하는 컬럼이다.
UNIQUE가 설정되어 있어서 같은 전화번호를 여러 회원이 사용할 수 없다.
(7) MYEMAIL
MYEMAIL은 회원 이메일을 저장하는 컬럼이다.
UNIQUE가 설정되어 있어 이메일 중복을 막는다.
(8) MYENABLED
MYENABLED는 회원의 가입 상태를 나타내는 컬럼이다.
Y는 가입 상태, N은 탈퇴 상태를 의미한다.
(9) MYROLE
MYROLE은 회원 등급을 나타내는 컬럼이다.
ADMIN이면 관리자, USER이면 일반 회원, MANAGER이면 매니저 같은 권한을 의미한다.
3) SEQ_MYMEMBER
(1) 시퀀스
SEQ_MYMEMBER는 회원 번호를 자동으로 생성하기 위한 시퀀스이다.
새로운 회원이 추가될 때 MYNO 값을 직접 입력하지 않고 자동으로 번호를 생성할 수 있다.
(2) 사용하는 이유
회원 번호는 중복되면 안 되는 값이다.
시퀀스를 사용하면 DB가 자동으로 번호를 증가시켜 회원을 구분할 수 있다.
2 MyMemberDto
1) MyMemberDto의 역할
(1) DTO
MyMemberDto는 MYMEMBER 테이블의 한 행 데이터를 Java 객체로 담는 클래스이다.
회원 번호, 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일, 가입 여부, 등급을 하나의 객체로 관리한다.
(2) DTO를 사용하는 이유
DB에서 조회한 회원 정보를 여러 변수로 따로 관리하면 복잡하다.
MyMemberDto 객체 하나에 회원 정보를 담으면 DAO, Controller, JSP 사이에서 데이터를 전달하기 쉽다.
2) 필드
(1) myno
myno는 회원 번호를 저장한다.
MYMEMBER 테이블의 MYNO 컬럼과 연결된다.
(2) myid
myid는 회원 아이디를 저장한다.
로그인할 때 사용자가 입력한 id와 DB의 MYID 값을 비교할 때 사용한다.
(3) mypw
mypw는 회원 비밀번호를 저장한다.
로그인할 때 사용자가 입력한 pw와 DB의 MYPW 값을 비교할 때 사용한다.
(4) myname
myname은 회원 이름을 저장한다.
로그인 성공 후 화면에 사용자 이름을 출력할 때 사용한다.
(5) myaddr
myaddr은 회원 주소를 저장한다.
일반 회원이 마이페이지에서 수정할 수 있는 정보이다.
(6) myphone
myphone은 회원 전화번호를 저장한다.
회원 정보 조회와 수정에서 사용된다.
(7) myemail
myemail은 회원 이메일을 저장한다.
회원 정보 조회와 수정에서 사용된다.
(8) myenabled
myenabled는 회원의 가입 여부를 저장한다.
Y이면 정상 회원, N이면 탈퇴 회원으로 판단할 수 있다.
(9) myrole
myrole은 회원 권한 또는 등급을 저장한다.
로그인 후 이동할 페이지를 결정하거나 관리자 페이지에서 등급을 변경할 때 사용한다.
3) 생성자와 메소드
(1) 기본 생성자
기본 생성자는 값 없이 MyMemberDto 객체를 만들 때 사용한다.
DB 조회 결과를 setter로 하나씩 넣을 때 사용할 수 있다.
(2) 매개변수 생성자
매개변수 생성자는 회원 정보를 한 번에 받아 객체를 만들 때 사용한다.
여러 필드 값을 한 번에 담아야 할 때 편리하다.
(3) getter와 setter
getter는 private 필드 값을 읽을 때 사용하고, setter는 private 필드 값을 변경할 때 사용한다.
JSP와 DAO에서 회원 정보를 안전하게 다루기 위해 사용한다.
3 MyMemberDao
1) MyMemberDao의 역할
(1) DAO
MyMemberDao는 MYMEMBER 테이블에 직접 접근하는 클래스이다.
로그인, 회원 전체 조회, 회원 한 명 조회, 등급 변경, 회원 탈퇴, 회원 정보 수정 SQL을 실행한다.
(2) 기능 구분
MyMemberDao에는 관리자 기능과 회원 기능이 함께 들어 있다.
관리자는 전체 회원 조회와 등급 변경을 할 수 있고, 일반 회원은 로그인, 내 정보 조회, 정보 수정, 탈퇴를 할 수 있다.
2) 관리자 기능
(1) selectAll
selectAll은 MYMEMBER 테이블의 모든 회원 정보를 조회한다.
관리자 페이지에서 전체 회원 목록을 볼 때 사용한다.
(2) selectUser
selectUser는 회원 번호 MYNO를 기준으로 회원 한 명의 정보를 조회한다.
회원 등급 변경 화면이나 마이페이지 조회, 회원 정보 수정 화면에서 사용된다.
(3) updateRole
updateRole은 특정 회원의 MYROLE 값을 변경한다.
관리자가 일반 회원을 매니저나 관리자로 변경할 때 사용할 수 있다.
3) 회원 기능
(1) login
login은 사용자가 입력한 아이디와 비밀번호가 DB에 존재하는지 확인한다.
MYID, MYPW, MYENABLED 값을 조건으로 조회해서 정상 가입 상태인 회원만 로그인할 수 있게 한다.
(2) deleteMember
deleteMember는 실제 회원 데이터를 삭제하지 않고 MYENABLED 값을 N으로 변경한다.
이것은 물리 삭제가 아니라 논리 삭제 방식이다.
(3) updateUser
updateUser는 회원의 주소, 전화번호, 이메일을 수정한다.
일반 회원이 마이페이지에서 자신의 정보를 변경할 때 사용한다.
4 로그인 화면과 로그인 처리
1) index.jsp
(1) 로그인 화면
index.jsp는 사용자가 아이디와 비밀번호를 입력하는 로그인 화면이다.
로그인 form을 통해 입력값을 logincontroller.jsp로 전달한다.
(2) form action
form의 action은 logincontroller.jsp이다.
사용자가 login 버튼을 누르면 로그인 요청이 Controller로 전달된다.
(3) hidden command
hidden input으로 command=login 값을 함께 보낸다.
logincontroller.jsp는 이 command 값을 보고 로그인 요청임을 판단한다.
(4) id와 pw
input의 name이 id와 pw로 설정되어 있다.
Controller에서는 request.getParameter("id"), request.getParameter("pw")로 입력값을 받을 수 있다.
2) logincontroller.jsp의 login 처리
(1) command 확인
logincontroller.jsp는 request.getParameter("command")로 요청 종류를 확인한다.
command가 login이면 로그인 처리 로직을 실행한다.
(2) 입력값 받기
사용자가 입력한 id와 pw를 request.getParameter로 가져온다.
이 값은 DAO의 login 메소드로 전달된다.
(3) dao.login 호출
dao.login(id, pw)는 MYMEMBER 테이블에서 아이디, 비밀번호, 가입 여부가 일치하는 회원을 조회한다.
조건에 맞는 회원이 있으면 MyMemberDto 객체에 회원 정보를 담아 반환한다.
(4) 로그인 성공 판단
dto.getMyid()가 null이 아니면 로그인 성공으로 판단한다.
DB에서 일치하는 회원 정보를 찾았다는 의미이다.
(5) 로그인 실패 처리
dto.getMyid()가 null이면 로그인 실패로 판단한다.
실패 메시지와 이동할 URL을 request에 담고 result.jsp로 forward한다.
5 Session을 이용한 로그인 유지
1) Session의 개념
(1) session
session은 같은 브라우저 안에서 사용자 정보를 유지하기 위한 객체이다.
로그인 성공 후 사용자 정보를 session에 저장하면 다른 JSP에서도 로그인한 사용자 정보를 사용할 수 있다.
(2) 사용하는 이유
웹은 기본적으로 요청과 응답이 끝나면 이전 요청 정보를 기억하지 않는다.
로그인 상태를 유지하려면 session처럼 사용자별 정보를 저장할 공간이 필요하다.
2) session.setAttribute
(1) 로그인 정보 저장
로그인 성공 시 session.setAttribute("dto", dto)를 사용해 회원 정보를 session에 저장한다.
이렇게 저장된 dto는 adminmain.jsp, usermain.jsp, userlistall.jsp 등에서 꺼내 사용할 수 있다.
(2) 저장하는 이유
로그인한 사용자의 이름, 등급, 회원 번호를 여러 페이지에서 사용해야 하기 때문이다.
매 페이지마다 DB에서 다시 로그인 정보를 조회하지 않아도 된다.
3) session.setMaxInactiveInterval
(1) 세션 유지 시간
session.setMaxInactiveInterval(60*60)은 세션 유지 시간을 1시간으로 설정한다.
사용자가 일정 시간 동안 아무 요청도 하지 않으면 세션이 만료될 수 있다.
(2) 사용하는 이유
로그인 상태를 무한정 유지하면 보안상 좋지 않다.
일정 시간이 지나면 자동으로 세션을 종료하도록 설정할 수 있다.
4) session.invalidate
(1) 로그아웃
session.invalidate는 현재 세션에 저장된 정보를 모두 삭제한다.
로그아웃할 때 사용한다.
(2) 로그아웃 후 처리
세션을 삭제한 뒤 로그아웃 완료 메시지를 result.jsp로 전달한다.
확인 버튼을 누르면 index.jsp로 이동해 다시 로그인할 수 있다.
6 관리자 페이지 흐름
1) adminmain.jsp
(1) 관리자 메인 페이지
adminmain.jsp는 ADMIN 권한 사용자가 로그인에 성공했을 때 이동하는 메인 페이지이다.
관리자 이름과 등급을 화면에 출력한다.
(2) session 정보 확인
session.getAttribute("dto")로 로그인한 사용자 정보를 꺼낸다.
dto가 null이면 로그인하지 않은 상태이므로 index.jsp로 보낸다.
(3) 로그인 체크
관리자 페이지는 로그인한 사용자만 접근해야 한다.
session에 dto가 없으면 접근을 막고 로그인 화면으로 이동시킨다.
(4) 회원 정보 조회 링크
관리자 메인 페이지에는 회원 정보 전체 조회 링크가 있다.
이 링크를 클릭하면 logincontroller.jsp?command=userlist 요청이 발생한다.
2) 관리자 권한 흐름
(1) 로그인 성공
로그인 성공 후 dto.getMyrole()이 ADMIN이면 adminmain.jsp로 redirect한다.
관리자 등급 사용자는 관리자 전용 화면으로 이동한다.
(2) 회원 관리
관리자는 전체 회원 목록을 조회하고, 특정 회원의 등급을 변경할 수 있다.
일반 회원 화면보다 관리 기능이 추가되어 있다.
7 회원 목록 조회
1) userlist 요청
(1) Controller 요청
관리자가 회원 정보 조회 링크를 클릭하면 command=userlist 요청이 logincontroller.jsp로 전달된다.
Controller는 이 요청을 보고 전체 회원 조회 기능을 실행한다.
(2) selectAll 호출
logincontroller.jsp는 dao.selectAll()을 호출한다.
MYMEMBER 테이블의 전체 회원 정보를 조회한다.
(3) request 저장
조회된 List<MyMemberDto>를 request.setAttribute("list", list)로 저장한다.
이후 userlistall.jsp로 forward하여 목록 데이터를 전달한다.
2) userlistall.jsp
(1) 회원 전체 목록 화면
userlistall.jsp는 전체 회원 정보를 테이블 형태로 출력하는 관리자용 View 페이지이다.
회원 번호, 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일, 가입 여부, 등급을 보여준다.
(2) session 체크
userlistall.jsp에서도 session의 dto를 확인한다.
로그인 정보가 없으면 index.jsp로 이동시켜 비로그인 접근을 막는다.
(3) 가입 여부 출력
MYENABLED 값이 Y이면 가입, N이면 탈퇴로 출력한다.
DB에는 Y 또는 N으로 저장되어 있지만 화면에서는 사용자가 이해하기 쉬운 단어로 보여준다.
(4) 등급 변경 버튼
각 회원 행마다 등급변경 버튼이 있다.
버튼을 누르면 해당 회원의 myno를 가지고 등급 변경 화면으로 이동한다.
8 회원 등급 변경
1) updateroleform 요청
(1) 등급 변경 화면 요청
userlistall.jsp에서 등급변경 버튼을 누르면 command=updateroleform과 myno 값이 Controller로 전달된다.
Controller는 해당 회원 번호를 이용해 회원 정보를 조회한다.
(2) selectUser 호출
dao.selectUser(myno)를 호출해 등급을 변경할 회원 한 명의 정보를 가져온다.
조회 결과를 request.setAttribute("selectone", dto)로 저장한다.
(3) updateroleform.jsp 이동
pageContext.forward("updateroleform.jsp")를 사용해 등급 변경 화면으로 이동한다.
forward를 사용하므로 request에 저장한 selectone 값을 그대로 사용할 수 있다.
2) updateroleform.jsp
(1) 등급 변경 화면
updateroleform.jsp는 특정 회원의 등급을 변경하는 화면이다.
회원 번호, 아이디, 이름을 보여주고 select 태그로 등급을 선택할 수 있다.
(2) select 태그
select 태그에는 USER, MANAGER, ADMIN 옵션이 있다.
현재 회원 등급과 같은 옵션에는 selected를 적용해 기존 등급이 선택되어 보이게 한다.
(3) hidden 값
form 안에는 command=updaterole과 myno 값이 hidden으로 들어 있다.
등급 변경 완료 버튼을 누르면 어떤 회원의 등급을 변경할지 Controller가 알 수 있다.
3) updaterole 처리
(1) 변경할 값 받기
Controller는 request.getParameter로 myno와 myrole 값을 받는다.
myno는 변경 대상 회원 번호이고, myrole은 새로 선택한 등급이다.
(2) updateRole 호출
dao.updateRole(myno, myrole)을 호출해 DB의 MYROLE 값을 변경한다.
SQL은 MYNO를 기준으로 해당 회원의 등급만 수정한다.
(3) 결과 처리
변경 성공 시 “회원 등급 변경 완료” 메시지를 result.jsp로 전달한다.
실패 시 다시 등급 변경 화면으로 돌아갈 수 있는 URL을 전달한다.
9 일반 회원 페이지 흐름
1) usermain.jsp
(1) 일반 회원 메인 페이지
usermain.jsp는 USER 권한 사용자가 로그인에 성공했을 때 이동하는 메인 페이지이다.
로그인한 사용자의 이름과 등급을 보여준다.
(2) session 정보 사용
session.getAttribute("dto")로 로그인한 회원 정보를 가져온다.
dto가 null이면 로그인하지 않은 상태이므로 index.jsp로 이동시킨다.
(3) 내 정보 보기 링크
usermain.jsp에는 내 정보 보기 링크가 있다.
이 링크를 클릭하면 command=userinfo와 로그인한 사용자의 myno 값이 Controller로 전달된다.
2) USER 권한 흐름
(1) 로그인 성공
로그인 성공 후 dto.getMyrole()이 USER이면 usermain.jsp로 redirect한다.
일반 회원은 자신의 정보 조회, 수정, 탈퇴 기능을 사용할 수 있다.
(2) 관리자와 차이
일반 회원은 전체 회원 목록이나 회원 등급 변경 기능을 사용하지 않는다.
자기 자신의 정보와 관련된 기능만 수행한다.
10 마이페이지 조회
1) userinfo 요청
(1) 내 정보 보기 요청
usermain.jsp에서 내 정보 보기를 클릭하면 command=userinfo와 myno 값이 Controller로 전달된다.
Controller는 myno를 기준으로 회원 정보를 조회한다.
(2) selectUser 호출
dao.selectUser(myno)를 호출해 해당 회원의 정보를 가져온다.
조회 결과를 request.setAttribute("dto", dto)로 저장한다.
(3) userinfo.jsp 이동
pageContext.forward("userinfo.jsp")로 마이페이지 화면으로 이동한다.
userinfo.jsp는 request에 담긴 dto를 사용해 회원 정보를 출력한다.
2) userinfo.jsp
(1) 마이페이지
userinfo.jsp는 로그인한 회원의 상세 정보를 보여주는 페이지이다.
아이디, 이름, 주소, 전화번호, 이메일, 등급을 출력한다.
(2) 수정 버튼
수정 버튼을 누르면 updateUser 함수가 실행된다.
확인 창에서 사용자가 확인을 누르면 command=updateform 요청으로 이동한다.
(3) 탈퇴 버튼
탈퇴 버튼을 누르면 deleteUser 함수가 실행된다.
command=deleteuser와 myno 값을 Controller로 전달해 회원 탈퇴를 처리한다.
(4) 목록 버튼
목록 버튼을 누르면 usermain.jsp로 이동한다.
일반 회원 메인 화면으로 돌아가는 기능이다.
11 회원 정보 수정
1) updateform 요청
(1) 수정 화면 요청
마이페이지에서 수정 버튼을 누르면 command=updateform과 myno 값이 Controller로 전달된다.
Controller는 수정할 회원 정보를 먼저 조회한다.
(2) selectUser 호출
dao.selectUser(myno)를 호출해 기존 회원 정보를 가져온다.
기존 주소, 전화번호, 이메일 값을 수정 form에 보여주기 위해 필요하다.
(3) updateuser.jsp 이동
조회한 dto를 request에 저장한 뒤 updateuser.jsp로 forward한다.
updateuser.jsp는 기존 회원 정보를 입력창에 출력한다.
2) updateuser.jsp
(1) 내 정보 수정 화면
updateuser.jsp는 주소, 전화번호, 이메일을 수정하는 화면이다.
아이디와 이름은 수정하지 않고 화면에 출력만 한다.
(2) hidden command
hidden input으로 command=updateuser 값을 전달한다.
form 제출 시 Controller가 회원 정보 수정 요청임을 알 수 있다.
(3) hidden myno
hidden input으로 myno 값을 전달한다.
DB에서 어떤 회원의 정보를 수정할지 구분하기 위해 필요하다.
(4) 기존 값 출력
주소, 전화번호, 이메일 input의 value에 기존 값을 넣는다.
사용자는 현재 정보를 확인한 뒤 원하는 값으로 수정할 수 있다.
3) updateuser 처리
(1) 수정값 받기
Controller는 myaddr, myphone, myemail, myno 값을 request에서 가져온다.
이 값들은 updateuser.jsp의 form에서 전달된다.
(2) DTO 생성
MyMemberDto 객체를 만들고 주소, 전화번호, 이메일, 회원번호를 setter로 저장한다.
DAO의 updateUser 메소드가 이 DTO 값을 이용해 SQL을 실행한다.
(3) updateUser 호출
dao.updateUser(dto)를 호출해 MYMEMBER 테이블의 MYADDR, MYPHONE, MYEMAIL을 수정한다.
WHERE MYNO=? 조건으로 특정 회원의 정보만 수정한다.
(4) 결과 처리
수정 성공 시 “내 정보 수정 성공” 메시지와 usermain.jsp 이동 URL을 result.jsp로 전달한다.
수정 실패 시 마이페이지로 다시 돌아갈 수 있는 URL을 전달한다.
12 회원 탈퇴
1) deleteuser 요청
(1) 탈퇴 요청
마이페이지에서 탈퇴 버튼을 누르면 command=deleteuser와 myno 값이 Controller로 전달된다.
Controller는 해당 회원 번호를 기준으로 탈퇴 처리를 진행한다.
(2) deleteMember 호출
dao.deleteMember(myno)를 호출한다.
이 메소드는 회원 행을 실제로 삭제하지 않고 MYENABLED 값을 N으로 변경한다.
2) 논리 삭제
(1) 논리 삭제의 개념
논리 삭제는 데이터를 실제로 삭제하지 않고 상태값만 변경하는 방식이다.
오늘 실습에서는 MYENABLED를 Y에서 N으로 바꾸어 탈퇴 상태를 표시한다.
(2) 사용하는 이유
회원 정보를 완전히 삭제하면 나중에 기록을 확인하기 어렵다.
상태값만 바꾸면 탈퇴 여부를 관리하면서 데이터는 유지할 수 있다.
(3) 로그인 제한
login SQL은 MYENABLED='Y'인 회원만 조회한다.
따라서 탈퇴 처리된 회원은 아이디와 비밀번호가 맞아도 로그인되지 않는다.
3) 탈퇴 결과 처리
(1) 탈퇴 성공
탈퇴 성공 시 “회원 탈퇴 성공” 메시지를 result.jsp로 전달한다.
이동 URL은 logout 요청으로 설정하여 세션도 함께 종료되도록 한다.
(2) 탈퇴 실패
탈퇴 실패 시 “회원 탈퇴 실패” 메시지를 전달한다.
이동 URL은 usermain.jsp로 설정해 다시 사용자 메인 화면으로 돌아가게 한다.
13 result.jsp 공통 결과 처리
1) result.jsp의 역할
(1) 공통 결과 페이지
result.jsp는 로그인 실패, 로그아웃 완료, 등급 변경 결과, 회원 탈퇴 결과, 회원 정보 수정 결과를 공통으로 보여주는 페이지이다.
여러 처리 결과를 하나의 JSP에서 처리할 수 있다.
(2) 반복 코드 감소
각 기능마다 결과 페이지를 따로 만들면 비슷한 코드가 반복된다.
result.jsp를 공통으로 사용하면 메시지와 이동 URL만 바꿔 여러 결과를 처리할 수 있다.
2) msg와 url
(1) msg
msg는 사용자에게 보여줄 결과 메시지이다.
Controller에서 request.setAttribute("msg", msg)로 저장한다.
(2) url
url은 확인 버튼을 눌렀을 때 이동할 주소이다.
Controller에서 request.setAttribute("url", url)로 저장한다.
(3) 확인 버튼
result.jsp의 확인 버튼은 location.href를 이용해 url로 이동한다.
사용자는 결과 메시지를 확인한 뒤 다음 페이지로 이동할 수 있다.
14 logincontroller.jsp 중심 흐름
1) Controller의 역할
(1) 요청 분기
logincontroller.jsp는 모든 요청을 command 값으로 구분한다.
login, logout, userlist, updateroleform, updaterole, userinfo, deleteuser, updateform, updateuser 요청을 처리한다.
(2) DAO 호출
Controller는 요청에 따라 MyMemberDao의 메소드를 호출한다.
DB 조회나 수정이 필요한 작업은 DAO를 통해 처리한다.
(3) 화면 이동 결정
Controller는 처리 결과에 따라 어떤 JSP로 이동할지 결정한다.
화면 이동에는 forward와 redirect가 사용된다.
2) 주요 command
(1) login
로그인 화면에서 전달된 id와 pw를 이용해 로그인 처리를 한다.
성공하면 session에 dto를 저장하고 권한에 따라 adminmain.jsp 또는 usermain.jsp로 이동한다.
(2) logout
session.invalidate로 로그인 정보를 삭제한다.
로그아웃 완료 메시지를 result.jsp로 전달한다.
(3) userlist
전체 회원 목록을 조회한다.
관리자 화면에서 전체 회원 정보를 확인할 때 사용한다.
(4) updateroleform
등급을 변경할 회원의 정보를 조회한다.
조회 결과를 updateroleform.jsp로 전달한다.
(5) updaterole
선택한 회원 등급을 DB에 반영한다.
성공하면 회원 목록으로 돌아가고, 실패하면 등급 변경 화면으로 돌아간다.
(6) userinfo
특정 회원의 정보를 조회한다.
일반 회원의 마이페이지 화면을 보여줄 때 사용한다.
(7) deleteuser
회원 탈퇴 처리를 한다.
MYENABLED 값을 N으로 변경하고 성공 시 로그아웃 흐름으로 연결한다.
(8) updateform
회원 정보 수정 화면에 보여줄 기존 정보를 조회한다.
updateuser.jsp로 dto를 전달한다.
(9) updateuser
주소, 전화번호, 이메일 수정 요청을 처리한다.
수정 성공 또는 실패 결과를 result.jsp로 전달한다.
15 오늘 실습의 핵심 정리
1) 로그인 기능 구현
(1) 로그인 검사
사용자가 입력한 아이디와 비밀번호를 DB의 MYID, MYPW와 비교했다.
MYENABLED가 Y인 회원만 로그인할 수 있도록 조건을 추가했다.
(2) 로그인 성공 처리
로그인 성공 시 회원 정보를 session에 저장했다.
session에 저장된 dto를 이용해 여러 페이지에서 로그인 상태를 유지했다.
(3) 로그인 실패 처리
로그인 실패 시 result.jsp로 이동해 실패 메시지를 보여주었다.
확인 버튼을 누르면 다시 index.jsp로 이동한다.
2) 권한별 페이지 이동
(1) ADMIN
MYROLE이 ADMIN이면 adminmain.jsp로 이동한다.
관리자는 전체 회원 조회와 회원 등급 변경 기능을 사용할 수 있다.
(2) USER
MYROLE이 USER이면 usermain.jsp로 이동한다.
일반 회원은 내 정보 조회, 내 정보 수정, 회원 탈퇴 기능을 사용할 수 있다.
(3) 권한 분리의 의미
같은 로그인 기능을 사용하더라도 회원 등급에 따라 접근 가능한 화면과 기능을 다르게 만들 수 있다.
이것이 권한 기반 화면 분리의 기본 구조이다.
3) session 체크
(1) 로그인 여부 확인
adminmain.jsp, usermain.jsp, userlistall.jsp, updateroleform.jsp 등에서 session의 dto를 확인했다.
dto가 null이면 로그인하지 않은 상태이므로 index.jsp로 이동시켰다.
(2) 사용하는 이유
주소를 직접 입력해서 관리자 페이지나 회원 페이지에 접근하는 것을 막기 위해 필요하다.
로그인한 사용자만 주요 페이지를 사용할 수 있게 만드는 기본 보안 흐름이다.
4) 관리자 기능
(1) 회원 전체 조회
관리자는 MYMEMBER 테이블의 전체 회원 목록을 조회할 수 있다.
가입 상태와 회원 등급도 함께 확인할 수 있다.
(2) 회원 등급 변경
관리자는 특정 회원의 MYROLE 값을 변경할 수 있다.
select 태그를 사용해 USER, MANAGER, ADMIN 중 하나를 선택하고 DB에 반영했다.
5) 회원 기능
(1) 마이페이지 조회
일반 회원은 자신의 회원 정보를 조회할 수 있다.
아이디, 이름, 주소, 전화번호, 이메일, 등급을 확인할 수 있다.
(2) 회원 정보 수정
일반 회원은 주소, 전화번호, 이메일을 수정할 수 있다.
수정할 수 있는 정보와 수정하지 않는 정보를 구분했다.
(3) 회원 탈퇴
회원 탈퇴는 데이터를 실제 삭제하지 않고 MYENABLED 값을 N으로 변경하는 방식으로 구현했다.
탈퇴한 회원은 로그인 조건에서 제외된다.
6) Controller 중심 구조
(1) command 방식
모든 요청은 logincontroller.jsp로 들어오고 command 값에 따라 분기된다.
요청 흐름을 한 곳에서 관리할 수 있어 구조를 파악하기 쉽다.
(2) forward와 request
DB 조회 결과를 JSP로 전달해야 할 때는 request.setAttribute를 사용하고 forward로 이동했다.
forward는 request 객체가 유지되기 때문에 조회 결과를 다음 JSP에서 사용할 수 있다.
(3) redirect와 session
로그인 성공 후 관리자 또는 사용자 메인 페이지로 이동할 때는 redirect를 사용했다.
로그인 정보는 session에 저장되어 있기 때문에 redirect 후에도 유지된다.
7) 오늘 배운 전체 흐름
(1) 로그인
index.jsp에서 아이디와 비밀번호를 입력한다.
logincontroller.jsp가 로그인 요청을 받아 DAO를 통해 회원 정보를 조회한다.
(2) 권한 분기
로그인 성공 시 session에 회원 정보를 저장한다.
회원 등급이 ADMIN이면 관리자 메인으로, USER이면 사용자 메인으로 이동한다.
(3) 관리자 흐름
관리자는 전체 회원 목록을 조회한다.
특정 회원의 등급 변경 화면으로 이동해 USER, MANAGER, ADMIN 등급을 변경할 수 있다.
(4) 일반 회원 흐름
일반 회원은 마이페이지에서 자신의 정보를 조회한다.
주소, 전화번호, 이메일을 수정하거나 회원 탈퇴를 할 수 있다.
(5) 공통 결과 처리
로그인 실패, 로그아웃, 등급 변경, 정보 수정, 회원 탈퇴 결과는 result.jsp에서 공통으로 처리한다.
Controller가 msg와 url을 전달하면 result.jsp는 메시지를 보여주고 다음 이동을 처리한다.