공부방

스프링 기초 본문

스프링

스프링 기초

코딩 화이팅 2023. 4. 11. 15:33

Framework

  • 사전적 의미 : (건물 등의)뼈대, (판단/결정 등을 위한) 틀
  • SW에서의 의미 : SW 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합

사용하는 이유

  • 웹 어플리케이션을 개발하기 위해서는 많은 기본 기능을 설계, 작성해야 한다.(요청처리, 세션관리 등)
  • 공통으로 사용되는 기본기능들을 일관되게 사용할 수 있으면 개발자는 웹 어플리케이션 기능 자체 개발에만 신경을 쓰면 되기 때문에 생산성이 높아진다.
  • 개발자 입장에서는 완성된 구조에 맡은 기능을 개발하여 넣어주면 되기 때문에 개발 시간을 단축할 수 있다.

특징

  • POJO(Plain Old Java Object->원래 방식) 방식의 프레임워크
  • 의존성 주입(Dependency Injection)을 통한 객체관계 구성
  • 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)
  • 제어 역전(IoC, Inversion of Control)
  • 높은 확장성과 다양한 라이브러리

의존 관계 역전

Class A 객체가 어떤 일을 처리하기 위해서 Class B의 객체의 도움을 받아야만 일을 처리할 수 있다면 'Class A는 Class B에 의존한다.' 라고 표현

package com.ssafy.di1;
//데스크톱을 반환하는 클래스
public class Desktop {
	//필드명 작성
	//CPU, 그래픽카드, 키보드 등등 사양
	
	//정보를 반환하는 메서드
	public String getInfo() {
		return "데스크톱";
	}
}
==========================================================
package com.ssafy.di1;

public class Programmer {
	//캡슐화 적용해보자.
	private Desktop computer;
	
	public Programmer() {
		computer = new Desktop();
	}
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 한다.");
	}
}
==========================================================
package com.ssafy.di1;

public class Test {
	public static void main(String[] args) {
		Programmer p = new Programmer();
		//테스트 클래스 안에 그 안에 데스크탑이 하나 만들어져 생성된 프로그래머 객체가 만들어진다.
		p.coding();
	}
}
//
데스크톱으로 개발을 한다.

여기서는 Programmer가 Desktop 클래스에 의존성을 가지고 있다.

여기서 가지는 의존성 : 객체 생성, 타입

Desktop에 대한 객체생성 의존성 Programmer->Test로 의존 관계 역전

package com.ssafy.di2;

public class Desktop {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "데스크톱";
	}
}
===============================================================
package com.ssafy.di2;

public class Programmer {
	//캡슐화 해보자
	private Desktop computer;
	
	//더이상 new를 하지않고 외부에서 만든 생성자를 넣어준다. 
	//객체생성 의존성 제거
	public Programmer(Desktop computer) {
		this.computer = computer;
	}
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
===============================================================
package com.ssafy.di2;

public class Test {
	public static void main(String[] args) {
		Desktop computer = new Desktop();
		Programmer p = new Programmer(computer);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

생성자를 이용한 타입 의존성 주입

package com.ssafy.di3;

//느슨한 결합을 위한 인터페이스
public interface Computer {
	String getInfo();
}
===============================================================
package com.ssafy.di3;

public class Desktop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "데스크톱";
	}
}
===============================================================
package com.ssafy.di3;

public class Laptop implements Computer{
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "노트북";
	}
}
===============================================================
package com.ssafy.di3;

public class Programmer {
	//캡슐화
	private Computer computer;
	
	//객체 생성 의존성을 제거하기 위해서 얘가 만드는 것이 아니라
	//만들어진 컴퓨터를 넣어주겠다.
	//데스크톱, 랩톱이 아닌 컴퓨터로 바꾸면 느슨한 결합을 하겠다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
===============================================================
package com.ssafy.di3;

public class Test {
	public static void main(String[] args) {
		Desktop computer1 = new Desktop();
		Laptop computer2 = new Laptop();
		Programmer p = new Programmer(computer1);
		p.coding();
		
		Programmer p2 = new Programmer(computer2);
		p2.coding();	
	}
}
//
데스크톱으로 개발을 합니다.
노트북으로 개발을 합니다.

설정자를 이용한 타입 의존성 주입

package com.ssafy.di3;

//느슨한 결합을 위한 인터페이스
public interface Computer {
	String getInfo();
}
============================================================
package com.ssafy.di3;

public class Desktop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "데스크톱";
	}
}
============================================================
package com.ssafy.di3;

public class Laptop implements Computer{
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "노트북";
	}
}
============================================================
package com.ssafy.di3;

public class Programmer {
	//캡슐화
	private Computer computer;
	
	//객체 생성 의존성을 제거하기 위해서 얘가 만드는 것이 아니라
	//만들어진 컴퓨터를 넣어주겠다.
	//데스크톱, 랩톱이 아닌 컴퓨터로 바꾸면 느슨한 결합을 하겠다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
	//setter(설정자) 이용한 주입
	public void setComputer(Computer computer) {
		this.computer=computer;
	}
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
============================================================
package com.ssafy.di3;

public class Test {
	public static void main(String[] args) {
		Desktop computer1 = new Desktop();
		Laptop computer2 = new Laptop();
		Programmer p = new Programmer(computer1);
//		p.coding();
		
		p.setComputer(computer2);
		p.coding();
		
		Programmer p2 = new Programmer(computer2);
//		p2.coding();	
	}
}
//
노트북으로 개발을 합니다.

새로운 클래스를 만들어 타입 의존성 주입

package com.ssafy.di4;

public interface Computer {
	String getInfo();
}
==========================================================
package com.ssafy.di4;

public class ComputerFactory {
	//이러한 컴퓨터 줘봐잉
	public static Computer getComputer(String type) {
		if(type.equals("D")) {
			return new Desktop();
		}else if (type.equals("L")) {
			return new Laptop();
		}
		return null;		
	}
}
==========================================================
package com.ssafy.di4;

public class Desktop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "데스크톱";
	}
}
==========================================================
package com.ssafy.di4;

public class Laptop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "노트북";
	}
}
==========================================================
package com.ssafy.di4;

public class Programmer {
	private Computer computer;
	
	//생성자가 있어야 객체 생성 가능
	public Programmer() {
	}
	
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
	public void setComputer(Computer computer) {
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
==========================================================
package com.ssafy.di4;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		Programmer p = new Programmer();
		Computer computer = ComputerFactory.getComputer(sc.next());
		p.setComputer(computer);
		
		p.coding();
		
		computer = ComputerFactory.getComputer(sc.next());
		p.setComputer(computer);
		
		p.coding();
		
	}
}
//
D
데스크톱으로 개발을 합니다.
L
노트북으로 개발을 합니다.

D
데스크톱으로 개발을 합니다.
D
데스크톱으로 개발을 합니다.
//여기서 두 데스크탑은 다른 데스크탑을 말한다.

getComputer를 통해 new를 통해서 새로운 컴퓨터들이 나온다. 따라서 다른 데스크탑을 말하는 것. 이렇게 새로운 것들을 만들어 낭비를 피하기 위해 싱글턴이 기본이다.

Spring IoC Container

Container

  • 스프링에서 핵심적인 역할을 하는 객체를  Bean이라고 하며 Container는 Bean의 인스턴스화 조립, 관리의 역할, 사용 소멸에 대한 처리를 담당한다.

Spring Container 빌드

  • Project 생성 후->Maven Project로 변경
  • pom.xml->Spring Context 의존성 추가
  • mvnrepository 사이트에 들어가 Spring context에 들어가서 가장 사람들이 많이 받거나 최신 것을 복붙해서 사용하면 됨.
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Spring_01_DI_2</groupId>
	<artifactId>Spring_01_DI_2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
    여기에 추가해주면 됨.
	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.18</version>
		</dependency>
	</dependencies>
</project>

Spring Container 빌드

Bean 등록(풀패키지 명 작성) 후 스프링 컨테이너와 getBean()을 이용하여 객체 가져오기

package com.ssafy.di;

public interface Computer {
	String getInfo();
}
=============================================================
package com.ssafy.di;

public class Desktop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	
	public String getInfo() {
		return "데스크톱";
	}
}
=============================================================
package com.ssafy.di;

public class Laptop implements Computer{
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "노트북";
	}
}
=============================================================
package com.ssafy.di;

public class Programmer {
	private Computer computer;

	// 기본 생성자
	public Programmer() {
	}

	public Programmer(Computer computer) {
		this.computer = computer;
	}

	public void setComputer(Computer computer) {
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo() + "으로 개발을 합니다.");
	}
}
=============================================================
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Spring_01_DI_2</groupId>
	<artifactId>Spring_01_DI_2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.18</version>
		</dependency>
	</dependencies>
</project>
=============================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 풀패키지명 -->
	<bean class="com.ssafy.di.Desktop" id="desktop"></bean>
	<bean class="com.ssafy.di.Programmer" id="programmer"></bean>

</beans>
=============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨에티너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		//컨테이너로부터 객체를 가져오겠다.
		Programmer p = (Programmer) context.getBean("programmer");
		Desktop desktop = context.getBean("desktop", Desktop.class);
		//이게 더 좋아보임.
		p.setComputer(desktop);
		
		p.coding();
		
		Desktop d = context.getBean("desktop", Desktop.class);
		Desktop d2 = context.getBean("desktop", Desktop.class);
	
		System.out.println(d);
		System.out.println(d2);
		System.out.println(d == d2);
		
	}
}
//
데스크톱으로 개발을 합니다.
com.ssafy.di.Desktop@598067a5
com.ssafy.di.Desktop@598067a5
true
나머진 위의 코드와 동일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 풀패키지명 -->
	<bean class="com.ssafy.di.Desktop" id="desktop" scope="prototype"></bean>
	<bean class="com.ssafy.di.Programmer" id="programmer"></bean>

</beans>
//
위에 코드에서 desktop 줄을
	<bean class="com.ssafy.di.Desktop" id="desktop" scope="prototype"></bean>
   scope="prototype"추가함
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨에티너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
//		System.out.println("1~~");
		//컨테이너로부터 객체를 가져오겠다.
		Programmer p = (Programmer) context.getBean("programmer");
		Desktop desktop = context.getBean("desktop", Desktop.class);
		//이게 더 좋아보임.
		p.setComputer(desktop);
//		System.out.println("2~~");
		
		p.coding();
		
		Desktop d = context.getBean("desktop", Desktop.class);
		Desktop d2 = context.getBean("desktop", Desktop.class);
	
		System.out.println(d);
		System.out.println(d2);
		System.out.println(d == d2);
		
	}
}
//
데스크톱으로 개발을 합니다.
com.ssafy.di.Desktop@3c0ecd4b
com.ssafy.di.Desktop@14bf9759
false

생성자(constructor-arg)를 이용하여 의존성 주입-<ref>,<value>와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정

나머진 위의 코드와 동일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 풀패키지명 -->
	<bean class="com.ssafy.di.Desktop" id="desktop"></bean>
	<bean class="com.ssafy.di.Programmer" id="programmer">
		<constructor-arg ref="desktop"></constructor-arg>
	</bean>

</beans>
==============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		//컨테이너로부터 객체를 가져오겠다.
		Programmer p = (Programmer) context.getBean("programmer");
		p.coding();
		
	}
}
//
데스크톱으로 개발을 합니다.

설정자(setter)를 이용하여 의존성 주입-<ref>,<value>와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 풀패키지명 -->
	<bean class="com.ssafy.di.Desktop" id="desktop"></bean>	
	<bean class="com.ssafy.di.Laptop" id="laptop"></bean>
	
	<bean class="com.ssafy.di.Programmer" id="programmer">
<!-- 	 name에는 설정자 이름을 넣을것! set 떼고 앞에 소문자로 바꾼거랑 동일 -->
		<property name="computer" ref="laptop"></property>
	</bean>
    
setter를 쓰기 위해서는 property를 써야됨.

</beans>
============================================================
package com.ssafy.di;

public class Programmer {
	private Computer computer;
	
	public Programmer() {
	}
	
	public Programmer(Computer computer) {
//		computer = new Desktop();
		this.computer = computer;
	}
	
	public void setComputer(Computer computer) {
		this.computer = computer;
	}
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		//컨테이너로부터 객체를 가져오겠다.
		Programmer p = (Programmer) context.getBean("programmer");
		p.coding();
		
	}
}

빈(Bean) 생성 및 설정(@Component)

  • Bean 생성 - @Component
  • 생성되는 Bean의 이름은 클래스의 첫 글자를 소문자로 바꾼 것이다. ex) Desktop->desktop
  • 스프링은 @Component, @Service, @Controller, @Repository의 Stereotype Annotation을 제공
  • 각 @Service, @Controller, @Repository는 목적에 맞는 구체적인 사용을 위한 @Component의 확장. 목적에 맞게 구체화하여 사용하면 Spring에서 더 효율적으로 사용 가능
나머지 코드는 위와 동일
package com.ssafy.di;

import org.springframework.stereotype.Component;

@Component
public class Desktop implements Computer {
	// 필드명 작성
	// CPU, 그래픽카드, 키보드 등등 사양
	public String getInfo() {
		return "데스크톱";
	}
}
============================================================
package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Programmer {
//	@Autowired
//	@Qualifier("laptop")
	private Computer computer;
	
//	public Programmer() {
//	}
//	@Autowired
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
//	@Autowired
//	public void setComputer(@Qualifier("desktop") Computer computer) {
//		this.computer = computer;
//	}
	
	
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
============================================================
resource의 밑에 Source옆에 Namespaces의 context를 추가한다.
<?xml version="1.0" encoding="UTF-8"?>
<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"
	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-4.3.xsd">
	
	<context:component-scan base-package="com.ssafy.di"></context:component-scan>
</beans>

모든 @Component가 붙은 것들을 Bean처리해주겠다
============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("programmer", Programmer.class);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

이렇게 value를 사용하여 이름을 간단하게도 가능

나머지 코드는 위와 동일
package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component(value='p')
public class Programmer {
//	@Autowired
//	@Qualifier("laptop")
	private Computer computer;
	
//	public Programmer() {
//	}
//	@Autowired
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
//	@Autowired
//	public void setComputer(@Qualifier("desktop") Computer computer) {
//		this.computer = computer;
//	}
	
	
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("p", Programmer.class);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

의존성 주입(@Autowired)

나머진 위의 코드와 동일
package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Programmer {

	private Computer computer;
	
	public Programmer() {
	}
	@Autowired
	//computer타입과 spring컨테이너에서 bean으로 등록돼 있는 타입과
	//동일한게 있다면 알아서 넣어준다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
	public void setComputer(@Qualifier("desktop") Computer computer) {
		this.computer = computer;
	}
	
	
	
	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
============================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("programmer", Programmer.class);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

Qualifier

package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Programmer {
	@Autowired
	@Qualifier("laptop")
	private Computer computer;
	
	public Programmer() {
	}
	//computer타입과 spring컨테이너에서 bean으로 등록돼 있는 타입과
	//동일한게 있다면 알아서 넣어준다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}

	public void setComputer (Computer computer) {		
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
===========================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("programmer", Programmer.class);
		p.coding();
	}
}
//
노트북으로 개발을 합니다.

생성자 위에 Qualifier를 사용하여 id를 입력해 우선순위를 만들어줄 수 있다.

package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class Programmer {

	private Computer computer;
	
	public Programmer() {
	}
	//computer타입과 spring컨테이너에서 bean으로 등록돼 있는 타입과
	//동일한게 있다면 알아서 넣어준다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
	@Autowired
	public void setComputer(@Qualifier("desktop") Computer computer) {
		//@Qualifier에는 id를 적어줘야됨
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
===========================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("programmer", Programmer.class);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

set뒤에도 Qualifier를 사용하여 우선순위를 만들어 줄 수 있다.

package com.ssafy.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class Programmer {
	@Autowired
	@Qualifier("laptop")
	private Computer computer;
	
	public Programmer() {
	}
	//computer타입과 spring컨테이너에서 bean으로 등록돼 있는 타입과
	//동일한게 있다면 알아서 넣어준다.
	public Programmer(Computer computer) {
		this.computer = computer;
	}
	
	@Autowired
	public void setComputer(@Qualifier("desktop") Computer computer) {
		//@Qualifier에는 id를 적어줘야됨
		this.computer = computer;
	}

	public void coding() {
		System.out.println(computer.getInfo()+"으로 개발을 합니다.");
	}
}
===========================================================
package com.ssafy.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		//스프링 컨테이너 객체를 빌드
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		
		Programmer p = context.getBean("programmer", Programmer.class);
		p.coding();
	}
}
//
데스크톱으로 개발을 합니다.

둘 다 입력한다면 set이 더 힘이 강하게 들어가는 것 같다.

'스프링' 카테고리의 다른 글

MyBatis  (0) 2023.04.19
File Upload&File Download  (0) 2023.04.18
Interceptor  (0) 2023.04.17
Spring Web MVC  (0) 2023.04.13
Spring AOP  (0) 2023.04.12