[spring]Dependency Injection

·2024년 5월 29일
0

spring

목록 보기
2/8
post-thumbnail

의존성 주입 방법

@Autowired 어노테이션 이용하여 의존성 주입할 수 있다.

필드 주입

가장 간단해요 !
필드에 @Autowired 를 붙여서 의존성 주입한다
그렇지만 ..
final 을 붙일 수 없어요 .😥 ....->변경될 여지가 있음.

setter 주입

setter(메소드)에 @Autowired 를 붙여서 클래스 타입의 빈을 찾아와서 의존성을 주입한다.
생성 시점 이후 메소드를 호출하여 의존성 변경 가능 .

그러나 필드가 외부에서 변경될 수 있다는 점 ,
의존성이 필요한 시점에 주입되지 않을 수도 있음

생성자 주입

클래스 생성자에 @Autowired 를 붙여 클래스 타입의 필드들을 찾아서 등록.
선언하는 클래스에 final 붙이기 가능
스프링에서 가장 권장되는 주입방식

장점 !

  • final 로 선언 가능 -> 변경 불가
  • 의존성 주입 시점에서 문제 발생확률 ⏬
  • 생성자에서만 ! 의존성 주입이 일어남.. 그래서 가독성 높고 관리하기 용이함 .

직접 테스트를 하러 가보장 ..!😀

의존성주입TEST

DTest1.java

import org.springframework.stereotype.Component;

@Component
public class DTest1{

	public void print(){
    		System.out.println("DTest1임 ");
            
            }
            
       }

DTest2.java

package~..

import org.springframework.stereotype.Component;

@Component
public class DTest2{
	//필드
	private final DTest1 dTest1;
    
    //생성자
    //생성자를 통해 DTest1객체를 dTest1 필드에 할당한다
    public DTest2(DTest1 dTest1){
    	this.dTest1 = dTest1;
        }
     
     //메서드
     //dTest1 의 print() 메서드 호출 후 출력한다 
    public void print2(){
    	dTest1.print();
        System.out.println("DTest2");
       }
       
    }

※ @Component 어노테이션

DTest1, DTest2 클래스에 붙어 있죠 ? 이를 통해 이 클래스들은 Spring 컨테이너에 의해 관리되는 빈으로 등록된다.

Spring 애플리케이션이 시작될때 @Component 가 붙은 클래스들은 자동으로 인스턴스화되고 컨테이너에 등록된다 이말 ..!

※ 의존성 주입

DTest2 클래스가 DTest1 클래스를 의존성으로 가지고 있는 상황
DTest2 생성자는 DTest1 타입의 매개변수를 받는다 .. Spring은 이 생성자를 호출하여 DTest1 빈을 DTest2 빈에 주입하는데? 이를 생성자 주입이라 한다

※참고
class DTest2⬇️{ .. -> ⬇️ 여기서 alt+enter 누르면 바로 Test 만들 수 있다_

1. 필드 주입

DTest1Test.java

package com.~~

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DTest1Test{

	//필드 주입
    @Autowired
    private DTest1 dTest1;

        
     @Test
     void print(){
     
     	//여기 두 줄은 그냥 순수 자바.
     	DTest1 test1 = new DTest1();
        test1.print();
        
        dTest1.print();
        }
     }   
  

2. setter 주입

DTest1Test.java

package com.~~

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DTest1Test{


    //setter 주입
    public void setDTest1(DTest1 dTest1){
    	this.dTest1 = dTest1;
        }
        
     @Test
     void print(){
        dTest1.print();
        }
     }   

3. 생성자 주입

DTest1Test.java

package com.~~

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DTest1Test{


	//생성자 주입
    private final DTest1 dTest1;
    
    @Autowired 
    public DTest1Test(DTest1 dTest1){
    	this.dTest1 = dTest1;
        
       }



        
     @Test
     void print(){
        dTest1.print();
        }
     }   

이건 DTest2Test.java ..그니까 아까 클래스 보면 DTest1, DTEst2 둘 다 콘솔창에 출력되어야 해야겠 죠 ?

DTest2Test.java

package com.~

import org.junit.jupiter.api.Test;
iport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class DTest2Test{

	@Autowired
    private DTest2 dTest2;
    
    @Test
    void test(){
    	dTest2.print2();
       }
       
     }
출력
DTest1
DTest2
profile
어리둥절 빙글빙글 돌아가는 코딩세상~

0개의 댓글