자바같은 객체 지향 프로그래밍 언어에서 class는 특정 기능을 수행하는 부품 역할을 한다.
애플리케이션이 사용자의 요구사항에 따라 클래스 기능을 변경하거나 다른 클래스 기능으로 대체해야 하는 경우가 생기기때문에 의존성 주입(DI)와 제어역행(IoC)가 필요하다.
DI(Depedency Injection) - 의존성 주입
class와 class간의 의존성과 결합도가 높다.
의존성, 결합도, 중복성이 낮을수록 좋은 프로그램이다
객체선언을 XML로 해줌으로써 의존성을 낮출 수 있다.
데이터 전송은 setter와 생성자로 진행된다.
외부로부터 메모리에 올라가있는 인스턴스의 레퍼런스를 인터페이스 타입의 파라미터로 의존관계를 설정하는것을 말한다. 스프링에선 IoC라는 용어만 가지고는 개념이 너무 추상적이라 그 핵심을 짚는 용어가 필요했는데, 이때 몇몇 사람들의 제안으로 만든 용어가 바로 DI인 것이다.
의존관계 주입 방법
필드를 이용한 의존관계 주입 (Field Injection)
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private CourseService courseService;
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
setter() 메서드를 이용한 의존관계 주입 (Setter Injection)
@Service
public class StudentServiceImpl implements StudentService {
private CourseService courseService;
@Autowired
public void setCourseService(CourseService courseService) {
this.courseService = courseService;
}
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
생성자를 이용한 의존관계 주입 (Constructor Injection)
@Service
public class StudentServiceImpl implements StudentService {
private final CourseService courseService;
@Autowired
public StudentServiceImpl(CourseService courseService) {
this.courseService = courseService;
}
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
[Spring xml파일생성]
[appCTX.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="su" class="com.java.di01.Su"/> <bean id="example" class="com.java.di02.Example"/> <bean id="testing" class="com.java.di02.Testing"/> </beans>
Su.java
package com.java.di01;
public class Su {
public void disp() {
System.out.println("Su Class disp Function");
}
}
MainClass.java
package com.java.di01;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
/*
* 클래스간의 결합이 강해지고 의존성이 높아지면 코드를 수정해야하는 범위가 넓어진다.
* 클래스간의 결합도를 약하게 하고 의존성을 낮게 작성해야한다.
* 이런 처리 방식의 설계 패턴을 방식이 DI(Dependency Injection)라고 한다.
* DI는 의존객체를 외부로부터 전달받아서 구현한다.
*/
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("appCTX.xml");
Su su = (Su)ctx.getBean("su");
su.disp();
ctx.close();
}
}
Example.java
package com.java.di02;
public class Example {
public void disp() {
System.out.println("Example Class disp Function");
}
}
Testing.java
package com.java.di02;
public class Testing {
public void print() {
System.out.println("Testing Class print Function");
}
}
MainClass.java
package com.java.di02;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.java.di01.Su;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("appCTX.xml");
Example ex = (Example) ctx.getBean("example");
ex.disp();
Testing test = (Testing) ctx.getBean("testing");
test.print();
Su su = (Su) ctx.getBean("su");
su.disp();
ctx.close();
}
IoC(Inversion of Control, 제어의 역전)
오브젝트 생성, 관계설정, 사용, 제거 등 오브젝트 전반에 걸친 모든 제어권을 애플리케이션이 갖는게 아니라 프레임워크의 컨테이너에게 넘기는 개념을 말한다. 참고로 스프링 프레임워크 만의 개념이 아니다.
스프링에서는 저 '오브젝트'를 '빈(Bean)'이라고 칭한다.
💡 의존관계
서로 다른 객체간에 레퍼런스 참조가 되어 있다는 말이다.
public class BestStar {
private Star star;
public BestStar()
star = new Star();
// BestStar 생성자에서 Star 클래스와의 의존관계를 애플리케이션 단에서 직접 설정하고 있다.
}
}
그런데 스프링이 제공하는 @Autowired 어노테이션을 사용함으로써 개발자가 직접 의존관계를 설정해주는 코드가 사라지고 프레임워크에 BestStar, Star 오브젝트 의존관계의 제어권을 맡길 수 있게 된 것이다.
public class BestStar {
@Autowired
private Star star;
}
💡 IoC가 필요한 이유? - 객체지향 원칙을 잘 지키기 위해
객체를 관리해주는 프레임워크와 내가 구현 하고자 하는 부분으로 역할과 관심을 분리해 응집도를 높이고
결합도를 낮추며, 이에 따라 변경에 유연한 코드를 작성 할 수 있는 구조가 될 수 있기 때문에 제어를 역전한 것이다.
출처
https://beststar-1.tistory.com/33
IoC(Inversion of Control, 제어의 역전) / DI(Dependency Injection, 의존관계 주입)
💡 이 포스팅은 스프링 스터디에 맞게 구성된 것이며, 추후 글의 구조와 다루는 범위가 변경될 수 있으니 참고 바란다. IoC(Inversion of Control, 제어의 역전) 오브젝트 생성, 관계설정, 사용, 제거
beststar-1.tistory.com
https://hyonee.tistory.com/232?category=952354
스프링 프레임워크 - [Spring] DI(Depedency Injection)
DI(Depedency Injection) class와 class간의 의존성과 결합도가 높다. 의존성, 결합도, 중복성이 낮을수록 좋은 프로그램이다 객체선언을 XML로 해줌으로써 의존성을 낮출 수 있다. 데이터 전송은 setter
hyonee.tistory.com
'Coding > SPRING' 카테고리의 다른 글
[Spring] AOP / 공통 클래스(Aspect), 공통 함수(Advice), 핵심코드(JoinPoint)=Part.2 (0) | 2022.04.07 |
---|---|
[Spring] AOP(Aspect Oriented Programming)=Part.1 (0) | 2022.04.07 |
[Spring] 다운로드 (0) | 2022.04.07 |