1. Maven project 생성
먼저 아래 url에 따라 Maven project를 생성하고 pom.xml을 수정하자.
2. Bean이란?
Spring IoC 컨테이너는 "빈(Bean)"이라는 객체를 관리한다. 이 때문에 Spring은 이 빈들을 관리한다는 의미로 컨테이너를 "Bean Factory"라고 부른다. 아래서 배우겠지만 우리가 일반적으로 사용하는 new 연산자로 만들어진 객체들은 Bean이 아니고, ApplicationContext.getBean()으로 얻을 수 있는 객체를 Bean이라고 생각하면 편하다. 이때 Bean들은 개발자가 관리하는 것이 아니라 스프링에게 제어권을 넘긴 객체이다. 즉, Spring에 의해 생성되고, 의존성 주입(DI)이 발생한다. 이때 Bean 클래스들은 다음과 같은 조건을 만족해야 한다.
- 기본생성자를 가진다.
- 필드는 private하게 선언한다.
- getter, setter 메소드를 가진다.
이때 만든 클래스들을 Bean으로 설정하는 방법은 다음과 같이 크게 두 가지 방법이 존재한다.
- xml 파일 사용
- Java Config 사용
이번 장에서는 xml 파일을 사용한 방법을 살펴보자.
3. xml 파일을 활용한 방법
먼저 UserBean이라는 클래스를 아래와 같이 생성해보자.
package com.example.springExam;
public class UserBean {
private String name;
private int age;
public UserBean() {
}
public UserBean(String name, int age, boolean male) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
이제 해당 클래스를 Bean으로 등록하기 위한 xml 파일을 만들어보자. 먼저 우리가 작업하는 프로젝트를 선택하고 우클릭을 한 후 [New]-[Folder]를 선택하자. 그리고 src/main 폴더 아래에 resources 폴더를 생성하고 아래와 같이 해당 폴더에 applicationContext.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="userBean" class="com.example.springExam.UserBean"></bean>
</beans>
위에서 "<bean id="userBean" class="com.example.springExam.UserBean"></bean>" 부분은 "UserBean userBean = new UserBean"과 같은 의미를 가진다. 즉, spring은 해당 커맨드를 보고 객체를 생성하여 컨테이너를 통해 관리한다. 이때 spring 컨테이너는 이러한 객체를 하나만 생성해서 가진다. 이렇게 객체를 하나만 생성하는 것을 싱글턴 패턴이라고 부른다. 이제 spring의 컨테이너가 가지고 있는 userBean 객체를 아래와 같이 사용할 수 있다.
public static void main(String[] args) {
ApplicationContext aContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserBean userBean = (UserBean) aContext.getBean("userBean");
userBean.setName("Gwon");
System.out.println(userBean.getName()); // 결과: Gwon
UserBean userBean2 = (UserBean) aContext.getBean("userBean");
System.out.println(userBean2.getName()); // 결과: Gwon
System.out.println(userBean == userBean2); // 결과: true
}
우리가 가장 먼저해야할 것은 우리가 사용할 컨테이너를 만드는 것이다. 위 코드는 Spring 컨테이너 중 ApplicationContext를 사용한다. 이때 xml 파일을 가져와 ApplicationContext를 생성하기 위해 ClassPathXmlApplicationContext 객체를 생성하는 것이다. 생성하게 되면 우리가 설정한 xml 파일을 읽어와 spring의 컨테이너는 userBean 객체를 가지고 있게 된다. 이때 이러한 Bean 객체를 가져오기 위해 getBean 메서드를 사용한다. 해당 메서드를 사용해 객체를 불러오면 우리가 원하는데로 사용할 수 있다. 단, 반환형은 Object 타입이므로 우리가 원하는 클래스 타입으로 강제 형변환을 해줘야 한다. 또한 이전에 말한 것과 같이 싱글턴 패턴이므로 위처럼 두 번 객체를 생성해도 spring의 컨테이너는 같은 객체를 반환해주기 때문에 userBean과 userBean2는 같은 객체를 가리키는 결과를 보여준다.
4. 의존성 주입(Dependency Injection)
의존성 주입의 예시를 살펴보자. 아래와 같이 두 개의 클래스가 있고 하나의 클래스가 다른 클래스를 필드로 가지고 있다고 하자.
// Engine 클래스
public class Engine {
public Engine() {
}
public void exec() {
System.out.println("Execute Engine");
}
}
// Car 클래스
public class Car {
Engine engine;
public Car() {
}
public void setEngine(Engine e) {
this.engine = e;
}
public void run() {
engine.exec();
}
}
보통 위와 같은 코드에서 run을 실행하기 위해 우리는 아래와 같이 코드를 작성한다.
Engine engine = new Engine();
Car car = new Car();
car.setEngine(engine);
car.run()
이를 간편하게 하기 위해서 applicationContext.xml 파일에 아래 내용을 추가해보자.
<bean id="engine" class="com.example.springExam.Engine"></bean>
<bean id="car" class="com.example.springExam.Car">
<property name="engine" ref="engine"></property>
</bean>
해당 코드는 engine과 car이라는 두 객체를 생성한다. 이때 car 생성을 위한 bean 태그 사이에 property 태그가 존재한다. 이때 ref에는 car의 engine을 set하기 위해서 우리가 직전에 선언한 engine 객체를 사용하겠다는 의미로 setEngine이라는 메서드를 수행할 때 engine 객체를 전달하여 실행시킨다는 뜻이다. 따라서 우리는 아래와 같이 car.run() 메서드를 수행시킬 수 있다.
public static void main(String[] args) {
ApplicationContext aContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Car car = (Car) aContext.getBean("car");
car.run(); // 결과: Execute Engine
}
References
'BackEnd > Spring' 카테고리의 다른 글
[Spring JDBC] Connection Pool, DataSource란? (0) | 2023.01.27 |
---|---|
[Spring] Java Config를 활용한 Bean 등록 방법 (0) | 2023.01.25 |
Maven에서 Spring 사용법 (pom.xml 설정) (0) | 2023.01.25 |
IoC/DI 컨테이너란? (0) | 2022.12.27 |
Spring이란? (0) | 2022.12.27 |