기록

*76일차 (회원가입 / 중복아이디 체크) 본문

학원/강의

*76일차 (회원가입 / 중복아이디 체크)

pringspring 2022. 5. 16. 18:25

@session 제한시간

  <session-config>
  	<session-timeout>30</session-timeout>
  </session-config>
  • 30분동안 다음 요청이 없으면 session 폐기함
  • localhost로 접속X ||  ip로 접속O
  • 왜 필요한가?  → 서버의 과부하를 줄이고 보안을 유지하기위함

 

@사용자 수 체크하기

  • listener 
  • -특정 이벤트를 처리하는 인터페이스
  • -이벤트의 발생여부를 기다리고 발생 시 해당 이벤트에 맞는 처리를 수행하는 객체
  • listener 사용하기

  • Session보다 Context가 생명주기가 긺
  • tomcat 시작 ~ 끝까지 유지되는 객체
  • 여기서는 LifeCycle 사용

 

1. 접속하고 있는 사용자수 (변수) 정의

2. session생성되면 수를 1 증가시킴

3. destory에서는 1 감소시킴 

서버를 껐다키면 서버가 날라가야하는데 개발시에는 폐기하지않고 유지시키기위하여 조건문 담

 

*등록은 web.xml

  <listener>
  	<listener-class>common.listener.SessionCounterListener</listener-class>
  </listener>
  • Ctrl+hover에서 링크걸리면 ㅇㅋ
  • 어떤 listener interface를 구현했냐에 따라 작동방식이 달라짐
  • 로그인할때가 아닌 브라우저에 처음 접속했을때 만들어짐

  • 세션 폐기 후 session이 재생성 되므로 세션생성이 출력됨

 

*session 속성에 관한 이벤트 생성

  • Changes to attributes listener 사용
  • Add | Remove | Replace
  •  
  • 이벤트 객체로부터 현재 session객체를 가져올 수 있다.
  • 로그아웃을 하게되면 Remove가 호출될 것

 

 

@Cookie 직접관리  - 아이디저장

 

  • MemberLoginServlet에서 관리
String saveId = request.getParameter("saveId"); // "on" | null
  • 체크했다면 on이 넘어오고 , 안했으면 null이 넘어옴
  •  
  • name은 saveId |  value에는 사용자의 현재 아이디값(memberId) 저장
  •  
  • 쿠키를 사용할 경로 지정 → mvc로 시작하는 경로에 이 쿠키를 사용함.
  • 쿠키 유효기간 지정 → 7*24*60*60 (일주일 후 폐기)
  •  
  • max-age설정이 없다면 세션쿠키로 등록 → 브라우저 종료시 폐기
  • max-age설정이 있으면 영속쿠키로 등록 → 지정한 시간에 폐기
  •  
  • 쿠키를 response에 담아줌 (Set-Cookie 헤더에 작성)

 

*로그아웃했을때도 아이디저장 유지

  • saveId값으로 쿠키가 있냐없냐를 따져봄
<input ~~~ ... value="<%= saveId != null ? saveId : "" %>">
  • 있으면 saveId값, 없으면 null

* 쿠키를 삭제하려면???

  • 동일한 쿠키(path도 같아야함) 를 만들고 유효기간 설정을 0으로...
  • 0은 즉시삭제
cookie.setMaxAge(0);

 

 

@회원가입

1. header.jsp

<input type="button" value="회원가입" onclick="location.href='<%= request.getContextPath() %>/member/memberEnroll';">
  • 주소 이렇게 쓸것

 

 

2. 요청 별로 Servlet을 만듦 → MemberEnrollServlet

  • URL mapping : /member/memberEnroll 로 변경
  • doGet + doPost 둘다 쓰기

 

3. 바로 jsp에 위임

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request
			.getRequestDispatcher("/WEB-INF/views/member/memberEnroll.jsp")
			.forward(request, response);
	}
  • 바로 RequestDispatcher에 반환함

 

4. 유효성검사 (jsp)

 

5. 제출 (실제 post타입으로 횐가입)

   a) 회원정보등록요청 (DML -MemberEnrollServlet)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			// 1. 인코딩
			request.setCharacterEncoding("utf-8");
			
			// 2. 사용자입력값 처리
			String memberId = request.getParameter("memberId");
			String password = request.getParameter("password");
			String memberName = request.getParameter("memberName");
			String gender = request.getParameter("gender");
			String email = request.getParameter("email");
			String phone = request.getParameter("phone");
			String address = request.getParameter("address");
			
			String _birthday = request.getParameter("birthday");
			System.out.println(_birthday);
			Date birthday = null;
			if(_birthday != null && !"".equals(_birthday))
				birthday = Date.valueOf(_birthday);
			
			String[] _hobby = request.getParameterValues("hobby");
			String hobby = null;
			if(_hobby != null)
				hobby = String.join(",", _hobby);
			
			Member member = new Member(
					memberId, password, memberName, MemberRole.U, 
					gender, birthday, email, phone, address, hobby, null
				);
			System.out.println("member@MemberEnrollServlet = " + member);
			
			// 3. 업무로직 (db insert) 
			int result = memberService.insertMember(member);
			String msg = "성공적으로 회원가입했습니다.";
			
			// 4. 리다이렉트 (DML처리인 경우 url을 변경해서 새로고침오류를 방지한다.)
			// 사용자 경고창 처리
			// 성공적으로 회원가입했습니다. | 회원가입 실패했습니다. 
			request
				.getSession()
				.setAttribute("msg", msg);
			response.sendRedirect(request.getContextPath() + "/");
		} catch(Exception e) {
			// 1. 로깅 및 관리팀 알림.
			e.printStackTrace();
//			errorLogToDiscord(e);
			// 2. 예외던지기 - tomcat에 통보
			throw e;
		}
  • birthday,hobby 변환해줘야함

   b) member-query에 추가

insertMember = insert into member values(?,?,?,?,?,?,?,?,?,default)

    c) MemberService

  1. connection 객체 생성
  2. dao 요청
  3. 트랜잭션 처리
  4. connection객체반환

 

    d) 예외처리 - exception package

  1. dao에서 예외를 던짐 (404는 톰캣이 보낸 예외로 사용자에게 다른페이지를 보여줘야함)
  2. service에서는 commit,rollback 후 다시던짐 (다시 던져야 예외페이지로 감)
  <error-page>
  	<exception-type>java.lang.Exception</exception-type>
  	<location>/WEB-INF/views/common/error.jsp</location>
  </error-page>
  • 따로 관리함

 

 

@중복 아이디 체크

 

1. input 버튼생성 (checkIdDuplicate(); 함수호출)

  • idValid = 0 이면 중복검사 전 , =1 이면 중복검사 통과

 

2. 함수생성

  • 현재 페이지를 벗어나면 안됨
<form name="checkIdDuplicateFrm" action="<%= request.getContextPath() %>/member/checkIdDuplicate">
	<input type="hidden" name="memberId" />

const checkIdDuplicate = () => {
	const title = "checkIdDuplicatePopup";
	const spec = "width=300px, height=200px";
	const popup = open("", title, spec);
	
	const frm = document.checkIdDuplicateFrm;
	frm.target = title; // 해당팝업에서 폼을 제출!
	frm.memberId.value = _memberId.value;
	frm.submit();
};
  • open("")이 공백인 이유 : form이 연결되야해서

 

3. checkIdServlet 생성

  • /member/checkIdDuplicate

 

 

ㄹㅇ하면할수록모르겠다 환장함