<한줄요약>
Spring : 자바 객체를 담고 있는 컨테이너, 객체의 생성/사용/제거 등 관리
1. Spring이란?
- JEE에서 사용하는 대부분의 기능 + @를 제공하는 경량화 Framework
- Low level을 자동으로 처리해주어 개발자가 상위 logic에 집중할 수 있도록 한다
- 외부 lib를 쉽게 가져다 쓸 수 있다
2. Spring 구조
- 1. POJO
- Plain Old Java Object
- 특정 시스템/기술에 종속적이지 않은 자바 객체.
- 종속성이 없어 생산/이식이 용이하다
- 2. PSA
- Portable Service Abstraction
- 기술에 일관된 방식을 사용해 접근 ( 추상화 )
- Service Abstraction이란? 어떤 기능을 사용자에게 드러내지 않고 시스템이 자동으로 처리해주는 것
- Portable Service Abstraction은? 비슷한 여러 기능을 하나로 통합해 사용자에게 제공하는 것
- ex) DB에 접근하는 법은 JDBC를 비롯해 여러가지가 있지만, @Trancaction으로 트랜잭션 일괄 처리
- 3. IoC/DI
- Inversion of Control (제어 반전)
- 객체의 생성, 의존 등 생명주기 관리를 개발자가 하는게 아닌, 컨테이너가 하게 된다
- Depedency Injection
- 객체를 생성해두고, 외부에서 의존성을 설정하면 객체가 주입되도록 한다
- 직접 생성자를 호출하거나, 함수를 통해 받을 필요가 없다
- 4. AOP
- Aspect Oriented Programming
- 관점 지향 프로그래밍
- 관점을 기준으로 모듈화, 핵심 로직과 공통(부가) 로직으로 분리한다
- 공통 사용 부분은 공통 모듈로 분리하고 필요할 때 호출해서 사용한다
- ex) 로그를 남기고 싶을때, 로그 기록 모듈을 별도로 생성 후 로깅이 필요한 부분에서 호출
- 재사용성의 증가
3. IoC
- Object간의 연결 관계를 런타임에 결정한다
- DI : IoC의 여러 방법 중 하나
- 객체 간 결합도를 떨어트려 유지보수 용이성을 높인다
IoC의 종류
- Dependency Lookup
- 직접 lookup해서 필요한 자원을 얻는 방식
- type casting 필요
- Dependency Injection
- 클래스 간 의존관계를 표기해두면(xml, @ annotaion 등) 자동으로 연결해주는 것
- lookup 불필요
Container란?
- 객체의 생성, 소멸 등 생애주기를 관리
- 객체 사용에 필요한 기능들 제공
- Dependency 제공
- Thread 처리 등
IoC Container
- 코드 대신 컨테이너가 object의 생성, 사용, 제거를 담당
- 컨테이너가 obj를 제어하므로 IoC Container라 한다
Bean
- spring이 생성,관리하는 객체
Spring DI Container (BeanFactory)
- Bean의 생명주기를 관리, BeanFactory라고도 호칭한다
- Bean을 등록, 생성, 조회
- getBean()으로 조회 가능
ApplicationContext
- BeanFactory의 기능을 확장한 것
- spring의 여러 서비스 추가 제공
IoC 장점
- 객체 간 결합도 감소
- 결합도가 높으면? 한 class의 코드만 변경되도 다른 코드들까지 다 변경이 일어날 가능성이 높다
- 결합도의 감소 예시
- 1. class가 아닌 interface를 사용
- interface만 동일하면 class는 얼마든 수정되도 상관 없다
- interface가 수정될 때는 수정 필요
- 2. Factory 이용
- 팩토리가 클래스를 생성, interface가 변경되도 팩토리만 수정한다
- class는 팩토리만 호출
- 팩토리에 의존하는 형태
- 3. Assembler 이용
- runtime에 클래스 관계를 설정, 객체를 주입해준다
- Spring Container에서 Bean으로 객체를 생성하면, 이를 getBean으로 가져다 쓰는 식
4. DI
Bean 생성 방법
- 1. XML 파일
- 자기 정보를 기술
- 기본적으로 singleton이다.
- singleton이 아니게 하려면 scope="prototype"설정
- <bean>태그 사용
<bean id="world" class="com.hello.world" />
//not singleton
<bean id="world" class="com.hello.world" scope="prototype" />
- 2. annotation
- 자동으로 bean 등록, 주입
- xml에 component-scan으로 검색할 패키지를 설정
//context 추가 필요
<context:component-scan base-package="com.hello.*" />
- @annotation을 설정해두면 자동으로 검색, bean으로 생성한다
표기 | 의미, 종류 |
@Repository | DAO와 같은, 데이터베이스 접근 클래스에 사용 |
@Service | service 클래스에 사용 |
@Controller | servlet같은 controller에 사용 |
@Component | 그 외 나머지에 사용 |
Dependency Injection (DI)
- 객체 간 의존관계를 외부에서 대신 수행한다
- IoC의 구현방법, 결합도가 느슨하다
DI 종류
- 외부 assembler에서 의존성 주입
- 1. xml 이용
- 주입할 객체를 xml파일에 설정
<bean id="world" class="com.test.hello.world" />
//not singleton
<bean id="world" class="com.test.hello.world" scope="prototype" />
- class가 ~hello.world인 클래스를 주입받는 bean 객체 생성
- world라는 id로 호출 가능하다
- 객체의 획득은 Container의 함수로 제공받는다
ApplicationContext context = new ClassPathXmlApplicationContext("com/test/hello/applicationContext.xml");
CommonService world = context.getBean("world", world.class);
- bean 생성시 생성자에 인자가 필요할 경우, constructor-arg태그를 사용한다
- 다른 bean을 인자로 받을 경우 value 대신 ref 사용, 인자는 해당하는 id값이다
<bean id="world" class="com.test.hello.world">
<constructor-arg value="50" />
</bean>
//위에서 생성한 world bean을 생성자의 인자로 받는 새 객체
<bean id="world2" class="com.test.hello.world2">
<constructor-arg ref="world" />
</bean>
- 생성한 객체에 값을 주입할 경우, property 태그를 사용한다
- 단, 해당 이름의 setter가 설정되 있어야한다. setArg1이 있을 경우 name="arg1"로 사용 가능
- 동일하게 value, ref 사용
//50을 arg1로, world객체를 arg2로 받는 객체
//world2 클래스 내부에 setArg1, setArg2 함수 필수
<bean id="world2" class="com.test.hello.world2">
<property name="arg1" value="50" />
<property name="arg2" ref="world" />
</bean>
- 주입할 값에 따라 <list> <map> 등 태그 존재
//인자로 list를 받는 객체
<bean id="world2" class="com.test.hello.world2">
<property name="argList">
<list>
<value type="java.lang.Integer">50</value> // int 50 저장
<ref bean="world" />
</list>
</property>
</bean>
//인자로 map를 받는 객체
<bean id="world2" class="com.test.hello.world2">
<property name="argMap">
<map>
<entry key="key1" value="val1" />
<entry key="key2" value-ref="world" />
</map>
</property>
</bean>
- 2. annotation 사용
- @Autowired
- 타입에 맞춰 주입해준다
- 동일한 type이 여러개일 경우 @Qualifier("name") Annotation을 추가해 구분
- @Resource
- 타입에 맞춰 주입해준다
- 동일한 type이 여러개일 경우 @Resource(name="name1") 으로 구분
- @Inject
- 이름으로 주입해준다(Spring 3 지원)
- 표준 Annotation으로, Spring 종속적이지 않다
- javax.inject-x.x.x.jar 필요
'WEB 공부' 카테고리의 다른 글
[WEB] Jenkins Permission denied 에러 해결법 (0) | 2021.10.06 |
---|---|
[WEB] Jenkins로 CI/CD 구축하기 (0) | 2021.10.05 |
[Frontend] 프론트에서 AWS S3에 이미지 압축 / 업로드 / 다운로드 / 삭제하기 (0) | 2021.08.22 |
[WEB] Cookie & Session (0) | 2021.05.16 |
[WEB] Backend - EL, JSTL (0) | 2021.05.16 |
[WEB] Backend - Servlet, JSP (0) | 2021.05.16 |
[JAVA] JDBC (0) | 2021.05.16 |