전자정부 표준 프레임워크_4(실행환경 실행환경소개,공통기반 레이어 IOC)

bitna's study note·2022년 11월 23일

스프링

목록 보기
48/54

11월 23일

1.실행환경구성

-실행환경이란?
업무 프로그램의 실행에 필요한 공통 모듈 및 업무 공통서비스를 제공함.

그림의 회색부분이 개발자가 개발해야 되는 부분이고 개발할때 필요한 부분을 실행환경에서 받아서 쓰거나 아니면 연계해서 쓰면된다.


공통기반(Foundation Layer)을 이용하여 Web Application 아키텍쳐 임.

-실행환경 구성
(1)화면처리
사용자의 인터페이스를 담당하는 레이어로 사용자 화면 구성, 사용자 입력정보 검증 등의 기능을 제공함.
(2)업무처리
업무로직을 담당하는 레이어로 업무 흐름 제어, 에러 처리 등의 기능을 제공한다.
(3)데이터처리
DB에 대한 연결 및 영속성 처리, 트랜잭션 관리를 제공
(4)연계통합
타 시스템과의 연동 기능을 제공
(5)공통기반
실행환경 서비스에서 공통적으로 사용하는 기능 제공
(6)배치처리
대용량 데이터처리 지원, 작업수행 및 관리기능 제공
(7)모바일 화면처리
모바일 환경의 화면구성을 지원, UI컴포넌트 제공
(8)모바일 디바이스 API 실행환경
모바일 하이브리드 애플리케이션 개발을 위한 디바이스 API기능

2.공통기반 레이어

각 실행 환경 Layer에서 공통적으로 사용하는 공통서비스를 제공하는 Foundation Layer 라고 보면 된다.

3.IoC컨테이너

Spring의 core기술로는 제일 기본이 되는 IoC(Inversion of Control) Container기능을 제공한다. IoC Container의 핵심적인 기능은 등록한 빈(객체)의 생명주기를 관리하고 필요한 곳에 주입시켜주는 등의 의존성을 관리하고 있는게 IoC Container의 핵심적인 역할이다.
*주요기능: Dependency Injection, Bean Lifecycle Management 이다.

스프링이 없을때는 객체를 생성할때 new라는 연산자를 통해서 객체를 생성했는데,IoC Container가 객체를 관리 하고 있기 스프링프레임워크 설정을 보고 적재적소에 객체를 주입시켜줌.
즉, 객체생성을 개발자가 아니라 스프링프레임워크가 주도하에 넣어줌.

(1)IoC(Inversion of Control)
제어의 역전이라는 의미로 개발자가 사용할 모듈을 스스로 결정하는 것이 아니라 IoC컨테이너가 객체들의 의존성을 파악해서 의존성에 맞게끔 빈들을 생성하고 서비스단에서 호출하게 되면 제공해주는 서비스이다.즉, 우리가 필요할때 생성하는게 아니라 필요할때 IoC컨테이너에 물어보고 IoC컨테이너가 객체를 제공해주고 필요가 없어지면 다시 회수한다.

왼쪽은 IoC/DI가 적용안된것으로 Foo라는 객체를 생성할때 Bar와 Baz가 객체가 필요한 상황에서 IoC/DI없을때에는 Foo객체를 이용시 Bar와 Baz객체를 신경써서 생성을 해줘야 한다.

그러나 IoC/DI가 적용된 오른쪽은 Foo객체를 생성시 Bar와 Baz객체가 필요한 상황에서 외부적인파일로 xml에 'Foo객체를 생성시 Bar와 Baz객체가 필요해'라고 설정해 놓으면
IoC컨테이너는 Foo를 생성할때 기본적으로 Bar와 Baz객체를 동일하게 생성해서 묶어주고 Foo를 생성할때 묶음으로 제공해준다. 이로써 개발자는 Foo를 생성할때 Bar와 Baz를 객체생성에 신경쓰지 않아도 된다.
또한, Bar나 Foo가 Bar2나 Foo2로 변경될때 코드를 변경하는것이 아니라 외부설정 파일인 xml만 변경하면 되기 때문에 편리하다.

IoC Container가 객체를 생성하고 객체간의 의존성을 이어주는 역할을 하는데
설정하는 방법으로는
(1)기본적으로 xml형태로 외부파일로 작성되며,
(2)추가적을 java Annotation을 이용해서도 설정이 가능하다.

(2)BeanFactory
BeanFactory IoC컨테이너 기능을 제공하는 기본 인터페이스로 Bean생성 및 의존성 주입, 생명주기 관리 등의 기능을 제공한다.

(3)ApplicationContext
BeanFactory인터페이스를 상속받아 Web Application을 만들기 위해서 좀더 확장된 기능을 제공하기 위해 생김. 기본적으로 BeanFactory인터페이스를 상속 받았기 때문에 BeanFactory의 기능인 IoC컨테이너 기능을 사용할 수 있다.

4.Bean 설정

IoC컨테이너를 사용하기 위해서 스프링에서 참고할수 있는 Bean 설정 파일을 작성해야한다.
설정 파일은 xml형태로 제공되고 있다.
xml에서는 속성 하나하나가 bean 정의를 나타낸다.

(1)Bean 이름
모든 Bean은 하나의 id를 가지며, id는 컨테이너 안에서 중복되지 않고 유일해야 한다.
name은 하나이상 가질수 있으며 alias로 name추가가 가능하다.
id와 name 둘 중하나만 쓰면 된고, 둘다 중복되면 오류가 떨어짐.
id가 중복될 경우 컴파일에서 오류가 떨어지고, name이 중복될 경우 런타임시 에러가 떨어진다.

(2)Bean Class
Bean객체에 실제 객체가 어떤것인지에 대한 내용이 들어있는 class를 지정해 준다.
지정을 해줄 때는 full name으로 class명을 써줘야한다.

<bean id="exampleBean" class="example.ExampleBean"/>
<bean name="anotherExample" class="example.ExampleBean2"/>

만약에 Bean이름을 지정하지 않았다면 BeanFactory가 임으로 Bean Class이름을 지정해줌.
Object의 이름을 가지고 Bean이름을 생성해줌.
내가 이름을 지정하지 않았지만 BeanFactory 에서 class이름이 지정됨.
나중에 호출할때 id나 name을 지정하지 않았지만 class이름을 호출하면 호출이 됩니다.

(3)Bean의 객체화
보통은 new연산자를 통하여 Bean을 객체화 시킬수 있음.
new연산자가 아닌 static Factory 메서드를 사용하여 Bean을 객체화시킬 수 있음.

<
bean id="exampleBean" 
class="example.ExampleBean"
factory-method="createInstance"
/>

(4)Bean의 객체화 attribute
빈들이 어느시점에 올라오냐면 WAS가 작동할때 모든 빈파일을 모두 읽고 서비스단에서 대기하고 있음. 그렇기 때문에 필요하지 않는 빈들도 WAS가 작동할때 읽기 때문에 WAS가동이 오래 걸린다.
이러한 단점을 해결하기 위해서 lazy-init을 사용하여 필요하지 않는거는 좀 나중에 호출될때 생성하는 기법이 lazy-init 이다.

<bean id="lazy" class="com.foo.ExampleBean" lazy-init="true"/>

아래와 같이 빈들을 한번에 묶어서 lazy-init을 지정할수 있다.

<beans default-lazy-init="true">
...지정 bean....
</beans>

(5)Bean의 생성하는 방법
의존성 주입에는 Constructor Injection과 Setter Injection 두가지의 방식이 있다.

*Constructor Injection

<beans>
  <bean name="foo" class="x.y.Foo">
    <constructor-arg>
      <bean class="x.y.Bar"/>
    </constructor-arg>
    <constructor-arg>
      <bean class="x.y.Baz"/>
    </constructor-arg>
  </bean>
</beans>

foo객체를 만들때는 constructor-arg 로 지정한 x.y.Bar 와 x.y.Baz를 가지고 만든다는 의미

*Setter Injection
Setter Injection은 argument가 없는 기본 생성자를 사용하여 객체를 생성한후, Setter메소드를 사용하여 의존성을 주입하는 방식으로 property 요소를 사용한다.

public class ExampleBean{
	
    private AnotherBean beanOne;
    private YetAnotherBean beanTwo;
    private int i;
    
    public void setBeanOne(AnotherBean beanOne){
    	this.beanOne=beanOne;
    }
    
    public void setBeanTwo(YetAnotherBean beanTwo){
    	this.beanTwo=beanTwo;
    }
    
    public void setIntegerProperty(int i){
    	this.i=i;
    }
    
}

xml을 통해서 bean을 설정 할수 도 있다.

<bean id="exampleBean" class="example.ExampleBean">
	<property name="beanOne"><ref bean="AnotherBean"/></property>
    <property name="beanTwo" ref="AnotherBean"/>
</bean>

property name="beanOne"이 위에 setBeanOne()과 이름이 매치가 되어야한다.
ref bean="AnotherBean"이부분은 필요한 클레스를 지정하면 된다.
ref="AnotherBean" 설정할 경우 참조할 객체나 빈을 적으면 됨.

xml설정만 보고도 대략적인 class의 구조를 알 수 있다.

(6)Inner Bean
보통은 ref를 통해 클레스를 참조하지만 Inner Bean은 클래스 안에 있기 때문에 레퍼런스 참조안해도됨.Inner Bean은 Inner class처럼 그안에서 존재하고 작동하고 외부에서 쓸수는 없다.

(7)Autowiring
IoC컨테이너는 서로 관련된 Bean객체를 자동으로 엮어줄 수 있다.
Autowiring 기능을 사용하기 위해서는 각각의 bean단위로 설정되며,자동 엮기 기능을 사용하면property 나 constructor-arg를 지정할 필요가 없어지므로 타이핑을 줄일 수 있다.
xml설정시 Autowiring기능은 많이 안쓴다. 이제는 @Autowired를 많이 쓴다.

(8)Bean Scope
빈에 대한 생명주기 또는 범위 이다.
총 5가지의 scope가 있다.(singleton,prototype,request,session,global session)
기본적으로 Bean Scope는 singleton 이다.
singleton: 하나의 bean 정의에 대해서 IoC컨테이너 내에 단 하나의 객체만 존재하는걸 의미함.하나만 생성해서 관리하는 시스템이다.
prototype: 하나의 Bean 정의에 대해서 다수의 객체가 존재 할 수 있다.

5.Annotation 설정

기존에 bean을 생성하기 위해서는 xml파일을 설정하여 빈을 생성했는데, 코딩할때 직접설정하는 방법은 Annotation방식을 사용하고있다.
Annotation방식을 사용하므로써 설정파일을 간결화 하고, 소스코드에 직접 설정을 하기 때문에 가독성이 좋다.
어노테이션을 사용할려면 xml파일에 아래와 같은 구문을 넣어주거나

<context:component-scan base-package="com.zorba.chocolate"/>

아래와 같이 xml설정을 하기도 함

<context:annotation-config/>

(1)@Required
Setter메서드에 적용되며 @Required를 사용하면 이 인자값은 필수로 지정,즉 값이 없으면 안된다!

(2)@Autowired
자동으로 엮을 property를 지정하기 위해 사용한다.
Setter뿐만 아니라 메서드에도 사용이 가능하다.
생성자와 필드값에도 설정이 가능하다.

public class SimpleMovie{
private MovieFinder movieFinder;

@Autowired
public void setMovieFinder(MovieFinder movieFinder){
	this.movieFinder=movieFinder;
}
}

스프링이 @Autowired 를 보고 컨테이너안에 MovieFinder라는 클래스를 찾아서 자동으로 엮어주는 기능이다.

(3)@Qualifier
동일한 클래스가 하나이상일때 자동엮기기능을 못쓰므로 보완하기 위해 나온기능으로 name을 지정하여 어떤클래스와 자동엮기를 할건지 지정해줌

(4)@Resource
@Autowired와 유사한 기능이다.클래스에 필요한 빈을 할당해주는 기능인데,Resource는 @Autowired와 다르게 name을 지정해야한다.
name을 지정하지 않을때에는 class의 이름을 따서 컨테이너가 지정해 준다.

(5)@Component
자바의 Object와 같이 최상위에 있는 class인거 처럼 @Component의 최상위 @Component라고 생각하믄됨

6.xml설정과 어노테이션사용의 장단점

xml설정으로 빈을 생성해 줄 경우 전체적인 소스를 뒤지지 않고도 xml설정파일만 으로도 전체적인 빈의 구조를 파악하기 좋다.단점으로는 일일히 작성을 해줘야한다.
어노테이션 같은 경우는 빈의 구조를 한눈에는 파악이 안되지만 클래스안에 명시적으로 지정하므로써 사용이 편리하고 설정코드를 작성해 주지 않아서 사용하기 편리하다.

profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글