본문 바로가기

Spring

(8)
[Spring MVC] DispatcherServlet 의 동작 흐름 DispatcherServlet DispatcherServlet은 Spring MVC 에서 프론트 컨트롤러 역할을 하는 서블릿 객체이다. 스프링 부트 어플리케이션을 시작하면 DispatcherServlet 객체를 생성해 서블릿 컨테이너에 등록하고, urlPatterns="/" 로 설정해 모든 요청에 대해 맵핑 한다. 때문에 서버로 요청이 들어오면 DispatcherServlet가 모든 요청의 url을 분석해 그 url에 매핑된 핸들러(컨트롤러)를 찾아 실행시킨다. HandlerMapping HandlerMapping은 요청 URL에 매핑된 핸들러를 찾아 조회하고 반환하는 기능을 제공하기 위한 인터페이스이다. 아래 의 메소드는 DispatcherServlet 에서 요청에 대한 핸들러(컨트롤러)를 찾기 위해..
스프링 컨테이너와 서블릿 컨테이너와의 관계 서블릿 컨테이너는 서블릿 객체의 생명주기를 관리하고 클라이언트의 HTTP 요청에 따라 맵핑된 서블릿 객체를 찾아 service() 메서드를 실행시킨다. 톰캣은 이러한 서블릿 컨테이너 기능을 포함한 WAS로 스프링 부트 어플리케이션을 실행시키면 톰캣 서버도 실행되며 서블릿 컨테이너의 역할을 수행한다. 결국 톰캣도 하나의 자바 프로그램이다. 스프링 부트 어플리케이션을 실행시키면 @ComponentScan을 통해 빈을 등록하고, @EnableAutoConfiguration가 스프링 부트의 autoconfigure패키지의 /META-INF/spring.factories 에서 EnableAutoConfiguration 의 키 값으로 설정된 패키지를 찾아 실행시키므로써 빈을 등록한다. 이 과정에서 톰캣 또한 실행되..
스프링 핵심 원리 - 기본편 : 빈 스코프(2/2) 스프링 핵심 원리 - 기본편 : 빈 스코프(2/2) - 웹 스코프 웹 스코프는 웹 환경에서 동작하는 스코프로 프로토타입 스코프와는 다르게 컨테이너가 생성과 소멸을 모두 관리한다. 때문에 소멸 메소드 또한 빈이 소멸하는 시점에 호출된다. 웹 스코프의 종류는 request, ssesion, application, websocket 가 있다. 참고 중인 강의에서는 request에 대한 예제로 진행된다. request 스코프는 HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프로, HTTP 요청마다 별도의 빈이 생성되고, 요청이 종료되면 소멸된다. 아래서 진행되는 예제는 각각 HTTP의 요청과 request 빈에 대한 로그를 출력하는MyLogger 클래스를 통해 진행된다. - request 스코프 예제 ..
스프링 핵심 원리 - 기본편 : 빈 스코프(1/2) 스프링 핵심 원리 - 기본편 : 빈 스코프(1/2) - 빈 스코프란? 빈의 생명주기가 '빈이 생존해 있을 때 생성과 소멸 사이에서 무엇을 할 것인가' 에 대한 것이라면 빈 스코프는 '빈이 언제 생성되고 언제 소멸될 것인가'에 대한 것이다. 즉 빈이 존재할 수 있는 범위를 결정한다. 지금까지는 디폴트로 설정되어 있는 싱글톤 스코프만 다뤘다. 싱글톤 스코프는 컨테이너가 생성되며 같이 등록되고, 컨테이너가 종료될 때까지 유지되는 가장 넓은 범위로 존재하는 스코프이다. 그 이외에 프로토타입, 웹 관련 스코프에 대해 알아보려고 한다, 먼저 프로토타입 스코프이다. - 프로토타입 스코프 빈으로 생성할 클래스 위에 @Scope를 추가하므로써 빈의 스코프를 지정해 줄 수 있다. 아래는 클래스를 프로토타입 스코프로 지정하..
스프링 핵심 원리 - 기본편 : 빈 생명주기 콜백 스프링 핵심 원리 - 기본편 : 빈 생명주기 콜백 어플리케이션의 데이터베이스 커넥션 풀, 네트워크 소켓 등 시작과 종료 시점에서 연결하고 연결을 끊는 작업이 꼭 필요한 경우가 있다. 이러할 경우 빈의 생명주기(Life cycle)을 활용해 빈이 생성되고 종료되는 시점 사이 특정 시점에 객체를 초기화 하고 종료하는 작업이 실행되도록 할 수 있다. 스프링 빈의 생명 주기는 아래와 같다. 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸전 콜백 → 스프링 종료 빈이 생성되고 의존관계가 모두 주입되어 이제 사용하기 전 단계(비즈니스 로직이 실행되기 전에)에 초기화 콜백을 통해 객체의 네트워크 연결 등의 초기화 작업을 진행하고, 어플리케이션이 종료 되는 시점 직전에 소멸..
스프링 핵심 원리 - 기본편 : 의존관계 자동 주입(2/2) 스프링 핵심 원리 - 기본편 : 의존관계 자동 주입(2/2) - 롬복과 최신 트랜드 Lombok 라이브러리를 사용하면 생성자, getter setter 와같은 수정자를 직접 작성하지 않고 어노테이션을 통해 간편하게 추가할 수 있다. 때문에 의존관계 주입을 통해 할당된 객체의 불변성은 유지하면서, 필드주입처럼 편리하게 개발할 수 있다. 아래 이미지처럼 @RequiredArgsConsturctor 어노테이션을 사용하고 생성자를 작성하지 않아도된다!! @RequiredArgsConstructor는 컴파일 단계에서 final로 선언된 필드를 매개변수로 받는 생성자 코드를 생성하여 자동으로 추가해준다. 때문에 컴파일이 완료된 .class 파일에는 아래 이미지처럼 생성자가 추가되고 @RequiredArgsConst..
스프링 핵심 원리 - 기본편 : 의존관계 자동 주입(1/2) 스프링 핵심 원리 - 기본편 : 의존관계 자동 주입(1/2) - 다양한 의존관계 주입 방법 지금까지 클라이언트 클래스가 구현클래스에게 의존하지 않고 생성자를 통한 의존관계 주입(DI)을 통해 객체지향의 OCP, DIP를 지킬 수 있었다. 하지만 의존관계 주입은 생성자 뿐만아니라 다양한 방법으로도 가능하다. 생성자 주입 말그대로 클래스의 생성자를 통해 의존관계를 주입받는다. 딱 한번만 호출되어 주입된 객체의 불변성을 보장한다. 때문에 final 키워드를 사용할 수있다. final 은 불필요한 변경을 컴파일 단계에서 막을 수 있다는 장점을 가진다. 스프링을 통해 DI컨테이너를 생성할때, 컴포넌트 스캔을 통해 빈을 등록한다면 생성자가 단 하나만 존재한다면 @Autowired를 생략 가능하다. (스캔 당하는 클..
[Spring 은 무엇일까]Spring 공부 시작 지금까지 Spring 으로 몇 번의 간단한 웹 어플리케이션과 API를 개발했었다. 하지만 다시 처음부터 Spring을 공부하면서 단순히 웹 어플리케이션 프레임워크 라고 정의하기에는 너무 많은 구성요소들이 존재한다고 느껴졌다. 당장 Spring의 공식 페이지에서는 Spring Framework, Boot, Data, Security, Session, HATEOAS 등 20가지가 넘는 프로젝트들이 존재한다.(프로젝트들는 프레임워크, 라이브러리, API 등 다양하다.) 내가 지금까지 사용해봤던 Express.js, React, 안드로이드 등의 프레임워크들은 조금 사용해보면 벡 엔드, 프론트엔드, 안드로이드 프론트를 위한 프레임워크라는 것을 알 수 있었다. 그러나 Spring 에서는 현재 서비스는중단 됐지만 안..