nocdev
스프링 Bean(빈) 본문
Bean(빈)
이번에는 스프링의 빈과 빈 설정 방법과 빈 조회방법에 대해서 살펴보겠습니다.
개발환경
Bean(빈)
빈은 스프링 컨테이너가 관리하는 자바 객체를 뜻합니다. 빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 합니다. 객체의 생성, 관리, 소멸을 개발자가 아닌 스프링 프레임워크에서 관리합니다.
POJO(Plain Old Java Object)
POJO는 오래된 방식의 자바 객체 라는 뜻으로 스프링 프레임워크에 종속되지 않은 일반적인 자바 객체를 의미하며, 특별한 애너테이션이나 상속 없이도 사용할 수 있는 순수 자바 객체입니다.
Bean VS POJO
1. POJO (Plain Old Java Object):
- POJO는 특별한 프레임워크나 기술에 종속되지 않는 순수한 자바 객체입니다.
- 애너테이션, 상속, 인터페이스 등이 필요 없으며, 비즈니스 로직을 담을 수 있습니다.
- 개발자가 직접 객체를 생성하고 관리합니다.
2. Bean (스프링 빈):
- 스프링 컨테이너에 의해 생성되고 관리되는 객체입니다.
- 주로 @Component, @Service, @Controller 등 애너테이션을 통해 등록됩니다.
- 의존성 주입, 라이프사이클 관리, AOP 등의 기능을 사용할 수 있습니다.
- POJO이면서도 스프링 컨테이너가 관리하는 객체입니다.
차이점:
- POJO는 순수 자바 객체로 프레임워크에 의존하지 않지만, Bean은 스프링 컨테이너에 의해 관리됩니다.
POJO 만들기
POJO는 자바 클래스를 이용해 객체를 만들면 됩니다. 특별한 애너테이션이나 인터페이스를 사용하지 않고 속성, 생성자, Getter/Setter 메서드를 포함하는 기본적인 객체입니다.
public class Person {
private String name;
private int age;
// 매개변수가 있는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter와 Setter
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 class Test {
public static void main(String[] args) {
//객체 생성
Person p = new Person("홍길동", 25);
}
}
main 메서드에서 Person 클래스의 객체 생성
이렇듯 POJO클래스는 객체의 생성, 관리 등을 개발자가 직접 관리해야합니다.
Bean 만들기
이번에는 위에서 만든 Person 클래스를 스프링 Bean으로 만들어보겠습니다. 스프링에서 Bean 등록방법은 크게 3가지가 존재합니다.
xml 기반 설정
이전에 생성했던 Spring MVC 프로젝트의 root-context.xml 파일 또는 servlet-context.xml 파일에 Bean을 정의합니다. 저는 root-context.xml 파일에서 진행합니다.
xml에서 bean 태그를 이용해 클래스의 인스턴스를 생성합니다. 이 때 클래스에 기본생성자가 아닌, 파라미터가 필요한 생성자가 있을 경우에는 constructor-arg 태그에 파라미터를 넣어주어야 합니다. 빨간 네모칸에 해당하는 부분이
Person p = new Person("홍길동", 25); 이부분과 동일한 역할을 수행합니다.
이렇게 xml에 설정을 하게 되면 개발자가 빈을 생성해달라고 요청하게 되고, 클래스의 인스턴스 생성을 개발자가 아닌 스프링 프레임워크가 맡게 됩니다.
Java 기반 설정
이번에는 Java 클래스를 이용해 Person 클래스의 빈을 생성해보겠습니다.
설정을 위한 별도 클래스를 생성하고 @Configuration 어노테이션을 클래스 위에 작성합니다. 이렇게 하면 servlet-context.xml 파일에 <annotation-driven /> 태그가 @Configuration 어노테이션이 달린 클래스를 읽어들이며 빈으로 등록하게 됩니다.
어노테이션 기반 설정(Component Scan)
이번에는 어노테이션을 이용해 Person 클래스의 빈을 생성해보겠습니다.
빈으로 설정하고자 하는 클래스 위에 @Component 어노테이션을 클래스 위에 작성합니다. 이렇게 하면 servlet-context.xml 파일에 <context:component-scan /> 태그가 @ Component 어노테이션이 달린 클래스를 읽어들이며 빈으로 등록하게 됩니다.
Bean 조회하기
스프링 빈으로 등록한 클래스들을 조회하기 위해서는 IOC컨테이너(ApplicationContext)에 접근하여 빈 객체를 꺼내와야 합니다.
xml빈 조회
root-context.xml 파일을 이용해 등록한 빈을 조회 해보겠습니다.
빈 전체 목록 조회
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/spring/root-context.xml");
// 컨텍스트에서 정의된 모든 빈 이름을 가져옵니다.
String[] beanNames = context.getBeanDefinitionNames();
// 모든 빈 이름을 출력합니다.
for (String beanName : beanNames) {
System.out.println("빈 이름 : " + beanName); // 각 빈의 이름을 출력합니다.
}
}
}
클래스 타입으로 빈 객체 조회
ApplicationContext 인터페이스를 구현한 FileSystemXmlApplicationContext 클래스를 이용해 root-context.xml 파일내에 정의한 빈 객체들을 조회할 수 있습니다.
빈에서 직접 객체를 꺼내기 위해서는 ApplicationContext인터페이스를 통해 가져와야 합니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/spring/root-context.xml");
//IOC 컨테이너에서 Person 빈 객체를 꺼내옵니다.
Person p = context.getBean(Person.class);
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
빈 이름으로 빈 객체 조회
빈 객체를 꺼내올 때 빈으로 등록된 클래스의 타입을 이용하거나, 빈의 이름을 이용해 꺼내올 수 있습니다. xml설정에서 빈의 이름을 지정해주어야 합니다. 빈을 이름으로 조회할 때에는 조회한 빈에 맞게 강제 형변환을 해주어야 합니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/spring/root-context.xml");
//IOC 컨테이너에서 person 이름으로 정의된 빈 객체를 꺼내옵니다.
Person p = (Person)context.getBean("person");
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
Java 설정에서 빈 조회
AppConfig.java 파일을 이용해 등록한 빈을 조회 해보겠습니다.
빈 전체 목록 조회
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 컨텍스트에서 정의된 모든 빈 이름을 가져옵니다.
String[] beanNames = context.getBeanDefinitionNames();
// 모든 빈 이름을 출력합니다.
for (String beanName : beanNames) {
System.out.println("빈 이름 : " + beanName); // 각 빈의 이름을 출력합니다.
}
}
}
클래스 타입으로 빈 객체 조회
ApplicationContext 인터페이스를 구현한 AnnotationConfigApplicationContext클래스를 이용해 AppConfig.java 파일내에 정의한 빈 객체들을 조회할 수 있습니다.
빈에서 직접 객체를 꺼내기 위해서는 ApplicationContext인터페이스를 통해 가져와야 합니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//IOC 컨테이너에서 Person 빈 객체를 꺼내옵니다.
Person p = context.getBean(Person.class);
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
빈 이름으로 빈 객체 조회
빈 객체를 꺼내올 때 빈으로 등록된 클래스의 타입을 이용하거나, 빈의 이름을 이용해 꺼내올 수 있습니다. 어노테이션 기반으로 빈을 등록할 때 빈의 기본 이름은 빈으로 등록된 영문 클래스명의 소문자가 됩니다.
Person 빈의 기본 이름은 person입니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//IOC 컨테이너에서 Person 빈 객체를 꺼내옵니다.
Person p = (Person)context.getBean("person");
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
어노테이션 기반 설정에서 빈 조회
어노테이션(ComponentScan)을 이용해 등록한 빈을 조회하기 위해서는 servlet-context.xml 파일의 component-scan 설정이 불러와져야 하기 때문에 테스트를 위해 AppConfig.java에서 ComponentScan을 할 수 있게 설정을 변경하겠습니다.
package com.example.mvc;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages="com.example.mvc")
public class AppConfig {
}
AppConfig.java에서 직접 클래스의 bean을 등록하지 않고 com.example.mvc 패키지 안에 있는 모든 클래스 중 @Component 어노테이션이 달린 클래스를 찾아 자동을 bean으로 등록하게 됩니다.
또한 ComponentScan을 사용해야 하는 경우 bean으로 등록되는 클래스가 기본생성자가 없다면 만들어 주어야 합니다. Person.java 파일을 변경하겠습니다.
package com.example.mvc;
import org.springframework.stereotype.Component;
@Component
public class Person {
private String name;
private int age;
// ComponentScan을 위한 빈 생성자
public Person() {
}
// 매개변수가 있는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter와 Setter
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;
}
}
빈 전체 목록 조회
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 컨텍스트에서 정의된 모든 빈 이름을 가져옵니다.
String[] beanNames = context.getBeanDefinitionNames();
// 모든 빈 이름을 출력합니다.
for (String beanName : beanNames) {
System.out.println("빈 이름 : " + beanName); // 각 빈의 이름을 출력합니다.
}
}
}
클래스 타입으로 빈 객체 조회
ApplicationContext 인터페이스를 구현한 AnnotationConfigApplicationContext클래스를 이용해 AppConfig.java 파일내에 정의한 빈 객체들을 조회할 수 있습니다.
빈에서 직접 객체를 꺼내기 위해서는 ApplicationContext인터페이스를 통해 가져와야 합니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//IOC 컨테이너에서 Person 빈 객체를 꺼내옵니다.
Person p = context.getBean(Person.class);
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
빈 생성자를 호출하였기 때문에 age 필드에 별도의 값이 대입되지 않고 기본값인 0이 출력됩니다.
빈 이름으로 빈 객체 조회
빈 객체를 꺼내올 때 빈으로 등록된 클래스의 타입을 이용하거나, 빈의 이름을 이용해 꺼내올 수 있습니다. 어노테이션 기반으로 빈을 등록할 때 빈의 기본 이름은 빈으로 등록된 영문 클래스명의 소문자가 됩니다.
Person 빈의 기본 이름은 person이 되게 됩니다.
package com.example.mvc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Spring의 ApplicationContext를 사용하여 XML 파일에서 빈 설정을 로드합니다.
// FileSystemXmlApplicationContext는 지정된 경로에서 XML 파일을 찾습니다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//IOC 컨테이너에서 Person 빈 객체를 꺼내옵니다.
Person p = (Person)context.getBean("person");
//Person 객체에 저장된 age 필드의 값을 조회하여 출력합니다.
System.out.println(p.getAge());
}
}
마무리
이번에는 스프링 빈 설정 및 조회 방법에 대해서 살펴보았습니다. 실제 스프링을 이용한 개발을 진행할 때 빈을 개발자가 직접 꺼내 조회 할 일은 많지 않습니다. 다음 포스팅에서는 스프링이 생성한 빈을 의존성 주입을 이용해 꺼내오고 어떻게 사용하는지에 대해 다뤄보겠습니다.
'개발 > spring' 카테고리의 다른 글
스프링 MVC 프로젝트 톺아보기3 (0) | 2024.10.11 |
---|---|
스프링 MVC 프로젝트 톺아보기2 (0) | 2024.10.05 |
스프링 MVC 프로젝트 톺아보기1 (1) | 2024.10.04 |