Spring Bean? 미스터 빈..?

윤한영·2024년 8월 12일
0

Spring

목록 보기
1/1
post-thumbnail

Spring을 공부하면서 IoC, DI, DL에 대해서 알게 된 내용을 정리하였습니다 :)

개념 정리를 하고, 실제로 Bean을 등록해 보겠습니다 !

개념정리

  • IoC란?
    IoC(Inversion of Control)이란 제어의 역전이라고 하며, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 개발자에게 있는 것이 아닌 프레임워크(ex/ Spring)에 있다는 개념이다.
  1. IoC가 아닌 경우
    개발 시 필요할 때마다 새로운 객체를 생성해서 사용함

  2. IoC인 경우
    자주 사용하는 객체를 미리 만들어두고 필요할 때마다 가져와서 사용함


IoC를 사용하는 이유

새로운 객체를 생성하고 해제하는 작업 ( = 메모리에 데이터를 올려 사용하고 내리고하는 작업 )은 시간이 오래 걸릴 수 있다.

때문에 자주 사용하는 객체를 미리 만들어두고 필요할 때마다 가져다 사용하면 성능 향상에 도움이 된다.


이러한 IoC를 구현하기 위해서 DL, DI 개념이 나오게 되는데,

  • DL (Dependency Lookup) ( 의존성 검색 )
    컨테이너(객체를 관리하는)에서 개발자에게 객체를 전달하는 기능

  • DI (Dependency Injection) ( 의존성 주입 )
    객체들은 따로 따로 존재하는 것이 아닌 서로 서로 의존 관계를 가지고 있다라는 개념 ( 소스 상에서의 "참조" )

Ioc 관련 용어 정리

  • Managed Bean ( = Bean, Bean 객체 )
    - Spring Container에 의해 관리되는 객체
    - 스프링 설정 파일( src/main/resoruces ) 에 등록되어 사용
    - 자동 등록 기능 사용 가능 ( = Component Auto Scanning, 어노테이션 )

  • Spring Container
    - 관리되어지는 빈이 모여 있는 곳
    - IoC Container, Spring Context, Application Context 등으로 불림



실제로 Bean을 등록해서 사용해 보겠습니다


아래와 같은 순서로 진행하려고 합니다.

이클립스에서 진행합니다 !

  • Maven Project 만들기
  • 객체를 이용하여 예제 만들기
  • Bean 객체를 등록하여 예제 만들기

1. Maven Project 만들기

  1. Dynamic Web Project 생성
  • Project Name: beanRegister-practice
  • Project 구조
src/main/java
src/main/resources
src/test/java
src/test/resources
  1. Maven 프로젝트로 변경
    프로젝트에서 오른쪽 마우스 > Configure > Convert to Maven Project



2. 패키지 생성 및 dependency 추가

  • src/main/java 에 패키지 추가 ( ex/ kr.co.acomp )
  • Maven Project 로 변경 후 생성된 pom.xml 파일에 dependency 추가
  • 패키지 내에 클래스 생성
    • HelloDAO.java
    • HelloMain.java

<!-- 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>


3. 객체를 이용한 예제


/* 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 출력
	}
}

4. Bean을 등록한 후 예제 만들기

  • src/main/resources 에 spring-context.xml 생성
  • Bean 등록
  • 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

0개의 댓글