스프링 프레임워크란 자바 플랫폼을 위한
오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급을 개발하기 위한
모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다.
✔ 엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 말입니다.
즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 환경이라 일컫습니다.
스프링 프레임워크는 경량 컨테이너로 자바 객체를 직접 담고
직접 관리합니다. 객체의 생성 및 소멸 그리고 라이프 사이클을 관리하며
언제든 Spring 컨테이너로부터 필요한 객체를 가져와 사용할 수 있습니다.
이는 Spring이 IOC 기반임을 의미합니다.
📝IOC(Inversion of Control)란?
⦁ IOC란?
일반적으로 지금까지 프로그램은
📝객체 결정 및 생성 -> 의존성 객체 생성 -> 객체 내의 메서드 호출
하는 작업을 반복했습니다.
이는 각 객체들이 프로그램의 흐름을 결정하고
각 객체를 구성하는 작업에 직접적으로 참여한 것입니다.
즉, 모든 작업을 사용자가 제어하는 구조인 것입니다.
하지만 IOC는 이 구조를 바꿉니다.
IOC에서의 객체는 자기가 사용할 객체를 선택하거나 생성하지 않습니다.
또한, 자신이 어디서 만들어지고 어떻게 사용되는지 모릅니다.
자신의 모든 권한을 다른 대상에 위임함으로써
제어 권한을 위임받은 특별한 객체에 의해 결정되고 만들어집니다.
즉, 제어의 흐름을 사용자가 컨트롤 하지 않고 위임한
특별한 객체에 모든 것을 맡기는 것입니다.
정리하면, IOC란 기존에 사용자가 모든 작업을 제어하던 것을
특별한 객체에 모든 것을 위임하여 객체의 생성부터
생명주기 등 모든 객체에 대한 제어권이 넘어간 것을 IOC, 제어의 역전이라고 합니다.
⦁ IOC의 구성요소 2가지
✔ IOC는 DI와 DL에 의해 구현됩니다.
⦁ 1. DL (Dependency Lookup) 의존성 검색
컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 빈을 저장하는데 저장소에 저장되어 있는 개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈 을 검색하는 방법입니다.
⦁ 2. DI (Dependency Injection) 의존성 주입
의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것입니다.
객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미합니다.
그렇다면 IOC에서의 DI는 무엇일까요?
바로 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가
자동으로 연결해 주는 것입니다.
📝 DI (의존성 주입) 실습
⦁ 자바 빈즈 클래스 생성
package day.day1.app;
public class Student {
private String name;
private int age;
private String gradeNum;
private String classNum;
public Student() {
}
public Student(String name, int age, String gradeNum, String classNum) {
this.name = name;
this.age = age;
this.gradeNum = gradeNum;
this.classNum = classNum;
}
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;
}
}
✔ 필드와 Get / Set 메서드를 가진 자바 빈즈 클래스입니다.
⦁ applicationCTX.xml 파일 생성
✔ xml 파일을 Java Resources안에 생성해주세요.
네임 스페이스와 스키마 속성을 갖는 태그를 작성합니다.
<?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 태그 속성
<bean id="빈 이름 설정" class="day.day1.app.Calculator"/>
⦁ class : 빈 클래스 (필수)
⦁ id : 빈 이름(id)
⦁ scope : singleton / prototype
⦁ primary : true를 지정하여 같은 타입의 빈이 여러개 일때 우선적으로 사용할 빈 설정
⦁ lazy-init : true를 지정하여 빈을 사용할 때 객체가 생성되도록 설정 (메모리 효율 ↑)
⦁ init-method : 빈 객체가 생성될 때 호출할 메서드 설정
⦁ destory-method : 빈 객체가 소멸될 때 호출할 메서드 설정
⦁ DI (의존성 주입) 2가지 방법
1. Setter 방식 - property 주입
<bean id="student" class="day.day1.app.Student">
<property name="name" value="현기"/>
<property name="age" value="24"/>
<property name="gradeNum" value="A+"/>
<property name="classNum" value="12345"/>
</bean>
✔ <property>의 value 속성에 값을 줍니다.
2. 생성자 방식 - constructor-arg 사용
<bean id="student" class="day.day1.app.Student">
<constructor-arg>
<value>현기</value>
</constructor-arg>
<constructor-arg>
<value>24</value>
</constructor-arg>
<constructor-arg>
<value>A+</value>
</constructor-arg>
<constructor-arg>
<value>12345</value>
</constructor-arg>
</bean>
+ 2가지 방식 모두 ref 속성을 이용해서 객체를 전달할 수도 있습니다.
<constructor-arg ref = "student"/>
+ List, Map 등 다양한 타입도 주입이 가능합니다.
//예시 입니다.
<property name="developers">
<list>
<value>Cheney.</value>
<value>Eloy.</value>
<value>Jasper.</value>
<value>Dillon.</value>
<value>Kian.</value>
</list>
</property>
⦁ MainClass.java
package day.day1.app;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
//컨테이너 생성
String configLocation = "classpath:applicationCTX.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
//xml에서 빈즈 가져오기
Student student = ctx.getBean("student", Student.class);
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getGradeNum());
System.out.println(student.getClassNum());
//빈즈 반납
ctx.close();
}
}
✔ ApplicationContext는 기본적으로 AbstractApplicationContext의 Interface를
구현한 구현체입니다.
Bean 객체를 생성하고 관리하는 기능을 가진 컨테이너 입니다.
GenericXmlApplicationnContext | 파일 시스템이나 클래스 경로에 있는 XML 파일을 로딩하여 구동하는 컨테이너다. |
XmlWebApplicationContext | 웹 기반의 스프링 어플리케이션을 개발할 떄 사용하는 컨테이너다. |
역시 웹 백엔드 대장 스프링이라
정리하기가 쉽지 않습니다..
잘 정리해 두신 여러 블로그를 참고해서 작성하였으니
밑에 참고문헌 링크 한 번씩 보시는 걸 추천드립니다! 😆
참고 문헌 :
https://velog.io/@ehdrms2034/Spring-MVC-Application-Context.xml
https://october-east-sea.tistory.com/157
'Back-End > Spring' 카테고리의 다른 글
[Spring] 자바 스프링 AOP란?, AOP 개념 정리 (프록시, AspectJ) (0) | 2022.10.27 |
---|---|
[Spring] 자바 스프링 한글 깨짐 해결 (filter) (0) | 2022.10.27 |
[Spring] 자바 스프링 프로퍼티(properties) 파일 데이터 가져오기 (0) | 2022.10.27 |
[Spring] DI(의존성 주입) @Configuration @Bean 어노테이션 사용방법 (0) | 2022.10.26 |
[Spring] 이클립스 자바 스프링 설치 방법 (0) | 2022.10.24 |