시리즈의 첫 번째 부분에서는 주요 질문을 검색하기 위해 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-corespring-web 은 모두 spring-social-twitter 에 의해 의존성으로 정의 되지만 이전 버전 은 각각 3.0.7.RELEASE3.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와 상호 작용하는 구성 요소를 만드는 것입니다. 이는 이 시리즈의 다음 기사에서 중점적으로 다룰 것입니다.

Generic footer banner