Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- json
- 병합정렬
- 분(minute)
- 곱 최대값
- 파사드패턴
- 조인
- 스트레티지패턴
- SSL설정
- 널체크
- 알고리즘
- 초(second)
- degien pattern
- 자바
- Flyweight Pattern
- spring
- jQuery
- 자바스크립트
- boot
- 시간더하기
- list
- java
- 시(hour)
- SpringBoot
- JavaScript
- oracle
- ThreeWayPartition
- 매일프로그래밍
- map
- 디자인패턴
- 생년
Archives
- Today
- Total
만들어가는 세상
[SPRINGBOOT] SPRING BOOT&GRADLE Twitter Search, Oracle 등 관리 로직입니다. 본문
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
'IT > SPRING' 카테고리의 다른 글
[SPRINGBOOT] SSL 적용#1 (0) | 2020.04.22 |
---|---|
[SPRING] 406 ERROR 발생시 대처 방법 (0) | 2019.11.26 |
[SPRINGBOOT] SPRING BOOT &GRADLE Google SMTP EMAIL 서버 전송 로직입니다. (0) | 2019.11.08 |
[SPRING] @RequestMapping 활용하기 (0) | 2019.11.08 |
[SPRING] REST FULL API 구현시 자주 사용되는 @RequestBody와 @ResponseBody 개념 (0) | 2019.11.08 |
Comments