ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DI사용
    공부/spring 2023. 4. 6. 00:05

    di를 사용 안한 코드

    package NotDi;
    
    public class MyRepository {
        public void saveData(String data) {
            System.out.println("Data saved:" + data);
        }
    }​
    package NotDi;
    
    public class MyService {
        public void doSomething() {
            MyRepository myRepository = new MyRepository();
    
            myRepository.saveData("Hello, world!");
        }
    }
    package NotDi;
    
    public class MyApp {
        public static void main(String[] args){
            MyService myService = new MyService();
    
            myService.doSomething();
        }
    }

    di를 사용했을때 코드

    package DI;
    
    public class MyApp {
        public static void main(String[] args){
            MyService myService = new MyService(new MyRepository());
    
            myService.doSomething();
        }
    }
    package DI;
    
    public class MyRepository {
        public void saveData(String data) {
            System.out.println("Data saved: " + data);
        }
    }
    package DI;
    
    import DI.MyRepository;
    
    public class MyService {
        private final MyRepository myRepository;
    
        public MyService(MyRepository myRepository){
            this.myRepository = myRepository;
        }
        public void doSomething() {
            MyRepository myRepository = new MyRepository();
    
            myRepository.saveData("Hello, world!");
        }
    }

     

    두 코드의 차이점

    객체 생성 방법

    notdi

    - MyService 클래스의 인스턴스를 직접 생성

    - MyRepository 클래스의 인스턴스도 MyService클래스 내에서 생성하여 사용

    - 이건 MyService 클래스가 MyRepository 클래스에 의존적 => MyRepository 클래스 수정 => MyService도 수정

     

    di

    - MyService 클래스가 MyRepository 클래스의 인스턴스를 생성하지 않는다

    - 생성자를 통해 MyRepository 클래스의 인스턴스를 주입! 받는다 (MyServise클래스가 MyRepository 클래스에 의존적이긴 하지마 인터페이스 역전!시킴으로써 MyRepository 클래스에 수정이 발생해도 수정 x)

     

     

     

     

     

     

     

    잘 모르겠는 코드 정리

     

    private final MyRepository myRepository;

    이 코드는 MyRepository 타입의 myRepository 필드를 선언한거

    final로 선언이 되어 생성자에서 한 번만 초기화할 수 있다(캡슐화,,?), 이 필드를 이용해 다른 메소드에서 사용할 수 있다

     

     

    this.myRepository = myRepository;

    내부 파라미터로 전달받은 myRepository 값을 인스턴스 변수인 myRepository에 할당하는 코드

    this는 해당 클래스의 현재 인스턴스를 가리키는 참조하는거

     

     

    느낀점

    di.. 이제 뭔지는 알겠지만.. 음... 어렵다..
    내일 한번 더 해보고 안되면 그냥 외우자
    금붕어도 아니고 자바 배운거 까먹음 계속 찾으면서 하니깐 기억이 나서 다행이다

    '공부 > spring' 카테고리의 다른 글

    애플리케이션 예외  (0) 2023.05.04
    Mapper  (0) 2023.05.03
    DTO  (0) 2023.05.01
    Controller  (0) 2023.04.28
    Spring Frmework 기본  (0) 2023.04.23
Designed by Tistory.