만들어가는 세상

[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
Comments