Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- pack
- 백준
- sizeof()
- 에라토스테네스의 체
- 2025
- EOF
- struct
- Wait
- handling
- strlen()
- 정보처리기사
- 필기
- fread()
- Docker
- fork
- Kafka
- 구조체
- scanf()
- fwrite()
- 카운팅 정렬
- endif
- 자식
- half-close
- DEBUG
- ifdef
- 1929
- 10989
- fgets()
- container
- signal
Archives
- Today
- Total
팥빵 먹으면서 코딩하는 블로그
DI에 대하여 본문
- DI(Dependency Injection)
직역하면 외부로부터 내가 사용할 객체를 주입을 받는다는 의미.
DI 장점
01. 의존성으로부터 격리시켜 코드 테스트에 용이하다.
(꼭 저 아이가 없더라도 테스트 가능하게 만듦.)
02. DI를 통하여, 불가능한 상황을 Mock와 같은 기술을 통하여 안정적으로 테스트 가능하다.
(원래는 배포를 해야지만 테스트가 가능했지만 이를 어떠한 응답이 올거란 기댓값을 넣어두고 로직을 넣으며 테스트 가능하다.)
03. 코드를 확장하거나 변경할 때, 영향을 최소화 한다.(추상화)
04. 순환참조를 막을 수 있다.
(내가 나를 참조한다던지, 내가 다른 객체를 참조했는데 그 객체가 나를 다시 참조한다던지 하는 것을 막을 수 있다.)
- java 프로젝트 (java spring 프로젝트 X)
- main
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";
/*
base64 encoder와 url encoder는 본질이 encoder로 같다.
따라서 Encoder라는 상위 클래스를 만들어준다.
또한 encode의 본질을 갖고 있는 세 encoder들은 encoder라는 동일점을 같고 있으므로
interface로 IEncoder를 만들어주어 동일 method를 사용하게 해준다.
*/
/*
base64로 인코딩하고 싶으면 객체에 new Base64Encoder()를 넣으면 되고
url로 인코딩하고 싶으면 객체에 new urlEncoder()를 넣으면 된다.
-> DI개념 덕에 본질을 바꾸지 않고 main에서 바꿔 사용할 수 있는 것.
*/
Encoder encoder = new Encoder(new Base64Encoder());//di 개념 도입(외부에서 객체를 주입받음)
String result = encoder.encode(url);
System.out.println(result);
}
}
- iEncoder( interface )
package com.company.ioc;
/*
base64 encoder와 url encoder는 본질이 encoder로 같다.
따라서 Encoder라는 상위 클래스를 만들어준다.
또한 encode의 본질을 갖고 있는 세 encoder들은 encoder라는 동일점을 같고 있으므로
interface로 IEncoder를 만들어주어 동일 method를 사용하게 해준다.
*/
public interface IEncoder {
String encode(String message);
}
- Encoder
package com.company.ioc;
/*
base64 encoder와 url encoder는 본질이 encoder로 같다.
따라서 Encoder라는 상위 클래스를 만들어준다.
또한 encode의 본질을 갖고 있는 세 encoder들은 encoder라는 동일점을 같고 있으므로
interface로 IEncoder를 만들어주어 동일 method를 사용하게 해준다.
*/
public class Encoder implements IEncoder {
private IEncoder iEncoder;
//생성자 : di개념을 도입해 본질적인 class에서 encoding 개념을 직접적으로 바꾸지 않게 한다.
public Encoder(IEncoder iEncoder){
this.iEncoder = iEncoder;
/* 객체를 받아오지 않았다면, 이 생성자에서
this.iEncoder = new Base64Encoder();
this.iEncoder = new UrlEncoder();
번갈아 고쳐야 했음.
*/
}
public String encode(String message){
return iEncoder.encode(message);
}
}
- Base64 Encoder
package com.company.ioc;
import java.util.Base64;
public class Base64Encoder implements IEncoder {
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
- UrlEncoder
package com.company.ioc;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrlEncoder implements IEncoder{
public String encode(String message){
try {
return URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
'study > JAVA SPRING' 카테고리의 다른 글
AOP에 대하여 (0) | 2024.08.30 |
---|---|
IoC에 대하여 (0) | 2024.08.30 |
spring에 대하여 (0) | 2024.08.29 |
Object Mapper (0) | 2024.08.29 |
controller 00. (0) | 2024.08.29 |