00. Auto-Wiring란?
· Auto-Wiring(자동 와이어링)은 스프링 프레임워크에서 빈을 자동으로 주입하는 기능을 말합니다. 이는 개발자가 명시적으로 의존성을 주입할 필요 없이 스프링이 빈을 자동으로 찾아서 주입해주는 것을 의미합니다.
스프링은 다양한 방식으로 Auto-Wiring을 지원합니다. 주요한 Auto-Wiring 전략은 다음과 같습니다:
1. By Type: 자동 와이어링은 빈의 타입에 따라 주입됩니다. 스프링은 컨테이너에서 해당 타입과 일치하는 유일한 빈을 찾아서 주입합니다. 타입이 일치하지 않거나 여러 개의 빈이 존재하는 경우에는 예외가 발생할 수 있습니다.
2. By Name: 자동 와이어링은 빈의 이름에 따라 주입됩니다. 이 경우 스프링은 빈의 이름과 동일한 이름을 가진 다른 빈을 찾아서 주입합니다.
3. Constructor: 생성자 자동 와이어링은 빈의 생성자에 @Autowired 어노테이션을 사용하여 의존성을 주입합니다. 이 방법은 생성자의 매개변수 타입에 해당하는 빈을 찾아서 주입합니다.
4. Setter: 세터 자동 와이어링은 빈의 세터 메서드에 @Autowired 어노테이션을 사용하여 의존성을 주입합니다. 이 방법은 세터 메서드의 매개변수 타입에 해당하는 빈을 찾아서 주입합니다.
5. Field: 필드 자동 와이어링은 빈의 필드에 @Autowired 어노테이션을 사용하여 의존성을 주입합니다. 이 방법은 필드의 타입에 해당하는 빈을 찾아서 주입합니다.
· Auto-Wiring은 스프링의 IoC (Inversion of Control) 컨테이너의 핵심 기능 중 하나로, 의존성 주입(Dependency Injection)을 편리하게 처리할 수 있도록 도와줍니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다.
(출처-ChatGPT)

< 이번실습에서 쓰이는 핵심 기술!! 암기하자>
+ @Autowiring와 @qualifier
· @ : 어노테이션(annotation)은 자바 프로그래밍 언어의 기능 중 하나로, 소스 코드에 메타데이터를 부착하는 것을 가능하게 합니다. 즉, 어노테이션은 코드에 대한 데이터로, 컴파일러, 런타임 라이브러리 또는 다른 도구들이 이 데이터를 활용할 수 있습니다.
- 컴파일 타임 검사: 어노테이션을 사용하여 코드를 컴파일하고 검사할 때 추가적인 정보를 제공합니다. 예를 들어, @Override 어노테이션은 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이딩하는지를 검사합니다.
- 런타임 처리: 어노테이션을 사용하여 런타임에 동적으로 처리할 수 있는 정보를 제공합니다. 예를 들어, 스프링 프레임워크에서는 @Autowired, @Component와 같은 어노테이션을 사용하여 의존성 주입 및 빈 관리를 수행합니다.
· @Autowiring : '@Autowired' 어노테이션은 스프링에서 의존성을 주입할 때 사용됩니다. 이 어노테이션을 사용하면 스프링이 해당 타입의 빈을 찾아서 자동으로 주입해줍니다. 즉, 개발자가 명시적으로 의존성을 설정할 필요 없이 스프링이 대신해줍니다. 주로 생성자, 세터 메서드, 필드에 사용됩니다. 예를 들어, @Autowired private UserService userService;라고 하면, 스프링은 UserService 타입의 빈을 찾아서 해당 필드에 자동으로 주입해줍니다.
· @Qualifier: '@Qualifier' 어노테이션은 여러 개의 동일한 타입의 빈이 존재할 때, 어떤 빈을 주입할지를 명시적으로 지정할 때 사용됩니다. @Autowired와 함께 사용되며, 주입할 빈의 이름을 지정합니다. 즉, 같은 타입의 빈이 여러 개 있을 때, @Qualifier를 사용하여 특정 빈을 선택할 수 있습니다. 예를 들어, @Autowired @Qualifier("userService") private UserService userService;라고 하면, 스프링은 "userService"라는 이름의 빈을 찾아서 해당 필드에 주입해줍니다.
(출처-ChatGPT)
01. Autowiring
가. 가정: 오브젝트 A 오브젝트 B를 의존
나. B: dependency(종속) 오브젝트, A: dependent(의존적인) 오브젝트
다. 기존: 세터주입, 생성자주입 => ref 태그 사용
라. 빈 와이어링(Wiring of beans): dependent와 dependency를 연결해주는 프로세스
마. 와이어링 주체: 프로그래머
바. 와이어링 구분

사. Autowiring 방법

02. 프로젝트 만들기
가. 구현 방법 (전체구성)
사용
pakages : com.kitri.spring.Autowiring
class : Address.java
Employee.java
Test.java
xml : Autowiring.xml

나. 구현 코드(전체코드)
Address.java
package com.kitri.spring.Autowiring;
public class Address {
private int hno;
private String street;
private String city;
public int getHno() { return hno; }
public void setHno(int hno) {
this.hno = hno;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return hno + ":" + street + ":" + city;
}
}
Employee.java
package com.kitri.spring.Autowiring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Employee {
private int id;
@Autowired(required = false)
@Qualifier("address")
private Address address;
public Employee() {}
public Employee(int id, Address address) {
this.id = id;
this.address = address;
}
public int getId() { return id; }
public void setId(int id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Test.java
package com.kitri.spring.Autowiring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// 스프링 컨테이너 생성
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(
"classpath:Autowiring.xml");
// 빈 객체 사용
Employee employee = (Employee)ctx.getBean("employee");
System.out.println(employee.getId());
System.out.println(employee.getAddress());
// 스프링 컨테이너 종료
ctx.close();
}
}
Autowiring.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean name="address"
class="com.kitri.spring.Autowiring.Address" p:hno="123"
p:street="서울로" p:city="서울시" />
<bean name="address123"
class="com.kitri.spring.Autowiring.Address" p:hno="231"
p:street="대전로" p:city="대전시" />
<bean name="employee"
class="com.kitri.spring.Autowiring.Employee"
p:id="23456" />
</beans>
다. 실행결과

3. 응용버전(과제)
가. 구현 방법(Customer가 Hotel에 Reservation 할 수 있는 코드를 autowired와 qualifier를 이용해서 구현해보자 )

나. 구현 방법 (전체구성)
사용
pakages : com.kitri.spring.Autowiring.Hotel
class : Cusotomer.java
Reservation.java
Test.java
xml : Autowiring-Hotel.xml

다. 구현
- Cusotomer.java

package com.kitri.spring.Autowiring.Hotel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Customer {
private String name;
@Autowired(required = false)
@Qualifier("reservation")
Reservation reservation;
public Customer() {}
public Customer(String name, Reservation reservation) {
this.name = name;
this.reservation = reservation;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Reservation getReservation() {
return reservation;
}
public void setReservation(Reservation reservation) {
this.reservation = reservation;
}
@Override
public String toString() {
return name + " => " + reservation;
}
}
이 클래스는 데이터베이스 연결 정보를 관리하는 데 사용될 수 있습니다. 객체를 생성할 때 데이터베이스의 URL, 사용자 이름 및 비밀번호를 설정하고, toString() 메서드를 사용하여 연결 정보를 문자열로 출력할 수 있습니다.
- Reservation.java

package com.kitri.spring.Autowiring.Hotel;
public class Reservation {
// 세터/생성자 중 하나를 선택
private int id;
// 세터/생성자 중 하나를 선택
private String time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return id + ":" + time;
}
}
이 클래스는 데이터베이스 연결 정보를 관리하는 데 사용될 수 있습니다. 객체를 생성할 때 데이터베이스의 URL, 사용자 이름 및 비밀번호를 설정하고, toString() 메서드를 사용하여 연결 정보를 문자열로 출력할 수 있습니다.
@Autowired와 @Qualifier:
· @Autowired(required = false): 이 어노테이션은 스프링에게 해당 클래스의 빈을 자동으로 주입하도록 지시합니다. required = false로 설정되어 있으므로, 해당 빈이 없는 경우에도 예외를 발생시키지 않습니다.
· @Qualifier("reservation"): 여러 개의 동일한 타입의 빈이 존재할 때, 어떤 빈을 주입할지를 지정합니다. 여기서는 "reservation"이라는 이름의 빈을 주입하도록 지정하고 있습니다.
- Test.java

package com.kitri.spring.Autowiring.Hotel;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// 스프링 컨테이너 생성
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(
"classpath:Autowiring-Hotel.xml");
// 빈 객체 사용
Customer customer = (Customer)ctx.getBean("customer");
System.out.println(customer);
// 스프링 컨테이너 종료
ctx.close();
}
}
이 코드는 스프링 애플리케이션 컨텍스트를 생성하고 XML 파일을 사용하여 설정된 빈 객체를 가져와서 사용하는 것입니다. 빈 객체는 처음에 만들어놓은 Cusotomer.java 클래스가 실행되어 출력됩니다.
- Autowiring-Hotel.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean name="reservation"
class="com.kitri.spring.Autowiring.Hotel.Reservation"
p:id="12345" p:time="오후10시30분" />
<bean name="customer"
class="com.kitri.spring.Autowiring.Hotel.Customer"
p:name="JMJ" />
</beans>
이 설정 파일은 외부 파일을 사용하여 두개의 클래스에서의 빈을 정의하고, 해당 빈에 필요한 설정 값을 주입하는 데 사용됩니다.
라. 실행결과

실행결과 NAME이 먼저 실행되었고 그 후에 @Qualifier("reservation") 가 적용되어 id=12345 와tiem=오후10시30분이 출력 되었다.
+ 새롭게 알아낸 사실~~~
Autowiring-Hotel.xml 에서 bean name=reservation이 분명 위에 있어 먼저 출력되어야 하지만 나중에 출력되었다 . 즉, 우선순위는 일반 메서드 -> @Qualifier 로 출력되는 것을 알 수 있었다. · @Autowired(required = false)는 쓰기는 했지만 bean을 전부사용해서 null값이 출력되는것은 확인하지못했지만 머리속으로는 넣어놨다!!!(흐흐)

'Spring' 카테고리의 다른 글
06. Spring - ★JDBCTemplate 연동★ (0) | 2024.04.23 |
---|---|
05. Spring - Interface 주입 (1) | 2024.04.22 |
03. Spring- Properties (3) | 2024.04.18 |
02. Spring- 스프링코어기본 - 세터주입(Maven Project) (0) | 2024.04.17 |
01. Spring- 스프링 웹 개발 환경구성 (2) | 2024.04.17 |