CheerUp_Cheers

스프링5 본문

카테고리 없음

스프링5

meorimori 2020. 11. 5. 14:42

--- 3장 스프링의 DI 설정 ---
#Maven
pom.xml을사용
많은 라이브러리를 관리하여 네트워크로 설치.
프로젝트의 전체적인 라이프사이클 관리 도구.
모든 기능은 플러그인 기반.
이전에는 Ant사용


#POM(project object model)
프로젝트 정보
빌드설정
빌드 환경
pom 연관 정보


#Gradle
빌드 배포 도구(java, c/c++, python)
Ant의 배포 스크립트 기능 사용가능.
라이브러리, 프로젝트, 의존성 관리.
그루비 문법 사용.


#Gradle 장점
[1]maven은 build라는 동적인 요소인 xml로 정의하기 힘듬.
-> 설정 길고, 가독성 떨어짐
-> 의존관계 복잡하면 부적절
[2] Configuration injection 방식을 통한 공통모듈 상속하여 사용
[3] 설정 주입시 프로젝트 조건 체크, 프로젝트 별로 설정다름
[4] 메이븐보다 최대 100배 빠름


#maven과 gradle 링크 https://hyojun123.github.io/2019/04/18/gradleAndMaven/


#Plugin
기본 소프트웨어를 지원해서 특수한 기능 확장하는 부속 프로그램.


#@Cofiguration
해당 클래스가 스프링 설정 클래스임을 지정.


#ApplicationContext
오브젝트 생성을 책임지는 오브젝트 팩토리.
Spring에서는 IOC컨테이너라고 도함.
관리할 모든 오브젝트 생성과 관계설정 담당.


#IOC(Inversion Of Control)
느슨한 정의.
스프링 프레임워크의 특징적 개념.
클래스 관리의 주체가 개발자가 아닌 프레임워크.


#@Bean
스프링이 생성한 객체임을 말함.
별도의 설정이 없으면 빈객체는 싱글톤 범위.
-> Spring 컨테이너에서 한번 생성.
- 꼭 모두 Bean을 통해 등록해야하는가?
getBean() 메서드를 사용안하고, 스프링 컨테이너가 제공하는 기능이 필요가 없다면 안써도 됨.


#Spring Container
주입을 이용한 객체관리를 주로 수행.
빈의 생성과 관계 사용 생명 주기 관장.
객체간의 의존성을 낮추기 위함!


#의존관계란?
https://it-mesung.tistory.com/120


#DI(의존성 주입)
의존 객체를 직접적으로 생성하지 않는것!
객체 변경시에도 객체를 생성하는 부분만 바꾸면됨.
ex) @Autowired
- 장점
[1] 객체 상호관 의존성 줄임
[2] 코드의 재사용과 조합 용이
[3] 가독성
[4] 구조변화에 민감하지 않음(유연)
- DI 생성방식
[1] 생성자를 통한 주입(권장)
-> 필수적으로 사용해야하는 ref없이는 인스턴스 생성못함.
[2] 세터를 통한 주입방식
[3] 필드(가장많이사용)


#@Autowired
@Bean으로 설정된 알맞은 객체에 자동으로 주입.
제대로 주입되지 않았다면 nullPointerException


#@import
ApplicationContext(컨테이너) 생성시, 하나의 config 클래스 사용.
import를 통해서 가능!
2개이상도 가능.
예시 - https://hilucky.tistory.com/244


--- 4장 의존 자동 주입 ---
#Bean 주입 에러의 경우
- 해당하는 빈이 없을 경우.
- 해당하는 빈이 2개이상일 경우.


#@Qualifier
자동 주입 가능한 빈이 두개이상일때 사용.
Qualifier로 설정안하면 빈이름이 한정자가 됨.
@Bean 과 @Autowired 두곳에 사용
예시 - https://velog.io/@owljoa/Spring-Boot-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EC%8B%9C-%EC%84%9C%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%EA%B5%AC%ED%98%84%EC%B2%B4-%EC%8B%9D%EB%B3%84-%EB%B0%A9%EB%B2%95


#@Autowired의 필수 여부 지정 방법
[1]@Autowired(required = false)
- 자동 주입할 객체가 있으면 주입, 없으면 안함
-> 예외발생 안함.
- 스프링 버전 5부터는 의존 주입 대상에 자바8의 Optional 사용가능.
[2] Optional
null인지 아닌지 확신할 수 없을때 사용.
obejct.isPresent()로 대상 여부 확인.
[3] @Nullable 어노테이션
스프링이 세터 메서드를 호출 시, 존재하면 빈을 인자로, 없으면 null


#자동주입과 수동주입
의존자동 주입을 사용했다면 일관성 있게 사용!
-> NullPointerException 발생 가능(주입이 잘 안되서)


--- 5장 컴포넌트 스캔 ---
#@Component
개발자가 직접 작성한 class를 Bean으로 등록하기 위한 어노테이션.
해당 클래스를 스캔 대상으로 표시.


#@ComponentScan
@Configuration이 붙은 클래스에 적용.
제외하는 Filter기능도 있음.
- 기본 스캔대상
@Component 가 붙은 대상만 아니라 다음도 포함
ex) Component, Controller, Service, Repository, Aspect, Configuration
예시 - https://jihazarrd.tistory.com/43
- 컴포넌트 스캔 충돌 처리
두개의 패키지에 같은 어노테이션과 이름이 있다면, 충돌.
수동으로 등록한 빈과 자동이 있으면 수동이 우선순위.

 

--- 6장 빈 라이프 사이클과 범위 ---

 

#컨테이너 초기화와 종료
스프링 컨테이너는 초기화와 종료라는 사이클을 가짐.
- 빈객체의 초기화와 소멸을 위한 인터페이스
스프링은 두 인터페이스를 제공
[1] InitalizingBean
Client client = ctx.getBean(xxx.class) // 생성시 호출
[2] DisposableBean
ctx.close() // 일때 호출이 됨
- 예시
https://kodejava.org/how-do-i-use-initializingbean-and-disposablebean-interfaces-in-spring/
- 사용하는 예
[1] 데이터베이스 커넥션 풀
[2] 채팅 클라이언트

 

#빈 객체의 초기화와 소멸 : 커스터마이징
모든 클래스가 위의 InitalizingBean과 DisposableBean을 구현 x.
외부에서 제공받은 클래스로