본문 바로가기
Framwork/SpringBoot

[Spring Boot] 의존 주입의 이해

by 김엉배 2022. 4. 5.
728x90
반응형


1) 의존 주입의 개념

 의존 주입은 스프링뿐 아니라, 자바 객체 프로그래밍에서 매우 중요하게 생각하는 개념이다.

 객체지향 프로그래밍에서 다른 객체를 사용하는 것을 다르게 표현하면 '다른 객체에 의존한다.'라고 표현한다.

 

의존 주입의  개념

→방법1 : A객체는 B, C객체의 기능에 의존한다. 

→방법2 : B, C 객체가 외부에 생성되어 있고, A객체에 주입된다.

 

여기서 B, C객체를 생성하고 B, C객체의 라이프 사이클을 관리하고

A객체에 의존 주입을 관리해주는 무엇인가를 컨테이너라 부른다.

개발자가 직접 객체를 제어하지 않고 컨테이너로 객체의 제어권이 넘어갔다는 의미로

제어의 역전(Inversion Of Contral: IoC)이라는 용어가 사용된다.

 

스프링이 이 IoC 컨테이너의 역활을 하며, 스프링은 객체를 생성, 라이프사이틀 관리 및 필요로 하는

객체에 의존 주입을 하는 컨테이너이고,  라이브러리들의 집합체라고 할 수 있다.


2) 강한 결합 VS 약한 결합

직접 객체를 생성하면 생성부터 메모리 관리를 위한 소멸까지 해당 객체의 라이프사이클을

개발자가 다 관리해야 하므로 강한 결합이 된다.

그리고 이미 누군가 생성한 객체를 주입받을 경우, 사용하기만 하면 되므로 약한 결합이 된다.

 

※예제

스프링 부트 프로젝트 생성


프로젝트 생성 정보


의존성 주입 선택: 아무것도 선택하지 않음


생성된 스프링 부트 프로젝트

※ 프로젝트 명 옆에 [boot]표시가 보이지 않는다면 표시될 때까지 잠시 기다린다.


패키지 추가 메뉴 선택


패키지명 입력


Printer 인터페이스, PrinterA, PrinterB 클래스 생성

@Override 어노테이션은 부모 클래스나 인터페이스로부터 어노테이션 바로 다음의 메서드를 오버 라이딩했다는 의미


Member 클래스 생성

생성자와 각 변수에 대한 세터로 구성되었다. 기본생성자(8라인), 파라미터를 받는 생성자(10라인),

   print 메서드(25라인) 을 통해 변수에 저장된 정보를 출력하는 메서드 구현


Config클래스 생성

Member클래스의 기능들을 사용할 수 있도록 설정

 

  • 6라인: @Configuration 어노테션이 붙은 클래스는 스프링 설정으로 사용됨을 의미
  • @Bean: 메서드의 리턴값은 빈 객체로 사용됨을 의미
  • 23라인: 어노테이션에 이름을 주면 해당 클래스를 빈으로 등록할 때 입력한 이름으로 빈의 이름 변경 가능

Application.java 수정


실행 로그 출력


3) 어노테이션으로 DI 사용하기

새로운 프로젝트 생성


프로젝트 구조


Member클래스 생성

  • 8라인: Member 클래스를 빈으로 등록하겠다는 의미
  • 10라인: 빈이 생성될 때 name변수의 기본값으로 "홍길동"으로 지정
  • 12라인: 빈이 생성될 때 nickname 변수의 기본값으로 "도사"를 지정
  • 14라인: 빈이 생성될 때 printer변수가 참조할 객체를 자동으로 찾아온다.
  • 15라인: 유사한 객체가 여러 개일 때 빈의 이름으로 정확하게 지정 

Print A, B 클래스 생성

  • 5라인: Print A,B 클래스를 빈으로 등록하겠다는 의미. 이때 등록할 이름을 printA,b를 사용하겠다고 이름 지정

Ex03AnnotationDiApplication.java

※ @SpingBootApplication 이노테이션의 3가지 기능

  1.  @Configuration: Bean을 생성할 때 Singletone으로 한 번만 생성
  2.  @EnableAutoConfiguration: 스프링 어플리케이션 컨텍스트를 만들 때 자동으로 설정하는 기능을 켠다.
  3.  @ComponentScan: 지정한 위치 이하에 있는 @Component와 @Configuration이 붙은 클래스를 스캔 빈으로 등록.

※  프로그램이 실행되면 Ex03AnnotationDiApplication 클래스의 main 메서드가 가장 처음으로 실행

    이 때  @SpringBootApplication 어노테이션을 통해 자동으로 빈을 검색하고 등록할 후 main 메서드의             

    SpringApplication.run을 통해 내장 톰캣을 실행한 다음, 자동으로  WebApplicationContext를 생성


8081 포트 설정


MyController 클래스 생성

  • 9라인: MyController 클래스를 빈으로 등록하겠다는 의미
  • 11라인: 빈이 생성될 때 member1 변수가 참조할 객체를 자동으로 찾아온다.
  • 13라인: 빈이 생성될 때 printer변수가 참조할 객체를 자동으로 찾아온다.
  • 14라인: 유사한 객체가 printerA, printerB 등 여러 개일 때 빈의 이름으로 정확하게 지정
  • 19라인: 웹 브라우저에서 사용자가 /로 get 방식의 url 호출을 하면 다음 라인의 root() 메서드를 실행
  • 20라인: @RequestBody 어노테이션은 Json이나 Xml등 REST API 형태의 응답을 할 경우, html 태그 없이 순수하게 스트링 데이터만으로 응답할 경우를 지정

콘솔창에 출력된 실행 로그


웹 브라우저에서 /url 호출

728x90
반응형

'Framwork > SpringBoot' 카테고리의 다른 글

[Spring Boot] JSP 사용하기  (0) 2022.04.12
[Spring Boot] 정적 리소스 사용하기  (2) 2022.04.06
[Spring Boot] 프로젝트 만들기  (0) 2022.04.01
[Spring Boot] 설치  (0) 2022.04.01