3-1. Java
개발 작업시 생긴 이슈가 무엇인지, 그리고 어떻게 해결했는지 확인할 수 있습니다
Mac 과 Windows 간의 인코딩 체계로 발생한 문제
팀원 중에서 Mac 환경에서 개발한 팀원이 있고, Windows 환경에서 개발한 팀원들이 있었습니다. 수집기 프로그램을 개발한 이후, Windows 에서 글자가 깨지는 문제가 발생되었습니다. 소스코드를 분석한 결과, InputStream 없이 직접 FileWriter 를 통해 파일을 작성한 사실을 알게 되었습니다.
Mac은 기본 인코딩 체계가 UTF-8 이지만, Windows는 로캐일(Locale) 설정에 따라 ANSI 또는 EUC-KR 등이 기본 인코딩 체계입니다. 따라서, Windows는 UTF-8 로 작성된 파일이 깨집니다.
따라서, 아래와 같은 코드를 수정 입력함으로, 문제를 해결했습니다.
StringBuilder sb = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(new File(filePath)), "UTF-8")
);){
String s = null;
while ((s = br.readLine()) != null) {
sb.append(s+"\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
경도 (longitude) 위도 (latitude) 미출력 문제
대부분의 트위터 사용자들은 자기 자신의 위치를 공개하는 것을 꺼리는 편입니다. 특히, 도널트 트럼프 미국 대통령은 (@realDonaldTrump) 그러합니다! 따라서 대부분의 트윗(Tweet)들은 경도와 위도가 출력되지 않는 문제가 발생됩니다.
(아래 링크에 있는 'JSON 구조'를 참고해주세요.)
2. 수집기위와 같은 미출력 문제로 발생되는 상황은 TwitterException 의 이름으로 발생됩니다만, 사실은 NullPointerException 과 동일한 현상입니다. 즉, null 이라는 것입니다.
myS = new TwitterStatusBuilder()
// ....... 략
.setGeoLocation(
s.getGeoLocation() == null?
new TwitterGeoLocBuilder().setEnabled(false)
.setLatitude(0.0)
.setLongitude(0.0)
.build()
: new TwitterGeoLocBuilder().setEnabled(true)
.setLatitude(s.getGeoLocation().getLatitude())
.setLongitude(s.getGeoLocation().getLongitude())
.build()
)
.setFavoriteCount(s.getFavoriteCount())
.build();
TwitterException 을 해결하기 위하여, 아프리카 대륙 인근의 바다 좌표값 (0, 0) 으로 결정했고, 이를 반영하여 문제를 해결했습니다.
종료시 최근의 Tweet이 저장되지 않는 이슈
Lively Java API의 랜덤 트윗 크롤링 기능은 무작위의 영문 트윗을 빠르게 저장하는 기능을 갖추고 있습니다. 빠른 속도로 Tweet이 JSON 파일과 텍스트 파일로 저장을 하지만, 특별히 Ctrl + C 로 종료하는 방법 이외의 방법은 없습니다.
이로 인하여, 종료될 때 가장 최신으로 내려받는 Tweet이 저장되지 않는 이슈가 발생했습니다.
Runtime 단계 자체에 Shutdown Hooker 코드를 넣음으로, 메모리 누수를 줄이고 정상적으로 종료가 되도록 유도하는 코드를 삽입하여, 이를 해결했습니다.
public void target(Twitter twitter, String[] targets) {
// (... 중략)
// 종료
Runtime.getRuntime().addShutdownHook(new Thread("TargetCrawlShutdown") {
@Override
public void run() {
// 남겨둬서 정상적으로 종료할 수 있도록 한다.
}
});
}
Last updated