페이스북 로그인 기능 구현 마무리

 

어제 잘 안됐던 시퀸스가 없다고 DB에 값이 들어가지 않았던 회원가입 문제를 해결했다!

값이 잘 들어간다.

원인 : 계정이 달라졌는데 driver 설정을 바꾸지 않아서 다른 계정에서 자꾸 시퀸스를 찾으니 오류가 나왔던 거다.

 

해결 : memberProcess에 새로운 계정을 연결해 드라이버 정보를 바꿔준다.

   // 드라이버 정보를 바꿔줘야 한다!!
   String dirver = (String)application.getInitParameter("OracleDriver");
   String url = (String)application.getInitParameter("OracleURL");
   
   OauthMemberDAO dao = new OauthMemberDAO(dirver, url, "oauth", "1234");

 


 

바뀐 코드 전문

 

memberProcess.jsp

<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="oauth.member.OauthMemberDTO"%>
<%@page import="oauth.member.OauthMemberDAO"%>
<%@page import="utils.JSFunction"%>


<%
   OauthMemberDTO dto = new OauthMemberDTO();
   
	String mid = request.getParameter("mid");
	String pass = request.getParameter("pass");
	String email = request.getParameter("email");
	String domain = request.getParameter("domain");
	String name = request.getParameter("name");
   
   System.out.print(mid);
   System.out.print(pass);
   System.out.print(email);
   System.out.print(domain);
   System.out.print(name);
   
   dto.setMid(mid);
   dto.setPass(pass);
   dto.setEmail(email);
   dto.setName(name);
   dto.setDomain(domain);
   
   // 드라이버 정보를 바꿔줘야 한다!!
   String dirver = (String)application.getInitParameter("OracleDriver");
   String url = (String)application.getInitParameter("OracleURL");
   
   OauthMemberDAO dao = new OauthMemberDAO(dirver, url, "oauth", "1234");
   
   int result = dao.insertmember(dto);
   
   if(result > 0){
      response.sendRedirect("facebookOauth2.html");
   }else{
      JSFunction.alertBack("회원가입에 실패하였습니다.", out);
   }
   
%>

 

OauthMemberDAO.java

package oauth.member;
import common.JDBConnect;

public class OauthMemberDAO extends JDBConnect{   
		
   public OauthMemberDAO(String driver, String url, String id, String pwd) {
		super(driver, url, id, pwd);
	}

   public int insertmember(OauthMemberDTO dto) {
      
      int result = 0;
         
      try {
    	  
         String query = " insert into Member "
                  + " values (seq_member_mno.nextval,?,?,?,?,?,sysdate) ";
            
         psmt = con.prepareStatement(query);
         psmt.setString(1, dto.getMid());
         psmt.setString(2, dto.getName());
         psmt.setString(3, dto.getPass());
         psmt.setString(4, dto.getEmail());
         psmt.setString(5, dto.getDomain());
            
         result = psmt.executeUpdate();
            
      }catch (Exception e) {
         e.printStackTrace();
      }
         
      return result;   
   }
}

 

OauthMemberDTO.java (수정 없음)

package oauth.member;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class OauthMemberDTO {
	private String mno;
	private String mid;
	private String name;
	private String pass;
	private String email;
	private String domain;
	private String regidate;
}

 

member.jsp (수정 없음)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   String name = request.getParameter("name");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
   #wrap {
      width:800px;
      margin : 20px auto;
   }
   
   input[type=text],input[type=password] {
      width:95%;
   }
</style>
</head>
<body>
   <div id="wrap">
      <h1>회원가입페이지</h1>
      <form method="post" action="memberProcess.jsp">
         <table border="1" width="100%">
            <colgroup>
               <col width="30%" />
               <col width="*" />
            </colgroup>
            <tr>
               <td>아이디</td>
               <td>
                  <input type="text" name="mid" />
               </td>
            <tr>
            <tr>
               <td>비밀번호</td>
               <td>
                  <input type="password" name="pass" />
               </td>
            <tr>
            <tr>
               <td>이름</td>
               <td>
                  <input type="text" name="name" value="${param.name }" />
               </td>
            <tr>
            
            <tr>
               <td>이메일</td>
               <td>
                  <input type="text" name="email" value="${param.email }" />
               </td>
            <tr>
            <tr>
               <td>도메인</td>
               <td>
                  <input type="text" name="domain" value="${param.domain }"/>
               </td>
            <tr>
         </table>
         <input type="submit" value="회원가입" />
         <input type="reset" value="취소">
      </form>
   </div>
</body>
</html>

 

facebookOauth2.html (수정 없음)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>

    function statusChangeCallback(response) {  // Called with the results from FB.getLoginStatus().
	    console.log('statusChangeCallback');
	    console.log(response);                   // The current login status of the person.
	    
	    if (response.status === 'connected') {   // Logged into your webpage and Facebook.
	      let domain = response.authResponse.graphDomain; // 도메인 정보 화면에 표시
	      document.querySelector('#authBtn').value = 'Logout';
	    
	    // 로그인이 성공했을 때 토큰
	    // '/me'를 쓰는 이유는 접속한 사람(나)의 정보를 가지고 오기 때문
	    // fields에서 받아올 수 있는 값을 확인하고 받아오고 싶은 값을 가지고 온다.
	      FB.api('/me',{fields:'email,name'}, function(response) {
	    	  // 로그인 성공했을 때 화면에 보여줄 메세지
	    	  // response 응답
	          document.querySelector('#name').innerHTML = response.name + "님 로그인 성공(" + response.email + ")" + domain;
	    	  window.location.href = 'member.jsp?name=' + response.name + "&email=" + response.email + "&domain=" + domain;
	        });
	    
	    } else {                                 // Not logged into your webpage or we are unable to tell.
	      
	      document.querySelector('#authBtn').value = 'Login';
	    // 로그아웃 후에는 이름, 이메일 정보가 안보이게 처리
	      document.querySelector('#name').innerHTML = "";
	        
	    }
    }
  
	window.fbAsyncInit = function() {
	    FB.init({
	      appId      : '____',        // 페이스북에서 발급받은 내 앱ID을 넣어야 한다.
	      cookie     : true,                     // Enable cookies to allow the server to access the session.
	      xfbml      : true,                     // Parse social plugins on this webpage.
	      version    : 'v18.0'                   // Use this Graph API version for this call.
	    });
	    
	    FB.getLoginStatus(function(response) {   // Called after the JS SDK has been initialized.
	        statusChangeCallback(response);        // Returns the login status.
      });
    };
</script>

   <!-- 로그인과 로그아웃을 하는 버튼 -->
   <input type="button" id="authBtn" value="페이스북 로그인" onclick="
         if(this.value === 'Login'){
            //로그아웃 상태
            FB.login(function(response){
                 // handle the response 
                 console.log('logout => response');
                 statusChangeCallback(response);
            });
         }else{
            //로그인 상태
            FB.logout(function(response) {
                  // Person is now logged out
                  console.log('login => response');
                  statusChangeCallback(response);
            });
         }
      ">
      
	<span id="name"></span>

<!-- sdk 로드  -->
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
</body>
</html>

 


 

 

 

간편로그인 후 페이지 경로 설정

 

간편로그인 후에는 이미 회원인지, 아닌지 확인이 필요

이미 회원이라면 로그인 완료가 된 것. 회원이 아니라면 회원 가입 절차를 밟기 위해 인증 화면으로 이동해야 한다.

이런 것들은 프로그램을 짜기 전 항상 고민해야 한다.

facebookOauth2 에서 name, email, domain 정보를 가지고 와 기존 회원 유무를 판단,

기존 회원 유무를 판단한 후에는 기존 회원이라면 로그인 화면,

기존 회원이 아니라면 회원 가입 화면으로 이동

기존회원 유무를 판단하기 위해 controller를 만들어야한다.

 

 

 

내가 만든 코드)

LoginPageController.java

package oauth.member;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import oauth.member.OauthMemberDAO;
import utils.JSFunction;

@WebServlet("/OauthLogin.do")
public class LoginPageController extends HttpServlet {
    
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // doGet 사용 안함, POST로만 받도록 설정
        resp.sendRedirect("index.jsp");
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      // 로그인과 회원가입 요청을 구분하여 처리해야한다.
      String action = req.getParameter("action");
      String email = req.getParameter("email");
      String domain = req.getParameter("domain");
      String name = req.getParameter("name");
      
      OauthMemberDAO dao = new OauthMemberDAO("driver", "url", "oauth", "1234");
   
      
      if ("로그인".equals(action)) {
         boolean confirmed = dao.confirmEmail(email, domain);
         if (confirmed) {
            JSFunction.alertLocation(resp, "기본회원 로그인 연동 페이지로 이동합니다.", "../Oauth/LoginMember.jsp");
         }else {
            JSFunction.alertBack(resp, "회원정보가 없습니다.");
         }
         
      } else if ("회원가입".equals(action)) {
         req.setAttribute("name", name);
            req.setAttribute("email", email);
            req.setAttribute("domain", domain);
            req.getRequestDispatcher("../Oauth/member.jsp").forward(req, resp);
         
      }
   }
      
}

강사님은 doGet()으로 받았는데 나는 doPost()로 받아서 방식이 조금 다르다. 어쩌면 그것 때문일지도,, ;; 코드가 잘 돌아가지 않는다. 너무 종합적인 문제가 있어서 차분히 다시 해봐야 할 듯.

 

OauthMemberDAO.java

package oauth.member;
import common.JDBConnect;

public class OauthMemberDAO extends JDBConnect{   
      
   public OauthMemberDAO(String driver, String url, String id, String pwd) {
      super(driver, url, id, pwd);
   }

   public int insertmember(OauthMemberDTO dto) {
      
      int result = 0;
         
      try {
         
         String query = " insert into Member "
                  + " values (seq_member_mno.nextval,?,?,?,?,?,sysdate) ";
            
         psmt = con.prepareStatement(query);
         psmt.setString(1, dto.getMid());
         psmt.setString(2, dto.getName());
         psmt.setString(3, dto.getPass());
         psmt.setString(4, dto.getEmail());
         psmt.setString(5, dto.getDomain());
            
         result = psmt.executeUpdate();
            
      }catch (Exception e) {
         e.printStackTrace();
      }
         
      return result;   
   }
   
   public boolean confirmEmail(String email, String domain) {
      
      boolean flag = false;
      
      try {
         
         String query = " select count(*) from member "
               + " where email = ? and domain = ? ";
         
         psmt = con.prepareStatement(query);
         psmt.setString(1, email);
         psmt.setString(2, domain);
         rs = psmt.executeQuery();
         
         if (rs.next() && rs.getInt(1) > 0) {
            flag = true;
         }
      }catch (Exception e) {
      System.out.println("회원 정보 확인 중 오류 발생");
      e.printStackTrace();
   }
      
      return flag;
   }
}

나는 불리언 타입으로, 강사님은 int로 코드를 작성

 


강사님 코드 )

 

LoginPageController.java

package oauth.member;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import oauth.member.OauthMemberDAO;
import utils.JSFunction;

@WebServlet("/OauthMemberController")
public class LoginPageController extends HttpServlet {
    
	 @Override
	 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String name = req.getParameter("name");
		String email = req.getParameter("email");
		String domain = req.getParameter("domain");
		
		
		OauthMemberDTO dto = new OauthMemberDTO();
		dto.setName(name);
		dto.setEmail(email);
		dto.setDomain(domain);
		
		ServletContext application = req.getServletContext();
		
		String driver = (String)application.getInitParameter("OracleDriver");
		String url = (String)application.getInitParameter("OracleURL");
		
		OauthMemberDAO dao = new OauthMemberDAO(driver, url, "oauth", "1234");
		int result = dao.selectCount(dto);
		
		if (result> 0) {
			resp.sendRedirect("Oauth/LoginForm.jsp");
		}else {
			req.getRequestDispatcher("/Oauth/Member.jsp").forward(req, resp);
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
	}
		
}

 

OauthMemberDAO.java

package oauth.member;
import common.JDBConnect;

public class OauthMemberDAO extends JDBConnect{   
		
   public OauthMemberDAO(String driver, String url, String id, String pwd) {
		super(driver, url, id, pwd);
	}

   public int insertmember(OauthMemberDTO dto) {
      
      int result = 0;
         
      try {
    	  
         String query = " insert into Member "
                  + " values (seq_member_mno.nextval,?,?,?,?,?,sysdate) ";
            
         psmt = con.prepareStatement(query);
         psmt.setString(1, dto.getMid());
         psmt.setString(2, dto.getName());
         psmt.setString(3, dto.getPass());
         psmt.setString(4, dto.getEmail());
         psmt.setString(5, dto.getDomain());
            
         result = psmt.executeUpdate();
            
      }catch (Exception e) {
         e.printStackTrace();
      }
         
      return result;   
   }
   
   public int selectCount(OauthMemberDTO dto) {
	   
	   System.out.println("selectCount");
	   
	   System.out.println("dto.getEmail() : " + dto.getEmail());
	   System.out.println("dto.getDomain() : " + dto.getDomain());
	   
	   int result= 0;
	   
	   try {
		   
		   String query = "  select count(*) from member "
		   		+ " where email = ? "
		   		+ " and domain = ? ";
		   
		   psmt = con.prepareStatement(query);
		   psmt.setString(1, dto.getEmail());
		   psmt.setString(2, dto.getDomain());
		   rs = psmt.executeQuery();
		   
		   rs.next();
		   
		   if (rs.getInt(1) != 0) {
			   
			   System.out.println("rs.getInt(1) :" + rs.getInt(1));
			   
			   
			   result = rs.getInt(1);
		   }
	   }catch (Exception e) {
		System.out.println("회원 정보 확인 중 오류 발생");
		e.printStackTrace();
	}
	   
	   return result;
}
   
}

 

컨트롤러를 만든다.

로그인 화면 ← 실패 ← logincontroller → 성공 → index.jsp

회원 가입 → memberJoinController (dopost) → DAO → DB

Memberprocess를 쓰지 않고 controller를 사용한다.

 

 

서블릿에서 매핑한 주소를 어디서 어떻게 써야 하는지를 모르겠다.

 


SQL)

 

system.sql

create user oauth identified by 1234;

grant connect ,resource
to oauth;

 

ouarth.sql

create table member (
mno varchar2(10) primary key,
mid varchar2(10),
name varchar2(50),
pass varchar2(30),
email varchar2(50),
domain varchar2(30),
regidate date default sysdate
);

drop table member;

commit;

CREATE SEQUENCE seq_member_num
START WITH 1
INCREMENT BY 1
NOCACHE;

DELETE 
  FROM member
 WHERE mno = 4;
 
 
 -- 계속 회원가입 실패 오류가 떠서 직접 회원정보를 넣고 찍어봄. 
 -- 동일 이메일, 도메인으로 계속 회원가입을 시도한 후 지우고 커밋을 안해서 회원가입 실패 오류가 뜬 것이었다.
 
 select count(*) from member
 where email = '__@naver.com'
 and domain = 'facebook';
 
 commit;

 

이 날은 강사님 코드를 따라친게 아니라 직접 코드를 짜보는 실습 위주였는데 그래서인지 정말 내가 엉망이라고 많이 느꼈다.,

그리고 정리도 안돼서 더 엉망인데 주말동안 되돌아보며 내가 이 날 뭘 했는지 살펴보니 그냥 모델 2방식에 페이스북 로그인만 추가하면 되는 거였다. 계속 어렵게 느낀 이유는 내가 모델 2방식을 잘 이해하지 못해서였다.

+ Recent posts