Java/Spring

[Spring] 02. bean 객체 생성하기(01)

담크 2021. 6. 11. 23:43

이제 본격적으로 스프링을 사용해서 코딩을 해볼게요!!

 

지난 포스팅과 비슷하게 Spring_Hello라는 프로젝트에 

이렇게 5가지를 만들어 줍니다.

 - 여기서 MessageBean.java는 interface이며 MessageBeanEn, MessageBeanKo는 MessageBean을 상속받고 있어야합니다.

 - beans.xml은 패키지 마우스 오른쪽 클릭 - new - other - spring 검색 후

Spring Bean Configuration File로 만들어 주시면 됩니다.

그리고 <beans>태그 안에다가

<bean id="korean" class="com.test03.MessageBeanKo"></bean>
<bean id="english" class="com.test03.MessageBeanEn"></bean>

이 코드를 작성한다면 준비 완료!

 

MessageBean, MessageBeanKo, MessageBeanEn은 아래 포스팅된 내용과 같습니다.

https://darmk.tistory.com/6

 

[Spring] 01. DI / IoC 강결합 약결합

오늘은 DI / IoC 중에 DI에서의 강결합과 약결합의 뜻과 함께 실제 사용하는 코드를 작성해서 비교해보려고 합니다. 그 전에 잠깐 앞서 저번 포스팅에 안에 가져온 spring-core, spirng-context에 대해 간

darmk.tistory.com

 

그렇다면 여기서 중요하게 봐야할게 MTest부분인데 먼저 코드부터 보면

package com.test03;

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

public class MTest {
	
	public static void main(String[] args) {
		
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/beans.xml");
		
		MessageBean korean = (MessageBean)factory.getBean("korean");
		MessageBean english = (MessageBean)factory.getBean("english");
		
		korean.hello("스프링");
		english.hello("Spring");
		
	}

}

이렇게 작성합니다.

(여기서 빨간줄이 생기거나 에러가 발생한다면 pom.xml에 spring-core와 spring-context가 없을 확률이 매우 큽니다 확인 꼭 해주세요!!)

 

여기서 저 코드들이 어떠한 의미를 가지고 있는지 간단히 설명하자면

 

  • BeanFactory : bean을 객체로 만들어서 그 bean을 담고있는애

 

  • ApplicationContext : BeanFactory을 상속받아서 확장시키는 애(그 인터페이스를 가지고 실제 구현한 구현체가 ClassPathXmlApplicationContext)

 

 

  • ClassPathXmlApplicationContext : xml형식의 파일을 읽어들인다 (beans.xml - bean태그를 읽어서 객체로 만들어서 그 만들어진 객체를 스프링컨테이너가 담아놓고 있겠다 를 표현)

 

입니다.

 

 

저번 포스팅에서 클래스랑 클래스 사이에 Interface를 써서 결합도가 낮아졌다고 했죠?

그런데 이번엔 클래스랑 클래스 사이에 Spring이 간섭하는거라고 보시면 됩니다.

 

스프링은 Beans.xml을 통해서 bean으로 등록합니다.(여기서의 bean은 객체라고 생각하시면 됩니다.)

<bean id="korean" class="com.test03.MessageBeanKo"></bean>

 = MessageBeanKo koean = new MessageBeanKo() 라고 생각하시면 됩니다.

 

지금까지는 MTest에서 new Class( )라고해서 객체를 직접 생성하고 있었는데,

이제는 스프링에서 만들어진 객체를 MTest에서 불러와서 사용하고 있는겁니다  신기하지 않나요?? ㅎㅎ

이걸 IoC라고 합니다.

 

IoC는 간단히 그림으로 보여드리면

이런 흐름을 가지고 있다고 생각하시면 됩니다.

 

 

다음은

Spring_Bean 프로젝트를 만들고 아래와 같이 패키지를 만들어 주세요.

MessageBean : interface

MessageBeanImpl : MessageBean을 상속받고 있음

appicationContext.xml : spring bean configuration file

 

MessageBean.java

package com.test01;

public interface MessageBean {
	
	public void hello();

}

MessageBeanImpl.java

package com.test01;

public class MessageBeanImpl implements MessageBean {
	
	private String fruit;	
	private int cost;
	
	public MessageBeanImpl() {
		this.fruit = "키위";
		this.cost = 3000;
	}
	
	public MessageBeanImpl(String fruit, int cost) {
		this.fruit = fruit;
		this.cost = cost;
	}

	@Override
	public void hello() {
		System.out.printf("과일 : %s \t 가격 : %d \n", fruit, cost);
	}

}

MTest.java

package com.test01;

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

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test01/applicationContext.xml");
		
		MessageBean kiwi = (MessageBean) factory.getBean("kiwi");
		MessageBean banana = (MessageBean) factory.getBean("banana");
		MessageBean melon = (MessageBean) factory.getBean("melon");
		MessageBean cherry = (MessageBean) factory.getBean("cherry");
		
		kiwi.hello();
		banana.hello();
		melon.hello();
		cherry.hello();
	}

}

appicationContext.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="kiwi" class="com.test01.MessageBeanImpl"></bean>
	
	<bean id="banana" class="com.test01.MessageBeanImpl">
		<constructor-arg>
			<value>바나나</value>
		</constructor-arg>
		<constructor-arg>
			<value>6000</value>
		</constructor-arg>
	</bean>
	
	<bean id="melon" class="com.test01.MessageBeanImpl">
		<constructor-arg value="멜론"></constructor-arg>
		<constructor-arg value="7000"></constructor-arg>
	</bean>
	
	<bean id="cherry" class="com.test01.MessageBeanImpl">
		<constructor-arg index="1" value="6000"></constructor-arg>
		<constructor-arg index="0" value="체리"></constructor-arg>
	</bean>
	
</beans>

 

코드 실행결과

 

여기서 눈여겨 봐야할 파일은 appicationContext.xml인데요 결과값을 보시면

<bean></bean>을 하면 기본생성자를 호출한다는걸 알 수 있습니다.

그 아래 <constructor-arg>태그는

constructor : 생성자

arg : 아규먼트로

생성자 아규먼트 값으로 넣어서 출력하겠다(객체를 만들겠다)라는 의미입니다

<constructor-arg>태그는 위의 코드와 같이 여러가지 형태로 사용할 수 있습니다.

코드를 비교해보면 색깔에 맞는 애들에 값이 들어가서 출력된다고 생각하시면 됩니다.