Dot Programming/Spring
[Spring/ AWS] S3에 있는 파일(CSV) 다운로드없이 바로 읽기
루지
2021. 5. 22. 23:40
1. Service 클래스에 readObject 메서드 생성
과정
- S3Object의 getObjectContent()를 호출하여 S3ObjectInputStream형태로 CSV파일 데이터를 불러온다.
- 그 해당 CSV파일을 BufferedReader로 한 줄 씩 읽어와서 데이터를 읽었다.
* CSV파일이 JSON에 비해 용량이 작아 사용했지만 읽어올 때 데이터 형태를 잘 짜지 않으면 받아오기 까다로울 것 같다.
@Service
@RequiredArgsConstructor
public class S3Service {
private final AmazonS3 amazonS3;
@Value("${aws.s3.bucket}")
private String bucket;
/**
* S3 bucket 파일 읽기
*/
public void readObject(String storedFileName) throws IOException{
S3Object o = amazonS3.getObject(new GetObjectRequest(bucket, storedFileName));
S3ObjectInputStream ois = null;
BufferedReader br = null;
// Read the CSV one line at a time and process it.
try {
ois = o.getObjectContent();
System.out.println ("ois = " + ois);
br = new BufferedReader (new InputStreamReader (ois, "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
// Store 1 record in an array separated by commas
String[] data = line.split(",", 0);
if(!data[0].equals("N")) {
int idx =Integer.parseInt(data[0]);
System.out.println(idx+"-----------------------------------");
for(int i=1; i<data.length; i++){
System.out.print(data[i]+" ");
}
System.out.println();
}else{
for (String s : data) {
System.out.print(s+" ");
}
System.out.println();
}
}
}finally {
if(ois != null){
ois.close();
}
if(br != null){
br.close();
}
}
}
}
참고로 내 CSV파일 데이터는 다음과 같다.
더보기
N | 카테고리 | 내용 | 링크 |
0 | [오늘의 날짜] | 2021년 05월 22일 (Sat) | |
1 | [오늘의 날씨] | 현재 16℃ (최저 14˚/ 최고 25˚) | |
2 | [오늘의 날씨] | 맑음, 어제보다 0˚ 높아요 | |
3 | [오늘의 날씨] | 오전 강수확률 0% / 오후 강수확률 0% | |
4 | [오늘의 날씨] | 미세먼지 28㎍/㎥좋음 초미세먼지 18㎍/㎥보통 | |
5 | [오늘의 영어 회화] | Rob: Listen to that clapping. The audience likes him! | |
6 | [오늘의 영어 회화] | Ms. Brown: Don’t you think Mr. Kim’s speech was too long? | |
7 | [오늘의 영어 회화] | Rob: Well, yes, he did go over by 15 minutes, but I think everyone’s ready to forgive him for that. His speech was really informative. | |
8 | [오늘의 영어 회화] | Ms. Brown: That’s true, but I may have to shorten my presentation so that we can stay on schedule. | |
9 | [오늘의 영어 회화] | Rob: 박수소리를 들어보세요. 청중들이 그를 좋아해요! | |
10 | [오늘의 영어 회화] | Ms. Brown: Mr. Kim의 연설이 너무 길었다고 생각되지 않나요? | |
11 | [오늘의 영어 회화] | Rob: 음, 그러게요, 15분을 넘겼군요. 하지만 모든 사람들이 그런 그를 이해해주고 있는 것 같네요. 그의 연설은 정말 유익했거든요. | |
12 | [오늘의 영어 회화] | Ms. Brown: 그렇긴 하지만 일정을 맞추기 위해서 제 발표는 짧게 해야겠어요. | |
13 | [국내 정치 헤드라인 뉴스] | 1. 美최초 흑인 추기경 만난 文 "두번째 카톨릭신자 韓대통령"(종합) | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=421&aid=0005365950 |
14 | [국내 정치 헤드라인 뉴스] | 2. 뜬금없는 '이 질문'에도 바이든은 웃으며 화답했다 [한미정상회담] | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=016&aid=0001838262 |
15 | [국내 정치 헤드라인 뉴스] | 3. ‘가톨릭 신자’ 文대통령, 그레고리 추기경 면담…‘구르마 십자가’ 선물(종합) | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=018&aid=0004936138 |
16 | [국내 정치 헤드라인 뉴스] | 4. 文대통령, 美 최초 흑인 추기경에 박용만 회장의 '손수레 십자가' 선물 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=016&aid=0001838261 |
17 | [국내 정치 헤드라인 뉴스] | 5. 정의용 “모더나, 국내 업체와 계약 체결할 것”…삼성바이오로직스 관측 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=366&aid=0000720882 |
18 | [국내 경제 헤드라인 뉴스] | 1. 韓·美 '배터리 동맹' 선언…세계 3대 전기차 시장 美 선점 기대 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=014&aid=0004643285 |
19 | [국내 경제 헤드라인 뉴스] | 2. 中 채굴 단속에도 불안한 그래픽카드 시장… '악순환' 못 끊나 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=022&aid=0003583466 |
20 | [국내 경제 헤드라인 뉴스] | 3. 보복소비 겨냥 초고가 전략… 한국인 ‘플렉스’ 자극 먹혔다 [심층기획-코로나시대 명품 장사 왜 잘됐나] | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=022&aid=0003583465 |
21 | [국내 경제 헤드라인 뉴스] | 4. [탐사보도 뉴스프리즘] 문재인 정부 4년 "부동산을 말하다" | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=422&aid=0000486370 |
22 | [국내 경제 헤드라인 뉴스] | 5. 중앙선 KTX 복합열차 투입…달라지는 점은? | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=056&aid=0011049040 |
23 | [국내 IT/과학 헤드라인 뉴스] | 1. ‘코로나의 역설’ 덕분에 목숨 건진 사람, 약 3만 2000명(연구) | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=081&aid=0003188259 |
24 | [국내 IT/과학 헤드라인 뉴스] | 2. “고성능 DSLR 카메라도 저무나” 2억 화소 ‘왕눈이’ 폰카 온다 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=016&aid=0001838246 |
25 | [국내 IT/과학 헤드라인 뉴스] | 3. 중국 BTS 또 건드렸다…中 최대 SNS “팬 계정 게시글 삭제” | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=016&aid=0001838243 |
26 | [국내 IT/과학 헤드라인 뉴스] | 4. [이도경의 플레e] 도쿄올림픽을 앞둔 e스포츠 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=014&aid=0004643254 |
27 | [국내 IT/과학 헤드라인 뉴스] | 5. “더이상 못 참아!” 돈벌이 혈안 막장 유튜버 제재 도마위 | https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=016&aid=0001838235 |
28 | [해외 헤드라인 뉴스] | 1. Biden slashes GOP priorities in $1.7 trillion infrastructure counteroffer to Senate Republicans | https://www.cnbc.com/2021/05/21/white-house-makes-1point7-trillion-infrastructure-counteroffer-to-gop-.html |
29 | [해외 헤드라인 뉴스] | 2. Biden rejects Trump approach to North Korea, says he won't give Kim 'international recognition' | https://www.cnbc.com/2021/05/21/biden-rejects-trumps-approach-to-north-korea.html |
30 | [해외 헤드라인 뉴스] | 3. Lumber futures swing 10% in wild session as speculative frenzy ends | https://www.cnbc.com/2021/05/19/lumber-futures-fall-for-an-eighth-straight-day-as-speculation-that-took-prices-to-a-record-unwinds.html |
31 | [해외 헤드라인 뉴스] | 4. Dr. Scott Gottlieb says vaccinations are not the only factor driving U.S. Covid cases down | https://www.cnbc.com/2021/05/21/scott-gottlieb-vaccines-not-the-only-factor-driving-covid-cases-down.html |
32 | [해외 헤드라인 뉴스] | 5. Covid vaccine passports: Everything we know so far | https://www.cnbc.com/2021/05/22/covid-vaccine-passports-everything-we-know-so-far.html |
32 | [경제 관련 데이터] | 달러환율 1,127.50전일대비 5.00(-0.44%) 하락 | |
33 | [경제 관련 데이터] | 나스닥지수 13,470.99전일대비 64.75(-0.48%) 하락 | |
34 | [경제 관련 데이터] | S&P500지수 4,155.86전일대비 3.26(-0.08%) 하락 |
2. Controller 클래스에서 해당 로직 실행
@Controller
@RequiredArgsConstructor
public class S3Controller {
private final S3Service downloadS3;
@GetMapping("/csv_read")
public String read() throws IOException {
downloadS3.readObject("20210522.csv");
return "csv_read"; // csv_read.html 있어야 에러 발생 안함
}
}
3. CSV파일 읽기 성공!
프로젝트를 실행하고 localhost:8080/csv_read를 하면 csv파일이 읽어진다.
그 전의 과정은 아래 링크 참고