스프링

http://spring.io/ 페이지에서 

가이드

검색 창에 facebook 

 Accessing Facebook Data 클릭
http://spring.io/guides/gs/accessing-facebook/

페이스북 개발자 검색을 해서 웹사이트 이동

로그인 후 키를 발급

https://developers.facebook.com/

 

페이스북 설정 ->

웹사이트 설정시 로컬 도 된다.  ex ) http://localhost:1112/

 

 

라이브러리

		<!-- 페이스북 라이브러리 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-social-facebook</artifactId>
		</dependency>
		
		

 

프로퍼티 설정 샘플



spring.social.facebook.app-id=343252354534
spring.social.facebook.app-secret=17f825fdfdfdd924c38807ac949a9b5d020d5

 

로그인 폼을 설정한다.

주소값을  반드시 /connect/facebook  해야 한다.

스프링부트에서 알아서 인증 처리 된다.

<h2>페이브북 접속</h2>
<!--  스프링 부트에 내장되어 있는 /connect/facebook 액션으로 이동 -->
<!-- ConnectController -->

<form action="/connect/facebook" method="post">
 <input type="hidden" name="scope" value="user_posts" >
 <button>페이스북 로그인</button>
</form>

 

스프링에서는 스프링 부트에서와 같은 인증 과정같은 소스를 직접 만들어야 하므로 복잡한 과정을 거쳐야 한다.

 

인증인 성공하면

 

/connect/facebookConnected.jsp

이동한다.  위 connect 폴더를  만들고 똑같은 이름으로 설정해 줘야 한다.

facebookConnected.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>



<h3>페이스북에 로그인 되었습니다.</h3>

		<p>
			You are now connected to your Facebook account.
			Click <a href="/">here</a> to see some entries from your Facebook feed.
		</p>

<a href="/">메인으로 이동</a>

<%
	response.sendRedirect("/");
%>
</body>
</html>

 

인증 성공하면 / 로 바로 페이지 이동 처리를 하였다.

 

 

컨트롤에서 / 매핑된 주소에서 인증이 성공 여부에 따라 

인증 되었으면 정보를 세션과 DB 에 저장 하도록 코딩하면 된다.

 

@Controller
public class FacebookController {
	//페이스북 API 객체  페이스북 자료를 가져온다.
	private Facebook facebook; 
	//페이스북 연결 정보 페이스북에 로그인을 했는지 여부
	private ConnectionRepository cr; 
	
	@Inject
	private FacebookFeedService facebookFeedService;

	private static final Logger logger=LoggerFactory.getLogger(FacebookController.class);
	
	
	public FacebookController ( Facebook facebook, ConnectionRepository cr){
		
		this.facebook =facebook;
		this.cr=cr;
		
	}
	
	
	
	@RequestMapping("/member/login")
	public String login(){
		
		return  "/member/login";
	}
	
	
	@RequestMapping("/member/logout")
	public String logout(HttpSession session){
		
		session.invalidate();
		
		return  "redirect:/";
	}
	
	
	
	
	@RequestMapping("/")
	public String home(HttpSession session, Model model  ){
		if( session.getAttribute("macaronicUser") !=null  && cr.findPrimaryConnection(Facebook.class) ==null){
			//페이스북에 로그인되어 있지 않을 때
			return "redirect:/member/login";//로그인으로 이동
		}else{
			//페이스북에 로그인되어 있을 때
			String[] fields={"id", "name", "birthday"
					, "email", "gender"};
			
			//페이스북 정보 검색 User 클래스는 페이스북 유저클래스
			User user =facebook.fetchObject("me", User.class, fields);
			
			String name=user.getName();
			String id=user.getId();
			String birthday=user.getBirthday();
			String email=user.getEmail();
			String gender=user.getGender().equals("male") ? "남" : "여";
			
	
				
			//feed 정보 저장
			PagedList<Post> feed =facebook.feedOperations().getFeed();
			
			//로그인 정보 아이디와 피드목록의 글 적은 아이디가 다르다. 따라서 로그인 정보 아이디 저장
			model.addAttribute("feed", feed);
			
			
		
			
			model.addAttribute("name", name);
			//세션에 저장
			session.setAttribute("user", user );
		
		}
		return "main"; 
	}
	


	
	
	
}

 

 

전반적인 상세 소스 

DB 테이블

  -- 페이스북의 게시물 정보

create table tbl_facebook_feed(
	idx NUMBER not null PRIMARY KEY ,
	id VARCHAR2(500) not null  ,
	name VARCHAR2(50),
	message long,
	picture VARCHAR2(500),
	created_time VARCHAR2(100)

);


create SEQUENCE seq_facebook_feed 

 start WITH 1 increment by 1;

 

DTO

 

여기서 DB 에서 message 컬럼이 long 타입이고  java 에서 string 타입으로 데이터를 전달 하는데

 

스프링에서 가능하다. 그러나 스프링 부트 아니 mybatis 에서 어노테이션으로 데이터를 넘길 때에는

데이터 를 전환을 하는 클래스를 만들어야  DB 에서 데이터를 가져 올 수있다.

 

자세한 내용은 다음 포스팅에 있다.

 

public class FacebookFeedVO {

	private Integer idx;
	private String id;
	private String name;
	private String message;
	private String picture;
	private Date created_time;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getPicture() {
		return picture;
	}
	public void setPicture(String picture) {
		this.picture = picture;
	}
	public Date getCreated_time() {
		return created_time;
	}
	public void setCreated_time(Date created_time) {
		this.created_time = created_time;
	}
	
	
	
	
	public Integer getIdx() {
		return idx;
	}
	public void setIdx(Integer idx) {
		this.idx = idx;
	}
	
	
	@Override
	public String toString() {
		return "FacebookFeedVO [idx=" + idx + ", id=" + id + ", name=" + name + ", message=" + message + ", picture="
				+ picture + ", created_time=" + created_time + "]";
	}

	
	
	

}

 

DAO

 

public interface FacebookFeedDAO {
	
	String insert=" insert INTO TBL_FACEBOOK_FEED ( idx, ID, NAME, MESSAGE, PICTURE, CREATED_TIME) "
				 + " VALUES ( seq_facebook_feed.nextval , #{id}, #{name}, #{message}, #{picture}, #{created_time} )";


	
	String list=" select * from TBL_FACEBOOK_FEED  where id=#{id}  order by idx desc";
	
	String get="select * from TBL_FACEBOOK_FEED  where idx=#{idx}";
	
	String delete =" delete FROM TBL_FACEBOOK_FEED WHERE id=#{id}";
	
	String count="";
	
	
	@Insert(insert)
	public void insert(FacebookFeedVO vo);
	
	@Select(list)
	public List<FacebookFeedVO> list(String id);
	
	
	@Select(get)
	public FacebookFeedVO get(String id);
	
	
	@Delete(delete)
	public void delete(String id);
	
	
	
	
	//@Select(count)
	public int count(String id);
	
	
}

 

서비스

 

@Service
public class FacebookFeedServiceImpl implements FacebookFeedService {

	@Inject
	private FacebookFeedDAO facebookFeedDAO;
	
	@Override
	public void insert(PagedList<Post> feed, String id) {

		try{
	
			if(feed.get(0).getId()!=null){
				
				//기존 데이터 삭제
				facebookFeedDAO.delete(feed.get(0).getId());
				
				for(Post post : feed){
					
					FacebookFeedVO vo =new FacebookFeedVO();
								
					vo.setId(id);
					vo.setCreated_time(post.getCreatedTime());
					vo.setMessage(post.getMessage());
					
					if(post.getFrom().getName()!=null){
						vo.setName(post.getFrom().getName());
					}else{
						vo.setName("");
					}
										
					if(post.getPicture()!=null){
						vo.setPicture(post.getPicture());
					}else{
						vo.setPicture("");
					}
					
					facebookFeedDAO.insert(vo);
				}			
			}
				
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public List<FacebookFeedVO> list(String id) {
		
		
		return facebookFeedDAO.list(id);
	}

	@Override
	public FacebookFeedVO get(String id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void delete(String id) {
		// TODO Auto-generated method stub

	}

	@Override
	public int count(String id) {
		// TODO Auto-generated method stub
		return 0;
	}

}

 

컨트롤

 

 

package com.comlu.macaronics.controller;

import java.util.Date;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.social.facebook.api.Facebook;
import org.springframework.social.facebook.api.PagedList;
import org.springframework.social.facebook.api.Post;
import org.springframework.social.facebook.api.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.comlu.macaronics.dto.FacebookFeedVO;
import com.comlu.macaronics.dto.MacaronicUser;
import com.comlu.macaronics.service.FacebookFeedService;

import ch.qos.logback.core.net.SyslogOutputStream;

@Controller
public class FacebookController {
	//페이스북 API 객체  페이스북 자료를 가져온다.
	private Facebook facebook; 
	//페이스북 연결 정보 페이스북에 로그인을 했는지 여부
	private ConnectionRepository cr; 
	
	@Inject
	private FacebookFeedService facebookFeedService;

	private static final Logger logger=LoggerFactory.getLogger(FacebookController.class);
	
	
	public FacebookController ( Facebook facebook, ConnectionRepository cr){
		
		this.facebook =facebook;
		this.cr=cr;
		
	}
	
	
	
	@RequestMapping("/member/login")
	public String login(){
		
		return  "/member/login";
	}
	
	
	@RequestMapping("/member/logout")
	public String logout(HttpSession session){
		
		session.invalidate();
		
		return  "redirect:/";
	}
	
	
	
	
	@RequestMapping("/")
	public String home(HttpSession session, Model model  ){
		if( session.getAttribute("macaronicUser") !=null  && cr.findPrimaryConnection(Facebook.class) ==null){
			//페이스북에 로그인되어 있지 않을 때
			return "redirect:/member/login";//로그인으로 이동
		}else{
			//페이스북에 로그인되어 있을 때
			String[] fields={"id", "name", "birthday"
					, "email", "gender"};
			
			//페이스북 정보 검색 User 클래스는 페이스북 유저클래스
			User user =facebook.fetchObject("me", User.class, fields);
			
			String name=user.getName();
			String id=user.getId();
			String birthday=user.getBirthday();
			String email=user.getEmail();
			String gender=user.getGender().equals("male") ? "남" : "여";
			
			MacaronicUser macaronicUser =new MacaronicUser(name, id, birthday, email, gender);
			
			
			//feed 정보 저장
			PagedList<Post> feed =facebook.feedOperations().getFeed();
			
			//로그인 정보 아이디와 피드목록의 글 적은 아이디가 다르다. 따라서 로그인 정보 아이디 저장
			model.addAttribute("feed", feed);
			
			
			String feed_name=feed.get(0).getFrom().getName();
			Date createTime=feed.get(0).getCreatedTime();
			String feed_message=feed.get(0).getMessage();
			String feed_picture=feed.get(0).getPicture();
			
			String feed_id=feed.get(0).getId();
			
			
			logger.info("이름 : " + feed_name);
			logger.info("날짜 : " + createTime);
			logger.info("메시지 : " + feed_message);
			logger.info("이미지 : " + feed_picture);
			logger.info("아이디 : " + feed_id + " :  feed.get(0).getFrom().getId()  :" +feed.get(0).getFrom().getId());
		
			
			
			
			///// 로그인 정보 아이디 저장
			facebookFeedService.insert( feed, id);
			
			model.addAttribute("name", name);
			//세션에 저장
			session.setAttribute("macaronicUser", macaronicUser);
			
			//thymeleaf
			
			model.addAttribute("id", id);
			model.addAttribute("birthday", birthday);
			model.addAttribute("email", email);
			model.addAttribute("gender", gender);
			
		}
		return "main"; 
	}
	

	//피드 목록 출력
	@RequestMapping("/member/feed")
	public ModelAndView feed(HttpSession session, ModelAndView mav){
		
		
	
		MacaronicUser user =(MacaronicUser)session.getAttribute("macaronicUser");
		if(user!=null){
			
			logger.info(" /member/feed 로그인 정보 : " +user.toString());
		
			List<FacebookFeedVO> list=  facebookFeedService.list(user.getId());
			
			for(FacebookFeedVO vo : list){
				logger.info(" FacebookFeedVO 정보 : " +vo.toString());
			}
			
			mav.addObject("feed", list);
		
		}
		
		
		
		mav.setViewName("/member/feed");
		return mav;
	}
	
	
	
	
}

 

폼 액션 url 주소값  중요  input name="scope"


<form action="/connect/facebook" method="post">
 <input type="hidden" name="scope" value="user_posts" >
 <button>페이스북 로그인</button>
</form>

 

 

폴더 위치 및 이름 중요

인증 성공시

connec /facebookConnected.jsp 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

역경을 이겨내기는 쉬우나 순경( 順境 )을 이겨내기는 어렵다. 오로지 참고 견디면 짧은 시간은 곧 지나간다. -치문보장집

댓글 ( 4)

댓글 남기기

작성