Spring framework

JunSeong_Park·2023년 1월 4일
0

Spring framework

  • Java Platform 을 위한 Open Source Application Framework
  • Enterprise급 Application을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화 솔루션
    Enterprise급 개발?
    → 직역 시 기업을 대상으로 하는 개발
    → 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로부터 행해지는,
        매우 큰 규모의 환경을 엔터프라이즈 환경이라 지칭
  • 경량 컨테이너로 Java 객체를 담도 직접 관리(IoC)
  • 객체의 생성 및 소멸 그리고 생명주기를 관리하며 언제든 Spring 컨테이너로 부터
    필요한 객체를 가져와 사용 가능
  • 이는 Spring이 IoC기반 Framework임을 의미
  • Spring Framework를 구성하는 삼각형IoC/DI, AOP, PSA는 application을 POJO로 개발할 수 있게해주는 기능 기술(enable technology)



IoC (Inversion of Control)

  • 직역 그대로 제어의 역전을 의미
  • 두 개의 오브젝트를 분리해서 만들고, 인터페이스를 두고 느슨하게 연결한 뒤,
    실제 사용할 대상DI(Dependency Injection)를 통해 외부에서 지정
  • new 키워드로 생성하여 사용하는 강한 결합보다 유연한 확장에 유리함
  • 일반적인 지금까지 반복되었던 프로그램 작업 과정
    • 객체 결정 및 생성
    • 의존성 객체 생성
    • 객체 내 Method의 호출
    • 모든 작업을 사용자가 제어하는 구조
  • IoC 적용 시
    - 객체자기가 사용할 객체를 선택하거나 생성하지 않음
    - 자신이 어디서 생성되고 어떻게 사용되는지 알 수 없음
    - 자신의 모든 권한다른 대상에 위임함으로써 제어권한을 위임받은
    특별한 객체에 의해 결정되고 생성
    - 제어의 흐름을 사용자가 컨트롤하지 않고 위임한 특별한 객체에 모든 것을 위임

    기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대핸 제어권이 넘어간 것을
    Inversion of Control, 제어의 역전이라 지칭



DI (Dependency Injection)

  • IoC를 구성하는 요소 중 하나
  • 의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입

의존성(Dependency)
객체지향 프로그램(OOP)에서 하나의 객체가 다른 객체를 사용하고 있음을 의미

  • Class 사이에 필요로 하는 의존관계Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 의미
  • 개방 폐쇠 원칙(OCP)으로 대체 설명 가능

개방 폐쇄 원칙(Open-Closed Principle)
→ S/W Entity(Class, Module, Function ..etc)는 확장에 대해서는 열려 있어야
하지만 변경에 대해서는 닫혀있어야 한다는 원칙
→ 해당 Class의 기존 동작을 변경하지 않고 Class의 동작을 확장하는 것이 목표
→ 유지 보수 및 수정이 쉬운 코드를 작성하는데 필수적

  • 유연한 확장이 가능 → OCP의 ‘확장에는 열려있다’

  • 변경없이 재사용 가능 → OCP의 ‘변경에는 닫혀있다’

    • Example) A → B라는 의존관계를 갖는 오브젝트 구조
      • 확장B가 자유롭게 변경될 수 있음을 의미
      • B변경되어도 A아무런 영향을 받지 않고 그대로 유지 가능
      • B의 관점 : 유연한 확장 // A의 관점 : 변경없이 재사용 가능 ( 상속의 특징을 모두 가지고 있음 )
  • DI의 활용

    • 핵심 기능의 변경
      • 의존 대상의 구현을 바꾸는 것
      • 전략 패턴(Strategy Pattern)
      • A → B 구조에서 A의 기능 일부를 B에 위임하는 경우
        • B의 구현 방식 필요에 따라 통째로 B1, B2, B3로 변경하는 것
        • Service가 사용하는 DAO가 있을 시 DAO의 구현을 JDBC로 했다가, JPA, Hibernate, Mybatis 등으로 변경하는 것
    • 핵심기능의 동적(Dynamic) 변경
    • 부가기능의 추가
    • 인터페이스의 변경
    • 프록시(Proxy)
    • 템플릿(Template)과 콜백(Callback)
    • 싱글톤(SingleTon)오브젝트 스코프(Object Scope)
  • DI의 3가지 유형

    • 생성자(Constructor)를 이용한 DI
      • 필요한 의존성을 모두 포함하는 Class의 생성자를 만들고
        그 생성자를 통해 의존성 주입
      • 생성자에 파라미터를 만들고 이를 통해 DI 컨테이너가 의존
        Object Reference를 넘겨주는 방식
      • Example
        public class MemberService {
        	private MemberDAO memberDAO;
        	
        	public MemberService(MemberDAO memberDAO) {
        		 this.memberDAO = memberDAO;
        	}
        }
    • setter() Method를 이용한 DI
      • 의존성을 입력받는 setter() Method 생성 후 이를 통해 DI
      • Spring에서 권장하는 방식
      • Example
        public class MemberService {
        	private MemberDAO memberDAO;
        	public void setMemberDAO(MemberDAO memberDAO) {
        		this.memberDAO = memberDAO;
        	}
            
            // 스프링 내에서는 이를 @Autowired 로 해결 할 수 있다
            // @Autowired : legacy 프로젝트의 MVC 모델에서 사용하여
            // 	root-context.xml 에 빈을 설정할 때 사용
            // xml 에 <context:annotation-config />를 입력하여
            // annotation 정보를 가져와야함
            @Autowired
            MemberDAO memberDAO
        	// 위의 코드를 매우 단순하게 줄인 모습
        }
  • 초기화 인터페이스(Initialize Interface)를 이용한 DI
    - 의존성을 주입하는 함수를 포함한 interface를 작성
    - 이 interface를 구현하도록 함으로써 이를 통해 DI
    - Spring에서 지원하지 않는 방식

DL(Dependency Lookup, 의존성 검색)

  • IoC를 구성하는 요소 中 하나
  • 컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 Bean을 저장
  • 개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 Bean을 검색하는 방법 (스프링에서 사용되는 root-context.xml 에서 정의하는 bean 객체 설정)




쓰면서도 아직 정보가 부족하다는 생각이 많이 든다 시간이 날 때 제대로 다시 정리해서 POJO 부터 샅샅이 찾아보고 조금 더 공부를 해야겠단 생각이 들었다..교재에 반영된 예시들로 인해 이해는 잘 되는 것 같지만, 아직 spring의 특징에 대해서 설명하지 않은 부분들이 너무나 많다..(예를 들면 Portable Service Application 이나 Aspect Oriented Programming 등) 다음에는 우선 제일 핵심이 되고 중요한 DI를 구체적으로 어떻게 활용하는지 알아봐야겠다



출처
스프링 입문을 위한 자바
https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다

0개의 댓글