CDN(Content Delivery Network)은 전 세계에 분산된 서버 네트워크를 통해 사용자에게 웹 콘텐츠(예: 이미지, 동영상, CSS, JavaScript 파일 등)를 빠르고 효율적으로 전달하는 시스템입니다. 기본저긍로, 원본 서버(예: 여러분의 Java/Spring 애플리케이션 서버)에서 직접 콘텐츠를 제공하는 대신, CDN의 여러 엣지 서버가 사용자와 가까운 위치에서 콘텐츠를 캐싱하여 제공하게 됩니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("https://your-cdn-domain.com/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
신입 Java/Spring 백엔드 개발자로서 CDN을 실습해보는 것은 실제 프로젝트에서의 성능 최적화와 확장성 향상에 큰 도움이 됩니다. 다음은 취업 준비와 실무 경험에 유용한 몇 가지 실습 아이디어와 단계별 가이드입니다.
목표: Spring Boot 애플리케이션을 생성하고, 정적 파일(이미지, CSS, JavaScript)을 CDN을 통해 제공하도록 설정합니다.
단계별 가이드:
Spring Boot 프로젝트 생성:
Spring Web을 추가합니다.정적 자산 추가:
src/main/resources/static 디렉토리에 이미지, CSS, JavaScript 파일을 추가합니다.src/main/resources/static/images/logo.png, src/main/resources/static/css/style.cssCDN 제공업체 선택 및 설정:
d1234abcdef.cloudfront.net)을 확보합니다.Spring Boot에서 CDN 사용하도록 설정:
WebConfig 클래스를 생성하여 정적 자산의 위치를 CDN으로 변경합니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.http.CacheControl;
import java.util.concurrent.TimeUnit;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("https://d1234abcdef.cloudfront.net/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
애플리케이션 테스트:
Request URL이 CloudFront 도메인으로 되어 있는지 확인합니다.목표: 특정 API 엔드포인트의 응답을 CDN에서 캐싱하여 응답 속도를 향상시키고 서버 부하를 줄입니다.
단계별 가이드:
API 엔드포인트 생성:
예를 들어, /api/data 엔드포인트를 생성하여 JSON 데이터를 반환합니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class DataController {
@GetMapping("/api/data")
public Map<String, String> getData() {
Map<String, String> data = new HashMap<>();
data.put("message", "Hello, CDN!");
return data;
}
}
CDN에서 API 응답 캐싱 설정:
/api/data 경로를 캐싱하도록 설정합니다./api/* 패턴을 캐시하도록 설정합니다.Spring Boot에서 캐시 제어 헤더 설정:
API 응답에 캐시 관련 헤더를 추가하여 CDN이 응답을 캐싱하도록 지시합니다.
import org.springframework.http.CacheControl;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@RestController
public class DataController {
@GetMapping("/api/data")
public ResponseEntity<Map<String, String>> getData() {
Map<String, String> data = new HashMap<>();
data.put("message", "Hello, CDN!");
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS))
.body(data);
}
}
테스트 및 검증:
/api/data 엔드포인트를 호출하고 CloudFront의 캐싱 동작을 확인합니다.목표: 사용자가 업로드한 파일(예: 프로필 사진)을 CDN을 통해 제공하여 서버의 스토리지 및 처리 부담을 줄입니다.
단계별 가이드:
파일 업로드 기능 구현:
Spring Boot에서 파일 업로드를 처리하는 엔드포인트를 생성합니다.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
// 파일을 로컬 서버에 저장하거나 S3 같은 스토리지에 업로드
String uploadDir = "/path/to/upload/dir/";
File dest = new File(uploadDir + file.getOriginalFilename());
file.transferTo(dest);
return "File uploaded successfully!";
}
}
S3 버킷 설정 및 CloudFront와 연동:
Spring Boot에서 업로드된 파일 URL을 CDN 도메인으로 반환:
파일 업로드 후, CDN 도메인을 통해 파일에 접근할 수 있도록 URL을 생성합니다.
@RestController
public class FileUploadController {
private final String cdnDomain = "https://d1234abcdef.cloudfront.net/uploads/";
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
String uploadDir = "/path/to/upload/dir/";
File dest = new File(uploadDir + file.getOriginalFilename());
file.transferTo(dest);
String fileUrl = cdnDomain + file.getOriginalFilename();
return "File uploaded successfully! Access it here: " + fileUrl;
}
}
테스트 및 검증:
목표: CDN의 캐싱 전략을 최적화하고, 성능을 모니터링하여 애플리케이션의 효율성을 극대화합니다.
단계별 가이드:
캐시 제어 헤더 이해 및 설정:
Cache-Control, Expires, ETag 등의 헤더를 적절히 설정하여 CDN이 최적의 캐싱을 할 수 있도록 합니다.CDN 로그 및 분석 도구 사용:
자동화된 배포 파이프라인 구축:
목표: CDN의 보안 기능을 활용하여 애플리케이션을 보호합니다.
단계별 가이드:
SSL/TLS 설정:
DDoS 방어 설정:
Access Control 설정:
포트폴리오에 포함할 수 있는 결과물:
CDN을 실습하는 과정은 단순히 개념을 이해하는 것을 넘어, 실제 애플리케이션에서 성능과 보안을 향상시키는 방법을 배우는 데 큰 도움이 됩니다. 위의 실습들을 통해 CDN의 다양한 기능을 체험하고, 이를 Java/Spring 애플리케이션에 효과적으로 통합하는 능력을 키울 수 있습니다. 이러한 경험은 취업 면접 시 강력한 포트폴리오로 어필할 수 있으며, 실무에서도 큰 자산이 될 것입니다. 실습을 진행하면서 발생하는 문제를 해결하고, 최적화하는 과정에서 문제 해결 능력도 함께 향상시킬 수 있습니다.
응원합니다! 성공적인 취업을 기원합니다.