CRUD게시판 - 로그인, 로그아웃

1. 기초 셋팅

(1) 멤버 테이블 생성

DROP TABLE member;
CREATE TABLE member4(
    id VARCHAR2(20),
    pwd VARCHAR2(10) CONSTRAINT mem_pwd_nn NOT NULL,
    name VARCHAR2(34) CONSTRAINT mem_name_nn NOT NULL,
    email VARCHAR2(1000),
    birthday VARCHAR2(20) CONSTRAINT mem_bd_nn NOT NULL,
    post VARCHAR2(10) CONSTRAINT mem_post_nn NOT NULL,
    add1 VARCHAR2(200) CONSTRAINT mem_add1_nn NOT NULL,
    add2 VARCHAR2(100),
    tel VARCHAR2(20),
    content CLOB CONSTRAINT mem_cont_nn NOT NULL,
    CONSTRAINT mem_id_pk PRIMARY KEY(id),
    CONSTRAINT mem_email_uk UNIQUE(email),
    CONSTRAINT mem_tel_uk UNIQUE(tel)
);
ALTER TABLE member4 ADD admin CHAR(1) CHECK(admin IN('y','n'));
INSERT INTO member4 VALUES('hong','1234','홍길동','hong@naver.com','2000-01-01','000-000',
'서울시 강남구 역삼동','','010-0000-0000','나는 admin입니다','y');
COMMIT;

(2) 폴더 및 JSP 생성하기

  • webcontent안에 member폴더 만들기
  • member폴더 안에 login.jsp, login_ok.jsp , logout.jsp , logout_ok.jsp 만들기

(3) VO만들기

package com.sist.dao;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String admin;
	private String msg;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAdmin() {
		return admin;
	}
	public void setAdmin(String admin) {
		this.admin = admin;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
}

2. 로그인 처리하기

main.jsp

(1) Java

  • 세션에 저장된 id값 받기
    • 세션에 저장이 되면 데이터 값이 존재하지만, 저장이 안된 경우에는 null값을 가지고 있다.
    • getAttribute메서드는 반드시 Object로 값을 받기 때문에 반드시 형변환을 해야한다.
<%
String id=(String)session.getAttribute("id");
%>
  • 로그인 된 경우, 안된경우 나눠서 화면 전환 처리하기
String log_jsp="";
   	if(id==null)
   	{
   		log_jsp="../member/login.jsp";
   	}
   	else{
   		log_jsp="../member/logout.jsp";
   	}

(2) HTML : 화면 전환 결과 출력하기

  • log_jsp include하기
<jsp:include page="<%=log_jsp %>"></jsp:include>

login.jsp

  • 태그로 값보내기
    • method : get/post(보안) 중에서 선택하기
    • action : 데이터를 받을 파일명 작성하기
    • </form> 의 위치 : 전송할 내용의 다음부분
<form method=post action="post">
  <table>
   /* 중략 */
  </table>
</form>
  • 일반 버튼으로 되어 있는 로그인 버튼을 데이터 보내는 유형으로 변경하기
<input type=submit value="로그인" class="btn btn-sm btn-success">

login_ok.jsp

  • 사용자가 보낸 id와 pwd받기
    • login.jsp의 태그에서 보낸 값을 받는 것임
    • 태그에서 name과 getParameter뒤에 값이 같아야 값을 받을 수 있음
<%
	String id=request.getParameter("id");
	String pwd=request.getParameter("pwd");
%>

자바에서 값 받을 때 : name사용
css제어 할 때 : id사용

member-mapper.xml에서 쿼리문장 작성하기

(1) member-mapper.xml 파일 만들기

매퍼를 기능 별로 따로 만드는 이유는?
재사용을 편하게 하기 위해서

(2) id 존재하는지 확인하기

  • 사용자가 입력한 id와 일치하는 id의 갯수가 몇 개인가?
    • 0이면 존재x, 1이면 존재o
<select id="memberIdCheck" resultType="int" parameterType="String">
		SELECT COUNT(*) FROM member
		WHERE id=#{id}
</select>

(3) 로그인 세션정보 확인하기

<select id="memberGetInfoData" resultType="com.sist.dao.MemberVO" parameterType="String">
		SELECT pwd,id,name,admin FROM member
		WHERE id=#{id}
</select>

Config.xml에 매퍼 등록하기

<mapper resource="com/sist/dao/member-mapper.xml"/>
  • 실제 프로젝트 할때는 패키지를 용도별로 vo, mapper,dao 따로 만들어서 mapper패키지를 한 번에 Config.xml에 등록하기

MemberDAO.java

(1) 자바 파일 생성하기 (2) XML읽어서 데이터를 저장하는 객체 만들기 (공통모듈)

	private static SqlSessionFactory ssf;
	static {
		try {
			Reader reader = Resources.getResourceAsReader("Config.xml");
			ssf=new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

(3) 로그인 처리

  • 로그인 처리가 완료되면 세션에 저장해야 하는데, 세션에 저장할 때 3개를 저장해야 한다.
    • id, name, admin여부가 세션에 저장되어야 한다.
  • new Connection()이 여러 개 있는데 사용 중이면 true, 사용 중 아니면 false이다.
    • 커넥션을 close하면 false로 변경되어 사용 가능한 상태로 변한다.

<JSP실행 시, 구동되는 메서드>

  • _jspInit() : 환경 설정
  • _jspService() : 사용자가 요청한 파일을 실행하기
  • _jspDestroy() : 메모리 해제
  • id몇 개 존재하는지 확인하기
int count=session.selectOne("memberIdCheck",id);
  • id가 존재하지 않으면 NOID라는 메세지 보내기
if(count==0) 
{
	vo.setMsg("NOID");
}		
  • id 존재하면 member정보 가져오기
else
{
    vo=session.selectOne("memberGetInfoData",id);
}
  • 가져온 member정보의 pwd와 사용자가 입력한 pwd 비교하기
if(pwd.equals(vo.getPwd()))
{
      vo.setMsg("OK");
}
else
{
      vo.setMsg("NOPWD");
}

login_ok.jsp

  • DAO보낸 값 받기
<%
    MemberVO vo=MemberDAO.memberLogin(id, pwd);
%>
  • id 틀린 경우 로그인 창으로 이동
        if(vo.getMsg().equals("NOID"))
	{
%>
		<script>
		alert("ID가 존재하지 않습니다!")
		history.back();
		</script>
<%
		
	}
  • id 존재, pwd 틀린 경우 로그인 창으로 이동
        else if(vo.getMsg().equals("NOPWD"))
	{
%>
		<script>
		alert("비밀번호가 일치하지 않습니다!")
		history.back();
		</script>
<%
	}
  • id 존재, pwd 맞는 경우 id,name,admin여부를 서버에 저장하고 main.jsp로 이동하기
    • 사용 중인 모든 jsp안에서 세션에 등록된 모든 데이터를 사용할 수 있다.
	else
	{
		session.setAttribute("id", vo.getId());
		session.setAttribute("name", vo.getName());
		session.setAttribute("admin", vo.getAdmin());
		response.sendRedirect("../main/main.jsp");
	}
%>

3. 로그아웃 처리하기

logout.jsp

  • HTML 모양 잡기

  • 관리자일 때와 일반유저일때 나눠서 처리하기

<tr>
       <td>
         <%
         	String admin=(String)session.getAttribute("admin");
         	if(admin.equals("y"))
         	{
         %>
         		<b><font color=blue>관리자</font></b>
         <%
         	}
         	else
         	{
         %>
         		<b><font color=blue>일반</font></b>
         <%
         	}
         %>
       </td>
</tr>
  • 로그아웃 버튼에 <form>태그 주기
    • 로그아웃 클릭하면 logout_ok.jsp로 이동하기

logout.jsp

(1) session에 등록된 데이터 전체 삭제하기

<%			
	session.invalidate();
%>

(2) main.jsp로 이동하기

<%	
	response.sendRedirect("../main/main.jsp");
%>

4. 로그인/로그아웃 및 권한별 메뉴 흐름 제어하기

  • 회원, 마이페이지
  • <head> 부터 <nav>까지 적용하기

  • 로그인되면 => 회원가입, 아이디찾기, 비밀번호 찾기 대신 회원수정, 회원탈퇴 메뉴 활성화하기

    • id=null이면 로그인되지 않은 상태임
 <%
 	String id=(String)session.getAttribute("id");
 
 %>
 <ul class="dropdown-menu">
        <%
        	if(id==null)
        	{
        %>
	          <li><a href="#">회원가입</a></li>
	          <li><a href="#">아이디찾기</a></li>
	          <li><a href="#">비밀번호찾기</a></li>
        <%
        	}
        	else
        	{
        %>
        		<li><a href="#">회원수정</a></li>
         		<li><a href="#">회원탈퇴</a></li>
        <%
        	}
        %>
</ul>
  • 로그인 안된 상태면, 영화 예매 기능 비활성화 하기
      <%
      	if(id!=null)
      	{
      %>
	      <li><a href="#">영화추천</a></li>
	      <li><a href="#">영화예매</a></li>
	      <li><a href="#">마이페이지</a></li>
      <%
      	}
      %>
  • 어드민 계정 정보도 받아오기
String admin=(String)session.getAttribute("admin");
  • 어드민 계정이면 마이페이지 대신 예매 현황이 보이도록 하기
      <%
      	if(id!=null)
      	{
      %>
	      <li><a href="#">영화예매</a></li>
	      <li><a href="#">영화추천</a></li>
	      <%
	      	if(admin.equals("n"))
	      	{
	      %>
	      		<li><a href="#">마이페이지</a></li>
	      <%
	      	}
	      	else
	      	{
	      %>
	      		<li><a href="#">예매 현황</a></li>
	      <%
	      	}
	      %>