[Spring] Spring DI

박세윤·2023년 4월 11일
0

Spring

목록 보기
1/11
post-thumbnail

📖 Spring DI

📌 Spring Framework


✅ Framework (틀)

  • SW에서의 의미 : SW 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합

  • 사용 이유

    • 웹 어플리케이션을 개발하기 위해 많은 기본 기능을 설계 및 작성해야 한다.

    • 공통으로 사용되는 기본기능들을 일관되게 사용하여 개발자는 웹 어플리케이션 기능 자체 개발에만 신경을 쓰면 된다.

      • 생산성 증가
    • 개발자 입장에서 완성된 구조에 맡은 기능을 개발하여 넣어주면 된다.

      • 개발 시간 단축



✅ Spring Framework의 등장

  • 90년대 말부터, 웹사이트가 복잡해지면서 엔터프라이즈 급 서비스가 필요

    • 엔터프라이즈 : 규모가 큼, 지속적인 데이터, 수 많은 동시 접속자 등
  • 엔터프라이즈 어플리케이션 개발을 위해 프레임워크 개발되기 시작

  • 자바에서 EJB(Enterprise JavaBeans)를 이용한 엔터프라이즈 급 애플리케이션을 제작이 유행

    • EJB를 기반으로 한 애플리케이션은 EJB 스펙에 따른 객체를 작성해야 함
    • 간단한 기능을 테스트 할 때도 EJB 서버 필요
    • => 개발 효율성 떨어지는 단점
  • 복잡한 구동환경과 하드웨어 구성이 필요하지 않은 경량 프레임워크를 지향하는 방법론이 제시됨

    • 이는 Spring Framework에 토대가 됨.



✅ Spring Framework 특징

  • POJO (Plain Old Java Object) 방식의 프레임워크

    • 특정 기술에 종속되지 않는 순수한 자바 객체
    • 진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
  • 의존성 주입(Dependency Injection)을 통한 객체관계 구성

  • 관점지향 프로그래밍(AOP, Aspect Oriented Programming)

  • 제어 역전(IoC, Inversion of Control)

  • 높은 확장성과 다양한 라이브러리



✅ 왜 Spring Framework를 사용해야 할까?

  • Everywhere
    • 전세계 많은 개발자들이 사용한다.
  • Flexible
    • 유연하고 포괄적인 외부 라이브러리 확장을 통한 다양한 형태의 애플리케이션 개발
  • Fast
    • 빠른 시작 / 빠른 종료 / 최적화된 실행
  • Productive
    • SpringBoot는 프로그래밍 접근 방식을 변환하여 작업량을 줄여준다.
    • 애플리케이션 컨텍스트 및 웹 서버 등을 결합하여 간단한 프로그래밍을 쉽게 해준다.
  • Secure
    • 업계 표준 보안 체계와 십게 통합할 수 있고, 기본적으로 신뢰할 수 있는 솔루션 제공
  • Supportive
    • 커뮤니티가 잘 발달해 있으며, 빠른 시작, 가이드, 자습서 등의 리소스를 지원



✅ Spring Framework Architecture



✅ STS(Spring Tools Suite) 설치

  • 스프링 개발을 위한 개발환경

  • Help -> Eclipse Marketplace -> sts 검색 -> 설치



📌 의존관계 역전


✅ 프로그래머와 컴퓨터(Desktop)

public class Programmer {

	private Desktop computer;
    
    public Programmer() {
    	computer = new Desktop();
    }
    
    public void coding() {
    	System.out.println(computer.getInfo() + "으로 개발을 합니다.
    }
}
public class Desktop {

	// 필요한 필드...
    
    // 해당 컴퓨터 정보를 반환...
    public String getInfo() {
    	return "데스크톱";
    }
}
  • ClassA 객체가 어떤 일을 처리하기 위해서 ClassB의 객체의 도움을 받아야만 일을 처리할 수 있다면
    • ClassA는 ClassB에 의존한다. 라고 표현



✅ 프로그래머와 컴퓨터(Laptop)

public class Laptop {

	// 필요한 필드...
    
    // 해당 컴퓨터 정보를 반환...
    public String getInfo() {
    	return "랩탑";
    }
}
  • 위의 Programmer 클래스에서 private Desktop computer; 부분이나, computer = new Desktop() 부분은 수정이 필요하다.
    • Programmer가 Desktop 클래스에 의존성을 가지고 있기 때문!



✅ 프로그래머와 컴퓨터 (객체생성 의존성 제거)

public class Programmer {

	private Desktop computer;
    
    public Programmer(Desktop desktop) {
    	computer = desktop;
    }
    
    public void coding() {
    	System.out.println(computer.getInfo() + "으로 개발을 합니다.");
    }
}
public class Test {
	public static void main(String[] args) {
    
    	Desktop desktop = new Desktop();
        Programmer p = new Programmer(desktop);
        p.coding();
    }
}
  • Desktop에 대한 객체생성 의존성 Programmer -> Test로 (의존관계 역전)
    • 이걸 Spring이 해준다.



✅ 프로그래머와 컴퓨터(타입 의존성 제거)

  • Computer라 하는 인터페이스를 만들고 그걸 구현하는 Desktop, Laptop을 만들자.



📌 의존성 주입


✅ 프로그래머 의존성 주입 (생성자 이용)

public class Programmer {
	private Computer computer;
    
    // 생성자를 이용한 의존성 주입
    public Programmer(Computer computer) {
    	this.computer = computer;
    }
    
    public void coding() {
    	System.out.println(computer.getInfo() + "으로 개발을 합니다.");
    }
}



✅ 프로그래머 의존성 주입 (설정자 이용)

public class Programmer {
	private Computer computer;
    
    // setter를 이용한 의존성 주입
    public void setComputer(Computer computer) {
    	this.computer = computer;
    }
    
    public void coding() {
    	System.out.println(computer.getInfo() + "으로 개발을 합니다.");
    }
}



✅ 프로그래머 의존성 주입 (Factory)



📌 Spring Container Build


✅ Spring IoC Container

  • Container
    • Bean : 스프링에서 핵심적인 역할을 하는 객체
      - ContainerBean의 인스턴스화 조립, 관리의 역할, 사용 소멸에 대한 처리를 담당한다.

  • BeanFactory

    • 프레임워크 설정과 기본 기능을 제공하는 컨테이너
    • 모든 유형의 객체를 관리할 수 있는 메커니즘 제공
  • ApplicationContext

    • BeanFactory 하위 인터페이스
    • 이벤트 처리, 국제화용 메시지 처리, AOP 통합 기능 제공
  • WebApplicationContext

    • 웹 환경에서 Spring을 사용하기 위한 기능이 추가
    • 대표적인 구현 클래스 : XmlWebApplicationContext



✅ 스프링 설정 정보 (Spring configuration metadata)

  • 애플리케이션 작성을 위해 생성할 Bean과 설정 정보, 의존성 등의 방법을 나타내는

  • 설정정보를 작성하는 방법은 XML 방식, Annotation 방식, Java 방식이 있다.



✅ Spring Container 빌드

  • Project 생성 후 -> Maven Project로 변경

  • pom.xml -> Spring Context 의존성 추가

  • Source Folder 생성 (resources)


  • 스프링 설정파일 생성




  • 빈(Bean) 등록 (풀패키지 명 작성)


  • 스프링 컨테이너를 이용하여 객체 가져오기


  • 객체를 getBean()하여 여러개 가져와 보기
Desktop desktop2 = context.getBean("desktop", Desktop.class);
Desktop desktop3 = context.getBean("desktop", Desktop.class);

System.out.println(desktop2);
System.out.println(desktop3);
  • 결과는 같은 객체가 나온다. 왜그럴까?



✅ Bean Scope

  • Bean 정의를 작성하는 것은 Bean 객체를 생성하는 것과 다르다.

  • Bean 범위(Scope)를 정의해서 객체의 범위를 제어할 수 있다.



원랜 위에꺼 없는데 이걸 applicationContext.xml파일의 bean 태그에 속성을 추가해주면 prototype 방식으로 bean scope가 조정된다.



📌 Spring DI


✅ XML - 의존성 주입 (생성자)

  • constructor-arg를 이용하여 의존성 주입

  • <ref>, <value>와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정

public class Programmer {
	private Computer computer;
    
    // 기본생성자
    public Programmer(){}
    
    // 생성자를 이용한 의존성 주입
    public Programmer(Computer computer) {
    	this.computer = computer;
    }
}
<bean class="com.ssafy.di.Desktop" id="desktop"></bean>

<bean class="com.ssafy.di.Programmer" id="programmer">
	<constructor-arg ref="desktop"></constructor-arg>
</bean>



✅ XML - 의존성 주입 (설정자)

  • setter를 이용하여 의존성 주입

  • <ref>, <value>와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정

public class Programmer {
	private Computer computer;
    
    // 기본생성자
    public Programmer(){}
    
    // setter를 이용한 의존성 주입
    public void setComputer(Computer computer) {
    	this.computer = computer;
    }
}
<bean class="com.ssafy.di.Laptop" id="laptop"></bean>

<bean class="com.ssafy.di.Programmer" id="programmer">
  	<property name="computer" ref="laptop"></property>
</bean>



✅ XML - 그 외 의존관계 설정

  • inner bean
    • ref 속성을 이용하여 외부 bean을 참조하는 대신 간단히 사용할 수 있다.


  • Collections
    • <list/>, <set/>, <map/>, <props/> 요소를 이용하여 List, Set, Map, Properties 속성을 설정








✅ Annotation

  • 빈(Bean) 생성 및 설정(@Component)

  • Bean 생성 - @Component

  • 생성되는 bean의 이름은 클래스의 첫 글자를 소문자로 바꾼 것
    - @Component(value="bean-name")으로 이름 지정 가능

  • 스프링은 @Component, @Service, @Controller, @Repository의 Stereotype Annotation 제공

  • 각 Annotation들은 목적에 맞는 구체적인 사용을 위한 @Component의 확장 목적에 맞게 구체화하여 사용하면 Spring을 더 효율적으로 사용 가능



✅ Annotation - 빈 생성 및 설정 (Component Scan)


<context:component-scan base-package="com.ssafy.di"></context:component-scan>**</span>



✅ Annotation - 의존성 주입 (@Autowired)

  • **Spring 컨테이너 내에서 타입 매칭 시행 (컨테이너에 해당하는 타입의 bean이 있다면 매칭)



profile
개발 공부!

0개의 댓글