Spring을 공부하면서 IoC, DI, DL에 대해서 알게 된 내용을 정리하였습니다 :)
개념 정리를 하고, 실제로 Bean을 등록해 보겠습니다 !
제어의 역전
이라고 하며, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 개발자에게 있는 것이 아닌 프레임워크(ex/ Spring)에 있다는 개념이다.IoC가 아닌 경우
개발 시 필요할 때마다 새로운 객체를 생성해서 사용함
IoC인 경우
자주 사용하는 객체를 미리 만들어두고
필요할 때마다 가져와서 사용함
새로운 객체를 생성하고 해제하는 작업 ( = 메모리에 데이터를 올려 사용하고 내리고하는 작업 )은 시간이 오래 걸릴 수 있다.
때문에 자주 사용하는 객체를 미리 만들어두고 필요할 때마다 가져다 사용하면 성능 향상에 도움이 된다.
DL (Dependency Lookup)
( 의존성 검색 )
컨테이너(객체를 관리하는)에서 개발자에게 객체를 전달하는 기능
DI (Dependency Injection)
( 의존성 주입 )
객체들은 따로 따로 존재하는 것이 아닌 서로 서로 의존 관계를 가지고 있다라는 개념 ( 소스 상에서의 "참조" )
src/main/resoruces
) 에 등록되어 사용아래와 같은 순서로 진행하려고 합니다.
이클립스에서 진행합니다 !
beanRegister-practice
src/main/java
src/main/resources
src/test/java
src/test/resources
Configure
> Convert to Maven Project
kr.co.acomp
)pom.xml
파일에 dependency 추가<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.co.acomp</groupId>
<artifactId>beanRegister-practice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
<dependencies>
<!-- spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.5</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>
</dependencies>
</project>
/* HelloDAO.java */
package kr.co.acomp.hello;
public class HelloDAO {
public int addTwoNumber(int a, int b) {
return a + b;
}
}
/* HelloMain.java */
package kr.co.acomp.hello;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloMain {
public static void main(String[] args) {
/* [] 객체를 생성해서 사용하는 방식 */
HelloDAO dao = new HelloDAO();
int result = dao.addTwoNumber(3, 5);
System.out.println(result); // 결과 8 출력
}
}
spring-context.xml
생성HelloMain.java
소스 수정<?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">
<!-- [] id: bean id, class: Bean으로 등록할 클래스 파일 -->
<bean id="helloDAO" class="kr.co.acomp.hello.HelloDAO" />
</beans>
package kr.co.acomp.hello;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloMain {
public static void main(String[] args) {
// parameter (Bean 설정파일이름)
/* [] Bean 컨테이너, Spring container가 로딩됨(생성), Bean이 생성이 됨 */
AbstractApplicationContext ctx =
new ClassPathXmlApplicationContext("/spring-context.xml");
// parameter (Bean ID, Class Type)
// getBean()이 Dependency Lookup을 지원, 매번 생성하는 것이 아닌 기존에 있는(=Spring Container에 있는) 객체를 전달, 훨씬 가벼움
HelloDAO dao = ctx.getBean("helloDAO", HelloDAO.class);
int result = dao.addTwoNumber(3, 5);
System.out.println(result); // 결과 8 출력
}
// 기존에는 "}" 이후에 객체가 사라지게 되는데 DL을 하게 되면 객체가 사라지는 것이 아니라 컨테이너로 반환되는 것임 -> 성능 향상
}
Spring Container에 Bean을 등록하여 사용하면
객체가 필요할 때마다 생성해서 사용하는 것이 아닌 Container에 존재하는 객체를 가지고 와서 사용하므로 성능 측면에서 상당한 이점이 있다고 합니다.
요청이 빈번한 Web Application 에서는 컨테이너를 사용하지 않으면 관리가 힘들다고 하니 개발하시면서 꼭 사용해 보시면 좋겠습니다 !
이미지 출처
심슨 - https://blog.naver.com/sysl9556/221225617255