Day 92

dokiru·2023년 6월 10일
0

학원

목록 보기
51/51

bean 등록 방법

2. java 어노테이션을 활용한 등록 방법

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 객체 하나하나? -->
<beans:beans
	xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc
			 					 http://www.springframework.org/schema/mvc/spring-mvc.xsd
			 					 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">

	<annotation-driven />

	<context:component-scan
		base-package="com.app.controller"></context:component-scan>
	<!-- 여기 들어와서 스캔하라고 스프링한테 알려줘야 들어가서 bean 객체 생성.. -->
	<context:component-scan
		base-package="com.app.config"></context:component-scan>
	

	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- /WEB-INF/views/ 의 폴더구조는 동일하기 때문에 prefix에 앞 구문 -->
		<beans:property name="prefix" value="/WEB-INF/views/"></beans:property>
		<!-- .jsp인 파일 이름은 동일하기 때문에 suffix에 뒷 구문 -->
		<beans:property name="suffix" value=".jsp"></beans:property>
	</beans:bean>

	<!-- 외부에서 요청이 들어오면 resources로 연결시키겠다 -->
	<resources location="/resources/" mapping="/**"></resources>

</beans:beans>

config 패키지 안에 Configuration 어노테이션을 추가한 클래스 안에 Bean 어노테이션을 통해서 Bean을 수동으로 등록

com/app/config/BeanConfiguration

@Configuration
public class BeanConfiguration {
	// 여기 들어와서 스캔해서 필요한 컴포넌트를 가져가라고 설정을 해줘야함
	
	// 등록할 bean에 대한 리턴 형태의 메소드 작성
	@Bean // 내가 등록을 하려고 하는 bean에 대한 정보를 입력
	// JavaConfigBean 타입의 Bean을 등록 -> 만들어서 리턴
    // xml에 <bean id="javaConfigBean" class="com.app.beans.javaConfigBean" /> 를 넣어주는 것과 동일
	public JavaConfigBean javaConfigBean() {
    	// 새 bean 객체를 만들어서 리턴
		return new JavaConfigBean();
	}
	
	@Bean
    @Lazy // 나중에 getBean해서 불리는 시점에!! 빈이 생성된다.
	public JavaConfigBean javaConfig() {
		return new JavaConfigBean();
	}
	
	// name 속성을 통해 id 이름 설정 가능
	@Bean(name = "myConfigBean")
	public JavaConfigBean sampleConfig() {
		return new JavaConfigBean();
	}
	
	@Bean				// javaTempBean1이라는 이름의 bean 등록됨
    @Scope("prototype") // Singleton 하나 vs Prototype 만들때마다 개별적으로 객체 만듦
	public JavaBean1 javaTempBean1() {
		return new JavaBean1();
	}
}

3. @Component 어노테이션 활용

: 자동으로 스프링 컨테이너에 빈을 등록하는 방법

  • servlet-context.xml에 component-scan 태그를 통해서 폴더를 지정해주면, 컴포넌트 스캔을 통해 @Component 어노테이션이 있는 클래스를 자동으로 찾아서 빈으로 등록해줌
  • @Component의 하위 어노테이션 : @Configuration, @Controller, @Service, @Repository

@Service 어노테이션에 이미 @Component 어노테이션이 포함되어 있는 모습


bean 의존성 주입

1. xml

1-1. setter 매핑 주입

  • property를 사용

root-context.xml

<?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 id="sb1" class="com.app.beans.SampleBean1" />
	<bean id="sb2" class="com.app.beans.SampleBean1" />
	<bean id="gsb2" class="com.app.beans.GetSetBean2">
      	<!-- 필드 이름과 동일하게 적어야 spring에서 set+{name}으로 setter를 불러올 수 있음 -->
		<property name="var1" value="500"/>
		<property name="var2" value="600"/>
		<property name="var3" value="문자!"/>
		<!-- 객체를 넣어주는 것이기 때문에 ref로 들어가야 함 -->
		<property name="sb1" ref="sb1" />
		<property name="sb2" ref="sb2" />
      
      <!-- 변수 지정해주고 어디서 따로 불러오지 않고 바로 만들어서 넣어주는 것이기 때문에 id 필요 X, property 태그 안에 바로 만들어줌
		<property name="sb1">
			<bean class="com.app.beans.SampleBean1" />
		</property>
		<property name="sb2">
			<bean class="com.app.beans.SampleBean1" />
		</property>
      -->
	</bean>
</beans>

GetSetBean2

package com.app.beans;

public class GetSetBean2 {
	// 기본타입 3개 + 객체 타입 2개
	int var1;
	String var2;
	String var3;
	
	SampleBean1 sb1;
	SampleBean1 sb2;

	public int getVar1() {
		return var1;
	}
	public void setVar1(int var1) {
		this.var1 = var1;
	}
	public String getVar2() {
		return var2;
	}
	public void setVar2(String var2) {
		this.var2 = var2;
	}
	public String getVar3() {
		return var3;
	}
	public void setVar3(String var3) {
		this.var3 = var3;
	}
	public SampleBean1 getSb1() {
		return sb1;
	}
	public void setSb1(SampleBean1 sb1) {
		this.sb1 = sb1;
	}
	public SampleBean1 getSb2() {
		return sb2;
	}
	public void setSb2(SampleBean1 sb2) {
		this.sb2 = sb2;
	}
	
	@Override
	public String toString() {
		return "GetSetBean2 [var1=" + var1 + ", var2=" + var2 + ", var3=" + var3 + ", sb1=" + sb1 + ", sb2=" + sb2
				+ "]";
	}
	
}

1-2. 생성자 매핑 주입

  • constructor-arg를 사용

root-context.xml

<?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">
  	<!-- ContainerBean의 name 필드로 들어가면서 생성됨 -->
  	<bean id="containerBean2" class="com.app.beans.ContainerBean">
		<constructor-arg value="xml 주입한 이름" />
	</bean>
	<!-- FieldBean의 data 필드로 들어가면서 생성됨 -->
	<bean id="fieldBean" class="com.app.beans.FieldBean">
		<constructor-arg value="xml 주입 데이터" />
	</bean>
	
  	<!-- 이미 만들어놓은 객체를 넣어주려면 ref로 id명 넣어줌 -->
	<bean id="containerBean3" class="com.app.beans.ContainerBean">
		<constructor-arg ref="fieldBean" />
	</bean>								
</beans>

ContainerBean

package com.app.beans;

public class ContainerBean {
	String name;
	FieldBean fieldBean;
	
	public ContainerBean() {
		name = "기본이름";
	}
	
	public ContainerBean(String name) {
		this.name = name;
	}
	
	public ContainerBean(FieldBean fieldBean) {
		this.fieldBean = fieldBean;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public FieldBean getFieldBean() {
		return fieldBean;
	}

	public void setFieldBean(FieldBean fieldBean) {
		this.fieldBean = fieldBean;
	}
}

FieldBean

package com.app.beans;

public class FieldBean {

	String data;
	
	public FieldBean(String data) {
		this.data = data;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}
	
}

+ 생성자의 매개변수로 들어가는 값은 String이 우선이기 때문에, type에 자료형을 넣어 구분해줄 수 있음

ex. SampleBean5에 String만 받는 생성자와 int만 받는 생성자가 둘다 있는 경우

root-context.xml

<?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 id="sampleBean5_2" class="com.app.beans.SampleBean5">	
		<!-- 어떤 타입을 넣어줄지 type으로 명시할 수 있음 -->
		<constructor-arg value="30" type="int" />
	</bean>
	<bean id="sampleBean5_3" class="com.app.beans.SampleBean5">	
		<!-- 여러 value 넣어주면 순서대로 들어감 -->
		<constructor-arg value="10"/>
		<constructor-arg value="20"/>
	</bean>
</beans>

2. Java 레벨 Configuration + Bean 설정등록 (생성자 + setter)

ContainerBean에 생성자와 getter-setter 설정

public class ContainerBean {
	String name;
	FieldBean fieldBean;
	
	public ContainerBean() {
		name = "기본이름";
	}
	
	public ContainerBean(String name) {
		this.name = name;
	}
	
	public ContainerBean(FieldBean fieldBean) {
		this.fieldBean = fieldBean;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public FieldBean getFieldBean() {
		return fieldBean;
	}

	public void setFieldBean(FieldBean fieldBean) {
		this.fieldBean = fieldBean;
	}
}

BeanConfiguration에서 Bean을 생성할 때 생성자 안에 주입시키거나 setter를 통해 주입

  • 2-1. 생성자를 통한 주입

@Configuration
public class BeanConfiguration {
	@Bean
	public ContainerBean cbBean() {
        FieldBean fb = new FieldBean("필드빈데이터");
		ContainerBean cb = new ContainerBean(fb); 

		return cb;
	}
}
  • 2-2. setter를 통한 주입

@Configuration
public class BeanConfiguration {
	@Bean
	public ContainerBean cbBean() {
        // 2. setter를 통한 주입
        FieldBean fb = new FieldBean("필드빈데이터2");
		ContainerBean cb = new ContainerBean();
		cb.setFieldBean(fb);
        
		return cb;
	}
}

3. 어노테이션 활용(@Autowired)

(Autowired로 불러오려는 객체가 bean으로 등록되어 있다는 전제!)

3-1. 필드 변수

@Controller
public class ExDaoController {
	@Autowired
	ExDao2 exDao2;
}

3-2. 생성자

  • controller에서 생성자를 @Autowired해서 주입
@Controller
public class ExDaoController {
	// 필드변수로 선언해놓고
	ExDao3 exDao3;
	
    // 생성자 주입
	@Autowired
	public ExDaoController(ExDao3 exDao3) {
		this.exDao3 = exDao3;
	}
}

3-3. Setter

  • controller에서 setter를 @Autowired해서 주입
@Controller
public class ExDaoController {
	// 필드변수로 선언해놓고
	ExDao2 exDao2;
	
    // setter 주입
	@Autowired
	public void setExDao2(ExDao2 exDao2) {
		this.exDao2 = exDao2;
	}
}
profile
안녕하세요!

0개의 댓글