1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | package com.bit.di.basic2; public class Book { private String bookName; private int price; private String author; private String publisher; public Book() { System.out.println("기본 생성자 실행"); } public Book(String bookName, int price, String author, String publisher) { super(); this.bookName = bookName; this.price = price; this.author = author; this.publisher = publisher; } public void initBook() { System.out.println("이닛북"); } public void destroy() { System.out.println("디스트로이"); } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } @Override public String toString() { return "Book [bookName=" + bookName + ", price=" + price + ", author=" + author + ", publisher=" + publisher + "]"; } } | cs |
Book
이후, 객체에서 initBook() 메소드와 destroy() 메소드를 만들어 주었다.
book.xml
- init-method : 빈이 초기화 될 때 호출될 메서드의 이름을 지정한다. 여기서 initBook 메서드가 초기화될 때 호출된다.
- destroy-method : 빈이 소멸될 때 호출될 메서드의 이름을 지정한다. 여기서 destroy 메서드가 빈이 소멸될 때 호출.
BookMain
ApplicationContext:
ApplicationContext는 Spring의 IoC (Inversion of Control) 컨테이너를 나타내는 인터페이스이다.
IoC 컨테이너는 빈의 생명주기를 관리하고 의존성 주입을 통해 객체를 생성하고 관리한다.
애플리케이션 컴포넌트들을 설정하고 연결하기 위한 중요한 역할을 한다.
FileSystemXmlApplicationContext:
FileSystemXmlApplicationContext는 Spring의 ApplicationContext 인터페이스를 구현한 클래스 중 하나이다.
이 클래스는 파일 시스템에서 XML 형식의 설정 파일을 사용하여 애플리케이션 컨텍스트를 생성한다.
"src/main/java/com/bit/di/basic2/book.xml":
이 부분은 설정 파일의 경로를 나타낸다.
FileSystemXmlApplicationContext 생성자의 매개변수로 설정 파일의 경로를 제공한다. "src/main/java/com/bit/di/basic2/book.xml"은 프로젝트 내에서 book.xml이라는 설정 파일이 위치한 경로를 나타다.
위 코드는 설정 파일 book.xml을 로드하여 FileSystemXmlApplicationContext를 생성하고,
이를 통해 Spring 애플리케이션 컨텍스트를 구성한다.
설정 파일에는 빈 정의와 빈 간의 의존성, 설정 정보 등이 포함될 수 있다.
생성된 애플리케이션 컨텍스트를 통해 빈을 조회하거나 사용할 수 있게 된다
아래 홈페이지에서 xml에 추가할 Maven을 가져온다.
https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api/1.3.2
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
prom.xml
위의 Maven 의존성 설정은 javax.annotation 패키지의 어노테이션을 사용하기 위한 API를 프로젝트에 추가하는 것이다. 따라서 프로젝트에서 어노테이션을 사용하거나 다른 라이브러리나 프레임워크와의 통합을 위해 필요한 경우에 해당 라이브러리를 사용할 수 있다.
1대1 매핑
<context:component-scan>이란?
Spring 프레임워크의 XML 설정에서 사용되는 태그 중 하나로, 컴포넌트 스캔을 활용하여 클래스를 자동으로 검색하고 Spring의 빈으로 등록하는 설정을 정의한다.
Spring에서는 클래스들을 빈으로 등록하여 관리할 수 있다.
그러나 모든 클래스를 개별적으로 XML에 등록하는 것은 번거로울 수 있다.
<context:component-scan>을 통해지정된 패키지 아래에서 자동으로 빈으로 등록할 클래스를 스캔하고 등록할 수 있다.
위 설정에서 base-package 속성은 스캔할 기준 패키지를 지정한다.
com.bit.di.* 패키지와 그 하위 패키지에서 Spring 컴포넌트에 해당하는 클래스를 검색하고 빈으로 등록한다.
이러한 설정을 사용하면 @Component, @Service, @Repository, @Controller 등과 같은
Spring 애노테이션이 붙은 클래스들이 자동으로 빈으로 등록되어 관리된다.
이는 XML에 일일이 빈 정의를 추가하는 대신 스캔을 통해 간편하게 빈을 관리할 수 있도록 도와준다.
BookStore
BookStore 클래스는 Book 객체를 의존성으로 가지며, Spring의 의존성 주입(DI)을 통해 이를 관리한다.
@Component(value ="Store")는 Spring 컨테이너에 이 클래스를 빈으로 등록하며, 빈의 이름을 Store로 지정한다.
만약 value 속성을 생략하면 클래스의 첫 글자가 소문자로 변환되어 빈 이름이 생성된다.
@Scope(value ="singleton")은 해당 빈이 싱글톤 스코프로 생성되도록 지정하는 것으로, Spring 컨테테이너에서 한 번 생성된 인스턴스가 계속해서 재사용된다.
@Autowired는 의존성 주입을 위한 어노테이션으로, Spring이 자동으로 해당 필드나 생성자 매개변수에 Book 객체를 주입한다.
BookMain
getBean을 통해 Component에서 빈의 이름으로 줬던 Store를 지정하여 데이터가 뽑히는지 확인해보았다.
1대 다 매핑
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Store': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.bit.di.basic2.Book com.bit.di.basic2.BookStore.book; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.bit.di.basic2.Book] is defined: expected single matching bean but found 3: [book1, book2, book3]
위 1대 1 매핑에서 book.xml에 있는 bean들을 모두 주석 해제하여 출력해보았다.
Book 타입의 빈이 여러개 정의되어 있지만, BookStore 클래스의 book 필드에는 하나의 Book 객체를 주입받을 수 있는데, 여러 개의 후보 Book 빈 중 어떤 것을 주입해야 할지 선택할 수 없다는 내용이다.
이때, 한정자(qualifier)를 사용할 수 있다. @Autowired 어노테이션에 한정자를 지정하여 어떤 빈을 주입할지 명시적으로 지정할 수 있는데, 이것은 다음 포스팅에서 자세히 알아보려고 한다.
BookStore
@Autowired 대신에 @Inject를 쓰기도 하지만, Autowired를 권장하여 사용한다.
book.xml
<qualifier >은 빈을 주입할 때 빈의 한정자를 명시적으로 지정하기 위해 사용된다.
한정자는 같은 타입의 여러 빈 중에서 어떤 빈을 주입해야 하는지를 구분하기 위해 사용한다.
한정자를 사용하는 이유
- 여러 개의 빈 중 특정한 빈 선택
- 의존성 주입 시 모호성 해결
- 동일 타입의 빈들 간의 구분
BookStore
의존성 주입하는 코드에서 @Qualifier 어노테이션을 사용해 어떤 한정자를 가진 빈을 주입할 것인지 명시할 수 있다.
위 코드에서 @Qualifier("b2")는 Book 타입의 빈 중에서 한정자가 b2인 빈을 주입하도록 지정했다.
BookMain
Main 메소드에서 @Component (빈의 이름)을 넣어주면 해당 value에 맞는 빈 값이 출력되는 것이다.
BookStore2
@Component를 통해 new를 하지 않아도 객체를 생성해준다.
BookMain
이렇게 bookStore2를 찍어보면 Component에 의해 데이터가 메모리에 올라갔다.
BookStore2
BookStore2는 Book을 의존하게 하기 위해서 @Resource를 사용할 수 있다.
BookMain
이후 bookStore2을 getBean하여 가져와보면 위와 같이 book.xml에 있는 book 데이터를 불러올 수 있다.
'✨ Back-end > Spring-Legacy' 카테고리의 다른 글
[Spring-legacy] xml로 AOP 어드바이스(Advice) (0) | 2023.08.25 |
---|---|
[Spring-Legacy] @Configuration 과 @Bean, @ComponentScan, @ImportResource (0) | 2023.08.24 |
[Spring-Legacy] @Service, @Autowired, @Qualifier 사용법 (0) | 2023.08.24 |
[Spring-Legacy] properties를 이용해 데이터 출력하기 (0) | 2023.08.23 |
[Spring-Legacy] 스프링 레거시 XML에서 빈(Bean) 정의해보기 (0) | 2023.08.22 |
댓글