서블릿(Servlet)
이전에 CGI는 프로세스를 할당하는 방식이라 서버가 사용자의 수를 감당할 수 없다고 들었습니다.
그리고 1995년 세상에 Java가 공개가 되고 1년 뒤인 1996년 Java 환경에서 사용 가능한 서블릿이 등장하게 됩니다.
바로 이 서블릿이 CGI를 대체할 수 있는 기술이었습니다. 서블릿은 앞서 말한 CGI처럼 규약을 뜻합니다.
서블릿도 동적인 페이지를 보여주기 위해 나온 기술이지만 CGI와 차이점은 서블릿은 쓰레드를 사용했습니다.
쓰레드는 프로세스 내부에 있는 작업 단위 입니다. 프로세스 1개 안에 여러개의 쓰레드가 돌고 있습니다.
그리고 서블릿은 사용자마다 1개의 쓰레드를 할당을 해줘서 사용자 과부하 문제를 해결할 수 있게 되었습니다.
자바 객체 생성의 과부화
서블릿을 이용해 쓰레드도 사용할 수 있고 동적인 페이지도 보여줄 수 있었지만 또 하나의 과부하 문제가 생겼습니다.
서블릿은 자바를 이용한 기술이었고 자바는 클래스의 객체를 만들어서 사용하는 기술입니다.
그리고 사용자마다 접속 시 클래스의 객체를 다 따로 만들어내면서 결과적으로 서버 용량이 감당할 수가 없었습니다.
싱글톤 패턴
그리고 시간이 흘러 2004년 이러한 문제점을 고치고자 나온 것이 Spring입니다.
Spring은 싱글톤 패턴을 사용하는데, 사용자가 객체를 만드는 코드를 실행시키는 것이 아닌 서버가 올라갈 때 서버가 직접 객체를 단 한번만 만들어주는 패턴을 말합니다.
그리고 서버는 접근하는 사용자에게 만들어진 객체를 제공하는 것이었죠.
예시를 들어서 설명해보겠습니다.
위와 같은 일반적인 스프링 구조의 Java 코드가 있다고 가정해보겠습니다.
싱글톤 패턴을 쓰기 전까지는 사용자는 위처럼 클래스의 객체를 만들어서 사용해야 했습니다.
하지만 이제는 서버가 시작 될 때 위의 코드를 서버가 대신 실행 시켜주고 사용자가 필요로 할 때마다 해당 객체를 제공합니다.
HelloController라는 클래스의 객체를 이미 서버가 만들었으니 저희는 hello메소드를 이용할 수 있는 것이죠.
만약 A라는 사용자가 /hello 를 통해 접속한다면 어떻게 될까요? 전역 변수 a에 1를 더해서 4를 출력합니다.
그리고 B라는 사용자가 다음으로 /hello를 통해 접속한다면 a는 3부터 시작하지 않고 4부터 시작해서 5를 출력합니다.
이렇듯 어떤 사용자가 들어와도 HelloController로 만들어진 객체는 단 하나일 뿐 입니다.
스프링의 구조
이제 스프링의 구조를 더 직접적으로 이해할 수 있게 됐습니다.
1. 스프링에선 서블릿을 사용합니다.
스프링에선 보통 Dispatcher-Servlet을 사용합니다. 동적인 데이터 생성을 위해 만들어진 기술입니다. 어떠한 경로로 들어오면 어떤 클래스(Controller)로 보낼 것인지 어떤 화면(View)을 보여줄 것인가에 대해 룰을 하나 만들어준 것이 서블릿이라 생각하면 됩니다.
2. 서버가 객체를 만듭니다.
이것을 제어의 역전(IoC)이라고 합니다. 프로그램의 제어(객체 생성)를 사용자가 하지않고 서버가 해주는 것을 말합니다.
사용자가 컨트롤러 밑에 직접 컨트롤러 객체 생성을 하면 어떻게 될까요?
사용 불가능 합니다. 스프링은 싱글톤 패턴으로 사용자가 객체 생성을 하지 못하도록 막고 있기 때문입니다.
3. 서버가 객체를 사용자에게 전달합니다.
스프링 어노테이션을 이용해 서버에서 만든 객체를 사용자에게 전달할 수 있는 기능입니다.
이러한 기술을 의존성 주입(Dependency Injection)이라고 합니다.
'🕸️ Web' 카테고리의 다른 글
HTTP/1.1 vs HTTP/2 - 동시 요청 처리 방법에 따른 대용량 트래픽 처리 (0) | 2025.01.21 |
---|---|
Cloud Database Service(2) - Firebase의 Realtime Database 규칙 (0) | 2023.05.24 |
Cloud Database Service(1) - 클라우드 DB의 종류 (0) | 2023.05.23 |
SOP(Same Origin Policy)와 CORS(Cross Origin Resource Sharing)의 차이 (0) | 2022.07.20 |
최초의 웹과 스프링이 나오기까지 (1) (0) | 2022.02.10 |