씨네
공부하는 개발자 강씨네
씨네
  • 분류 전체보기 (460)
    • Web (21)
      • HTML (11)
      • CSS (10)
    • JS 관련 (49)
      • JavaScript (27)
      • JQuery (22)
    • TS 관련 (15)
      • TypeScript (15)
    • NodeJS (7)
      • NodeJS (7)
    • 따라하며 배우는 시리즈 (23)
      • NodeJS & ReactJS Basic (23)
      • NodeJS & ReactJS Movie (0)
      • NodeJS & ReactJS Youtube (0)
      • NodeJS & ReactJS ChatBot (0)
    • SPA (14)
      • React (14)
      • Vue (0)
      • Anguler (0)
    • Java 관련 (118)
      • Java (52)
      • JDBC (6)
      • JSP & Servlet (18)
      • Spring Legecy (38)
      • SpringBoot (4)
    • Python (26)
      • Python (20)
      • PyMongo (1)
      • Django (5)
    • Git (24)
      • Github (24)
    • RDB (22)
      • Oracle (21)
      • MySQL (1)
    • NoSQL (5)
      • MongoDB (5)
    • OS (4)
      • Linux (4)
    • 빅데이터 (2)
      • hadoop (2)
    • IDE (20)
      • eclipse (11)
      • VSCODE (4)
      • VisualStudio (1)
      • IntelliJ (1)
      • PyCharm (1)
      • DBeaver (2)
    • Install (3)
      • Tomcat (1)
      • Docker (1)
      • Anaconda (1)
    • 오류&에러 (28)
      • TS (2)
      • NodeJS (7)
      • SQL (8)
      • Java (1)
      • Spring (4)
      • Git (6)
      • 기타 (0)
    • 알고리즘 (67)
      • 수열 (1)
      • 백준(backjoon) (39)
      • Programmers (27)
    • 자격증 (5)
      • SQLD (5)
    • 기타 (2)
    • IT유튜브로 지식쌓기 (2)

공지사항

인기 글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
씨네

공부하는 개발자 강씨네

[Spring] DI / IoC (Bean 객체 생성_01)
Java 관련/Spring Legecy

[Spring] DI / IoC (Bean 객체 생성_01)

2022. 3. 10. 08:53
728x90

스프링의 특징 중 DI / IoC, AOP, OCP가 있었습니다.

그중 DI는 객체간의 결합을 느슨하게 하는 스프링의 핵심기술입니다.

쉽게 말하면 결합도를 낮추기 위함입니다.

​

결합도란?

강결합 : 객체 간 결합도가 강한 프로그램

- HelloApp 에서 MessageBean을 직접 객체 생성하여 사용하는 경우에 MessageBean 클래스를 다른 클래스로 변경할 경우, HelloApp의 소스를 수정해주어야합니다.

​

약결합 : 인터페이스를 사용하여 객체 간 결합도를 낮춘 프로그램

인터페이스를 활용하여 결합도를 낮춘 경우

- HelloApp 은 MessageBean 이라는 인터페이스를 톨해 객체를 사용할 경우

- 일반적으로 팩토리 메서드를 활용하여, 사용할 객체를 생성합니다. 위의 경우 MessageBean이라는 이름의 MessageBeanKo의 객체가 생성이 되던 MessageBeanEn의 객체가 생성이 되던 HelloApp은 수정될 필요가 없습니다.

​

스프링과 인터페이스를 활용하여 결합도를 낮춘 경우

- 프로그램에서 필요한 객체를 스프링컨테이너가 미리 생성하여 이 객체를 필요로 하는 프로그램에 생성자, setter 또는 메서드를 통해서 전달(주입)합니다.

- 어떠한 객체를 생성하여 전달할지는 디스크립터 파일(XML)을 사용합니다.

​

​

​

​

​

​

기본 세팅을 마친 후 패키지를 만들어서 MessageBean인터페이스와 MessageBeanEn, MessageBeanKo, MTest클래스를 만들어줍니다!

그리고 Beans.xml파일을 만들건데요!

Spring Bean Configuration File로 만들어주세요!

​

​

MessageBean.java

package com.test03;

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

}

​

MessageBeanEn.java

package com.test03;

public class MessageBeanEn implements MessageBean {

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

}

​

MessageBeanKo.java

 
package com.test03;

public class MessageBeanKo implements MessageBean {

	@Override
	public void sayHello(String name) {
		System.out.println("안녕하세요, " + name + "님");
	}

}

 

MTest.java

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.sayHello("스프링!");
		english.sayHello("Spring");
	}

}

​

Beans.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="korean" class="com.test03.MessageBeanKo"></bean>
	<bean id="english" class="com.test03.MessageBeanEn"></bean>
	
</beans>

​

실행결과

​

​

MessageBean인터페이스를 상속받은 MessageBeanKo와 MessageBeanEn를 만들고 각각의 클래스에 sayHello메서드를 만들었습니다.

Beans.xml에서

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

의 코드를 작성했고 이는 각각

MessageBeanKo korean = new MessageBeanKo();
MessageBeanEn english = new MessageBeanEn();

와 동일한 코드입니다.

즉, bean은 객체라고 생각하시면 되겠습니다.

​

이를 main메서드에서 factory메서드를 통해 사용하게 됩니다.

ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/beans.xml");
		
MessageBean korean = (MessageBean) factory.getBean("korean");
MessageBean english = (MessageBean) factory.getBean("english");
		
korean.sayHello("스프링!");
english.sayHello("Spring");

ApplicationContext / ClassPathXmlApplication

​

BeanFactory <- ApplicationContext <- ClassPathXmlApplicationContext

​

스프링의 ApplicationContext 객체는 스프링 컨테이너의 인스턴스이다.

스프링은 ApplicationContext의 몇가지 기본 구현을 제공한다.

그 중 ClassPathXmlApplicationContext는 XML 형식의 독립형 어플리케이션에 적합하다.

(지정된 classpath에서 xml 파일을 읽어서 스프링 컨테이너 객체 생성)

​

content : 기능

context : 기능을 구현하기 위한 정보

container : 담는 그릇(기능을 담던, 정보를 담던, 객체를 담던)

​

또한 factory메서드를 통해 객체를 넘겨 받을때 Object타입으로 객체를 받게 됩니다.

그래서 명시적으로 형변환을 반드시 해주어야합니다!

해당 코드에서는 (MessageBean)타입으로 형 변환 해주었습니다!

​

​

​

생성(Beans.xml)과 사용(MTest.java)이 구분되어있다고 할수있겠죠.

이렇게 프로그램의 제어 흐름 구조가 뒤바뀌는 것 개념을 IoC(Inversion of Controll)이라고 합니다.

​

728x90

'Java 관련 > Spring Legecy' 카테고리의 다른 글

[Spring] DI / IoC (Bean 객체 생성_04) - Singleton  (0) 2022.03.13
[Spring] DI / IoC (Bean 객체 생성_03) - setter 주입  (0) 2022.03.12
[Spring] DI / IoC (Bean 객체 생성_02) - 생성자 주입  (0) 2022.03.11
[Spring] 기본세팅(Maven / pom.xml)  (0) 2022.03.09
[Spring] Spring FrameWork(스프링이란?, 스프링의 특징)  (0) 2022.03.08
    'Java 관련/Spring Legecy' 카테고리의 다른 글
    • [Spring] DI / IoC (Bean 객체 생성_03) - setter 주입
    • [Spring] DI / IoC (Bean 객체 생성_02) - 생성자 주입
    • [Spring] 기본세팅(Maven / pom.xml)
    • [Spring] Spring FrameWork(스프링이란?, 스프링의 특징)
    씨네
    씨네
    개발자 씨네가 공부하는 내용을 기록 겸 공유하는 블로그입니다!

    티스토리툴바