donaricano-btn

PresentationLayer_1


1. 스프링 MVC


1_1. MVC설계

- 클래스 별로 약한 결합으로 되어있다

- 모델-뷰-컨트롤러뿐만 아니라 스프링 MVC가 제공하는 기능은 독립적이고 약한 결합니다

1_2. 애노테이션 도입

- 스프링 1.0에서는 컨트롤러 클래스를 만들때 컨트롤러 인터페이스를 만들어야 했다

- 지금은 컨트롤러 클래스@Controller 애노테이션만 선언 하면된다

- URL과 실행할 메소드의 메핑도 @RequestMapping 이면 된다

1_3. 스프링 MVC와 REST

1) REST

- Representational State Transfer, 웹 어플리케이션을 구현하는 방법의 하나

- 웹상의 정보를 하나하나 리소스로 파악하고 그 식별자로서 URI를 할당해 고유하게 특정할 수 있게 한다

Example    

- foo.bar.baz 도메인으로 복수의 사용자 정보를 관리

- 사용자 정보에 uri로 http://foo.bar.baz/user/{사용자id}를 할당해 각 사용자를 특정하게 관리

 REST의 특징은 소스 접근 방식이다

- REST로 리소스 접근시 HTTP프로토콜로 정의된 HTTP 메소드를 충실하게 사용한다

Example

- 아이디가 1인 사용자는 GET메소드로 접근

- 아이디가 2인 사용자는 POST로 접근

REST 웹 어플리케이션을 구축에 필요한 MVC 프레임워크는 기능

a. URL을 자유롭게 결정할 수 있다

b. HTTP 메소드에 따라 실행할 처리를 전환할 수 있다

c. URL일부를 쉽게 추출해 사용할 수 있다

- 스프링MVC는 REST의 사고의 강하게 영향 받았다


1_4. 스프링 MVC의 요소

1) 동작 개요


역할

a. DispatcherServlet

프론트 컨트롤러를 담당

- 모든 HTTP 요청을 받아 들여 그 밖의 오브젝트 사이의 흐름 제어

b. HandlerMapping

- 클라이언트 요청을 바탕으로 어느 컨트롤러를 실행 할지 결정

- 애노테이션 이용시 mvc:annotation-driven 태그를 설정하여 RequestMappingHandlerMapping 클래스가 적용됨

c. Model

- 컨트롤러에서 뷰로 넘겨줄 오브젝트를 저장하기 위한 오브젝트

- HttpServletRequest와 HttpSession처럼 String키와 오브젝트를 연결하여 오브젝트 유지

d. View

- 뷰에 화면표시 처리 의뢰

e. Business

- 비즈니스 처리

f. Controller

- 클라이언트 요청에 맞는 프레젠테이션 층의 애플리케이션 처리

g. 뷰

- 화면표시

흐름

a. 요청받기

- DispatcherServlet은 브라우저로부터 요청을 받는다

b. 컨트롤러 오브젝트 얻기와 메소드 실행

- DispatcherServlet은 요청된 url을 핸들러매핑 오브젝트에 넘기고 호출 대상의 컨트롤러 오브젝를 얻어 url에 해당하는 메소드 실행

c. 비즈니스로직처리와 그 결과를 뷰에 넘기기 위해 Model 오브젝트에 저장 

- 컨트롤러 오브젝트는 비즈니스 로직 처리를 실행하고, 결과를 바탕으로 뷰에 전달할 오브젝트Model 오브젝트에 저장한다, 끝으로 컨트롤러 오브젝트는 처리 결과에 맞는 View이름을 반환한다

d. View오브젝트 얻기

- DispatcherServlet은 컨트롤러에서 반환된 View 이름뷰 리졸버에 전달 해서 View 오브젝트를 얻는다

e. 뷰 호출 및 화면 표시 의뢰

- View 오브젝트는 해당하는 뷰를 호출해서 화면 표시 의뢰

f. 화면 표시 처리 실행

- 뷰는 Model 오브젝트에서 화면 표시에 필요한 오브젝트를 가져와 화면 표시 처리 실행


컨트롤러의 개요와 Model 오브젝트


- Model 은 스프링 MVC의 Model 오브젝트이다

- Model 오브젝트는 서블릿 API에서 말하는 HttpServletRequest나 HttpSession과 같다

View와 뷰리졸버

- 스프링MVC에서는 View인터페이스를 구현한 View 오브젝트가 애플리케이션 개발자가 작성한 뷰를 호출해서 화면에 표시함

- JSTL이라면 JstlView 클래스의 오브젝트, Velocity라면 VelocityView클래스 오브젝트가 담당

- 컨트롤러와 뷰 사이의 독립성을 유지하기 위해 뷰 리졸버 오브젝트를 사이에 둔다

- 컨트롤러는 뷰가 어떤 뷰 기술을 쓰든 신경쓸 필요가 없다


UrlBasedViewResolver 와 뷰 경로

- 뷰 리졸버에서 가장 자주 사용되는 것이 UrlBasedViewResolver이다

- 설정

접두사 : /WEB-INF/views/

접미사: .jsp







'Back-End > SpringFrame_1' 카테고리의 다른 글

[Spring] @RequestMapping 애노테이션 속성  (0) 2016.08.22
[Spring] PresentationLayer_Function of Spring  (0) 2016.08.16
[Spring] BusinessLayer_2  (0) 2016.08.07
[Spring]BusinessLayer_1  (0) 2016.08.01
[Spring] DataAccessLayer_2  (0) 2016.07.31
블로그 이미지

리딩리드

,
donaricano-btn

1. 트랜잭션 매니저의 구현 클래스

- 트랜잭션 매니저의 이용방법은 데이터 엑세스 기술에 의존하지 않는다

- 공통 인터페이스가 존재함

- Bean 정의(DataSourceTransactionManager)



2. 트랜잭션 기능의 사용법

2_1. 선언적 명시적 트랜잭션

1) 선언적 트랜잭션

트랜잭션 처리의 대상으로 하는 메소드를 Bean정의 파일 혹은 애노테이션으로 지정

- 트랜잭션 정보도 함께 설정하며 나머지는 스프링이 자동으로 프록시를 생성해서 트랜잭션 처리 함

- 애노테이션 소스 코드의 트랜잭션 처리를 기술할 필요가 없으므로 좋다

2) 명시적 트랜잭션

- 트랜잭션 매니저의 API를 애플리케이션 프로그램에서 직접 호출하여 트랜잭션 처리

- 애플리케이션 소스 코드에 트랜잭션 처리가 기술되어 코드가 복잡해짐


2_2. 선언적 트랜잭션 설정

1) Bean정의 파일 의한 선언적 트랜잭션- 어드바이스 설정

a. 기본 설정

 

- 와일드카드(*) 함으로서 모든 메소드에 기본 트랜잭션 정의 정보가 됨

b. 정의 정보 설정

 

- 전파속성 : PROPARGATION_REQUIRED

- 독립성 수준 : READ_COMMITED

- 시간만료 : 10초

- 읽기 전용상태 : false

- 롤백대상 예외 : sample.business....

c. 대상 오브젝트에 어드바이스 적용

 

- 이름끝에 Service 들어간 메소드 모두 지정

- 포인트 컷을 메소드가 아니라 애노테이션으로 지정하는 법

- Example(@Service 붙은 모든 클래스를 트랜잭션 대상으로 할때)

 

2) 애노테이션 의한 선언적 트랜잭션

a. 기본 설정

 

b. 메소드 마다 트랜잭션 정의 정보 

 

c. Bean 정의 파일에 @Transactional을 유효하게 설정 해야

 

2_3. 명시적 트랜잭셔 사용법

 


3. 트랜잭션 시작/ 종료 로그를 출력 하는 법

- DataSourceTransactionManger와  Log4j를 이용할 때, Log4j에 설정

3_1. XML 경우

 

3_2. property

 

'Back-End > SpringFrame_1' 카테고리의 다른 글

[Spring] PresentationLayer_Function of Spring  (0) 2016.08.16
[Spring] PresentationLayer_1  (0) 2016.08.08
[Spring]BusinessLayer_1  (0) 2016.08.01
[Spring] DataAccessLayer_2  (0) 2016.07.31
[Spring] DataAccessLayer_1  (0) 2016.07.25
블로그 이미지

리딩리드

,
donaricano-btn

This keyword


1. Usage of java this keyword

1) this keyword can be used to refer current class instance variable

2) this() can be used to invoke current class constructor

3) this keyword can be used to invoke current class method

4) this can be passed as an argument in the method call

5) this can be passed as an argument in the constructor call

6) this keyword can also be used to return the current class instance

2. Without this keyword


- We use a this key word to distinguish between local variable and instance variable

- we have a this 

 

- If local variables and instance variables are different, there is no need to use this keyword


'Back-End > Java_1' 카테고리의 다른 글

[Java] Input by BufferedReader  (0) 2016.08.22
[Java] Input by Scanner  (0) 2016.08.18
[Java] Static_2  (0) 2016.07.26
[Java] Constructor_2  (0) 2016.07.26
[Java] Method Overloading  (0) 2016.07.25
블로그 이미지

리딩리드

,
donaricano-btn

BusinessLayer_1


1. 트랜잭션

1) 요청에 걸친 트랜잭션

- 롱트랜잭션, 약한결합 트랜잭션이라 한다

- 여러 요청에 걸친 트랜잭션

- 애플리케이션 설계 혹은 시스템 운영으로 대응

- 올라인으로 책을 구입해서 집으로 배송되고 은행에서 대금이 인출


2). 요청 안에서 트랜잭션

- 쇼트 트랜잭션, 밀결합 트랜잭션

- 데이터소스가 하나일때는 로컬 트랜잭션, 여러개에 걸칠 때는 글로벌 트랜잭션

- 스프링 트랜잭션 기능을 이용

- 주문확정 요청을 받아 발주 테이블과 고객테이블, 재고 테이블이 갱신


1_1. 트랜잭션의 경계

- 트랜잭션의 경계는 프레젠테이션 층비즈니스 로직 층 사이에 있다

- 컨트롤러에서 서비스 클래스의 메소드가 호출되면 시작

- 서비스 클래스의 메소드를 마치고 컨트롤러로 되돌아 갈 때가 트랜잭션 종료


1_2. 트랜잭션 처리를 구현하는 장소 문제

비즈니스 로직 안에서 트랜잭션 처리 문제점

1) transfer()는 프레젠테이션 층에 공개된 서비스의 메소드인 트랜잭션 경계이다

2) 이체 서비스 옆은 DAO이며 계좌의 잔고를 갱신하는 updateZandaka()가 있다

3) transfer()에서 updateZandaka()를 각각 호출한다

4) 비즈니스 로직안에서 커넥션 취득이나 커밋/롤백을 호출할 필요가 있다

5) 은폐되어야할 JDBC의 API에 비즈니스 층이 의존하게된다

1_3. AOP를 이용한 트랜잭션 처리

- 선언적 트랜잭션 구현

- AOP로 서비스에 어드바이스를 적용함

- 스프링이 제공하는 트랜잭션 매니저와 어드바이스 사용


2. 트랜잭션 매니저

- 트랜잭션 시작과 종료, 롤백 처리를 비롯해 트랜잭션의 정의정보를 세밀하게 설정함

- 데이터 엑세스기술을 은폐해 기술이 바뀌어도 같은 방법으로 매니저 사용


2_1. 트랜잭션 정의 정보

- 트랜잭션 매니저로 설정할수 있는 정의 정보

a. 전파(Propagation) 속성

b. 독립성 수준

c. 시간만료

d. 읽기전용상태(Read-Only Status)

e. 롤백 대상 예외

f. 커밋 대상 예외

1) 전파 속성

- 트랜잭션의 전파 방법을 설정하는 속성

1 : 컨트롤러 1에서 서비스 1을 호출, 트랜잭션은 서비스1의 메소드가 호출되었을 때 시작

2 :  컨트롤러 2에서 서비스2를 호출하고 서비스2에서 서비스 1을 호출

- 서비스2의 메소드가 호출 될 때 트랜잭션 시작, 그 트랜잭션 안에서 서비스1 호출

- 서비스 1이 호출되면 동시에 트랜잭션을 새로 시작할지 아니면 원래 트랜잭션(서비스2) 그대로 이어갈지 선택 해야한다

- 이런 선택을 우린 전파속이라 한다

전파 속성의 종류

전파속성

서비스 1에 대해 설정했을 시 

1경우

2경우 

 PROPAGATION_REQUIRED

트랜잭션을 시작  

서비스 2의 트랜잭션의 참가 

PROPAGATION_REQUIRES_NEW 

트랜잭션을 시작 

새 트랜잭션을 시작 

PROPAGATION_SUPPORTS 

트랜잭션을 하지 않는다 

서비스2의 트랜잭션의 참가 

PROPAGATION_MANDATORY 

예외릐 던진다. 

서비스2의 트랜잭션에 참가 

PROPAGATION_NESTED 

트랜잭션을 시작 

부분적인 트랜잭션을 시작 

PROPAGATION_NEVER 

트랜잭션 하지 않는다 

예외를 던진다

PROPAGATION_SUPPORTED 

트랜잭션 하지 않는다 

트랜젹션을 하지 않는다 

개발에서는 기본적으로 PROPAGATION_REQUIRED로 문제 없다


2) 독립성 수준

- 트랜잭션 처리가 병행해서 실행될 때 의 각 트랜잭션의 독립성을 결정하는 것이다

- Example

a. 트랜잭션 1과 트랜잭션 2과 나란히 실행됨

b. 트랜잭션1이 무엇인가 데이터베이스의 레코드를 갱신 했다고 한다, 단 트랜잭션 도중이므로 아직 커밋 안함, 오류가 일어난다면 롤백해서 불안정한 상황

c. 트랜잭션 2는 1의 갱신한 데이터를 읽어 오려한다, 읽어 오려는 데이터는 커밋되지 않은 불확정한 상태 이다

d. 이때 트랜잭션2는 갱신된 데이터를 읽어와도 되는가?

e. 모순 되지 않게 하려면 트랜잭션1이 커밋해서 확정된 후에 데이터를 읽어와야 한다

f. 트랜잭션1과 2과 나란히 실행될 때 모순되지 않게 처리하는 속성이 독립성 이다

- 독립성 수준의 종류

 독립성 수준

의미 

ISOLATION_READ_COMMITED

다른 트랜잭션이 변경했지만 아직 커밋하지 않은 데이터는 읽을 수 없다 

ISOLATION_READ_UNCOMMITED 

다른 트랜잭션이 변경하고 아직 커밋하지 않은 데이터는 읽을 수 있다 

ISOLATION_REPEATABEL_READ

트랜잭션 내에서 여러번 데이터를 읽어올 때, 다른 트랜잭션이 도중에 데이터를 갱신해도 같은 값을 읽어온다 

ISOLATION_SERIALIZABLE 

트랜잭션을 하나씩 순서대로 처리해서 독립시킨다 

ISOLATION_DEFAULT 

데이터베이스가 제공하는 기본 독릭성 수준을 이용한다 

- 데이터가 모순되는 3가지 상태

a. Dirty Read

- 다른 트랜잭션이 변경했지만, 아직 커밋하지 않은 데이터를 읽어내는 것이다.

b. Unrepeatable Read

- 트랜잭션 내에서 같은 데이터를 여러번 읽을 때, 다른 트랜잭션이 해당 데이터를 변경하면 이전에 읽은 데이터와 다른 데이터를 읽어내는 것

c. Phantom Read

- 트랜잭션 내에서 같은 데이터를 여러번 읽을 때, 다른 트랜잭션이 새로운 레코드를 추가하면 이전에 없던 레코드를 읽어 내는것

- 독립성 수준과 데이터 모순 상태

독립성 수준 

Dirty Read 

Unrepeatable Read 

Phantom Read 

ISOLATION_READ_UNCOMMITTED 

O 

O 

O 

ISOLATION_READ_COMMITED 

X 

O 

O 

ISOLATION_REPEATABLE_READ 

X 

X 

O 

ISOLATION_SERIALIZABLE 

X 

X 

X: 허용안함, O: 허용

- 아래로 갈수록 독립성 수준이 높다.

- 독립성이 강해지면 성능이 나뻐진다.

- Example

과자 가게 아줌마가 한번에 아이들에게 과자를 팔면 200원이 모자란다. 그래서 한줄로 세우고 순서대로 계산하면 계산은 맞지만 시간이 오래걸린다



'Back-End > SpringFrame_1' 카테고리의 다른 글

[Spring] PresentationLayer_1  (0) 2016.08.08
[Spring] BusinessLayer_2  (0) 2016.08.07
[Spring] DataAccessLayer_2  (0) 2016.07.31
[Spring] DataAccessLayer_1  (0) 2016.07.25
[Spring] AOP_2  (0) 2016.07.20
블로그 이미지

리딩리드

,