-
Spring - 제어의 역전, 의존성 주입CS/Spring 2024. 6. 19. 23:56

스프링 핵심 기능 2가지 - 제어의 역전, 의존성 주입
제어의 역전 (IoC : Inversion of Control)
일반적인 자바 개발에서는 클래스를 사용하려면 클래스 객체를 생성해 사용해야 한다. 따라서 객체를 생성하고 사용하는 작업들을 모두 개발자가 직접 제어를 한다.
하지만 스프링에서는 개발자가 사용할 객체를 직접 사용하지 않고 객체의 생명 주기 즉, 객체가 생성되고 소멸되는 모든 과정을 스프링 컨테이너가 관리한다. 말그대로 객체 관리권이 개발자가 아닌 컨테이너로 역전된 것이다.
제어의 역전을 통해 의존성 주입, 관점 지향 프로그래밍 등이 가능해진다.
아래와 같은 코드가 있을 때, Class01 클래스의 method를 사용하기 위해서는 Class02에서처럼 new를 통해 객체를 생성해야 한다.
하지만 스프링의 경우 Class03처럼 객체를 생성하지 않아도 Class01의 method를 사용할 수 있다. 코드가 실행될 때 이미 스프링 컨테이너가 객체를 생성해주기 때문이다. (객체 생성 시점에 관한 내용은 다음 포스팅에서 다룰 예정)
public class Class01{ int a=1; public void method(){ System.out.println(a); } } // 일반적인 자바 public class Class02{ Class01 class01 = new Class01(); //객체를 생성 public void run(){ class01.method(); // 객체를 생성하지 않으면 오류 } } // 스프링 제어의 역전 public class Class03{ Class01 class01; public void run(){ class01.method(); // 객체를 생성하지 않아도 오류가 생기지 않고 실행됨. } }의존성 주입 (Di : Dependency Injection)
제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식이다. 말이 어렵지만 그냥 해당 클래스에서 필요한 객체를 생성해주는 것을 말한다.
의존성을 주입하는 방법은 세 가지가 있다.
💡의존성이란?
제어의 역전에서 든 예시코드의 경우 Class01이 있어야 Class03이 정상작동을 한다. Class03이 Class01에 의존한다고 볼 수 있다. 이를 의존성이라고 한다.1. 생성자를 통한 주입
기존 자바 코드랑 다를게 없어보이지만, 사실 스프링에서는 객체를 생성할 필요가 없기 때문에(@Controller 어노테이션이 붙은 클래스만) 여기서 생성자는 객체를 생성하기 위한 생성자가 아니라 의존성을 주입하기 위한 생성자이다.
@RestController public class Controller{ Class01 class01; public Controller(Class01 class01){ this.class01=class01; } public void run(){ class01.method(); } }2. 필드 객체 선언을 통한 의존성 주입
@Atowired라는 어노테이션을 통해 의존성을 주입할 수 있다. 생성자를 통한 방식보다 코드가 간단하다.
@RestController public class Controller{ @Autowired Class01 class01; }3. setter을 통한 의존성 주입
@RestController public class Controller{ Class01 class01; public void setController(Class01 class01){ this.class01=class01 } }스프링 공식 문서에서는 생성자를 통한 주입을 권장한다.
순환 참조 오류가 있을 경우 생성자 방법을 사용하면 컴파일부터 안돼서 에러 찾기가 쉽다. 하지만 필드 객체를 통한 방법은 순환 오류가 있더라도 컴파일이 된 후에 문제가 있는 코드가 실행되기 전까지는 에러가 발견되지 않는다.
💡순환 참조 오류?
A 라는 클래스가 B 클래스를 참조하고,B클래스가 C클래스를 참조하고, C클래스가 A클래스를 참조할 때
만약 A가 제대로 생성이 안되면 C, B가 정상작동 되지 않을 것이다. 이 경우가 순환 참조 오류이다.'CS > Spring' 카테고리의 다른 글
JPA - N+1 문제 해결하기, 성능개선(페이징 처리) (0) 2024.07.22 Spring Security - 동작 과정, 로그인 구현하기 (0) 2024.07.04 📬JPA, Spring Mail 사용해 이메일 인증 기능 구현하기 (+SMTP,IMAP) (0) 2024.06.29 Spring - 스프링 부트의 동작 방식 (2) 2024.06.27 JPA - save 메서드에 대하여🤯 (엔티티 생명주기, isNew(), @GeneratedValue, persist(),merge()) (0) 2024.06.26