본문 바로가기
✨ Back-end/Spring-Legacy

[Spring-Legacy] XML과 @Annotation을 이용해 데이터 출력하기

by 환풍 2023. 8. 23.
728x90
반응형

 

 

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

Maven에 있는 dependency를 복사해준다.

<!-- 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 데이터를 불러올 수 있다.

 

728x90
반응형

댓글