본문 바로가기

분류 전체보기

(334)
[Spring] 빈 생명주기 콜백 목차빈 생명주기 콜백인터페이스 InitializingBean, DisposableBean등록 초기화, 소멸 메서드 지정 @Bean애노테이션 @PostConstruct, @PreDestroy  빈 생명주기 콜백 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보자.간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다.이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 ..
[Spring] 의존관계 자동 주입 목차다양한 의존관계 주입 방법생성자 주입의 장점Lombok 라이브러리@Autowired 필드 명, @Qualifier, @Primary애노테이션 직접 만들기조회한 빈이 모두 필요할 땐 List, Map  다양한 의존관계 주입 방법의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입옵션 처리  1. 생성자 주입이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다.컴포넌트 스캔 => 스프링 빈 등록시점에 생성자 호출 => Autowired 확인 => 생성자 파라미터 타입에 맞는 의존관계 주입 특징생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.불변, 필수 의존관계에 사용@Componentpublic class OrderServiceImpl ..
[Spring] 컴포넌트 스캔 목차컴포넌트 스캔과 의존관계 자동 주입탐색 위치와 기본 스캔 대상필터중복 등록과 충돌 컴포넌트 스캔과 의존관계 자동 주입지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의  등을 통해서 설정 정보에 직접 등 록할 스프링 빈을 나열했다.예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고,  설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자. AutoAppConfig.javapackage hello.core;i..
[Spring] 싱글톤 컨테이너 목차웹 어플리케이션과 싱글톤싱글톤 패턴싱글톤 컨테이너싱글톤 방식의 주의점@Configuration과 싱글톤@Configuration과 바이트코드 조작@Configuration을 사용하지 않으면? 웹 애플리케이션과 싱글톤스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다.대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다.웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.계속 요청이 올 때마다 객체가 생성된다. => 메모리 낭비  스프링 없는 순수한 DI 컨테이너 테스트package hello.core.singleton;import hello.core.AppConfig;import hello.core.member.Member..
[Spring] 스프링 빈 설정 메타 정보(feat. XML) 목차XML로 빈 설정해보기스프링 빈 설정 메타 정보BeanDefinition 살펴보기 다양한 설정 형식 지원 - 자바 코드, XML 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되어 있다.자바 코드, XML, Groovy 등등  애노테이션 기반 자바 코드 설정 사용지금까지 했던 것이다.new AnnotationConfigApplicationContext(AppConfig.class)AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. XML 설정 사용최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다.아직 많은 레거시 프로젝트 들이 XML로 되어 있고, 또 XML을 사용하면 컴파..
[Spring] 스프링 빈 조회 목차컨테이너에 등록된 모든 빈 조회스프링 빈 조회스프링 빈 조회 - 동일한 타입 둘 이상스프링 빈 조회 - 상속 관계 컨테이너에 등록된 모든 빈 조회 스프링 컨테이너에 실제 스프링 빈들이 잘 등록 되었는지 확인해보자.package hello.core.beanfind;import hello.core.AppConfig;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.context.annotation.AnnotationConfigApplicationContext;pu..
문자 찾기 보호되어 있는 글입니다.
[Spring] 스프링 컨테이너 목차스프링 컨테이너스프링 생성 과정BeanFactory와 ApplicationContext 스프링으로 전환하기지금까지 순수한 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자.package hello.core;import hello.core.discount.DiscountPolicy;import hello.core.discount.FixDiscountPolicy;import hello.core.discount.RateDiscountPolicy;import hello.core.member.MemberRepository;import hello.core.member.MemberService;import hello.core.member.MemberServiceImpl;import hello.core.m..
[Spring] IoC, DI 컨테이너 제어의 역전 IoC (Inversion of Control)기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다.반면에 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. 예를 들어서 OrderServiceImpl 은 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다.  프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다. 심지어 OrderServiceImpl 도 AppConfig가 생성한다. 그리고 AppConfig는..
[Spring] OCP, DIP 원칙을 지켜주는 AppConfig 새로운 할인 정책 적용과 문제점할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.private final MemberRepository memberRepository = new MemoryMemberRepository();// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();// 할인 정책 변경, OCP 원칙 위반, DIP 원칙 위반(추상화 뿐만 아니라 구체화 의존)private final DiscountPolicy discountPolicy = new RateDiscountPolicy() 문제점 발견우리는 역할과 구현을 충실하게 분리했나? => OK다형성도 활용하고, 인터페이스와 구현 객체를..