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)은 자바 프로그래밍 언어의 기능 중 하나로, 소스 코드에 메타데이터를 부착하는 것을 가능하게 합니다. 즉, 어노테이션은 코드에 대한 데이터로, 컴파일러, 런타임 라이브러리 또는 다른 도구들이 이 데이터를 활용할 수 있습니다.

 

  1. 컴파일 타임 검사: 어노테이션을 사용하여 코드를 컴파일하고 검사할 때 추가적인 정보를 제공합니다. 예를 들어, @Override 어노테이션은 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이딩하는지를 검사합니다.
  2. 런타임 처리: 어노테이션을 사용하여 런타임에 동적으로 처리할 수 있는 정보를 제공합니다. 예를 들어, 스프링 프레임워크에서는 @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값이 출력되는것은 확인하지못했지만 머리속으로는 넣어놨다!!!(흐흐)

 

 

 
2024. 4. 19. 14:12