본문 바로가기

Spring52

의존관계 자동 주입 - 1 의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 우리가 진행했던 방법이 바로 생성자 주입이다. 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용한다. 중요! 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입 된다. 물론 스프링 빈에만 해당한다. 수정자 주입(setter 주입) setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다. 선택, 변경 가능성이 있는 의존관계에 사용한다. 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다. 필드 주입 이름 그대로 .. 2022. 3. 22.
컴포넌트 스캔 컴포넌트 스캔과 의존관계 자동주입 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 역시 개발자는 반복을 싫어한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여주면 된다. 기존의 AppConfig와는 다르게 @Bean으로 등록한 클래스가 하나도 없다! 컴포넌.. 2022. 3. 21.
싱글톤 컨테이너 싱글톤 컨테이너 적용 전 우리가 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 객체를 새로 생성한다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! 메모리 낭비가 심하다. 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. -> 싱글톤 패턴 1. static 영역에 객체 instance를 미리 하나 생성해서 올려둔다. 2. 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있다. 이 메서드를 호출하면 항상 같은 인스턴스를 반환한다. 3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막.. 2022. 3. 20.
스프링 컨테이너와 스프링 빈 ApplicationContext 를 스프링 컨테이너라 한다. ApplicationContext 는 인터페이스이다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다. 직전에 AppConfig 를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 자바 설정 클래스를 기반으로 스프링 컨테이너( ApplicationContext )를 만들어보자. new AnnotationConfigApplicationContext(AppConfig.class); 이 클래스는 ApplicationContext 인터페이스의 구현체이다. 스프링 컨테이너의 생성 과정 1. 스프링 컨테이너 생성 new AnnotationConfigApplica.. 2022. 3. 18.
관심사의 분리와 AppConfig OrderServiceImpl에서 할인정책이 변경될때 DIP와 OCP를 위반하는 경우가 발생했다. 어떻게 문제를 해결할 수 있을까 ? 클라이언트 코드인 OrderServiceImpl 은 DiscountPolicy 의 인터페이스 뿐만 아니라 구체 클래스도 함께 의존한다. 그래서 구체 클래스를 변경할 때 클라이언트 코드도 함께 변경해야 한다. DIP 위반 추상에만 의존하도록 변경(인터페이스에만 의존) DIP를 위반하지 않도록 인터페이스에만 의존하도록 의존관계를 변경하면 된다. 인터페이스에만 의존하도록 설계를 변경하자. 그런데 구현체가 없는데 어떻게 코드를 실행할 수 있을까? 실제 실행을 해보면 NPE(null pointer exception)가 발생한다.이 문제를 해결하려면 누군가가 클라이언트인 OrderS.. 2022. 3. 16.
주문과 할인 도메인 오늘의 목표 - 주문과 할인 도메인 설계, 개발, 테스트 할인 정책부터 만든다. discount 패키지안에 DiscountPolicy 인터페이스를 작성한다, 일단 정액 할인 정책의 구현체를 만든다 FixDiscountPolicy (정률 할인 정책은 다음에) 다음 Order 서비스를 만들기 위해 order 패키지를 생성하고 Order 클래스를 작성한다. 그 다음 OrderService 인터페이스를 작성한다. 그 다음 OrderServiceImpl 구현체를 작성한다. main 함수로 OrderApp 클래스를 작성하여 테스트 해본다. 결과를 눈으로 확인해야 하는 불편함이 있다. 다음은 Junit으로 넘어와 order 패키지를 생성하고 OrderServiceTest 클래스를 생성하여 테스트한다. 초록불이 뜨며 .. 2022. 3. 15.