Spring DI 의존 주입 코드로 살펴보기(1) - 자바 코드로 주입

Jiwon·2024년 1월 27일
0

Spring DI

스프링에서 DI를 사용하는 방법은 3가지이다.
1. 빈 설정 xml
2. 자바 코드를 이용
3. 애너테이션 이용

스프링 부트는 xml 사용을 최소화하기 때문에 2,3번 방법의 의존 주입을 많이 사용한다.

🛠️ 코드 Preview
1. 자바 코드를 이용하는 DI 방법
Printer 인터페이스를 구현한 2개의 구현체 PrinterA와 PrinterB가 있고, 일반 객체인 Book이 있다.
빈을 등록할 때 2개의 Book 클래스의 빈 이름을 다르게 설정한다.

/* Printer.java */
public interface Printer{
	public void print(String message);
}

/* PrinterA.java */
public class PrinterA implements Printer{ // interface의 첫번째 구현체
	@Override
    public void print(String message) {
    	System.out.println("Printer A : " + message);
    }
}

/* PrinterB.java */
public class PrinterB implements Printer{ // interface의 두번째 구현체
	@Override
    public void print(String message) {
    	System.out.println("Printer B : " + message);
    }
}

/* Book.java */
public class Book {
	private String title;
    private String writer;
    private Printer printer;
	
    public Book() {}
    
    public Book(String title, String writer, Printer printer){
    	this.title = title;
        this.writer = writer;
        this.printer = printer;
    }
    
    public void setTitle(String title) { this.title = title; }
    public void setWriter(String writer) { this.writer = writer; }
    public void setPrinter(Printer printer) { this.printer = printer; }
    
    public void print(){
    	printer.print("Hello "+title+" : "+writer);
    }
}

/* Config.java */
@Configuration // 스프링 설정으로 사용되는 클래스
public class Config {
	@Bean // 메서드 단위에만 붙히는 애너테이션, 리턴값이 빈 객체로 사용됨을 알림
    public Book book1(){
    	// 1. Setter 메서드를 이용한 의존성 주입
    	Book book1 = new Book();
        book1.setTitle("해리포터");
        book1.setWriter("J.K.롤링");
        book1.setPrinter(new PrinterA());
        return book1;
    }
    
    @Bean(name="hello") // 해당 클래스를 빈으로 등록할 때 이름을 지정할 수 있음
    public Book book2(){
    	// 2. 생성자를 이용한 의존성 주입
   		return new Book("나니아연대기", "C.S.루이스", new PrinterA());
    }
    
    @Bean
    public PrinterA printerA(){
    	return new PrinterA(); // 생성자를 이용한 의존성 주입
    }
    
    @Bean
    public PrinterB printerB(){
    	return new PrinterB(); // 생성자를 이용한 의존성 주입
    }
}

/* CodeApplication.java */
public class CodeApplication {
	public static void main(String[] args){
    	// 1. IoC 컨테이너 생성
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        
        // 2. Book Bean 가져오기
        Book book1 = (Book)context.getBean("book1");
        book1.print();  // 출력 > Printer A : Hello 해리포터 : J.K.롤링
        
        // 3. Book Bean 가져오기
        Book book2 = context.getBean("hello", Book.class);
        book2.print(); // 출력 > Printer A : Hello 나니아연대기 : C.S.루이스
        
        // 4. PrinterB Bean 가져오기
        Printer printer= context.getBean("printerB", Printer.class);
		book1.setPrinter(printer); 
        book1.print(); // 출력 > Printer B : Hello 해리포터 : J.K.롤링
        
        // 5.싱글톤인지 확인
        if(book1 == book2)
        	System.out.println("동일한 객체");
        else
        	System.out.println("서로 다른 객체");
        // 출력 > 서로 다른 객체
    }
}           
		
  • Config 클래스에서 의존성을 주입할 때 Book 클래스 2개를 다른 빈 이름으로 지정하였기 때문에, 같은 구조의 클래스라도 다른 객채로 주입되었음을 확인할 수 있다. (마지막 5.싱글톤인지 확인하는 코드를 통해)
profile
작은 개발 기록

0개의 댓글