본문 바로가기

JAVA/Spring

[ Spring / JAVA ] 스프링 - DI 방법 ( 3가지 )

728x90

 

 

 

안녕하세요 !

 

오늘은 Spring의 특징인 DI 방법 3가지를 알아보려고합니다.

 

DI가 아직 뭔지 잘 모르겠다 ! 하시는 분들은 이전 글을 참조하시면 좋을 것 같습니다.

 

 

 

[Spring / JAVA] 스프링 - DI ( Dependency Injection ) 의존성 주입

안녕하세요 ! ꉂꉂ(ᵔᗜᵔ*) 이번 글에서는 스프링의 특징 중 하나인 DI에 대해서 공부해보겠습니다. DI : Dependency Injection 객체간 의존성을 개발자가 객체 내부에서 직접 호출하는 연산자 대신 외

preparingforme-n-us.tistory.com

 

 

외부에서 객체를 생성해주는 방법에는 다음과 같은 세가지의 방법이 있습니다.

 

( xml만을 이용해서 객체 생성을 하는 방법은 이전 글에 설명해두었으니 참고해주세요 ! )

 

  • Annotation을 활용해 xml 없이 객체 생성해주는 방법
  • Annotation을 만들고, xml에서 Annotation을 가져와서 함께 쓰는 방법
  • xml에서 객체 생성을 해준 뒤 Annotation에서 xml을 Import해서 쓰는 방법

 

그럼 xml 없이 Annotation을 사용하는 방법부터 보겠습니다 !

 

 < Annotation >

 

파일은 다음과 같이 생성하고 시작하겠습니다.

 

 

ApplicationConfig.java 를 만들고

 

Annotation을 사용해서 기존에 xml을 사용할 때 필요했던 Configuration과 Bean을 선언해줍니다.

 

 

 

ApplicationConfig.java

 

package com.spring.app;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {

	@Bean
	public Student student1() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("독서");
		hobbys.add("음악");
		
		Student student = new Student("김미미", 20, hobbys);
		student.setGradeNum("1");
		student.setClassNum("2");
		
		return student;
	}
	
	@Bean
	public Student student2() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("영화");
		hobbys.add("수영");
		
		Student student = new Student("김쥬쥬", 24, hobbys);
		student.setGradeNum("2");
		student.setClassNum("6");
		
		return student;
	}
	
}

 

 

 

Student.java

 

package com.spring.app;

import java.util.ArrayList;

public class Student {
	
	private String name;
	private int age;
	private String gradeNum;
	private String classNum;
	private ArrayList<String> hobbys;
	
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getGradeNum() {
		return gradeNum;
	}

	public void setGradeNum(String gradeNum) {
		this.gradeNum = gradeNum;
	}

	public String getClassNum() {
		return classNum;
	}

	public void setClassNum(String classNum) {
		this.classNum = classNum;
	}

	public ArrayList<String> getHobbys() {
		return hobbys;
	}

	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	
	
}

 

 

 

MainClass.java

 

package com.spring.app;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnnotationConfigApplicationContext ctx
		 = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		
		Student student1 = ctx.getBean("student1", Student.class);
		System.out.println("이름 : " + student1.getName());
		System.out.println("나이 : " + student1.getAge());
		System.out.println("학년 : " + student1.getGradeNum());
		System.out.println("반 : " + student1.getClassNum());
		System.out.println("취미 : " + student1.getHobbys());
		
		Student student2 = ctx.getBean("student2", Student.class);
		System.out.println("이름 : " + student2.getName());
		System.out.println("나이 : " + student2.getAge());
		System.out.println("학년 : " + student2.getGradeNum());
		System.out.println("반 : " + student2.getClassNum());
		System.out.println("취미 : " + student2.getHobbys());
		
		ctx.close();
	}
}

 

 

ApplicationConfig.java 에서 @Configuration으로 Class를 만들고 @Bean을 써서 Student 객체 ( student1, student2 ) 를 만들어줬습니다.

 

MainClass.java에서 AnnotationConfigApplicationContext 를 사용해서 ApplicationConfig 클래스를 불러와줍니다.

 

student1과 2를 ctx.getBean()으로 가져와서 할당해줍니다.

 

 

 

 

 < xml ← Annotation >

 

이번 방법은 파일 구성을 이렇게 만들어주고 시작하겠습니다 !

 

 

위 방법에서 했던 것처럼 Annotation을 활용할거기 때문에 ApplicationConfig.java를 만들어서 동일하게 작성한 후

 

xml에서 Annotation으로 작성한 객체를 받아오는 식으로 쓰겠습니다.

 

 

 

ApplicationConfig.java

 

package com.spring.app;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {

	@Bean
	public Student student1() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("독서");
		hobbys.add("음악");
		
		Student student = new Student("김미미", 20, hobbys);
		student.setGradeNum("1");
		student.setClassNum("2");
		
		return student;
		
	}
	
}

 

 

 

Student.java는 위에 썼던 그대로 들고와주세요 !

 

 

 

MainClass.java

 

package com.spring.app;

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

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractApplicationContext ctx
		 = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
		
		Student student1 = ctx.getBean("student1", Student.class);
		System.out.println("이름 : " + student1.getName());
		System.out.println("나이 : " + student1.getAge());
		System.out.println("학년 : " + student1.getGradeNum());
		System.out.println("반 : " + student1.getClassNum());
		System.out.println("취미 : " + student1.getHobbys());
		
		Student student2 = ctx.getBean("student2", Student.class);
		System.out.println("이름 : " + student2.getName());
		System.out.println("나이 : " + student2.getAge());
		System.out.println("학년 : " + student2.getGradeNum());
		System.out.println("반 : " + student2.getClassNum());
		System.out.println("취미 : " + student2.getHobbys());
		
		ctx.close();
	}
}

 

 

 

applicationCTX.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-3.1.xsd">
	
	<context:annotation-config />
	<bean class="com.spring.app.ApplicationConfig" />
	
	<bean id="student2" class="com.spring.app.Student">
		<constructor-arg>
			<value>김쥬쥬</value>
		</constructor-arg>
		<constructor-arg>
			<value>24</value>
		</constructor-arg>
		<constructor-arg>
			<list>
				<value>영화</value>
				<value>수영</value>
			</list>
		</constructor-arg>
		<property name="gradeNum" value="2" />
		<property name="classNum" value="6" />
	</bean>

</beans>

 

이런식으로 applicationCTX.xml 에서

 

<context:annotation-config /> 

<bean class="com.spring.app.ApplicationConfig" />

 

로 Annotation를 활용해 만들어준 ApplicationConfig.java를 가져와줍니다.

 

MainClass.java에서는 AbstractApplicationContext()를 사용해서 CTX를 불러와줍니다.

 

 

 

 < Annotation ← xml >

 

파일 구성은 다음과 같습니다 !

 

 

이번엔 위에 했던 방법과 달리 xml에 Annotation을 불러오는게 아니라 xml에 Annotation을 가져와서 써보도록 하겠습니다.

 

 

 

ApplicationConfig.java

 

package com.spring.app;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:applicationCTX.xml")
public class ApplicationConfig {

	@Bean
	public Student student1() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("독서");
		hobbys.add("음악");
		
		Student student = new Student("김미미", 20, hobbys);
		student.setGradeNum("1");
		student.setClassNum("2");
		
		return student;
		
	}
	
}

 

 

 

Student.java는 위에 썼던 그대로 들고와주세요 !

 

 

 

MainClass.java

 

package com.spring.app;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnnotationConfigApplicationContext ctx
		 = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		
		Student student1 = ctx.getBean("student1", Student.class);
		System.out.println("이름 : " + student1.getName());
		System.out.println("나이 : " + student1.getAge());
		System.out.println("학년 : " + student1.getGradeNum());
		System.out.println("반 : " + student1.getClassNum());
		System.out.println("취미 : " + student1.getHobbys());
		
		Student student2 = ctx.getBean("student2", Student.class);
		System.out.println("이름 : " + student2.getName());
		System.out.println("나이 : " + student2.getAge());
		System.out.println("학년 : " + student2.getGradeNum());
		System.out.println("반 : " + student2.getClassNum());
		System.out.println("취미 : " + student2.getHobbys());
		
		ctx.close();
	}
}

 

 

 

applicationCTX.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="student2" class="com.spring.app.Student">
		<constructor-arg>
			<value>김쥬쥬</value>
		</constructor-arg>
		<constructor-arg>
			<value>24</value>
		</constructor-arg>
		<constructor-arg>
			<list>
				<value>영화</value>
				<value>수영</value>
			</list>
		</constructor-arg>
		<property name="gradeNum" value="2" />
		<property name="classNum" value="6" />
	</bean>
</beans>

 

 

ApplicationConfig.java 에서

@ImportResource("classpath:applicationCTX.xml")

로 작성해둔 xml을 가져와줍니다.

 

MainClass.java에서는 AnnotationConfigApplicationContext를 이용해서 Annotation으로 작성한 ApplicationConfig 클래스를 가져와서 써주면 됩니다.

 

 

이렇게 작성해주면 나오는 출력문입니다.

 

 

 

오늘은 여기서 마치고 다음 글에서는 spring으로 데이터를 전달하는 방법을 배워보도록 하겠습니다 !

 

감사합니다 !