Skip to Content
Suffering builds character

2.패턴 활용 사례

이 패턴의 실제 활용 사례는 다음과 같음

1. 데이터베이스 커넥션 풀

클라이언트의 요청이 올 때마다 커넥션 객체를 매번 생성하는 것은 애플리케이션 서버와 DBMS 서버 간의 TCP 소켓 연결 등의 작업 처리 과정에 있어서 성능 저하가 발생

Producer는 서버를 실행하는 과정에서 미리 일정 개수의 커넥션 객체를 생성해두고,
Consumer는 사용자의 요청을 수행하기 위해 커넥션 객체를 사용함

ex. Apache DBCP, HikariCP와 같은 커넥션 풀

2. 웹 서버의 스레드 풀

데이터베이스의 커넥션 풀과 유사하게 스레드 역시 클라이언트의 요청이 올 때마다 스레드를 매번 생성하는 것은 클라이언트(ex. Browser)와 웹 서버 사이의 작업 처리 과정에 있어서 응답 성능 저하가 발생

따라서 Producer는 서버를 실행하는 과정에서 미리 일정 개수의 스레드를 생성해두고,
이후, 웹 서버는 사용자의 HTTP 요청을 큐에 순서대로 적재,

Consumer인 각 스레드는 요청들을 하나씩 큐에서 꺼내 처리하는 구조로 동작

ex. Tomcat, Jetty와 같은 서블릿 컨테이너에서 사용하는 스레드 풀 객체

3. 로그 처리 시스템

로그 코드
log.info("사용자 로그인");

위와 같이 로그를 처리하는 코드가 실행될 때마다 애플리케이션에서는 로그를 파일이나 DB에 저장하는 과정에서 입출력(IO)이 발생하기 때문에 성능이 저하될 수 있음

따라서 Producer는 로그 메시지를 큐에 적재하고,
별도의 스레드인 Consumer가 비동기적으로 로그 메시지를 처리하여 동작하도록 적용
→ 로깅 라이브러리에서 활용하는 비동기 로깅

ex. Logback, Log4j와 같은 로깅 라이브러리

4. 메시지 큐 시스템

로그 처리 시스템과 유사하게 파일 업로드, 이메일 전송 등과 같이 서버에서 처리 시간(CPU 연산)이 오래 걸리는 작업들을 비동기적으로 처리하기 위해 메시지 큐를 활용할 수 있음

Producer는 처리할 작업을 메시지의 형태로 큐에 저장,
Consumer는 큐에서 메시지를 소비하여 처리

ex. RabbitMQ, Kafka를 통한 메시지 큐잉

Last updated on