[Java/Spring] Ioc, DI (의존관계주입)

Hyeri Park·2022년 7월 14일
0

JAVA/Spring 기초

목록 보기
10/22
post-thumbnail

1. IoC (Inversion of Control)

  • 스프링에서는 일반적인 JAva 객체를 new로 생성하여 개발자가 관리하는 것이 아닌 Spring Container에 모두 맡긴다.
  • 즉, 개발자에서 -> 프레임워크로 제어의 객체 관리의 권한이 넘어갔음으로 "제어의 역전" 이라고 한다.

스프링 컨테이너란?

스프링 컨테이너는 Bean들의 생명주기를 관리한다.
또한 어플리케이션을 구성하는 모든 Bean들을 관리하기 위해 IoC를 사용한다.

스프링 컨테이너의 종류에는 BeanFactory와 이를 상속한 ApplicationContext가 있다.
이 두개의 컨테이너로 의존성 주입된 빈들을 제어하고 관리할 수 있다.

@Component

@Component 어노테이션을 이용하면 Bean Configuration 파일에 Bean을 따로 등록하지 않아도 사용할 수 있다.
빈 등록자체를 빈 클래스 자체에다가 할 수 있다는 의미이다.
@Component 어노테이션은 기본적으로 타입기반의 자동주입 어노테이션이다.

package com.example.springioc;

import java.util.Base64;

import org.springframework.stereotype.Component;

// spring -> 객체관리요청 

@Component
public class Base64Encoder implements IEncoder{
	
	public String encode(String message) {
		return Base64.getEncoder().encodeToString(message.getBytes());
		
	}
}



2. DI (Dependency Injection)

1) DI 장점

  • 의존성으로 부터 격리시켜 코드 테스트에 용이하다.
  • DI를 통하여 불가능한 상황을 Mock와 같은 기술을 통하여 안정적으로 테스트 가능하다.
  • 코드를 확장/변경할때 영향을 최소화한다 (추상화)
  • 순환참조를 막을 수 있다.

2) 실습코드

프로젝트경로

Base64Encoder.java

package com.company.ioc;

import java.util.Base64;

//public class Base64Encoder {
//	
//	public String encode(String message) {
//		return Base64.getEncoder().encodeToString(message.getBytes());
//		
//	}
//}

public class Base64Encoder implements IEncoder{
	
	public String encode(String message) {
		return Base64.getEncoder().encodeToString(message.getBytes());
		
	}
}

UrlEncoder.java

package com.company.ioc;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

//public class UrlEncoder {
//	
//	public String encode(String message) {
//		try {
//			return URLEncoder.encode(message, "UTF-8");
//		} catch (UnsupportedEncodingException e) {
//			e.printStackTrace();
//			return null;
//		}
//	}
//}


public class UrlEncoder implements IEncoder{
	
	public String encode(String message) {
		try {
			return URLEncoder.encode(message, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
	}
}

IEncoder.java (interface)
package com.company.ioc;

public interface IEncoder {
	String encode(String message);
	
}

Encoder.java
package com.company.ioc;



public class Encoder {
	
	
	private IEncoder iEncoder;
	
	// 간단히 설정된 Encoder
	//생성자 
//	public Encoder() {
//		//this.iEncoder = new Base64Encoder();	
//		this.iEncoder = new UrlEncoder();	
//	}

	public Encoder(IEncoder iEncoder) {
	//this.iEncoder = new Base64Encoder();	
	// this.iEncoder = new UrlEncoder();
		this.iEncoder = iEncoder;
}
	public String encode(String message) {
		return iEncoder.encode(message);
		
	}
}

Main.java
package com.company.ioc;

public class Main {

	public static void main(String[] args) {
		String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
		
		// Base 64 encoding 
		//Base64Encoder encoder = new Base64Encoder();
		IEncoder encoder = new Base64Encoder();
		String result = encoder.encode(url);
		System.out.println("Base64 Encoder : " + result);
		
		// URL encoding
		// UrlEncoder urlencoder = new UrlEncoder();
		IEncoder urlencoder = new UrlEncoder();
		String Urlresult = urlencoder.encode(url);
		System.out.println("UrlEncoder : " + Urlresult);
		
		// 간단한 설정 Encoder 
		//Encoder encoder2 = new Encoder();
		//String result2 = encoder2.encode(url);
		//System.out.println("설정된 Encoder : " + result2);
		
		// DI - 주입 Encoder
		//Encoder encoder2 = new Encoder(new Base64Encoder());
		Encoder encoder2 = new Encoder(new UrlEncoder());
		String result2 = encoder2.encode(url);
		System.out.println("DI Encoder : " + result2);
		
		
		
	}

}

refenrence
https://velog.io/@jaepani5015/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

https://programmingrecoding.tistory.com/13

profile
Backend Developer

0개의 댓글