[작성자:] leja

  • 네이버 클라우드 Object Storage zip 파일 압축 해제 한계와 WAS 스트림 해결 방법

    네이버 클라우드 Object Storage zip 파일 압축 해제 한계와 WAS 스트림 해결 방법

    NCP 스토리지 ZIP 자동 해제 아키텍처

    안녕하세요. 클라우드 스토리지를 백엔드 프로젝트에 연동하다 보면, 로컬 서버(File System)와는 전혀 다른 동작 방식 때문에 당황스러운 순간들이 발생합니다.

    “사용자가 여러 이미지가 담긴 .zip 파일을 통째로 업로드하면, 서버에서 자동으로 압축을 풀어서 개별 이미지 파일로 스토리지에 저장해주세요.”

    이런 요구사항을 받았을 때, 리눅스 서버 환경에 익숙한 개발자라면 가장 먼저 이렇게 생각할 수 있습니다.
    “스토리지에 zip 파일을 업로드한 다음, 스토리지 내부에서 unzip 명령어를 실행해서 풀면 되지 않을까?”

    실제로 클라우드 콘솔을 뒤적이거나 SDK 문서를 검색하며 ‘압축 해제’ API를 찾느라 시간을 보내는 분들이 많습니다. 저 역시 처음엔 그랬으니까요. 하지만 이 접근은 Object Storage의 근본적인 개념을 간과한 착각이었습니다.

    오늘은 네이버 클라우드(NCP) Object Storage 환경에서 이 문제를 어떻게 해결했는지, 디스크 I/O 낭비 없이 WAS 메모리 스트림을 활용하는 아키텍처적 고민을 공유해 보겠습니다.


    1. 블록 스토리지(Block Storage)와 오브젝트 스토리지(Object Storage)의 차이

    우리가 흔히 AWS EC2나 온프레미스 리눅스 서버에서 사용하는 파일 시스템은 블록 스토리지(Block Storage) 기반입니다. 운영체제(OS)가 설치된 인스턴스에 마운트되어, 디렉토리 계층 구조를 가지고 CPU 자원을 사용해 파일을 조작할 수 있습니다.

    반면, 네이버 클라우드 Object Storage(또는 AWS S3)는 객체(Object) 단위의 단순 데이터 저장소입니다.
    – Flat Namespace: 폴더처럼 보이는 구조는 사실 prefix일 뿐, 실제로는 계층이 없는 평면 구조입니다.
    – 연산 능력 부재: 스토리지는 HTTP RESTful API(PUT, GET, DELETE 등)만을 제공할 뿐, 내부에 컴퓨팅 파워(CPU, RAM)가 할당되어 있지 않습니다.

    즉, 오브젝트 스토리지는 가상 컴퓨터(VM)가 아니기 때문에, 스토리지 자체에서 쉘 명령어(unzip)를 실행하는 것은 물리적으로 불가능합니다.


    2. 해결 방안: WAS 단에서 Stream 기반 압축 해제 파이프라인

    스토리지 내부 조작이 불가능하다면, 스토리지에 업로드하기 전 단계에서 압축을 풀어야 합니다.

    임시로 EC2(WAS) 로컬 디스크에 파일을 저장했다가 압축을 풀고 다시 업로드하는 방식은 불필요한 디스크 I/O를 발생시키고 서버 용량을 차지합니다. 이를 피하기 위해, WAS(Spring Boot)의 메모리 스트림(ZipInputStream)을 활용하여 파일 데이터를 실시간으로 읽고 클라우드로 바로 전송하는 방식을 선택했습니다.

    클라이언트가 MultipartFile로 zip 업로드 -> Spring Boot WAS가 ZipInputStream으로 실시간 스트림 처리 -> 추출된 각 파일을 Object Storage에 PUT 업로드 하는 흐름도

    Java (Spring) 기반 Stream 처리 수도 코드

    로컬 디스크 저장을 생략하고, 스트림에서 바이트를 읽어내는 즉시 NCP SDK의 putObject 요청으로 넘기는 구조입니다.

    public void uploadZipToStorage(MultipartFile zipFile) {
        try (ZipInputStream zis = new ZipInputStream(zipFile.getInputStream())) {
            ZipEntry entry;
    
            // zip 내부의 파일을 순회하며 하나씩 추출
            while ((entry = zis.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
                    String fileName = entry.getName();
    
                    // 스트림에서 바로 바이트를 읽어 Object Storage SDK로 PUT 업로드 (디스크 I/O 없음)
                    objectStorageClient.putObject(bucketName, fileName, zis);
                }
                zis.closeEntry();
            }
        } catch (IOException e) {
            log.error("압축 해제 및 업로드 실패", e);
        }
    }
    

    이렇게 하면 사용자가 올린 zip 파일이 WAS의 메모리를 흐르듯 거쳐 개별 파일 스트림으로 분리되고, 각각의 독립적인 객체(Object)로서 스토리지에 나란히 저장됩니다.


    3. 트레이드오프 (Trade-off) 및 아키텍처 확장

    이 방식은 요구사항을 명확하고 우아하게 해결하지만, 아키텍처 설계 시 반드시 감수해야 할 트레이드오프가 존재합니다. 압축 해제 로직은 본질적으로 CPU와 메모리를 많이 소모하기 때문입니다.

    1. WAS 부하 및 OOM(Out of Memory) 위험
    2. 사용자가 1GB 이상의 대용량 zip 파일을 올리거나, 다수의 사용자가 동시에 압축 해제 업로드를 요청할 경우, 비즈니스 로직을 처리하는 메인 WAS가 뻗어버릴 위험이 있습니다.

    3. 고급 해결책: Serverless 워커(Worker) 분리

    4. 위와 같은 부하 이슈가 예상되는 서비스라면, 메인 서버와 파일 처리 로직을 물리적으로 분리해야 합니다.
    5. 네이버 클라우드의 Cloud Functions(또는 AWS Lambda) 같은 서버리스 환경이나 비동기 메시지 큐(RabbitMQ)를 활용하여, “무거운 파일 처리 전담 인스턴스”에 역할을 위임하는 아키텍처로 확장하는 것이 바람직합니다.

    마무리

    처음에는 단순히 “클라우드 스토리지에서는 압축이 안 풀리네?” 하고 당황했던 경험이었지만, 이를 통해 블록 스토리지와 오브젝트 스토리지의 명확한 구조적 차이를 체감할 수 있었습니다.

    디스크 I/O를 줄이는 메모리 스트림 방식은 성능 면에서 훌륭하지만, 그만큼 메모리 누수나 부하 관리에 신경 써야 한다는 점도 잊지 마시기 바랍니다. 다음 포스팅에서는 실제 Spring Boot 코드 레벨에서 NCP Object Storage SDK를 결합하여 견고하게 동작하는 전체 코드를 구현해 보도록 하겠습니다.

    감사합니다.


    네이버클라우드ObjectStorage #오브젝트스토리지압축해제 #자바unzip스트림 #MultipartFile압축풀기 #클라우드스토리지 #백엔드개발 #스프링부트파일업로드

  • 서울보라매병원 스텐트 시술 후기: 보호자를 위한 A to Z 가이드

    가족이 갑작스럽게 심혈관센터에서 스텐트 시술을 받게 되면, 보호자로서 무엇부터 준비해야 할지 막막해지죠. 시술 전 금식부터, 기약 없는 조영실 앞 대기 시간, 그리고 퇴원 후 관리까지 챙길 것이 한두 가지가 아닙니다.

    이 글에서는 서울보라매병원 심혈관센터에서 스텐트 시술(관상동맥중재술)을 진행하며 직접 겪었던 과정과, 보호자가 실질적으로 알아두면 좋은 팁들을 정리했어요.

    서울보라매병원 스탠트 시술 후기 썸네일

    1. 시술 전, 보호자 필수 체크리스트

    막상 병원에서 시술 날짜를 잡고 나면 당황하기 쉬워요. 병원 안내문을 바탕으로 보호자가 직접 챙겨야 할 핵심 사항 4가지는 다음과 같아요.

    • 금식 시간 준수: 시술 전 최소 6시간 금식이 필수예요. 물도 절대 마시면 안 됩니다.
    • 제모 준비: 양쪽 사타구니나 손목 등 시술 부위에 제모크림을 발라야 해요. 5~10분 뒤 젖은 수건으로 닦아내는데, 10분을 넘기면 피부가 상할 수 있으니 시간을 꼭 체크해 주세요.
    • 탈의 및 장신구 제거: 환자복 안의 속옷을 모두 탈의하고, 안경, 장신구, 틀니 등은 모두 제거해야 합니다.
    • 복용 약물 확인 (매우 중요): 아스피린, 클로피도그렐 같은 항혈소판제는 금식 중이어도 소량의 물과 꼭 복용해야 해요. 반면, 와파린(항응고제)이나 당뇨약(메트포르민)은 담당 의료진과 미리 상의해 중단 일정을 맞춰야 합니다.

    2. 서울보라매병원 심혈관센터 첫인상

    ‘수술’과 ‘시술’이라는 단어가 주는 무게감 때문에 병원 입구에서부터 긴장하기 마련이죠.

    보라매병원 외관 간판

    하지만 서울보라매병원은 웅장한 규모만큼이나 체계적으로 관리되고 있었어요. 내부 길 안내가 직관적이어서 넓은 병원 내에서도 목적지를 찾기 수월했거든요. 심혈관센터는 2~3층에 위치해 있어 안내데스크를 거치면 금방 도착할 수 있습니다.

    보라매병원 주요 층별 안내

    3. 심혈관조영실 앞, 기나긴 대기 시간

    표지판을 따라가면 실제 시술이 이루어지는 심혈관조영실 입구가 나옵니다.

    심혈관조영실 입구와 통제구역 안내판

    시술 전 의사 선생님을 만나 시술 동의서를 작성하며 부작용에 대한 설명을 듣게 됩니다. 당연히 가슴이 철렁 내려앉는 순간이지만, 서울대병원 출신 의료진분들의 전문적이고 따뜻한 대처 덕분에 큰 위로를 받을 수 있었어요.

    대기 시간은 얼마나 걸릴까요?

    단순 심혈관 조영술은 약 30분이면 끝나지만, 스텐트 시술이 동반될 경우 1~2시간 이상 소요될 수 있어요. 보호자는 행복관 3층 심혈관조영실 앞에서 대기하게 됩니다. 대기 시간이 길어진다면, 교대로 1동 지하 1층 식당이나 2동 1층 편의점을 이용하는 것도 방법이에요.

    심혈관조영실 대기 화면에 표시된 환자 진행 상태

    특히 조영실 앞 대기 현황 모니터가 정말 큰 도움이 됐어요. 환자의 현재 상태(검사 중, 시술 중, 회복 중)를 실시간으로 확인할 수 있어, 무작정 기다려야 하는 보호자의 불안감을 크게 덜어주거든요.

    시술 후 의사 면담

    시술이 끝나면 조영실 내부로 들어가 의사 선생님의 브리핑을 듣게 됩니다. 최대 2명까지 동반 입장이 가능했고, 시술 영상과 함께 과거력부터 향후 주의사항까지 상세히 설명해 주셨어요.

    4. 입원 병동 생활과 주의사항

    차분하고 깔끔한 병동 복도 전경

    입원 병동은 환자의 안정을 위해 쾌적하고 조용하게 관리되고 있었어요. 시술 직후 가장 중요한 것은 시술 부위의 지혈과 안정입니다.

    • 손목 시술 시: 지혈대를 착용하고 최소 2시간 이상 손목을 사용하지 않아야 해요.
    • 사타구니 시술 시: 모래주머니를 얹고 4~6시간 동안 절대 안정(누운 자세)을 취해야 출혈을 막을 수 있습니다.

    또한, 체내 조영제 배출을 위해 충분한 수분 섭취가 필수입니다. 사타구니 시술로 누워만 있어야 할 경우, 구부러지는 빨대를 미리 준비하면 정말 유용해요.

    이럴 땐 즉시 간호사를 호출하세요!

    • 흉통, 호흡곤란, 두근거림 발생 시
    • 조영제 부작용 (화끈거림, 구토, 두드러기)
    • 시술 부위 출혈이나 뜨거운 열감 발생 시

    퇴원 전 가장 강조 받은 것은 항혈소판제의 꾸준한 복용이었어요. 스텐트 내 혈전 생성을 막는 생명줄과도 같으니 임의 중단은 절대 금물입니다.

    스마트폰 와이파이 설정 화면

    참고로, 원내에서는 무료 와이파이가 원활하게 제공됩니다. 병원 네트워크에 연결하면 안내 창이 떠서 쉽게 접속할 수 있어요.

    5. 퇴원 후 관리가 ‘진짜 시술의 완성’

    병원 앞에 대기 중인 흰색 전기 택시

    병원 입구에는 택시가 넉넉히 대기하고 있어, 귀가 시 콜택시를 부르는 번거로움 없이 편하게 이동할 수 있었습니다.

    하지만 퇴원했다고 모든 것이 끝난 것은 아니에요. – 정기 외래 진료: 1개월, 3개월, 6개월 주기의 진료 일정을 캘린더에 등록해 두세요. – 응급 상황 대비: 다시 협심증 증상(가슴 통증, 식은땀 등)이 발생하면 즉시 응급실로 가야 합니다. – 생활습관 개선: 저염식과 단백질 위주의 식단, 절대 금연, 그리고 무리하지 않는 선에서의 가벼운 평지 걷기가 필수입니다.

    6. 마치며

    가족의 큰 시술을 앞두고 불안한 것은 당연해요. 하지만 현대 의학과 체계적인 시스템을 믿고, 환자 앞에서는 덤덤하고 밝은 모습을 보여주세요.

    주소서울특별시 동작구 보라매로5길 20
    예약 문의1577-0075 (통합 예약센터)
    대중교통신림선 보라매병원역 2번 출구 (도보 340m)
    주차 혜택입/퇴원 당일 1차량 최대 24시간 무료
    편의 시설식당(1동 B1), 신한은행(2동 3F), 이마트24(2동 1F), 카페

    이 기록이 스텐트 시술을 앞둔 환자와 보호자분들께 작은 길잡이가 되길 바랍니다.