시리즈의 첫 번째 부분에서는 주요 질문을 검색하기 위해 StackExchange REST API 를 사용하는 초기 작업을 다룹니다. 이 두 번째 부분 에서는 Spring Social Twitter 프로젝트를 사용하여 Twitter REST API와 상호 작용하는 데 필요한 지원을 설정하는 데 중점을 둡니다. 최종 목표는 이러한 질문을 하나의 주제에 초점을 맞춘 여러 계정에서 하루에 두 번 트윗할 수 있는 것입니다.
1. 스프링 소셜 트위터 사용하기
Spring Social Twitter 프로젝트를 사용하는 데 필요한 의존성은 간단합니다. 먼저 spring-social-twitter 자체를 정의합니다.
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-twitter</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
그런 다음 의존성 중 일부를 최신 버전으로 재정의해야 합니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
spring-core 와 spring-web 은 모두 spring-social-twitter 에 의해 의존성으로 정의 되지만 이전 버전 은 각각 3.0.7.RELEASE 및 3.1.0.RELEASE 입니다. 우리 자신의 pom에서 이것을 재정의하면 프로젝트가 이러한 이전 상속 버전 대신 정의한 최신 버전을 사용하도록 보장합니다.
2. 트위터 애플리케이션 만들기
이 사용 사례 - 자신의 계정에 있는 다른 사용자를 대신하지 않고 개인 계정 으로 트윗하는 것은 간단한 것입니다. 간단하기 때문에 애플리케이션이 각 트위터 계정에서 여러 사용자를 위해 트윗해야 하는 경우 필요한 대부분의 OAuth 오케스트레이션 을 생략할 수 있습니다.
따라서 사용 사례의 경우 필요한 모든 것을 수동으로 설정할 수 있으므로 TwitterTemplate 을 직접 만들 것입니다.
가장 먼저 필요한 것은 개발 애플리케이션 입니다. 로그인 후 여기에서 생성 할 수 있습니다 . 애플리케이션을 생성한 후 소비자 키 와 소비자 비밀 을 갖게 됩니다 (이는 애플리케이션 페이지에서 가져옴) . OAuth 설정 .
또한 응용 프로그램이 계정에서 트윗할 수 있도록 하려면 기본 읽기 전용 권한 을 대체하도록 읽기 및 쓰기 액세스 를 설정해야 합니다 .
3. TwitterTemplate 프로비저닝
다음으로 TwitterTemplate 에는 프로비저닝할 액세스 토큰 과 액세스 토큰 비밀 이 필요합니다. 이는 애플리케이션 페이지( 세부 정보 탭 아래)에서 생성할 수도 있습니다. 내 액세스 토큰 만들기 . 그런 다음 OAuth 도구 탭 아래에서 액세스 토큰과 비밀을 모두 검색할 수 있습니다 .
내 액세스 토큰 다시 만들기 작업을 통해 세부 정보 탭 에서 항상 새 항목을 다시 생성할 수 있습니다 .
이 시점에서 소비자 키와 소비자 비밀, 액세스 토큰과 액세스 토큰 비밀 등 필요한 모든 것이 있습니다. 즉 , 해당 애플리케이션에 대한 TwitterTemplate 을 만들 수 있습니다.
new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
4. 계정당 하나의 템플릿
이제 단일 계정 에 대해 단일 TwitterTemplate 을 만드는 방법을 보았으므로 사용 사례를 다시 볼 수 있습니다. 여러 계정에 대해 트윗해야 하므로 여러 TwitterTemplate 인스턴스가 필요합니다.
요청 시 간단한 메커니즘으로 쉽게 생성할 수 있습니다.
@Component
public class TwitterTemplateCreator {
@Autowired
private Environment env;
public Twitter getTwitterTemplate(String accountName) {
String consumerKey = env.getProperty(accountName + ".consumerKey");
String consumerSecret = env.getProperty(accountName + ".consumerSecret");
String accessToken = env.getProperty(accountName + ".accessToken");
String accessTokenSecret = env.getProperty(accountName + ".accessTokenSecret");
Preconditions.checkNotNull(consumerKey);
Preconditions.checkNotNull(consumerSecret);
Preconditions.checkNotNull(accessToken);
Preconditions.checkNotNull(accessTokenSecret);
TwitterTemplate twitterTemplate =
new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
return twitterTemplate;
}
}
네 가지 Security 아티팩트는 물론 계정별로 속성 파일로 외부화 됩니다. 예를 들어 SpringAtSO 계정 의 경우 :
SpringAtSO.consumerKey=nqYezCjxkHabaX6cdte12g
SpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A
SpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3
SpringAtSO.accessTokenSecret=ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE
이것은 유연성과 안전성의 좋은 조합을 허용합니다. Security 자격 증명은 코드베이스( 오픈 소스 임)의 일부가 아니지만 파일 시스템에서 독립적으로 살고 Spring에서 선택하고 간단한 구성을 통해 Spring 환경에서 사용할 수 있습니다.
@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {
//
}
Spring의 속성은 이전에 논의된 주제이므로 여기에서 이 주제에 대해 더 자세히 설명하지 않습니다.
마지막으로 테스트 는 계정에 Spring 환경에서 쉽게 사용할 수 있는 필요한 Security 정보가 있는지 확인합니다. 속성이 없으면 getTwitterTemplate 논리가 NullPointerException 으로 테스트에 실패해야 합니다 .
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TwitterTemplateCreatorIntegrationTest {
@Autowired
private TwitterTemplateCreator twitterTemplateCreator;
//
@Test
public void givenValidAccountSpringAtSO_whenRetrievingTwitterClient_thenNoException() {
twitterTemplateCreator.getTwitterTemplate(SimpleTwitterAccount.SpringAtSO.name());
}
}
5. 트윗하기
TwitterTemplate 이 생성되면 실제 트윗 동작을 살펴보겠습니다 . 이를 위해 TwitterTemplate 을 수락하고 기본 API를 사용하여 트윗을 만드는 매우 간단한 서비스 를 사용합니다.
@Service
public class TwitterService {
private Logger logger = LoggerFactory.getLogger(getClass());
public void tweet(Twitter twitter, String tweetText) {
try {
twitter.timelineOperations().updateStatus(tweetText);
} catch (RuntimeException ex) {
logger.error("Unable to tweet" + tweetText, ex);
}
}
}
6. TwitterTemplate 테스트하기
마지막으로, 계정에 대한 TwitterTemplate 을 프로비저닝하고 해당 계정에서 트윗하는 전체 프로세스를 수행하는 통합 테스트를 작성할 수 있습니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TweetServiceLiveTest {
@Autowired
private TwitterService twitterService;
@Autowired
private TwitterTemplateCreator twitterCreator;
@Test
public void whenTweeting_thenNoExceptions() {
Twitter twitterTemplate = twitterCreator.getTwitterTemplate("SpringAtSO");
twitterService.tweet(twitterTemplate, "First Tweet");
}
}
7. 결론
이 시점에서 우리가 만든 Twitter API는 StackExchange API와 완전히 별개이며 특정 사용 사례와 독립적으로 사용하여 무엇이든 트윗할 수 있습니다.
Stack Exchange 계정에서 질문을 트윗하는 프로세스의 다음 논리적 단계는 지금까지 제시 한 Twitter 및 StackExchange API와 상호 작용하는 구성 요소를 만드는 것입니다. 이는 이 시리즈의 다음 기사에서 중점적으로 다룰 것입니다.