-
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