Spring

DI( 의존성 주입 )

yooky 2022. 2. 9. 22:31

DI ( Dependency injection ) - 의존성 주입

객체를 사용하기 위하여 미리 만들어진 객체를 Spring에서 주입 시켜주는 행위

=> 나 이 객체 쓸래 ! 하면 스프링에서 해당객체가 있는지 찾아서 집어넣어줌

 

어떻게 집어넣어주냐

=> 2.x까지는 객체 정보 및 의존성 주입을 xml에서 지정 일일히 빈 클래스를 만들어서 

=> 2.5x~부터는 Spring이 자동관리 요청만 하면 됨 

 

 

Spring에서 사용할 핵심 클래스들은 Spring에서 객체를 생성한다.

우리가 따로 만들필요 없음

 

Spring 구동 => 파일 조회 => @기반으로 객체를 생성 => DI

객체생성과 DI는 상호보완적 객체생성이되야 DI될 때도 있고 DI가 되야 객체생성이 되야할 떄도 있음

 

 

Service : 우리가 기능을 구현할 때 용도에 맞춰 분리된 거

우리가 객체를 만들 때 기능하고 외부저장소에 접근하는 걸 분리함

컨트롤러에서 기능을 요청하기위해 인터페이스가 필요

 

컨트롤러에서 사용 요청 => 인터페이스명이 동일한 것을 확인 => 해당 인터페이스를 참조하고 있는 클래스 => 주입

컨트롤러는 특별관리대상 

그 외 객체는 주입개념 필요시마다 빌려주는 

 

객체만 가지고 찾기엔 양이 너무 많음 

DI에서 인터페이스 = 이름표

DI에서 인터페이스는 클래스를 특정짓는 역할

 

 

기본세팅 @service어노테이션과 인터페이스 참조

 

DI 사용법

컨트롤러에 @Autowired 와 인터페이스 선언

 

* 인터페이스가 필요한 이유 

인터페이스를 거치지않으면 클래스와 컨트롤러와 직결됨
그러면 컨트롤러에서 내용이 직결되어있기때문에 보안이 떨어짐 
스프링의 주 목적은 안정성과 보안이 목적이기 때문에 인터페이스를 사용하도록 하자

 

예제 - DI를 이용한 구구단 출력하기

 

- Testcontroller.java

@Autowired
	public ITestService iTestService;

@RequestMapping(value = "/test4")
	public ModelAndView test4(ModelAndView mav
			,@RequestParam int dan) { 
		 //단값 취득
		
		String gugu = iTestService.getGugu(dan); 
		//서비스 호출하여 구구단 결과 취득
		
		//취득한 데이터 화면에 전송
		mav.addObject("gugu",gugu);
		
		mav.setViewName("test/test4");
		
		return mav;
	}

 

- ITestService

package com.spring.test.service;

public interface ITestService {
	
	public void test();

	public String getGugu(int dan);


}

원래는 getGugu a = new getGugu(); 와 같이 객체를 생성하고 객체의 메소드를 호출해야하지만

@Autowired(= 해당 인터페이스에 객체를 주입 )때문에 그럴 필요가 없다.

 

- TestService

package com.spring.test.service;

import org.springframework.stereotype.Service;

@Service
public class TestService implements ITestService{

	@Override
	public String getGugu(int dan) {
		String gugu = "";
		
		for(int i = 1; i < 10;i++) {
		gugu += dan +" * "+ i + " = " + (dan * i) +"<br/>"; 
		}
		return gugu;
	}

	@Override
	public void test() {
		// TODO Auto-generated method stub
		
	}
	
}