Backend/Spring 16

빈 스코프

빈 스코프는 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 스코프를 지원한다. 싱글톤: 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입: 스프링 컨테이너가 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는, 매우 짧은 범위의 스코프이다. 웹 관련 스코프: request: HTTP 요청 하나가 들어오고 나갈 때까지 유지된다. 각각의 HTTP 요청마다 별도로 빈 객체가 생성되고 관리된다. session: HTTP Session과 동일한 생명주기를 갖는다. application: 웹의 서블릿 컨텍스트와 동일한 생명주기를 갖는다. websocket: 웹 소켓과 동일한 생명주기를 갖는다. 싱글톤 스코프 싱글톤 빈은 스프링 컨테이너 생성 시점에 ..

Backend/Spring 2023.12.30

빈 생명주기 콜백을 통한 스프링 빈 객체의 초기화/종료 작업

데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 객체의 초기화는 스프링 컨테이너에 해당 객체가 스프링 빈으로 생성되고 의존관계 주입이 완료된 후에 진행해야 하고, 객체의 종료는 해당 객체의 빈이 소멸되기 직전에 진행해야 한다. 참고로 객체가 스프링 빈으로 생성된 후에 객체의 초기화 작업을 해야 하는 이유는 다음과 같다. 생성자는 필수 정보를 파라미터로 받고 메모리를 할당해서 객체를 생성하는 책임을 가진다. 반면 초기화는 이렇게 생성된 객체를 외부 커넥션과 연결하는 등 무거운 동작을 수행한다. 따라서 생성자 안에서 무거운 초기화 작업까지 함께 하는 것보다는 객..

Backend/Spring 2023.12.29

스프링 빈 등록과 조회

스프링 컨테이너에서 빈 조회 다음 메소드를 통해 스프링 컨테이너에 있는 빈을 조회할 수 있다. getBeanDefinitionNames(): 스프링에 등록된 모든 빈 이름을 조회한다. 따라서 사용자가 정의한 빈 외에 스프링이 내부에서 사용하는 빈들도 함께 조회된다. 스프링이 내부에서 사용하는 빈은 제외하고 사용자가 등록한 빈만 조회하려면, getRole() 메소드를 통해 빈을 구분하면 된다. ROLE_APPLICATION` : 일반적으로 사용자가 정의한 빈 ROLE_INFRASTRUCTURE` : 스프링이 내부에서 사용하는 빈 getBean(): 빈 이름 또는 타입으로 빈을 조회한다. (ex, getBean("memberService", MemberService.class)) 조회하려는 빈이 없으면 No..

Backend/Spring 2023.12.29

컴포넌트 스캔과 자동 의존관계 주입

컴포넌트 스캔(@ComponentScan, @Component)과 자동 의존관계 주입(@Autowired) 지금까지 스프링 빈을 등록할 때 @Bean을 포함한 설정 정보 클래스를 작성해주었다. 그러나 등록해야 할 빈이 수십, 수백개가 되면 일일히 등록하기 매우 번거롭다. 따라서 스프링은 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔이라는 기능을 제공한다. 다음과 같이 설정 정보 클래스에 @ComponentScan을 붙여주면 된다. 그러면 기존과 달리 @Bean을 작성하며 일일히 빈을 등록해주던 코드를 작성해주지 않아도 된다. @Configuration @ComponentScan() public class AutoAppConfig { } 설정 정보 클래스임을 나타내기 위해 @Configuration을 붙여..

Backend/Spring 2023.12.29

스프링 컨테이너와 스프링 빈

스프링 컨테이너 스프링은 스프링 컨테이너를 제공함으로써 이전에 직접 만들었던 AppConfig처럼 각 객체들의 생성과 의존관계를 관리해준다. 스프링 컨테이너가 객체 간의 의존관계를 관리해줌으로써 각 구현체 클래스들은 다른 구현체 클래스에 의존하지 않을 수 있다. 이전에 정의했던 AppConfig에 스프링을 적용하면 다음과 같다. @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(membe..

Backend/Spring 2023.12.28

스프링과 객체지향

스프링의 핵심 컨셉: 객체지향 스프링은 자바 기반의 프레임워크이다. 자바의 가장 큰 특징은 객체지향 언어라는 것인데, 스프링은 객체지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다. 즉 스프링의 핵심 컨셉은 객체지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크이다. 다형성 객체지향 프로그래밍은 프로그램을 여러 객체들의 모임으로 파악하고, 각 객체들 간에 메시지를 주고받으며 협력하는 것을 강조한다. 이러한 객체지향 프로그래밍은 프로그램을 유연하고 변경에 용이하게 만든다. 프로그램이 유연하고 변경에 용이하다는 것은 무엇일까? 여기서 다형성이라는 개념이 등장한다. 다형성은 역할과 구현을 분리한다. 예를 들어 다음과 같이 자동차 역할과 그 구현이 나눠져있다고 가정하자. 그러면 자동차의 구현체가 K3에..

Backend/Spring 2023.12.28