개발새발/Spring

220218_스프링 입문_스프링을 조금 더 들여다보기_IoC, DI(1)_패스트캠퍼스 챌린지 26일차

막동이아빠 2022. 2. 18. 23:34

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일차 강의 완료~

필기 & 내 화면 스크린샷 저장

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.