Dot Programming/Spring

[Spring/ AWS] S3에 있는 파일(CSV) 다운로드없이 바로 읽기

루지 2021. 5. 22. 23:40

    1. Service 클래스에 readObject 메서드 생성

    과정

    1.   S3Object의 getObjectContent()를 호출하여 S3ObjectInputStream형태로 CSV파일 데이터를 불러온다.    
    2.   그 해당 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파일이 읽어진다.

     

    get: /csv_read
    데이터 읽어서 출력


    그 전의 과정은 아래 링크 참고

     

    [Spring/ AWS] Spring Boot S3를 이용하여 File 다운로드하기 - DOT CODING

    목차 1. build.gradle에 의존성 추가하기 2. application.yml에 버킷 및 자격 정보 입력하기 3. Amazon 계정과 연결하기 4.S3 버킷에 있는 파일 다운로드하기 1. build.gradle에 의존성 추가하기 Spring과 AWS를..

    loosie.tistory.com