대덕공부/Spring

Spring - CoreContainer

02O2 2022. 7. 14. 17:53

IOC

Inversion OF Control 

의존성 역전의 구조  - 의존성 생성의 권한이 프레임워크로 넘어갔을 때  

마이배티스 썼을때 꼭 마이배티스가 써라는대로 했어야했음 대부분의 파일은 설정파일이있는데 설정파일이 명하는대로 해야함 주도권이 나한테 없음 .( 프레임워크)

반면에 라이브러리(lang3)은 주도권이 나한테있다 java안에서 라이브러리가 돌아가고 설정파일이없음 내맘대로 쓸수있음! 

 

프레임워크와 라이브러리의 차이점** 알기 

-의존성역전의구조가 제공이 되냐 안되냐이다. 

 

– Framwork 와 Library 의 차이

• Framework : 소프트웨어의 특정 문제를 해결하기 위해 상호협력하는 클래스와 인터페이스의 집합.
1. 특정 개념들의 추상화를 제공하는 클래스나 컴포넌트들로 구성
2. 상기의 추상적 개념들이 문제를 해결하기 위해 협업하는 방법을 정의함.
3. 재사용 가능한 컴포넌트들의 집합
4. 보다 수준 높은 패턴들로 조직화된 구조.


• Library : 소프트웨어에서 호출할수 있는 함수와 루틴들로 구성

 


Spring Framework

– Spring이라는 이름의 기원은 전통적인 J2EE를 "겨울"에 빗대어 "겨울" 후의 "봄"으로 새로운 시작을 의미함
– EJB가 제공했던 대부분의 기능을 일반 POJO(Plain Old Java Object)를 사용하여 개발할 수 있도록 지원함
– 엔터프라이즈 어플리케이션 개발의 복잡성을 줄이기 위한 목적으로 개발됨

 

 Introduction

– JavaEE 기반의 어플리케이션 개발을 쉽게 해주는 오픈 소스 어플리케이션 프레임워크
– 전체 애플리케이션을 체계적으로 엮어낼(wire up) 수 있는 프레임워크
– POJO기반의 개발을 통해 의존적인 코드 없이 빈들에 대한 생명주기를 관리 //결합력이 없다는 뜻 
– 트랜잭션 관리를 위한 일관된 방법을 제공
– O/R mapping : Hibernate, iBatis, JDO등과의 연동 시의 필요 작업 최소화
– Lightweight Container 로 시작 시 부하가 적음
– 다양한 3rd 파티 제품과의 연동
– 테스트의 용이성

 


dao의 Interface만 설계해주면된다 -> dao 대신 만들어주니깐 ( dao의 proxy를 만들어준다. ) 

proxyMapper 어플리케이션 전체에서 사용하도록 확장된 거 

messaging -STOMP

https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/htmlsingle/

 

Spring Framework Reference Documentation

Authors Rod Johnson , Juergen Hoeller , Keith Donald , Colin Sampaleanu , Rob Harrop , Thomas Risberg , Alef Arendsen , Darren Davison , Dmitriy Kopylenko , Mark Pollack , Thierry Templier , Erwin Vervaet , Portia Tung , Ben Hale , Adrian Colyer , John Lew

docs.spring.io

 

 

전자정부 egov쓰는이유

 

java 객체지향프로그래밍 지원 어쩌구..

 

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rtea3.9 

 

egovframework:rtea3.9 [eGovFrame]

 

www.egovframe.go.kr

 

**읽어보기 

 

CoreContainer 

어제까지 사용한게 Web구조이다. 

Messaging을 연결하면 실시간 서비스가 가능한다. ( 양방형형태 = 완전하다!)

수업순서

 

 Core Container

 Core and Beans
• Spring 프레임워크의 근간이 되는 IoC/DI 기능을 지원하는 영역을 담당하고 있다.
 BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원한다.
 Context
• Core and Beans를 견고히(solid)한 모듈이다. JNDI 처럼, 프레임워크 방식으로 객체에 접근하는 방법을 제공
• Beans 모듈에 더하여 국제화, 이벤트 전파, 리소스 로딩, 투명한 context 생성 등을 제공한다.
– Expression Language(SpEL)
• 객체 탐색을 실행 시에 구하거나(querying) 조작할 수 있도록 강력한 표현언어를 제공한다.(SpringEL/SpEL)
• 객체 속성에 대한 값 읽기 및 설정, 메서드 호출, 배열에 접근, collection and indexers, 논리 및 수리 연산,
named variables, Spring의 IoC container로부터 이름에 의한 객체 검색 등을 제공한다.


 AOP and Instrumentation

– AOP(Aspect-oriented programming)
• AOP Alliance 기반의 Aspect Oriented Programming을 지원한다.
• 업무로직에서 부가적인 기능들을 method-interceptors, pointcuts 을 이용하여 분리(module)하여 작성할 수
있다.
– Instrumentation
• 어플리케이션 서버에서 사용되도록 클래스 구현의 지원이나 클래스 로더의 구현을 제공한다.
• 단어 : instrument (네이버)
장치나 도구를 말하며, 기능을 확대하기 위한 보조 장치나 보조 기구를 뜻하는데 측정 기기, 사진 기기
등이 포함된다.www.ddit.or.kr

Spring Framework
Data Access/Integration
– JDBC
• JDBC 기반하의 DAO개발을 좀 더 쉽고, 일관된 방법으로 개발하는 것이 가능하도록 추상화된 레이어를 제공.
– ORM
• Object Relation Mapping 프레임워크인 Hibernate, iBatis, JDO, JPA와의 통합을 지원.
– OXM
• Object/XML Mapping 은 Object와 XML간의 변환을 위한 추상 계층을 제공한다. (JAXB, Castor, XMLBeans,
JiBX, XStream 등)
– JMS
• Java Message Service, 메시징 처리를 위한 모듈을 제공한다.
– Transaction
• 직접적인 트랜잭션 관리나 선언적인 트랜잭션 관리에 있어 일관된 추상화를 제공.
Web
– Web
• 기본적인 웹 기반을 위한 기능을 제공한다.
• 다중 FileUpload 처리, 리스너 와 웹 기반 application context를 위한 IoC컨테이너 초기화
– Web-Servlet
• 웹 어플리케이션 구현을 위한 Spring MVC(Model-View-Controller) 제공
• Struts, Webwork와 같은 프레임워크의 통합을 지원
– Web-WebSocket
• JSR-356 스펙에 따라 구현된 WebSocket 프로그래밍 지원 모듈
– Web-Portlet
• 포털기반의 MVC 구현을 위한 모듈 제공.
Messaging
– Messaging
• Spring-Integration 모듈에서 Message, MessageChannel, MessageHandler 등 endpoint에서 메시지 매핑을
지원하는 API 들을 스프링 기본 모듈로 이관.
Test
– Test
• JUnit이나 TestNG와 같이 Spring Componets 를 테스트하는 모듈 제공한다.
• Mock object를 통하여 독립된 환경에서 코드를 테스트 할 수 있도록 제공한다.


**스프링의 장점은 쪼개져있고 필요한걸 쓸수있다. 

**그럴려면 구조를 잘알아야한다.

--> 의존성이야기

context를 넣으면 core bean expression 다 들어옴!!

 

의존관계 잘 파악해야함

https://mvnrepository.com/artifact/org.springframework/spring-context/4.3.22.RELEASE

 

Maven Repository: org.springframework » spring-context » 4.3.22.RELEASE

org.springframework spring-context 4.3.22.RELEASE // https://mvnrepository.com/artifact/org.springframework/spring-context implementation group: 'org.springframework', name: 'spring-context', version: '4.3.22.RELEASE' // https://mvnrepository.com/artifact/

mvnrepository.com

지금부터 springcontainer 쓰는거

 

spirng container 안에잇는 객체를 bean이라고 부름

스프링 컨테이너 다른말은 = bean container 

이안에는 빈들이있고 빈 하나하나가 객체가 된다.

이제 Spring 하나가 주입자가 되는거 

ApplicationContext

컨테이너의 최상위 인터페이스

 

ClassPathXmlApplicaitionContext

classPath안에 xml을 구현하겠다 ?

 

 

우리가아는 싱글톤이랑 비슷한데 같은건 아님!!

 

우리가 아는 싱글통이라면 두개의 빈객체의 주소가 같아야함 !

 

에러터짐 인터페이스구현체는 유일해야함 이 예외가 없앨려면
id로 유일성을 보장받으면 예외가 안나온다.

싱글톤패턴은 클래스 기준으로 하는거고 

여기서의 (Spring)에서 말하는 싱글톤의 대상은 Bean이다 Bean하나가 싱글톤 구조를 이루고있음 

같은 클래스 객체라도 bean에따라서 하나씩 클래스가 생성되기때문에 false값일 뜬거임 

특별한경우가 아닐경우만 싱글톤이지 다른경우에는 independent instance


//protype으로 줘야지 매번 필요할때마다 새로운객체를 생성함 , 경우에따라 싱글톤을 써지말아야할경우 (상태를 유지해야할 경우) 서비스나 다오가 상태변수를 가지고있을경우 싱글톤으로 유지하면 문제가 발생할수있음 ** 객체의 특성에따라 single일수도있고 proto일수도있음

 

아직 객체 생성하지도않앗는데 이미 생성완료되어있는 상태를 볼수있음 - 필요하지 않는 객체는 생성하지않고 생성지연해야함 이게 바로 protype이 필요한 이유. 그런속성들을 알고 사용할수있어야함
default가 false 미리 객체 생성하겠다는거
미리만들지않고 주입되기 직전에 생성한다.

이건 c: 써을ㅇ때 마리아 생성 - > service 생성함 

 

setter - p 

기본생성자 사용 setter ( p )

service -> maria

주입하기 직전에 maria가 만들어짐

 

c, p 써서 생성순서 잘 만들 수 있어야한다. 

 

다 true일대 객체 하나도 생성안됨

 

default일때 생성순서

14:04:00.962 [main] INFO  k.o.d.s.d.SampleDAO_Maria - class kr.or.ddit.sample.dao.SampleDAO_Maria 객체생성
14:04:00.971 [main] INFO  k.o.d.s.d.SampleDAO_Oracle - class kr.or.ddit.sample.dao.SampleDAO_Oracle 객체생성
14:04:00.971 [main] INFO  k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체생성_기본생성자

마리아 - 오라클 - 서비스 

 

 

오라클 서비스 마리아 순서

14:04:33.405 [main] INFO  k.o.d.s.d.SampleDAO_Oracle - class kr.or.ddit.sample.dao.SampleDAO_Oracle 객체생성
14:04:33.413 [main] INFO  k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체생성_기본생성자
14:04:33.414 [main] INFO  k.o.d.s.d.SampleDAO_Maria - class kr.or.ddit.sample.dao.SampleDAO_Maria 객체생성

 

다시 c로 바꾸면

오라클 마리아 서비스 

마리아가 만들어지고 서비스를 넘길수있음 (?) 

 

14:06:22.985 [main] INFO  k.o.d.s.d.SampleDAO_Oracle - class kr.or.ddit.sample.dao.SampleDAO_Oracle 객체생성
14:06:22.995 [main] INFO  k.o.d.s.d.SampleDAO_Maria - class kr.or.ddit.sample.dao.SampleDAO_Maria 객체생성
14:06:23.002 [main] INFO  k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체생성_dao 주입생성자

 

주입할때 전까지 객체 생성 ( 프로토타입) = lazy-init이 포함된거나 마찬가지 

 

p로 바꾸면

 

14:07:40.672 [main] INFO  k.o.d.s.d.SampleDAO_Oracle - class kr.or.ddit.sample.dao.SampleDAO_Oracle 객체생성
14:07:40.680 [main] INFO  k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체생성_기본생성자
14:07:40.681 [main] INFO  k.o.d.s.d.SampleDAO_Maria - class kr.or.ddit.sample.dao.SampleDAO_Maria 객체생성

 

default-lazy-init="true" //기본레이지 설정이 true

객체가 하나도생성안됨

lazy-init="false"  객체를 미리만들겠다 

 

]

 

 

오라클 서비스 마리아

 

마리아 오라클 서비스 

오라클 서비스 마리아

 

 

p를 ->c로바꾸면 ( c가 생성자)

오라클 마리아 서비스

 

 

마리아 서비스 오라클 (객체생성순서)

마리아은 매번 객체가생성되도록 

 

 

 

 

 

 

해시코드 동일함 - 싱글통리사ㅓ

 

생성소멸과정확인할수잇ㅇ므

 

 

파일 위치에 무관하게 파일업로드되도록 스프링이 도와줌

 

 

컨테이너 = 리소스 로더 

 

 

프로펄티 읽는거 하기