스프링 부트에서의 로드 밸런싱 개념과 구현 방법

1. 로드 밸런싱이란?

로드 밸런싱(Load Balancing)은 들어오는 네트워크 트래픽이나 작업 부하를 여러 서버 또는 인스턴스에 분배하여 단일 서버에 과부하가 걸리지 않도록 하는 기술입니다.

이를 통해 애플리케이션의 가용성(Availability), 신뢰성(Reliability), 반응성(Response Time)을 유지할 수 있습니다.

예를 들어, 쇼핑몰 사이트에서 블랙 프라이데이 세일이 시작되면 트래픽이 급증하는데, 이때 로드 밸런싱 없이 하나의 서버만 사용한다면 과부하로 인해 서비스가 중단될 가능성이 높습니다.
하지만 여러 서버에 부하를 나누면 서비스가 안정적으로 유지됩니다.

2. 로드 밸런싱의 종류

로드 밸런싱 방식은 크게 다음과 같이 나뉩니다.

  • 하드웨어 기반: 물리적인 로드 밸런서 장비(예: F5, Citrix)를 사용
  • 소프트웨어 기반: Nginx, HAProxy 등을 이용하거나 애플리케이션 내부에서 직접 구현
  • 클라우드 기반: AWS ELB, GCP Load Balancer와 같은 클라우드 서비스 활용

이번 포스팅에서는 소프트웨어 기반 로드 밸런싱을 스프링 부트를 이용해 직접 구현해보겠습니다.

3. 로드 밸런싱의 장점과 단점

장점

  • 성능 향상: 부하를 분산해 개별 서버의 처리 속도가 빨라짐
  • 가용성 및 신뢰성 증가: 하나의 서버가 다운되어도 다른 서버가 요청을 처리 가능
  • 확장성 확보: 트래픽 증가 시 손쉽게 서버를 추가하여 대응 가능
  • 자원 활용 최적화: 여러 서버가 균등한 부하를 처리할 수 있음

단점

  • 복잡성 증가: 시스템 구조가 복잡해지고 관리할 요소가 많아짐
  • 비용 상승: 여러 개의 서버 유지 비용 및 로드 밸런서 자체 비용 발생
  • 지연(latency) 증가: 요청을 분배하는 과정에서 약간의 오버헤드 발생
  • 단일 실패 지점(SPOF, Single Point of Failure): 로드 밸런서 자체가 장애가 나면 전체 시스템에 영향 미칠 수 있음

4. 스프링 부트에서 로드 밸런싱 구현

4.1. 구현 개요

  • 메인 애플리케이션: 여러 서버 인스턴스에 요청을 분배
  • 서드 파티 애플리케이션: 여러 포트(8081, 8082, 8083)에서 실행되는 서비스
  • 라운드 로빈 방식: 서버 목록에서 순차적으로 하나씩 선택해 요청을 전달

4.2. 서드 파티 애플리케이션 구현

@SpringBootApplication
@RestController
public class ThirdPartyApplication {
    @Value("${server.port}")
    private int port;

    @GetMapping("/test")
    public String test() {
        return "Response from port: " + port;
    }

    public static void main(String[] args) {
        SpringApplication.run(ThirdPartyApplication.class, args);
    }
}

설정 파일 (application.properties)

server.port=8081

이 애플리케이션을 포트 8081, 8082, 8083에서 각각 실행하려면 VM 옵션을 설정하면 됩니다.

-Dserver.port=8081
-Dserver.port=8082
-Dserver.port=8083

4.3. 메인 애플리케이션 구현

@SpringBootApplication
@RestController
public class MainApplication {

    private final List<String> serverList = Arrays.asList(
        "http://localhost:8081/test",
        "http://localhost:8082/test",
        "http://localhost:8083/test"
    );
    private AtomicInteger currentIndex = new AtomicInteger(0);

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/load-balance")
    public String loadBalance() {
        int index = currentIndex.getAndIncrement() % serverList.size();
        String serverUrl = serverList.get(index);
        return restTemplate.getForObject(serverUrl, String.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

설정 파일 (application.properties)

server.port=8080

5. 실행 방법

  1. 서드 파티 애플리케이션을 8081, 8082, 8083 포트에서 각각 실행
  2. 메인 애플리케이션(8080)을 실행
  3. /load-balance 엔드포인트를 호출하면 요청이 라운드 로빈 방식으로 서버 인스턴스에 분배됨
curl http://localhost:8080/load-balance

6. 결론

스프링 부트를 이용한 간단한 로드 밸런싱을 구현해보았습니다.
더 복잡한 환경에서는 Spring Cloud LoadBalancer, Spring Cloud Gateway, Netflix Ribbon 등을 활용할 수도 있습니다.
클라우드 환경에서는 AWS, GCP, Azure의 로드 밸런싱 서비스를 활용하면 더욱 효율적인 로드 밸런싱이 가능합니다.

추천 URL 링크

Spring Cloud LoadBalancer 공식 문서
Spring Cloud Gateway 공식 문서
Netflix Ribbon 깃허브
AWS Elastic Load Balancing
백엔드 아키텍처 패턴 - 마틴 파울러 블로그

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글