220218_스프링 입문_스프링을 조금 더 들여다보기_IoC, DI(1)_패스트캠퍼스 챌린지 26일차
<2022년 02월 18일 _ 패스트캠퍼스 챌린지 26일차>
[스프링 입문_스프링을 조금 더 들여다보기_IoC, DI(1)]
1. IoC (Inversion Of Control)
: 스프링에서는 일반적인 Java 객체를 new로 생성하여 개발자가 관리하는 것이 아닌, Spring Container에 모두 맡긴다
: 개발자에서 -> 프레임워크로 제어의 객체 관리의 권한이 넘어 갔음 으로 '제어의 역전' 이라고 한다
2. DI (Dependency Injection)
: 의존성으로부터 격리시켜 코드 테스트에 용이함
: DI를 통해, 불가능한 상황을 Mock와 같은 기술을 통해, 안정적으로 테스트 가능
: 코드를 확장하거나 변경 할 때 영향을 최소화 함(추상화)
: 순환 참조를 막을 수 있다.
3. 실습
(1) File > New > Project
: Java 11
: Create Project from templete 체크
: 제목, 패키지 : ioc
(2)Encoder 클래스를 만듭니다
package com.company.ioc;
import java.util.Base64;
public class Encoder {
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
(3) 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";
//Base 64 encoding
Encoder encoder = new Encoder();
String result = encoder.encode(url);
System.out.println(result);
}
}
결과:
d3d3Lm5hdmVyLmNvbS9ib29rcy9pdD9wYWdlPTEwJnNpemU9MjAmbmFtZT1zcHJpbmctYm9vdA==
(4) 이번엔 UrlEncoder 클래스를 추가해봅니다
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;
}
}
}
(5) 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";
//Base 64 encoding
Encoder encoder = new Encoder();
String result = encoder.encode(url);
System.out.println(result);
//url encoding
UrlEncoder urlEncoder = new UrlEncoder();
String urlResult = urlEncoder.encode(url);
System.out.println(urlResult);
}
}
결과:
d3d3Lm5hdmVyLmNvbS9ib29rcy9pdD9wYWdlPTEwJnNpemU9MjAmbmFtZT1zcHJpbmctYm9vdA==
www.naver.com%2Fbooks%2Fit%3Fpage%3D10%26size%3D20%26name%3Dspring-boot
인코딩이 잘 되는 것을 확인할 수 있습니다. 하지만 새로운 인코딩이 필요할때마다 인코더를 추가해야 한다?
쉽지 않겠죠..
(6) Encoder와 UrlEncoder 클래스가 비슷한 기능을 한다면? Encoder Interface를 만들어봅시다
package com.company.ioc;
public interface IEncoder {
String encode(String message);
}
: Encoder 와 UrlEncoder 두 곳 모두에서 상속을 받습니다 (Encoder 클래스는 Base64Encoder로 복사 합시다)
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) {
e.printStackTrace();
return null;
}
}
}
package com.company.ioc;
import java.util.Base64;
public class Base64Encoder implements IEncoder{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
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
IEncoder encoder = new Base64Encoder();
String result = encoder.encode(url);
System.out.println(result);
//url encoding
IEncoder urlEncoder = new UrlEncoder();
String urlResult = urlEncoder.encode(url);
System.out.println(urlResult);
//
}
}
: 하지만 여전히 객체를 매번 생성해 주고 있죠? Encoder가 스스로를 가지고 있으면 되지 않을까요?
(7)Encoder를 수정해봅시다
package com.company.ioc;
public class Encoder implements IEncoder{
private IEncoder iEncoder;
public Encoder(IEncoder iEncoder){
this.iEncoder = iEncoder;
}
public String encode(String message){
return iEncoder.encode(message);
}
}
: 이를 메인에 적용하면 하단 두개와 같습니다
DI 는 이런식으로 외부에서 주입을 받는다!!
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
IEncoder encoder = new Base64Encoder();
String result = encoder.encode(url);
System.out.println(result);
//url encoding
IEncoder urlEncoder = new UrlEncoder();
String urlResult = urlEncoder.encode(url);
System.out.println(urlResult);
// Base 64 encoding
Encoder encoder2 = new Encoder(new Base64Encoder());
String result2 = encoder2.encode(url);
System.out.println(result2);
//url encoding
encoder2 = new Encoder(new UrlEncoder());
result2 = encoder2.encode(url);
System.out.println(result2);
}
}
결과:
d3d3Lm5hdmVyLmNvbS9ib29rcy9pdD9wYWdlPTEwJnNpemU9MjAmbmFtZT1zcHJpbmctYm9vdA==
www.naver.com%2Fbooks%2Fit%3Fpage%3D10%26size%3D20%26name%3Dspring-boot
d3d3Lm5hdmVyLmNvbS9ib29rcy9pdD9wYWdlPTEwJnNpemU9MjAmbmFtZT1zcHJpbmctYm9vdA==
www.naver.com%2Fbooks%2Fit%3Fpage%3D10%26size%3D20%26name%3Dspring-boot
Encoder는 건들지 않아도 언제든지 새로운 클래스를 생성해서 IEncoder 를 상속받고 주입해줄 수 있다.
DI의 기본적인 개념이다!
26일차 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220220_스프링 입문_스프링을 조금 더 들여다보기_AOP_패스트캠퍼스 챌린지 28일차 (0) | 2022.02.20 |
---|---|
220219_스프링 입문_스프링을 조금 더 들여다보기_IoC, DI(2)_패스트캠퍼스 챌린지 27일차 (0) | 2022.02.19 |
220217_스프링 입문_스프링을 조금 더 들여다보기_스프링의 핵심_패스트캠퍼스 챌린지 25일차 (0) | 2022.02.17 |
220216_스프링 입문_스프링 부트 시작하기_Object Mapper 및 모범사례_패스트캠퍼스 챌린지 24일차 (0) | 2022.02.16 |
220215_스프링 입문_스프링 부트 시작하기_Response 내려주기 및 모범사례_패스트캠퍼스 챌린지 23일차 (0) | 2022.02.15 |