아키텍트가 바라보는 Spring framework

34
아키텍트가 바라보는 Spring Framework ㈜이밸리사람들 컨설팅 사업부 이해일 이사

Transcript of 아키텍트가 바라보는 Spring framework

Page 1: 아키텍트가 바라보는 Spring framework

아키텍트가 바라보는Spring Framework

㈜이밸리사람들컨설팅 사업부

이해일 이사

Page 2: 아키텍트가 바라보는 Spring framework

차례기본기

컨테이너쓰레드

Spring 적용하기PattenAspect

Page 3: 아키텍트가 바라보는 Spring framework

컨테이너

Page 4: 아키텍트가 바라보는 Spring framework

컨테이너

동작 환경

Page 5: 아키텍트가 바라보는 Spring framework

컨테이너

Page 6: 아키텍트가 바라보는 Spring framework

컨테이너Java EE

웹 어플리케이션

비즈니스

어플리케이션

엔터프라이즈

어플리케이션

Page 7: 아키텍트가 바라보는 Spring framework

컨테이너Java EE - EJB

Page 8: 아키텍트가 바라보는 Spring framework

컨테이너JavaEE - Spring

Page 9: 아키텍트가 바라보는 Spring framework

컨테이너컨테이너에 넣을 구현체는 무엇인가?컨테이너가 제공할 동작 환경은 무엇인가?

CMTThread SafetyComponent Life Cycle

Page 10: 아키텍트가 바라보는 Spring framework

쓰레드도전

Page 11: 아키텍트가 바라보는 Spring framework

쓰레드해법

Page 12: 아키텍트가 바라보는 Spring framework

쓰레드동시성 문제

Thread1 HeapStack

Thread2

Stack

Object A

attribute

Page 13: 아키텍트가 바라보는 Spring framework

쓰레드동시성 문제 – 왜?

JMM

Page 14: 아키텍트가 바라보는 Spring framework

쓰레드동시성 문제 - 동기화

주 메모리

object

a := 2

lock

Thread 1바이트 코드실행 엔진

작업 메모리

a := 2

1. 작업메모리에복사한다.

Thread바이트 코드실행 엔진

작업 메모리

a := 1

주 메모리

object

a := 1

lock

Thread1바이트 코드실행 엔진

작업 메모리

a := 1

주 메모리

object

a := 2

Thread 2바이트 코드실행 엔진

lock 2. a를읽어서값을바꾼다.

1. 작업메모리에복사한다.

Thread 2바이트 코드실행 엔진

작업 메모리

a := 1

작업 메모리

a := 2

if (a > 0){

a--;}

주메모리 Object 내용

2. a를읽어서값을바꾼다.

3. 쓰레드종료시점에 동기화

주 메모리

object

a := 1

lock

Thread 2바이트 코드실행 엔진

작업 메모리

a := 1

3. 쓰레드종료시점에 동기화

Page 15: 아키텍트가 바라보는 Spring framework

쓰레드동시성 문제

심각성일반 개발 환경인 단일 프로세서 환경에서는 잘 드러나지 않는다.다중 프로세서가 장착된 운영 환경에 가서야 드러나는 경우가 많다.부하가 적을 때는 드러나지 않기 때문에 재현하기 쉽지 않다.

해결하기 아주 힘든문제가 된다.

Page 16: 아키텍트가 바라보는 Spring framework

쓰레드동시성 문제 - 사례public void put(Object values){

int count = 1;while (true){

if ( ){

try{

Thread.sleep(10);}catch (InterruptedException e){

e.printStackTrace();MsgParameter msp = new MsgParameter();msp.add(poolType);throw new FWRuntimeException(FWExceptionCode.EX00075, msp, e);

}count++;// 객체풀이 여유가 없을 경우 최대 시도 횟수만큼 재시도하고// 재시도 후에도 여유가 없을 경우는 풀의 맨처음 객체를 제거한다.if (count == retryCount){

if(this.objPool.size()>0){

this.objPool.remove(0);}

}continue;

}this.objPool.add(values);

break;}

}

Page 17: 아키텍트가 바라보는 Spring framework

쓰레드쓰레드 안정성을 보장하라.

JVM 차원 필드 동기화 : volatile – 정확히 동작하지 않음코드 차원 동기화 : synchronized – 동시성 VS 정합성객체 공유하지 않기 : 참조 넘기지 않기불변 객체 만들기 : singleton

Page 18: 아키텍트가 바라보는 Spring framework

쓰레드synchronized

synchronized로 구분된 블락은 특정 시점에 오직 한 쓰레드만 실행할 수 있다.주메모리와 작업메모리 내용을 동기화해서 한 쓰레드가 바꾼 상태를 다른 쓰레드가 알아차리게 한다.Oracle select … for update와 비슷하다.

Page 19: 아키텍트가 바라보는 Spring framework

쓰레드synchronized

Page 20: 아키텍트가 바라보는 Spring framework

쓰레드Synchronized

동기화는 성능을 크게 저하시킨다. 꼭 필요할 때만 동기화하라.

final public class ServiceLocator{

private Context ctx;private static ServiceLocator SINGLETON;

private ServiceLocator(){

this.ctx = new InitialContext();…

}

public static synchronized ServiceLocator getInstance(){

if (SINGLETON == null){SINGLETON = new ServiceLocator();

}return SINGLETON;

}…

}

동기화가 필요할까?[YES] 객체가 한 번만 생성된다는것을 보장하려면 동기화는 필요하다.[NO] 아주 빈번하게 호출되는메소드를 동기화하면 전체 시스템성능에 영향을 준다.

Page 21: 아키텍트가 바라보는 Spring framework

쓰레드Synchronized

동기화는 성능을 크게 저하시킨다. 꼭 필요할 때만 동기화하라.

Page 22: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE - 서블릿

Web Server

WASClient

Client

Client

Servlet

Thread

Thread

Thread

Page 23: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE - 서블릿

단일 쓰레드 서블릿 – 동시성 저하

Page 24: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE - EJB

Application Server

WAS

Client

Client

Client

Thread

Thread

Thread

EJB

EJB

EJB

Page 25: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE 안정성 문제

WAS

Client

Client

Client

Thread

Thread

Thread

Servlet

object

object

Page 26: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE 안정성 문제

WAS

Client

Client

Thread EJB 1

Thread EJB 3

EJB 2

object

object

object

Page 27: 아키텍트가 바라보는 Spring framework

쓰레드JavaEE - Spring

Page 28: 아키텍트가 바라보는 Spring framework

Spring 적용하기컨테이너에 넣을 구현체는 무엇인가?

EJBHome/Business Interface, Bean Class, DDCore J2EE Pattern, EJB Pattern 참조하여 컨테이너에 넣을

SpringInterface, Bean, Context FilePattern???

Page 29: 아키텍트가 바라보는 Spring framework

Spring 적용하기Pattern

HTTP 기반 요청에 Spring MVC 이용

- 트랜잭션/기본 디버그 로깅/프로파일링 애스팩트화- 비즈니스 컴포넌트 구성요소 가운데 퍼서드와 자원접근객체를 Bean으로 등록

Page 30: 아키텍트가 바라보는 Spring framework

Spring 적용하기Pattern

Spring Beanssingleton

Spring Beanssingleton

new로 생성

new로 생성

Page 31: 아키텍트가 바라보는 Spring framework

Spring 적용하기Pattern

트랜잭션 전파

Page 32: 아키텍트가 바라보는 Spring framework

Spring 적용하기Pattern

실행시점 객체 다이어그램DTO를 제외한 모든 객체는 상태가 없다.스프링 빈은 모두 singleton scope를 가진다.모든 클래스는 인스턴스를 하나만 만들어 낸다.

Page 33: 아키텍트가 바라보는 Spring framework

Spring 적용하기Aspect

Page 34: 아키텍트가 바라보는 Spring framework

Spring 적용하기Aspect

트랜잭션