잡동사니에도 사랑을

[21.11.08] (chapter01) 본문

SPRING

[21.11.08] (chapter01)

luvforjunk 2021. 11. 8. 11:19
728x90
반응형

★ DI (Dependency Injection)

 

스프링의 핵심 개념

 

객체사이의 의존 관계를 자기 자신이 아닌 외부에 의해서 설정된다는 개념이다

스프링에서는 설정파일을 사용하여 손쉽게 객체간의 의존관계를 설정하기에 스프링을 DI컨테이너라고 부르기도 한다.

DI 컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역활을 한다.

DI 컨테이너가 인스턴스를 생성하도록 하려면 프로그램 소스 내부에서 new 로 직접 생성하지 않고 설정파일에서 필요로 하는 클래스의 정보를 설정해 주어야한다.

 

스프링은 각 클래스간의 의존관계를 관리하기 위한 방법

- Constructor Injection

- Setter Injection

 

가. Constructor Injection

: 생성자를 통해서 의존 관계를 연결시키는 것을 말한다.

: 생성자를 통해서 의존 관계를 연결하기 위해서는 XML 설정 파일에서 <bean>요소의 하위요소로 <constructor-arg>를 추가해야 한다.

 

1. 객체를 전달할 경우에는 ref 요소를 사용

public class Foo {

private Bar bar;

 

public Foo(Bar bar){

this.bar = bar;

}

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg>

<ref bean="bar" />

</constructor-arg>

</bean>

<bean id="bar" class="Bar" />

 

 

[실습]

Project : chapter01

 

Package : sample01

Class : HelloSpring.java - main()

          MessageBean.java


Package : sample02

Interface : MessageBean.java

Class : HelloSpring.java - main()

            MessageBeanKo.java

            MessageBeanEn.java


Package : sample03

Interface : MessageBean

Class : HelloSpring - main()

            MessageBeanKo

            MessageBeanEn

 

src : applicationContext.xml

 

클래스파일은 sample02와 같으므로 그대로 복사해서 들고온다.

xml은 다음과 같이 만들어준다.

 

 

 

 

 

 

만약 context를 선택하지 못하고 Finish를 눌러줬다면, Namespaces에서 선택해주면 된다.

 

 

////////HelloSpring.java

package sample03;

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

public class HelloSpring {

	public static void main(String[] args) {
		// 인터페이스라 뉴 생성이 안되므로 다음과 같은 방법을 써준다.
		// ApplicationContext context = new
		// FileSystemXmlApplicationContext("src/applicationContext.xml");
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 클래스 패스라 기본적으로 src에서 시작한다.
		MessageBean messageBean = (MessageBean) context.getBean("messageBean"); // xml에서의 id="messageBean"을 가져온다.
		messageBean.sayHello("Spring");
		System.out.println();

		MessageBean messageBean2 = context.getBean("messageBean", MessageBean.class);
		messageBean2.sayHello("Spring");
		System.out.println();
		
		MessageBean messageBean3 = context.getBean("messageBean", MessageBean.class);
		messageBean3.sayHello("Spring");
		System.out.println();

		// 기본 생성자가 한번밖에 생성이 되지 않는다 - SingleTon되었다는 뜻.
	}
}

 

 

 

////////MessageBean.java - Interface

package sample03;

public interface MessageBean {
	public void sayHello(String name);
}

 

 

 

////////MessageBeanEn.java

package sample03;

public class MessageBeanEn implements MessageBean {

	@Override
	public void sayHello(String name) {
		System.out.println("Hello " + name + "!!");
	}
}

 

 

 

 

////////MessageBeanKo.java

package sample03;

public class MessageBeanKo implements MessageBean {
	private int num;
	
	public MessageBeanKo() {
		System.out.println("MessageBeanKo 기본생성자");
	}
	
	@Override
	public void sayHello(String name) {
		num++;
		System.out.println("num = " + num);
		System.out.println("안녕하세요" + name + "!!");
	}
}

 

 

 

 

////////applicationContext.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"
	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">
	
	<!-- sample03 -->
	<!--scope : prototype, request, session, singleton -->
	<bean id="messageBean" class="sample03.MessageBeanKo" scope="prototype"></bean>

 

 

 

 


Package : sample04

Interface : Calc.java

추상Method : public void calculate(int x, int y);

Class : HelloSpring - main()

            CalcAdd.java

            CalcMul.java

 

[실행결과]

25 + 36 = xx

25 * 36 = xxx

 

 

////////Calc.java - interface

package sample04;

public interface Calc {
	public void calculate(int num1, int num2);
}

 

 

 

////////CalcAdd.java

package sample04;

public class CalcAdd implements Calc {

	@Override
	public void calculate(int num1, int num2) {
		System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));

	}
}

 

 

 

////////CalcMul.java

package sample04;

public class CalcMul implements Calc {

	@Override
	public void calculate(int num1, int num2) {
		System.out.println(num1 + "*" + num2 + "=" + (num1 * num2));
	}
}

 

 

 

////////HelloSpring.java - void main

package sample04;

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

public class HelloSpring {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Calc calc;
		calc = (Calc) context.getBean("calcAdd");
		calc.calculate(25, 36);
		System.out.println();
		
		calc = (Calc) context.getBean("calcMul");
		calc.calculate(25, 36);
		System.out.println();	
	}
}

 

 

 

 

////////applicationContext.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"
	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">

	<!-- sample04 -->
	<bean id="calcAdd" class="sample04.CalcAdd"></bean>
	<bean id="calcMul" class="sample04.CalcMul"></bean>
</beans>

 

 


Package : sample05

Interface : SungJuk.java

           public void calc();

           public void display();

Class : SungJukImpl.java - SungJuk를 Override하는 클래스

       기본생성자 - Scanner 통해서 데이터 입력

           public void calc() - 총점, 평균 계산

           public void display() - 출력

Class : HelloSpring.java - main

            

 

 

////////applicationContext.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"
	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">
	
	<!-- sample05 -->
	<bean id="sungJukImpl" class="sample05.SungJukImpl"></bean>
</beans>

 

 

 

////////HelloSpring.java

package sample05;

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

public class HelloSpring {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		SungJuk sungJuk = (SungJuk) context.getBean("sungJukImpl");
		sungJuk.calc();
		sungJuk.display();
	}
}

 

 

 

////////SungJuk.java

package sample05;

public interface SungJuk {
	public void display();
	public void calc();
}

 

 

 

////////SungJukImpl.java

package sample05;

import java.util.Scanner;

public class SungJukImpl implements SungJuk {
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int tot;
	private double avg;

	public SungJukImpl() {
		Scanner scan = new Scanner(System.in);

		System.out.println("이름 입력 : ");
		name = scan.next();
		System.out.println("국어 입력 : ");
		kor = scan.nextInt();
		System.out.println("영어 입력 : ");
		eng = scan.nextInt();
		System.out.println("수학 입력 : ");
		math = scan.nextInt();
	}

	@Override
	public void calc() {
		tot = kor + eng + math;
		avg = tot / 3.0;

	}

	@Override
	public void display() {
		System.out
				.println(name + "\t" + kor + "\t" + eng + "\t" + math + "\t" + tot + "\t" + String.format("%.3f", avg));

	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'SPRING' 카테고리의 다른 글

[21.11.11] (sample03 - chapter02_SpringMaven)  (0) 2021.11.11
[21.11.10]  (0) 2021.11.09
[21.11.09] (Chapter02 - sample02)  (0) 2021.11.09
[21.11.09] (Chapter02 - sample02 / 03 / 04)  (0) 2021.11.09
[21.11.08] (Chapter02)  (0) 2021.11.08