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
댓글 ( 4)
댓글 남기기