IT/SPRING
[SPRINGBOOT] SPRING BOOT&GRADLE Twitter Search, Oracle 등 관리 로직입니다.
윤재웅
2019. 11. 12. 14:28
[SPRINGBOOT] SPRING BOOT&GRADLE twitter4j, Twitter Search, Oracle 등으로 처리한 로직입니다.
이 개발과정은 crontab 스케줄러 가 트위터의 특정 keyword 검색에 해당하는 게시물을 하루 간격으로 데이터를 수집하며 저장하는 로직입니다. 필요한 부분을 공유합니다. curl 로 접근하여 처리합니다.
http://localhost:8080/api/twitter/search?data=bts&count=100
build.gradle 에서 dependencies 합니다.
//트위터 jar 파일을 dependencies 합니다.
compile group: 'org.twitter4j', name: 'twitter4j-core', version: '4.0.7'
application.yml 여기에서는 로컬, 개발, 운영 서버 기준으로 서로다른 key값으로 활성화 될수 있 떄문에 아래와 같이 처리하였습니다.
---
spring:
profiles: dev
system:
twitter-consumer-key: key
twitter-consumer-secret: key
twitter-access-token: key
twitter-access-token-secret: key
---
spring:
profiles: prod
system:
twitter-consumer-key: key
twitter-consumer-secret: key
twitter-access-token: key
twitter-access-token-secret: key
---
spring:
profiles: test
system:
twitter-consumer-key: key
twitter-consumer-secret: key
twitter-access-token: key
twitter-access-token-secret: key
SystemProperties.java 동적 프로퍼티값을 JAVA파일로 선언합니다.
@Data
@ConfigurationProperties("system")
@Component
public class SystemProperties {
private String twitterConsumerKey;
private String twitterConsumerSecret;
private String twitterAccessToken;
private String twitterAccessTokenSecret;
}
TwitterConfig.java 키값을 받아 트위터 객체에 해당 KEY값을 할당합니다. 준비를 위해 아래와같이 로직 처리를 합니다. 이제 동적 프로퍼티값이 Twitter search 처리를 위한 준비를 합니다.
@Configuration
public class TwitterConfig {
@Autowired
public SystemProperties systemProperties;
public Twitter getT() {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(systemProperties.getTwitterConsumerKey())
.setOAuthConsumerSecret(systemProperties.getTwitterConsumerSecret())
.setOAuthAccessToken(systemProperties.getTwitterAccessToken())
.setOAuthAccessTokenSecret(systemProperties.getTwitterAccessTokenSecret());
TwitterFactory fac = new TwitterFactory(cb.build());
Twitter twitter = fac.getInstance();
return twitter;
}
}
RestAPI형식으로 리눅스 크론탭으로 처리하기 위해 아래와 같이 로직처리합니다.
@GetMapping("/api/twitter/search")
public ResponseEntity<?> twitterSearch(@RequestParam String[] data, @RequestParam int count) throws TwitterException {
return ResponseEntity.ok(Collections.singletonMap("result", twitterService.insertTwitter(data, count)));
}
TwitterService.java 오라클에 insert 및 서비스 로직을 수행합니다.
@Service
public class TwitterService extends BaseService{
@Autowired
private TwitterMapper twitterMapper;
@Autowired
private TwitterConfig twitterConfig;
public HashMap<String, Object> insertTwitter(String[] data, int count) throws TwitterException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Twitter tw = twitterConfig.getT();
TwitterLog tLog = new TwitterLog();
boolean resultTypp = true;
int insertCnt = 0;
String keyword = "";
HashMap<String, Object> resultMap = new HashMap<String, Object>();
Query query = new Query();
for(String arrayData : data) {
//get 방식에서 변수의 약속으로 tag_test로 올 시 tag_는 # 치환하여 해쉬태그 검색으로 처리합니다.
keyword += arrayData.replaceAll("tag_", "#")+" ";
}
query.setQuery(keyword);
tLog.setKeyword("keyword");
if(twitterMapper.getMaxId() != null) {
query.setSinceId(twitterMapper.getMaxId());
}
QueryResult result = null;
result = tw.search(query);
for(Status status : result.getTweets()) {
tLog.setUserId("@"+status.getUser().getScreenName());
tLog.setId(status.getId());
tLog.setText(status.getText());
tLog.setSource(status.getSource());
tLog.setCreatedDt(format.format(status.getCreatedAt()));
try {
insertCnt += twitterMapper.insertTwitter(tLog);
}catch(Exception e) {
e.getMessage();
resultTypp = false;
}
}
if(resultTypp) {
resultMap.put("success", insertCnt);
}else {
resultMap.put("fail", insertCnt);
}
return resultMap;
}
}
TwitterMapper.java Mapper 클래스 입니다.
@Mapper
public interface TwitterMapper {
Long getMaxId();
int insertTwitter(TwitterLog Twitter);
}
Twitter.xml mybatis 로직 입니다.
<mapper namespace="com.test.mapper.TwitterMapper">
<resultMap id="convertClob" type="com.test.common.LowerKeyMap" >
<result property="text" column="TEXT" jdbcType="CLOB" javaType="java.lang.String" />
</resultMap>
<insert id="insertTwitter" parameterType="com.test.domain.TwitterLog" >
/* file : Twitter.xml, id : insertTwitter */
INSERT INTO TWITTER_LOG
(
ID
,USER_ID
,KEYWORD
,TEXT
,SOURCE
,CREATED_DT
,REG_DT
)
VALUES
(
#{id}
,#{userId, jdbcType=VARCHAR}
,#{keyword, jdbcType=VARCHAR}
,#{text, jdbcType=VARCHAR}
,#{source, jdbcType=VARCHAR}
,#{createdDt, jdbcType=VARCHAR}
,SYSDATE
)
</insert>
<select id="getMaxId" resultType="Long">
/* file : Twitter.xml, id : getMaxId */
SELECT MAX(ID) ID FROM TWITTER_LOG
</select>
</mapper>
//crontab -e 로 log file 과 함께 배치작업
0 0 12 * * curl -X GET 'http://localhost:8080/api/twitter/search?data=test&count=100' >> /www/twitter/twitter.log 2>&1