728x90
728x90

전체 글 383

[6] Nginx(엔진 x) - 콘텐츠 캐시(Content Cache), 성능 개선 설정

캐시 성능을 위한 추가 설정 캐시 환경 설정 (proxy_cache_path에 추가)1. 캐시 파일을 저장할 하위 디렉터리 계층 구조를 설정합니다.[levels=levels] 단계는 최대 3단계까지 설정할 수 있습니다.단계 별 디렉터리 이름 길이는 1 또는 2만 지정할 수 있습니다.levels=2:2:2 캐시 파일이 한 디렉터리에 몰리지 않도록 3단계 하위 디렉터리 구조로 나누어 저장하게 했습니다. 캐시 파일이 53e7658dcfe7a42a9b26451cd3a61bde이라면 끝에서부터 역순으로 디렉터리를 생성합니다.최종 경로는 /var/cache/nginx/de/1b/a6/53e7658dcfe7a42a9b26451cd3a61bde이 됩니다. 2. 캐시 파일을 디스크에 저장할 때 임시 디렉터리를 거칠지 여..

[5] Nginx(엔진 x) - 콘텐츠 캐시(Content Cache), 캐시 볼륨 시 오류

Docker 컨테이너로 Nginx를 실행할 때 캐시 디렉터리를 볼륨(Volume) 마운트하면 파일을 읽지 못하는 오류가 발생합니다. [docker-compose.yml 파일]services: nginx: # 볼륨 (컨테이너 외부 경로:컨테이너 내부 경로) volumes: # 캐시 디렉터리 - C:\workspaces\docker\nginx\cache:/var/cache/nginx 캐시 파일들이 저장될 디스크 경로를 기본 경로(/var/cache/nginx)로 설정하였습니다. [Nginx 로그][crit] 22#22: *1 fstat() "/var/cache/nginx/53e7658dcfe7a42a9b26451cd3a61bde.0000000001" failed (2: No s..

[4] Nginx(엔진 x) - 콘텐츠 캐시(Content Cache)

Content Cache(콘텐츠 캐싱)WAS가 생성한 응답을 Nginx에 저장해서 동일한 요청이 들어왔을 때 WAS로 가지 않고 Nginx가 바로 응답을 하게하는 기능입니다. 이 기능을 사용하면 WAS와 데이터베이스의 부하를 줄여 전체 성능을 높이고, 콘텐츠 전송 속도를 개선할 수 있습니다. Nginx는 WAS가 생성한 응답(헤더와 바디)을 파일로 만들어 디스크에 저장합니다. 이때 요청을 구분하기 위해 $scheme$proxy_host$request_uri 조합으로 캐시 키(Cache Key)를 생성합니다.이후 동일한 요청이 들어오면 이 캐시 키를 이용해 디스크에 저장된 파일을 찾아서 응답을 전달합니다. 이를 캐시 히트(Cache Hit)라고 합니다. OpenAI로 생성한 이미지입니다. 캐시 키와 캐시 ..

[3] Nginx(엔진 x) - 정적 파일 분리

Spring Boot 애플리케이션 내부에 있는 정적 파일(HTML, CSS, JavaScript, 이미지 등)을 Nginx가 직접 처리하도록 하겠습니다.Spring Boot 애플리케이션을 빌드할 때 정적 파일이 포함되지 않게 설정합니다.정적 파일을 Nginx에서 처리되게 설정합니다. 정적 파일을 제외하여 WAR로 빌드transmission 프로젝트에서 정적 파일은 css, scripts 디렉터리에 있습니다. 1. pom.xml 파일의 에 maven-war-plugin 설정에 warSourceExcludes 속성을 추가합니다.warSourceDirectory(src/main/webapp)에서 WAR 파일로 생성할 때 제외할 파일이나 디렉터리를 쉼표(,)로 구분하여 설정합니다. (현재 images 디렉터리..

[2] Nginx(엔진 x) - 리버스 프록시 (Reverse Proxy)

리버스 프록시(Reverse Proxy)클라이언트와 WAS(Web Application Server, 웹 애플리케이션 서버)사이에 위치하여 클라이언트의 요청을 받아 내부 WAS로 전달하고 WAS의 응답을 다시 클라이언트에게 보내주는 중개자 역할을 합니다. OpenAI로 생성한 이미지입니다. 클라이언트와 WAS사이에서 요청과 응답을 중개하는 것을 프록시(Proxy)라고 하고 이 역할을 하는 시스템을 프록시 서버라고 합니다. Nginx는 웹 서버이면서 리버스 프록시 서버입니다. 리버스 프록시를 사용하면 클라이언트의 요청이 Nginx를 거쳐 내부 WAS로 전달되기 때문에 내부 WAS의 IP, PORT의 정보가 외부로 노출되지 않아 보안이 강화됩니다. Nginx(엔진 x)와 Spring Boot 애플리케이션 ..

[1] Nginx(엔진 x) - HTTP 웹 서버

Nginx(엔진 x)고성능 웹 서버 소프트웨어로 HTTP 웹 서버 역할뿐만 아니라 리버스 프록시, 콘텐츠 캐시, 로드 밸런싱, TCP/UDP 프록시 및 메일 프록시 역할을 수행합니다.HTTP 웹 서버(Web Server) : 정적 파일(HTML, CSS, JavaScript, 이미지 등)을 클라이언트의 요청을 받아 전달(웹 서비스 운영)리버스 프록시(Reverse Proxy) : 클라이언트의 요청을 받아 백엔드 서버로 전달하고 결과를 다시 클라이언트에 전달콘텐츠 캐시(Content Cache) : 데이터 캐싱(서버로부터 받은 응답을 서버 로컬 디스크에 저장하여 동일한 요청이 들어올 때 서버를 거치지 않고 바로 응답)을 통한 응답 속도 향 및 서버 부하 개선로드 밸런싱(Load Balancing) : 여러..

[6] Docker - 윈도우(WSL) 가상 디스크 파일 용량 실제 줄이기

VHDX 파일 압축도커 이미지(docker image)를 삭제해도 윈도우의 가상 디스크 파일(.vhdx) 크기는 자동으로 줄어들지 않습니다.그래서 윈도우 내장 디스크 관리 도구인 diskpart를 사용하여 디스크 용량을 줄어보겠습니다. 도커에는 2개의 가상 디스크 파일(VHDX)이 있습니다.%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx ← 도커 이미지, 도커 컨테이너, 볼륨 등이 저장%LOCALAPPDATA%\Docker\wsl\main\ext4.vhdx ← 도커 시스템 관련 데이터 저장실제로 도커 이미지, 도커 컨테이너, 볼륨 등이 저장되는 docker_data.vhdx 파일을 압축해서 파일 용량 크기를 줄여보겠습니다. Docker Desktop가 실행 중이라면..

[6] Spring Boot App 모니터링 - Scouter로 모니터링, 최신 버전으로 도커 이미지 생성

GitHub에 있는 최신 버전으로 도커 이미지를 생성하여 Scouter Server로 사용하겠습니다. 다운로드 한 압축 파일(scouter-all-2.21.3.tar.gz)로 도커 이미지 생성1. Scouter 프로젝트 GitHub Releases (https://github.com/scouter-project/scouter/releases)에 접속합니다. 2. Assest에서 scouter-all-2.21.3.tar.gz를 클릭하여 다운로드 받습니다.(Spring Boot 3.x 기반이라면 이전에 다운로드하였습니다.) 3. C:\workspaces\docker\scouter에 scouter-build 디렉터리를 생성하고 scouter-all-2.21.3.tar.gz 파일을 복사해서 붙여넣기합니다.C:\..

[5] Spring Boot App 모니터링 - Scouter로 모니터링, Host Agent

Scouter Host Agent는 도커 컨테이너 내부가 아닌 호스트에서 실행해야 합니다. Host Agent도 이전에 다운로드 받은 scouter-all-2.21.3.tar.gz (또는 scouter-all-2.17.1.tar.gz) 파일에 포함되어 있습니다. 다운로드하지 않았다면, Scouter 프로젝트 GitHub Releases (https://github.com/scouter-project/scouter/releases)에 접속해서 버전을 선택하여 Assest에 있는 scouter-all-2.x.x.tar.gz 파일을 다운로드 하시기 바랍니다.Spring Boot 3.x 기반이라면 Release list에서 최신 버전인 v2.21.3를 다운로드하시기 바랍니다. Host Agent 설치1. C:..

[4] Spring Boot App 모니터링 - Scouter로 모니터링, Scouter Paper

Scouter Paper오픈 소스 APM인 Scouter Web API를 활용하여 수집된 성능 데이터를 웹에서 대시보드로 확인할 수 있도록 제공하는 소프트웨어입니다. Scouter Paper 설치1. 도커 컨테이너를 중지하고 삭제합니다.docker compose stopdocker compose rm 2. C:\workspaces\docker\scouter\docker-compose.yml 파일을 수정합니다.# 컨테이너 내의 서비스들 정의services: # 서비스명 scouter: # 가져올 이미지:태그(버전) image: scouterapm/scouter-server:2.17.1 # 컨테이너명 container_name: dev-scouter # 연결된 포트 (컨테이너 ..

Windows에서 특정 포트를 사용하는 프로세스 확인 및 종료

1. 특정 포트를 사용하는 PID(Process ID) 확인netstat -ano | findstr netstat : 네트워크에 연결되어 열려 있는 주소:포트, 상태를 출력합니다. -a(All) : 모든(연결 및 수신 대기) 주소:포트를 출력합니다.-n(Numerical) : 이름으로 출력되는 주소를 숫자 형식(IP 형식)으로 표시합니다.-o(Owning) : 주소:포트를 사용하고 있는 PID를 출력합니다. 8080 포트를 사용하는 PID(Process ID) 확인합니다.netstat -ano | findstr 8080 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 25424 TCP [::]:8080 ..

[3] Spring Boot App 모니터링 - Scouter로 모니터링, Scouter Collector (Server), Scouter Agent, Docker Image

Scouter(스카우터)Java기반의 오픈소스 APM(Application Performance Monitoring) 솔루션으로 서버 인프라 자원(CPU/메모리 사용량, Heap Memory 상태, GC(Garbage Collection) 발생 횟수 등)과 JVM 환경에서 실행되는 애플리케이션의 성능을 실시간으로 모니터링합니다. 성능 지표 모니터링과 실시간 트랜잭션 추적을 통해 병목 구간과 오류를 찾아냅니다. OpenAI로 생성한 이미지입니다. Scouter Agent : 모니터링 대상 서버에 설치되어 성능 데이터를 수집한 뒤 Scouter Collector (Server)로 전송합니다.- Host Agent : OS 자원(CPU, 메모리, 디스크 등) 수집- Java Agent : JVM 환경 내부 트..

[2] Spring Boot App 모니터링 - Prometheus, Grafana로 모니터링

Prometheus(프로메테우스)와 Grafana(그라파나) Prometheus(프로메테우스)는 주기적으로 서버나 애플리케이션의 엔드포인트(endpoint)에 접속해 정보 데이터를 수집하여 시간 순서대로(시계열) 저장합니다. 자체 쿼리 언어인 PromQL(Prometheus Query Language)을 사용해 수집된 시계열 데이터를 실시간으로 조회하고 집계할 수 있는 오픈소스 모니터링 도구입니다. Grafana(그라파나)는 Prometheus(프로메테우스)와 연동하여 데이터를 대시보드로 시각화해주는 오픈소스 데이터 시각화 및 모니터링 도구입니다. Gemini AI와 OpenAI로 생성한 이미지입니다. Docker Compose로 Prometheus(프로메테우스)와 Grafana(그라파나) 설치1. m..

[1] Spring Boot App 모니터링 - Spring Boot Actuator, Micrometer

Spring Boot Actuator(액추에이터)Spring Boot Actuator(액추에이터)는 서버에 배포된 애플리케이션의 상태, CPU 및 메모리 사용량, HTTP 요청 수 등 다양한 시스템 정보를 HTTP 엔드포인트를 통해 실시간으로 모니터링할 수 있게 해줍니다. OpenAI로 생성한 이미지입니다. 의존성 추가 및 설정1. Spring Boot 애플리케이션에서 제공하는 정보를 모니터링하기 위해서 pom.xml 파일에 spring-boot-starter-actuator 의존성을 추가합니다. org.springframework.boot spring-boot-starter-actuator Spring Boot Actuator는 Spring Boot 애플리케이션의 내부 정보를 확인할 수 있는..

[28] 대용량 파일 전송 시스템 개발 - 배포, Docker Container 실행, docker run / inspect / network / logs, host.docker.internal

Docker Container 실행 Docker Container 실행 도커 이미지로 컨테이너를 생성하여 백그라운드로 실행합니다.docker run -d -p [호스트 포트]:[컨테이너 포트] --name {생성할 컨테이너 이름} {이미지의 이름(태그)}-d : 컨테이너를 백그라운드 모드로 실행합니다.-p : PC의 포트와 컨테이너 내부의 포트를 연결합니다. docker run -d -p 8080:8080 --name dev-transmission transmission-app 도커 컨테이너 실행 실패 Docker Container 실행 Log 확인 (Docker Desktop에서 Logs 탭에서 확인할 수 있습니다.)WARN 1 --- [transmission] [ main] Co..

[27] 대용량 파일 전송 시스템 개발 - 빌드(Maven Bulid)와 Docker Image 생성

빌드 IntelliJ IDEA에서 빌드우측 Maven 탭 → {Profiles} → Local를 선택합니다. (실행 환경을 선택합니다.) 우측 Maven 탭 → {project} → Lifecycle → package를 더블 클릭합니다. 빌드 결과{project}/target/ 경로에 생성됩니다. Build Project (Ctrl + F9)로 실행하면 .class 파일만 생성되고 WAR 파일은 패키징되지 않습니다. 빌드 결과 지우기우측 Maven 탭 → {project} → Lifecycle → clean를 더블 클릭합니다. Terminal에서 빌드테스트 실행을 건너뛰고 프로젝트를 깨끗하게 다시 컴파일하여 배포 가능한 파일(JAR 또는 WAR)로 패키징합니다.프로젝트의 루트 디렉터리에서 빌드해야 합니..

[26] 대용량 파일 전송 시스템 개발 - application를 로컬(local), 개발(dev), 운영(prod) 환경으로 분리

application.properties를 application.yml로 변경application.properties 파일을 application.yml 파일로 변경합니다.구분propertiesyml(YAML)Key 포맷점(.)으로 계층 구분들여쓰기(Space 2칸)와 콜론(:)으로 계층 구분Value 구분이콜(=)로 구분Key=Value콜론(:)으로 구분Key: Value설명데이터의 계층이 깊어질수록 상위 계층을 매번 반복해서 입력해야 하기 때문에 복잡해지고 가독성이 떨어집니다.들여쓰기를 기반으로 데이터의 계층 구조를 명확하게 구분하기 때문에 복잡하지 않아 가독성이 좋습니다. 파일 확장자를 properties에서 yml로 변경합니다.점(.)으로 구분된 데이터의 계증 구조를 콜론(:)으로 변경하고 들여쓰..

[25] 대용량 파일 전송 시스템 개발 - Redis의 Key 동시성 문제 해결, Redisson

대용량 파일을 다운로드할 때 서버의 부하를 줄이기 위해 Redis에 파일 데이터를 캐싱하는 방식을 사용했습니다. 하지만 저장할 때 동시성 문제가 발생할 수 있습니다. 동시성 문제 발생클라이언트의 다운로드 요청으로 서버가 다운로드 받을 대용량 파일을 Redis에 저장하고 있는 중에 다른 클라이언트가 동일한 파일을 다운로드 요청할 때 발생합니다. 즉, 동시에 동일한 Key로 Redis에 데이터를 저장하면 데이터가 계속적으로 덮어씌워지면서 서버에 부하를 주고 저장 과정에서 치명적인 경쟁 상태가 만들어집니다. 파일 크기가 클수록 파일에서 데이터를 읽어오는 시간이 길어지기 때문에 이러한 동시성 문제가 발생할 확률이 높아집니다. 그래서 동일한 Key로 Redis에 데이터가 저장되는 중이라면 저장이 완료될 때까지 다..

[24] 대용량 파일 전송 시스템 개발 - 파일 다운로드에 Redis를 활용하기 (바이트 배열) 2

대용량 파일 다운로드를 Redis에 저장할 때 문자열(String)이 아닌 바이트 배열(byte[])로 저장해서 가져오도록 수정하겠습니다. 기존 소스처럼 DownloadCheckController.java 파일과 DownloadProcessController.java 파일을 합치지 않고 유지하겠습니다. 1. transmission\src\main\java\com\example\transmission\controller\DownloadCheckController.java 파일을 수정합니다.저장 방식을 SaveType.STRING에서 SaveType.BYTE로 변경합니다.// Redis에 저장int chunkCount = 0;try { String key = "download:" + fileID; ..

[23] 대용량 파일 전송 시스템 개발 - 파일 다운로드에 Redis를 활용하기 (바이트 배열) 1

Redis를 활용해 파일 다운로드 데이터를 문자열(String)이 아닌 바이트 배열(byte[]) 형태로 저장하고 가져오는 방법을 알아보겠습니다. 기존에 만든 Redis 서비스에 간단한 수정만으로 바이트 배열(byte[]) 데이터를 저장할 수 있게 할 수 있습니다. 먼저, 데이터의 저장 방식을 명확하게 관리하기 위해 Enum(열거형)으로 정의합니다.enum SaveType { STRING, BYTE} Redis에 바이트 배열(byte[])를 저장하기 위해 Redis Configuration에 등록한 Bean을 사용합니다.@Autowired@Qualifier("redisTemplateByte")private RedisTemplate redisTemplateByte; 기존에 파일에서 바이트 배열(byt..

[22] 대용량 파일 전송 시스템 개발 - 파일 다운로드에 Redis를 활용하기 (문자열)

Redis에 데이터를 저장할 때 opsForValue()대신 opsForList()를 사용해서 저장하겠습니다. opsForList()는 Redis에서 List 구조로 관리됩니다.그래서 입력된 데이터의 순서가 유지되고 리스트이기 때문에 앞(Left)과 뒤(Right) 양쪽에서 데이터를 넣고 제거할 수 있습니다. 순서를 유지하기 위해 리스트의 오른쪽에 데이터를 추가하면 됩니다.rightPush(key, value) opsForList()를 사용한 이유는 저장하는 데이터가 순서대로 들어가고 하나의 Key로 모든 데이터를 관리하기가 편리하기 때문입니다.redisTemplateString.opsForList().rightPush("download:test", chunkData);:redisTemplateStrin..

[21] 대용량 파일 전송 시스템 개발 - Redis를 활용한 메모리 캐싱

서버 로컬 디스크나 스토리지에서 직접 파일을 읽어오면 디스크 I/O(입출력 부하)가 증가합니다. 이로 인해 시스템 응답 속도가 느려지고 병목 현상이 발생하기 쉽습니다. 가장 좋은 해결책은 CDN(Content Delivery Network)을 도입해 트래픽을 분산하는 것입니다. 하지만 보안상의 이유나 환경적 제약으로 인해 서버가 직접 파일을 전송해야 하는 순간이 있습니다. 이때 파일을 매번 디스크에서 읽지 않고 메모리에 캐싱한 뒤 전송하면 속도를 높일 수 있습니다. 하지만 모든 파일을 무작정 메모리에 올리면 서버 메모리가 바닥나는 OOM(Out of Memory) 현상을 마주할 수 있습니다. 이를 방지하려면 TTL(Time-To-Live, 유효 기간)을 적용해 일정 시간이 지난 데이터는 메모리에서 즉시 ..

[5] Docker - compose, commit

Docker Compose는 여러 개의 컨테이너를 하나로 묶어 정의하고 실행할 수 있도록 돕는 도구입니다.하나의 명령어(docker compose up)로 여러 컨테이너를 켜고 끌 수 있게 해줍니다. docker-compose.yml파일은 각각의 컨테이너들을 실행할 때 필요한 옵션들을 적어둔 문서입니다. 1. Redis 폴더를 생성합니다.C:\workspaces\docker\redis 2. C:\workspaces\docker\redis에 docker-compose.yml파일을 생성합니다.# compose 파일 버전version: "3.9"# 컨테이너 내의 서비스들 정의services: # 서비스명(이름을 설정해도 docker-compose.yml 파일이 있는 폴더명(프로젝트명)으로 생성됨) redi..

[4] Docker - 명령어로 Redis CLI 실행, 환경 설정

exec 명령어실행 중인 컨테이너 내부에서 새로운 명령어를 실행합니다.docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Redis CLI 실행실행 중인 redis 컨테이너에서 redis-cli를 실행시킵니다.-it (or -i -t) : 대화형 터미널을 열어 컨테이너 내부에서 명령어를 입력할 수 있게 합니다.docker exec -it dev-redis redis-cli redis-cli keys * 명령어로 모든 키를 가져옵니다. (현재는 키가 없습니다.)keys *ctrl+z, ctrl+d, ctrl+c를 누르면 redis-cli가 종료됩니다. Bash 실행실행 중인 redis 컨테이너에서 bash를 실행시킵니다.docker exec -it dev-redi..

[3] Docker - 명령어로 설치 및 컨테이너 실행, Redis

Docker 명령어 pull 명령어레지스트리에서 로컬 시스템으로 이미지를 다운로드합니다.docker pull [OPTIONS] NAME[:TAG|@DIGEST] Redis의 이미지를 가져오겠습니다.최신 버전의 이미지를 가져올 경우에는 latest를 입력하시면 됩니다.docker pull redis:latest 특정 버전을 가져올 경우에는 버전을 입력하시면 됩니다.docker pull redis:8.2.1 images 명령어로컬 시스템에 다운로드된 이미지를 리스트로 보여줍니다.docker images [OPTIONS] [REPOSITORY[:TAG]] 모든 이미지을 보여줍니다.docker imagesdocker image ls image rm 명령어로컬 시스템에 다운로드된 이미지들을 삭제합니다.dock..

[2] Docker - 이미지 다운로드 및 컨테이너 실행, Redis

Redis 이미지 다운로드1. [Docker Hub]를 누르고 검색창에 "redis"를 입력하고 [Search]버튼을 누릅니다. 2. redis를 선택합니다. 3. [Tag]에서 latest(가장 최신 버전)나 다운로드 받을 버전을 선택하고 [Pull]버튼을 누릅니다. 작성 당시 버전은 8.8.2입니다. 4. redis 이미지를 다운로드합니다. 5. [Images]에 redis 이미지가 나타납니다. Redis 이미지 실행 (컨테이너 생성)1. [Images]에서 redis 이미지에 있는 [Run]버튼을 누르면 이미지가 Build 되어 redis 컨테이너가 생성되고 실행됩니다. 2. 컨테이너에 대한 옵션을 설정합니다. [Optional setting]를 펼칩니다. 3. [컨테이너 이름]과 [포트]를 입력..

[1] Docker Desktop 설치 및 실행

Docker Desktop 설치하기1. Docker (https://www.docker.com/) 사이트에 접속합니다. 2. 상단 메뉴에서 Products에 있는 Docker Desktop를 클릭합니다. 3. Download Docker Desktop에서 Download for Windows-AMD64를 선택합니다. 4. 다운로드 됩니다. 5. 다운로드된 Docker Desktop Installer.exe를 실행하여 설치합니다.설치를 위해 초기화합니다.구성을 설정합니다. shortcut를 설치하기 위해서 체크합니다. (기본적으로 체크되어 있습니다.)설치를 위해 파일들의 풉니다.설치가 완료되어 윈도우를 재부팅을 해야 합니다. 작성 당시 버전은 4.91.0입니다. (업그레드를 진행하였습니다.) Docker..

[20] 대용량 파일 전송 시스템 개발 - 파일 다운로드 REST API, ResponseEntity<byte[]>, ResponseEntity<Object>

이번에는 데이터를 청크(Chunk) 단위로 분할하여 전하는 대신 리소스를 한 번에 전송하는 방식으로 구현하겠습니다.이 방식은 HTTP 범위 요청(HTTP range requests)처럼 클라이언트에서 리소스의 일부(특정 범위)를 보내달라고 요청할 때나 서버에서 리소스 전체를 보낼때 사용됩니다.ResponseEntity이 방식으로 소용량의 데이터를 보낼 때 사용하시기 바랍니다. 대용량 파일 전송 시에는 메모리 효율이 떨어질 수 있으니 유의하시기 바랍니다. ResponseEntity를 적용한 컨트롤러의 기본 구조입니다. 간단하게 텍스트 문자열을 전송합니다.package com.example.transmission.controller;import org.springframework.http.HttpHeader..

[19] 대용량 파일 전송 시스템 개발 - 파일 다운로드 REST API, ResponseEntity<StreamingResponseBody>

기존 Servlet 기반의 코드를 Spring REST API 형태로 변경해보겠습니다. Spring에서 권장하는 ResponseEntity 방식을 사용하여 대용량 파일 다운로드할 때 메모리가 효율적으로 사용되게 구현하겠습니다.ResponseEntity StreamingResponseBody는 대용량 데이터를 메모리에 한 번에 올리지 않고 청크(Chunk) 단위로 나누어 클라이언트에 비동기 스트리밍 방식으로 전송할 때 사용하는 인터페이스입니다.데이터를 메모리에 적재하지 않고 즉시 처리하므로 OutOfMemoryError가 발생하지 않습니다.별도의 스레드에서 실행되어 메인 스레드를 차단하지 않고 데이터를 효율적으로 전송합니다.클라이언트(브라우저)와 연결된 출력 스트림에 람다식(->)으로 데이터를 write하..

[18] 대용량 파일 전송 시스템 개발 - 파일 다운로드 전체 소스

파일 다운로드 전체 소스DB 테이블 생성임시 다운로드 파일 테이블다운로드되는 파일에 대한 정보를 관리하는 테이블입니다. 다운로드가 진행되면 데이터가 생성되고 완료되면 삭제됩니다. 1. DBeaver를 사용하여 SQL문을 실행합니다.-- testdb.tb_down_tempfile definitionCREATE TABLE `tb_down_tempfile` ( `SEQ` int NOT NULL AUTO_INCREMENT COMMENT '다운로드 임시 파일 시퀀스', `FILE_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '다운로드 파일 ID', `FILE_PATH` varchar(256) CHARACTE..

728x90
728x90