Cache
캐싱의 기본적인 컨셉은 자주 접근되는 데이터를 메모리에 저장하여 더욱 빠르게 조회되도록 하는 것이다.
프로젝트에서는 local cache와 global cache로 구분하여 사용된다.
EHCache와 같은 라이브러리를 통해 로컬의 메모리에 저장하여 사용한다.
로컬 메모리를 사용하기 때문에 접근 속도는 가장 빠르지만,
메모리 사용에 한계가 있고 여러 서버를 사용하는 애플리케이션의 경우 메모리 동기화 문제가 발생하는 한계가 있다.
Redis 등을 통해 외부 캐시 서버 메모리에 컨텐츠를 저장하여 사용한다.
네트워크를 통해 캐시에 접근하기 때문에 local cache보다 접근이 느리다는 단점이 있으나
여러 서버를 구동하는 어플리케이션에서의 캐시 데이터 동기화 문제가 없고 캐싱 전용 서버를 사용하기 때문에 어플리케이션 내의 메모리를 직접 사용하는 것보다 사용 제한이 덜하다.
@Service
public class MyService {
@Cacheable(value = "myCache", key = "#id")
public BusinessObject getBusinessObject(String id) {
// 실제 비즈니스 로직이 들어가는 부분
}
}
Spring에서는 두 경우 모두 @Cacheable 등의 어노테이션을 통해 간단한 설정만으로도 캐싱을 사용할 수 있다. 캐싱의 종류와 상관없이 어노테이션 설정만 해주면 스프링에서 각 캐싱 방법에 맞게 프록시 객체를 생성하여 알아서 캐싱을 관리해준다.
CDN
CDN(Content Delivery Network)은 웹 콘텐츠를 사용자에게 빠르게 전달하기 위한 분산 네트워크이다. 일반적으로 웹사이트의 콘텐츠는 한 서버에서 호스팅되어 전 세계에 전송되지만, CDN은 여러 지역에 위치한 서버들로 구성되어 있어 사용자가 요청한 콘텐츠를 가장 가까운 서버에서 받을 수 있게 한다.
이 때 캐싱의 개념이 사용되는데, CDN은 사용자의 요청을 받으면 가장 가까운서버에서 해당 콘텐츠를 찾고, 이때 해당 콘텐츠가 서버에 캐시되어 있다면 즉시 사용자에게 전달한다. 만약 캐시에 콘텐츠가 없다면, CDN은 원본 서버로부터 콘텐츠를 가져와서 사용자에게 전달하고, 이 콘텐츠를 CDN 서버에 캐시한다.
CDN은 트래픽이 많은 웹사이트나 글로벌 사용자를 대상으로 하는 서비스에서 특히 유용하다. CDN을 사용하면 웹사이트의 속도를 향상시킬 수 있고, 서버에 부하를 줄일 수 있으며, 서버 다운타임 없이 안정적인 서비스를 제공할 수 있다. 또한, 사용자가 콘텐츠를 빠르게 받을 수 있으므로 사용자 경험도 개선된다.
대표적인 CDN 서비스로는 Akamai, Cloudflare, Amazon CloudFront 등이 있다
CDN은 단순히 컨텐츠를 빠르게 제공하는 것 이외에도 서버의 부하를 고르게 분산시키는 로드밸런싱, DDoS 공격 등에 대한 보안 등의 기능을 제공한다.