의존성 주입(Dependency Injection, DI)

콜라맘·2023년 7월 3일
0

Spring

목록 보기
4/14
post-thumbnail

🍀 Dependency Injection

  • 외부에서 두 객체간의 관계를 결정해주는 디자인 패턴
  • 인터페이스를 사이에 두어 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있도록 한다
  • 유지보수성이 좋아진다는 장점이 있다

🌼 스프링이 자동으로 컨텍스트에 등록하는 어노테이션들

  • @Component : 컨텍스트 로드시에 스프링이 자동으로 수거해가는 대상이 된다, 컴포넌트 스캔을 통해 특정 패키지의 컴포넌트들을 수거할 수 있다
  • @Controller : MVC패턴에서 컨트롤러 역할을 하는 컴포넌트들을 표시해놓는 어노테이션
  • @Repository : MVC패턴에서 모델 역할을 하는 컴포넌트들을 표시해놓는 어노테이션
  • @Service : MVC패턴에서 비즈니스 로직을 수행하는 컴포넌트들을 표시해놓는 어노테이션

🌼 @Autowired를 통한 의존성 주입

  • @Autowired가 적용되어 있는 자원은 컨텍스트 영역에 등록된 컴포넌트들 중 알맞은 컴포넌트를 자동으로 찾아 인스턴스를 주입해준다
  • 생성자를 사용하지 않아도 스프링이 대신 인스턴스를 생성하여 주입해주기 때문에 클래스 간의 결합도가 낮아져 유지보수성이 올라가는 효과가 있다

🌼 Java Bean Object(자바빈 객체)

  • 데이터 클래스를 만들 때 자주 사용하던 클래스의 형태를 자바빈 객체라고 한다
  • 필드값(속성)의 접근 제어자는 private이어야 한다 (protected도 됨)
  • 필드값에 대한 접근은 Getter/Setter를 통해 이루어져야 한다
  • 기본 생성자가 반드시 존재해야 한다(다른 생성자를 쓰고 싶다면 기본 생성자를 반드시 명시해줘야 한다)
  • 자바빈 스타일의 객체는 다양한 프레임워크, API, 라이브러리 등에서 기본 형태로 생각하기 때문에 반드시 지켜야한다

🌼 의존성 주입 방법

1. 자바빈 객체 생성
✔ Student.java >>

import org.springframework.stereotype.Component;
@Component
public class Student {
	private String name;
	private String grade;
	public Student(){
		name = "기본 이름";
		grade = "기본 등급";	
	}
	public Student(String name, String grade) {
		this.name = name;
		this.grade = grade;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	@Override
	public String toString() {
		return String.format("%s[%s]", name, grade);
	}
}

2. 컨트롤러에 Autowired 어노테이션 추가
✔ HomeController.java >>

@Controller
public class HomeController {
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@Autowired
	Student student;
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		
		System.out.println("stu : " + student);
		return "home";
	}
}

📺 출력 결과 >>

-> Student를 직접 생성하지 않아도 Autowired으로 자동으로 생성됨을 확인할 수 있다


🍀 컨텍스트에 빈(Bean) 등록하기

  • <bean>을 사용해 직접 등록하거나 컴포넌트 스캔을 통해 등록할 수 있다
  • 컨텍스트에 등록된 자바 객체를 빈(bean)이라고 부른다
  • 컨텍스트에 등록된 객체들은 알아서 적재적소에 사용된다
  • 컨텍스트에 등록되는 객체들은 싱글톤 패턴으로 등록된다

🌼 servlet-context의 Bean Graph

  • 내가 생성한 클래스들이 Bean으로 자동 등록된다
profile
콜라맘 코딩일기

0개의 댓글