스프링 프레임우커 Bean 라이프사이클

Bean(POJO)의 LifeCycle

Spring은 Bean의 LifeCycle을 관리하는 것이 가능하다. Spring 프레임워크를 Spring Container, IoC Container라고 부르는 이유가 Bean(또는 POJO)에 대한 Life Cycle을 관리할 수 있는 기능을 제공하고 있다는 것이다.

Spring이 Bean의 Life Cycle을 관리하는 과정은 다음과 같다. Spring 프레임워크는 POJO 빈에 대하여 생성, 초기화(Initialize), 서비스, 소멸(Destroy)에 대한 순서로 Life Cycle을 설정하는 것이 가능하다. Servlet과 EJB에서는 이와 같은 Life Cycle이 특정 인터페이스를 상속하게 함으로서 처리가 가능하도록 지원하고 있다.

그러나 Spring에서는 POJO 클래스에 대한 Life Cycle을 관리하기 위하여 두가지 방식을 제공하고 있다.

•설정파일에서 임의의 메써드를 초기화 메써드(Initialize Method, init-method), 소멸 메써드(Destory Method, destory-method)를 지정할 수 있다.

•특정 인터페이스(InitializingBean, DisposableBean)를 상속할 경우 초기화와 소멸 작업을 진행한다.

각각의 장, 단점

Spring 프레임워크는 Bean의 Life Cycle을 관리하기 위하여 두가지 방법을 제공한다고 했다. 이 두가지 방법중 어느 것을 사용해야 할지 결정할 때 고려해야 할 사항에 대하여 알아보자.

첫번째 방법은 설정파일에서 초기화 메써드(Initialize Method, init-method), 소멸 메써드(Destory Method, destory-method)를 지정하고 있다. 이 방법의 Bean을 보면 Spring 프레임워크와 의존 관계에 있는 클래스가 하나도 없다. 그러므로 Spring 프레임워크를 사용하지 않는 경우가 발생하더라도 재사용하는 것이 가능하다. 그러나 두번째 방법의 경우에는 Spring 프레임워크에서 제공하는 인터페이스를 상속하고 있기 때문에 Spring 프레임워크에 대한 의존도가 높아질 수 밖에 없다. 첫번째 방법이 두번째 방법보다 Portability가 높아지게 된다.

그러나 국내 현실에서 프로젝트를 진행할 때 이와 같은 부분은 큰 의미가 없는 사실이다. Spring 프레임워크를 사용하다가 사용하지 않게 되는 경우 일반적으로 프로젝트 전체적인 재개발이나 변경이 요구되는 경우이기 때문이다. 또한 이 같은 Life Cycle을 관리하기 위해서는 프로그램의 수정이 필요할 수 밖에 없다. Spring 프레임워크를 제거하고 다른 프레임워크(Life Cycle을 관리해주는 EJB, Servlet)로 변경한다고 하더라도 해당 Bean의 변경은 불을 보듯 뻔하다. 이러한 상황에서 첫번째 방법을 사용하느냐, 두번째 방법을 사용하느냐 결정하기 위하여 시간을 낭비할 필요는 없을 것으로 생각한다.

개발자들이 편하다고 생각하는 방법을 이용하여 개발하는 것이 가장 좋은 선택이라고 생각한다.

리눅스의 커널과 쉘

리눅스는 커널(kernel)이라 불리는 하드웨어를 직접 제어하는 부분과 그 위에서 커널에 명령을 주는 하나 이상의 쉘(shell)로 구성되어 있다. 커널은 하드웨어를 직접 제어하는 리눅스의 핵심부로서 쉘에서 임무를 받아서 수행한다. 쉘은 명령어 기반 인터페이스인데 이것을 통해서 사용자는 리눅스 OS와 상호 작용을 하게 된다.

• 커널(kernel)은 리눅스 운영체제의 핵심으로서 프로세스(process) 관리, 메모리 관리, I/O 시스템 관리, 파일 시스템 관리 등을 수행한다.

• 쉘 (shell)은 사용자와 내부 커널 사이의 인터페이스 역할 (명령어 해석기)을 수행한다.

[그림 1] 리눅스 OS의 구성 계층도

리눅스 커널은 1만 줄 이상의 C 프로그램과 1000여 줄의 어셈블리어로 구성되어 있어서 이식성이 좋다고 한다. 커널은 리눅스가 부팅할 때 메모리로 로딩된다.

[그림 2] 커널과 쉘, 유틸리티, 응용프로그램의 관계도

그림 2에서 도시된 대로 사용자(user)는 (보통은 키보드로) 명령을 입력하면 쉘에서 그 명령을 해독하여 커널에 전달한 후 그 결과를 출력하게 된다. 쉘을 사용하면 커널단의 복잡한 동작 방식을 알 필요 없이 쉘 상의 인터페이스로 시스템 자원들을 쉽게 관리할 수 있다. 이것이 바로 쉘이 탄생한 이유이기도 하다.

리눅스에서 쉘은 여러 종류가 있고 쉘마다 특징이 있다. 쉘은 본쉘(bourne shell, bash), C쉘(c shell, csh), 콘쉘(korn shell, ksh)이 있으며, 대부분의 리눅스 시스템에서 본쉘을 사용하고 있다. 본쉘은 쉘프로그래밍(도스로 치면 bat 파일로서 쉘명령어들의 모음)이 쉬운 반면 다른 쉘보다는 사용자와 상호 작용이 부족하다는 단점이 있다.

24. 스레드(Thread) 정의

: 프로세스내에서 동시에 실행되는 독립적인 실행 단위를 말함, 장점으로는 자원을 많이 사용하지 않고 구현이 쉬우며 범용성이 높다

25. 스레드(Thread) 특징

· 어플리케이션의 성능을 향상시킬수 있고, 구현이 쉽다. 즉 작은 투자로 큰 효과를 기대.

· 스레드를 활용한 대표적인 예) 웹 브라우저

· 스레드를 쓰지 않고 프로세스나 다른 방법을 통하여 비슷하게 구현 할 수 있다.

반면 대부분의 자원을 많이 소모하여 구현이 복잡해지고 범용성이 떨어지는 등의 문제점이 있다. 스레드를 사용함으로써 이 문제들을 해결할 수 있다.

스레드는 각자의 스택 메모리영역을 가지고 있다. 프로세스와 달리 스레드는 동일한 프로세스내의 다른 스레드들과 전역메모리를 공유한다. 이에 반해 프로세스는 자기 자신의 메모리 영역을 가진다.

26. 스레드(Thread)의 장점 / 단점

장점 : ①빠른 프로세스 생성 ② 적은 메모리 사용 ③ 쉬운 정보 공유

단점 : 교착상태에 빠질 수 있다.

-스레드는 각자의 스택 메모리영역을 가지고 있다. 프로세스와 달리 스레드는 동일한 프로 세스내의 다른 스레드들과 전역메모리를 공유한다. 이에 반해 프로세스는 자기 자신의 메 모리 영역을 가진다.

①빠른 프로세스 생성 ② 적은 메모리 사용 ③ 쉬운 정보 공유

-스레드는 작업 디렉토리, 파일 지시자들, 대부분의 전역변수와 데이터, UID와 GID 같은 자원들을 서로간에 공유하고 있기 때문에 자원을 프로세스 복사(copy-on-write)방식으로 자 식 프로세스에게 복사하여 사용하는 프로세스(fork) 방식에 비해 더 빠른 수행능력을 보여 주고 있다. 하지만 다중스레드 방식의 프로그래밍에서는 매우 정교한 실패나 의도하지 않 은 변수의 공유로 인해 야기되는 실패가 발생할 가능성이 매우 높다. 그 대표적인 예)교착 상태

-교착상태 : 다중프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행 할 수 없는

어떤 특정시간을 기다리고 있는 상태. 망에서는 사용 가능한 버퍼가 없어 일단의 노드들이 패킷을 전송할 수 없는 상태이다. 데이터 통신망에서 송신기 및 수신기간에 전송할 정보는 있지만 송수신에 필요한 자원이 서러 맞물려 있어 송수신이 이루어질수 없는 현상. 교착상태에는 직접, 간접 및 재조립 교착상태가 있다.

27. 스레드와 프로세스의 차이점은?

운영체제에서 실행중인 하나의 프로그램을 프로세스(Process)라고 한다. 여러 분야에서 ‘과정’ 또는 ‘처리’라는 뜻으로 사용되는 용어로 컴퓨터 분야에서는 ‘실행중인 프로그램’이라는 뜻으로 쓰인다. 이 프로세스 내에서 실행되는 각각의 일을 스레드라고 한다. 프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 스레드가 하나의 프로세스를 이루게 되는 것이다.

28. JVM이란?

-자바 프로그램은 자바 컴파일러에 의해 바이트 코드로 번역됨. 이 번역된 바이트 코드는 인터프리터에 의해 해석되고 실행됨. 여기서 자바 바이트 코드를 기계어로 사용하는 컴퓨 터를 자바 가상기계라고 함. 즉, 자바의 바이트 코드를 해석하여 실행하는 해석기가 설치 된 컴퓨터는 모두 자바 가상 기계가 될 수 있음.

  1. 클래스 파일에 대해 설명해보시오.

JAVA(이하 자바)는 인터프리터 언어와 컴파일 언어의 특성을 모두 가지고 있는 언어이다. 자바 언어를 컴파일 했을 때 나오는 결과물이 클래스 파일(class file)이다. 클래스 파일은 온전한 실행 파일이 아니기 때문에 자바 버추얼머신(JVM)이 한번 더 컴파일을 했을 때에야 제대로 된 실행을 할 수 있다. 즉, 클래스 파일은 소스파일과 실행파일의 중간단계로 볼 수 있다. 두 번 컴파일을 해야하기 때문에 속도가 느리다는 단점이 있지만, JVM만 있다면 플랫폼을 가리지 않고 실행할 수 있다는 장점을 가지고 있다.

  1. 모델 1,2 MVC패턴에 대해 설명해보세요.

①객체지향프로그래밍에서, MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모 형에 관련 시키기 위한 방법론 또는 설계 방식중 하나이다. MVC방식은 자바, Smalltalk, C 및 C++ 등과 같은 프로그래밍 언어를 쓰는 개발 환경에서 널리 사용된다. MVC 형식 은 목적 코드의 재사용에 유용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요되는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.

②MVC 형식은 소프트웨어 개발에 사용될 세 가지 구성요소 또는 객체를 제안한다.

-Model: 소프트웨어 응용과 그와 관련된 고급 클래스 내의 논리적 데이터 기반 구조를 표 현. 이 목적 모형은 사용자 인터페이스에 관한 어떠한 정보도 가지고 있지 않다.

-View: 사용자 인터페이스 내의 구성요소들을 표현하는 클래스들의 집합.

(누름단추, 표시 상자 등과 같이 사용자가 화면상에서 보고 응답할 수 있는 모든 것들)

-Controller: 모형과 뷰를 연결하고 있는 클래스들을 대표하며, 모형과 뷰 내의 클래스들 간 에 통신하는데 사용됨.

47. 서블릿의 라이프 사이클에 대해 설명하세요.

①서버를 실행시키는 순간 서블릿의 생성자가 호출된다.

②생성자를 호출해서 객체가 생성되면 초기화 작업을 한다.(init() 메소드가 최초 한번만 자 동적으로 호출된다.)

③초기화 작업 후에는 Service메소드가 호출이 된다.(req, res를 통해 data get, logic 구현 등의 작업이 일어난다. -> Service메소드는 클라이언트가 요청할 때마다 호출이 된다.)

④마지막으로 서버가 종료되는 시점에 destroy()메소드가 호출된다.(혹은 서버 재시작 시에 자원 반납을 위해서 호출된다.)

62. Heap이란?

실행되는 동안 동적으로 할당 되는 메모리 영역. 객체나 배열 new 키워드로 할당된 객체들이 저장된다.

모든 객체들이 저장되는 공간이다. (인스턴스와 배열)

JVM의 모든 스레드들이 공유하며, JVM이 시작될 때 생성된다.

63. Stack 이란?

메서드가 호출될 때마다, 스택 프레임(stack frame)이라고 불리는 새로운 데이터 영역이 생성된다. 스택 프레임이 모여 자바 스택(java stack)을 생성한다.

스택의 최상단에 존재하는 스택 프레임은 활성화된 스택 프레임(active stack frame)이라고 부른다.

스택 프레임의 구조
는 다음과 같다.

  • 피연산자 스택(operand stack)
  • 지역 변수(로컬 변수)들을 저장하는 배열
  • 현재 실행중인 명령어를 나타내는 포인터.

실행 순서

  1. 프로그램이 수행될 때는 활성화된 프레임의 피연산자 스택과 지역 변수 배열만 사용된다.
  2. 메서드가 호출되면, 새로운 자바 스택 프레임이 생성되고, 새로 생성된 프레임이 자바 스택의 최상단으로 오게 된다.
  3. 이전의 자바 스택 프레임에서는 모든 변수들과 프로그램 카운터를 저장한다.
  4. 새로운 자바 스택 프레임은 자기 자신의 프로그램 카운터를 생성하고, 이 카운터는 호출된 메서드의 시작 부분을 가리키게 된다
  5. 호출된 메서드가 종료되면 최상단 스택 프레임은 없어지며, 아래쪽에 있는 스택 프레임이 다시 활성화된 스택 프레임이 된다.
  6. 이 스택 프레임에서 프로그램 카운터는 메서드를 호출한 명령어의 다음 명령어를 가리키고 있을 것이고, 프로그램은 메서드를 호출한 부분의 다음부터 수행한다

64. 프레임워크란?

* 특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스프레임과 인터페이스프레임의 집합

* 특정한 틀을 만들어놓고 거기에 살을 붙여 놓음으로써 프로그램을 만들어 작업시간을 줄여주는 것이다.

스켈레톤 코드라고도 하는데, 뼈대가 이미 만들어져 있어서 거기에 살(기능)만, 덧붙이면 완성이 되도록 공통된 함수 또는 클래스를 미리 만들어 놓는 것을 이야기한다.

프레임워크는 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성된다.

프레임워크는 이렇게 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의한다.

프레임워크 컴포넌트 들은 재사용이 가능하다.

프레임워크는 좀 더 높은 수준에서 패턴을 조작한다.

* 프레임뭐크가 중요한 이유는 객체지향 개발을 하게 되면서 개발자의 취향에 따라 다양한 프로그램이 나오게 되었다. 프로그램 개발에 투입되는 개발자도 점점 늘어남에 따라 전체 시스템의 통합성, 일관성이 부족하게 되었기 때문이다. 그래서 개발자의 자유를 제한하기 위해 프레임워크를 도입했다.

프레임워크가 가져야할 특징

a. 개발자들이 따라야할 가이드라인을 가진다.

b. 개발할 수 있는 범위가 정해져 있다.

c. 개발자를 위한 다양한 도구들이 지원된다.

* 프레임워크의 장/단점

장점 : 개발 시간을 줄일 수 있고 오류로부터 자유로울 수 있다.

단점 : 프레임워크에 너무 의존하면 개발 능력이 떨어져서 프레임워크 없이 개발하는 것이 불가능해지는 점이다.

65. SPRING FRAMWORK

EJB기반으로 개발을 하지 않고 POJO기반으로 개발을 하더라도 가볍고, 제어가 가능한 상호관련이 적은 AOP를 지원한다. 컨테이너를 통해 라이프사이클을 관리하고 XML기반으로 컴포넌트를 개발할 수 있도록 지원해주는 프레임워크

출처: http://www.javajigi.net/pages/viewpage.action?pageId=1035

데드락

교착 상태란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.

1971년에 E. G. 코프만 교수는 교착상태가 일어나려면 다음과 같은 네 가지 필요 조건을 충족시켜야 함을 보였다.

1.상호배제(Mutual exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.

2.점유대기(Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

3.비선점(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.

4.순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

이 조건 중에서 한 가지라도 만족하지 않으면 교착 상태는 발생하지 않는다. 이중 순환대기 조건은 점유대기 조건과 비선점 조건을 만족해야 성립하는 조건이므로, 위 4가지 조건은 서로 완전히 독립적인 것은 아니다.

교착 상태의 관리

현재의 대부분의 운영 체제들은 교착 상태를 막는 것은 불가능하다.[1] 교착 상태가 발생하면 여러 운영 체제들은 제각기 다른 비표준 방식들로 이러한 교착 상태에 대응한다. 대부분의 접근들은 4가지 코프먼 조건들 가운데 하나(특히 4번째 것)를 막음으로써 동작한다.[2] 주요 접근 방식은 다음과 같다.

교착 상태의 예방

상호배제 조건의 제거

교착 상태는 두 개 이상의 프로세스가 공유가능한 자원을 사용할 때 발생하는 것이므로 공유 불가능한, 즉 상호 배제 조건을 제거하면 교착 상태를 해결할 수 있다.점유와 대기 조건의 제거

한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때에는 다른 프로세스가 자원을 요구하도록 하는 방법이다. 자원 과다 사용으로 인한 효율성, 프로세스가 요구하는 자원을 파악하는 데에 대한 비용, 자원에 대한 내용을 저장 및 복원하기 위한 비용, 기아 상태, 무한대기 등의 문제점이 있다.비선점 조건의 제거

비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 준다.환형 대기 조건의 제거

자원 유형에 따라 순서를 매긴다.

이 교착 상태의 해결 방법들은 자원 사용의 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.

교착 상태의 회피

자원이 어떻게 요청될지에 대한 추가정보를 제공하도록 요구하는 것으로 시스템에 circular wait가 발생하지 않도록 자원 할당 상태를 검사한다.

교착 상태 회피하기 위한 알고리즘으로 크게 두가지가 있다.

1.자원 할당 그래프 알고리즘 (Resource Allocation Graph Algorithm)

2.은행원 알고리즘 (Banker's algorithm)

교착 상태의 무시

예방 혹은 회피기법을 프로그래밍해서 넣으면 성능에 큰 영향을 미칠 수 있게 된다. 그렇기 때문에 데드락의 발생 확률이 비교적 낮은 경우 별다른 조치를 취하지 않는다.

교착 상태의 발견

감시/발견을 하는 detection 알고리즘으로 Deadlock 발생을 체크하는 방식. 이 역시 성능에 큰 영향을 미칠 수 있다.

results matching ""

    No results matching ""