본문 바로가기

Spring10

[Spring] DI, 의존관계 주입 방법 의존 관계란? '클래스 A가 클래스 B를 의존한다' 라고 했을 때, B클래스의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다는 것이다. 그래서 직접적으로 클래스를 의존하는 것보다, 인터페이스로 추상화하면 더 다양한 클래스가 의존받을 수 있다. 추상화를 함으로써 더 다양한 의존 관계를 맺을 수가 있고, 실제 구현 클래스와 느슨한 결합 관계를 유지할 수 있다. DI란? 생성자 주입. 의존 관계를 외부에서 결정하도록 하는 것이다. 즉, A클래스를 사용하고자 하는 또 다른 클래스에서 의존 관계를 결정하도록 하는 것이다. DI를 위한 방법은 여러가지가 있다. 생성자 주입 생성자를 통해서 의존 관계를 주입하는 방법 생성자 호출 시(빈 등록 시), 예를 들어 @Autowired 등의 의존 관계를 .. 2024. 4. 7.
[Spring] @Qualifier, @Primary ** 공유가 아닌 개인 공부에 목적을 둔 글입니다 ** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다 @Autowired 로 의존관계 주입시 여러 빈이 찾아져서 매칭되려고 할 때 스프링이 에러를 뱉게 된다 이 문제는 어떻게 해결할까 @Qualifier @Qualifier 은 추가 구분자로서 빈을 구분하는 역할을 하지 빈 이름 자체를 변경하는 것이 아니다 빈을 등록할 때 @Qualifier 로 이름을 정해주고, 생성자 주입시나 수정자 주입시, 필드 주입시 등 다양한 주입에서 활용할 수 있다 아래 예시를 보자 RateDiscountPolicy 클래스에 @Qualifier 구분자 어노테이션을 추가해줌으로써 "mainDiscountPolicy"라는 이름으로 해당 빈을 추가적으로 구분할 수 있게 .. 2021. 12. 7.
[Spring] @Autowired 의존관계 주입시 조회되는 빈이 여러개일때 ** 공유가 아닌 개인 공부에 목적을 둔 글입니다 ** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다 @Autowired 는 타입으로 빈을 조회하는데, 타입으로 조회했을 때 등록된 빈이 여러개일 때 오류가 발생한다 @Autowired 로 의존관계 주입한 클래스 @Component 로 빈 등록을 한 클래스, 둘이 같은 타입이다 (DiscountPolicy) @ComponentScan 을 넣은 AutoAppConfig 클래스를 설정정보로 넘겨주고 스프링 컨테이너를 생성하고 테스트 이때 나타나는 오류 NoUniqueBeanDefinitionException 타입 매칭 결과가 여러개일 때, 필드 이름, 파라미터 이름으로 빈 이름을 2차 매칭 한다 DiscountPolicy discountPoli.. 2021. 11. 29.
[Spring] @ComponentScan 과 @Autowired ** 공유가 아닌 개인 공부에 목적을 둔 글입니다 ** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다 @Bean 이나 XML 의 을 통해 빈을 등록하는 방법도 있지만, 등록해야 할 빈이 많아지면 실수하기 마련이다 스프링은 이를 위해 자동으로 스프링 빈을 등록하는 @ComponentScan 과 의존관계를 자동으로 주입하는 @Autowired 어노테이션을 제공한다 1. 설정정보 클래스(Config.class) 에 @Configuration 과 더불어 @ComponentScan 을 붙인다 (@ComponentScan 을 사용하면 @Configuration 이 붙은 다른 설정정보들도 자동으로 등록되기 때문에 이를 제외하고 싶다면 excludeFilters 를 이용해 제외하면 된다 반대로 다른 클.. 2021. 11. 29.
[Spring] 싱글톤 컨테이너와 @Configuration ** 공유가 아닌 개인 공부에 목적을 둔 글입니다 ** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다 싱글톤 패턴이란, 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴으로, private 생성자를 사용해 외부에서 new 로 인스턴스 생성을 하지 못하도록 막는다 해당 인스턴스가 필요할 때는 메소드를 통해서만 조회할 수 있게 한다 그렇다면 왜 싱글톤 패턴이 필요할까? 호출을 할 때마다 새로 객체를 생성하면 메모리 낭비가 심한데, 동시에 여러 클라이언트가 서비스를 요청하는 것을 고려하면 느리고, 비효율적이다 그래서 하나의 인스턴스를 공유하도록 설계하는 것이 좋은 것이다 Spring 은 스프링 컨테이너를 통해 싱글톤 인스턴스를 기본으로 하는데, 스프링 빈이 그것이다 즉 스프링 .. 2021. 11. 28.
[Spring] @Configuration, @Bean 이해하기 ** 공유가 아닌 개인 공부에 목적을 둔 글입니다 ** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다 @Configuration 클래스단에 붙고, 해당 클래스를 설정정보로 사용한다는 어노테이션이다 @Bean 메소드에 붙고, 해당 메소드를 스프링 컨테이너에 빈으로 등록한다 클래스단에 붙으면 해당 클래스 안의 모든 메소드를 빈으로 등록한다 ApplicationContext 는 스프링 컨테이너로, 설정정보를 바탕으로 메소드에서 반환된 객체를 컨테이너 내에서 빈으로 등록하는 역할을 한다 BeanDefinition 은 빈 설정 메타정보로, 스프링 컨테이너의 구현체인 AnnotationConfigApplicationContext 가 AppConfig 설정정보를 읽고 생성해낸다 스프링 컨테이너는 이 .. 2021. 11. 26.