PSA (Portable Service Abstraction)

Back-End/Spring 2019. 6. 6. 12:08
728x90
반응형

-PSA (Portable Service Abstraction)-


비슷한 기술들을 모두 아우를 수 있는 추상화 계층이다.


사용하는 기술(프로그램)이 바뀌더라도 비즈니스 로직의 변화가 없도록 해준다.


예를 들어 트랜잭션 처리를 하고 싶을 때, 사용하는 기술에 따라 JDBC API를 쓸 수도 있고,


iBatis가 제공하는 API 또는 Hibernate가 제공하는 API를 사용할 수도 있다.


비슷한 기능이지만 각 기술마다 구현의 차이가 있기 때문에 특정 기술을 대체 기술로 바꾸려면


적용한 코드를 모두 찾아 바꿔줘야 하기 때문에 스프링에서는 추상화 계층을 통해서 기술이 바뀌더라도


의존성 주입 기능으로 사용할 객체만 바꿔주면 되도록 지원한다.


(정리 : 인터페이스에서 추상메소드를 만들듯이 PSA에서는 추상화된 계층을 통해서 기술이 바뀌어도 의존성 주입 기능을 써서

사용할 객체만 바꿔주면 되도록 지원한다.) 




-트랜잭션 이란?-


더 이상 나눌 수 없는 단위 작업을 의미


EX) 모든 사용자에 대한 레벨 변경 작업은 전체가 성공하든지 전체가 실패해야 한다.

레벨 변경 작업은 부분적으로 성공하거나 여러 번에 걸쳐서 진행할 수 있는 작업이

아니어야 한다. (일관성)

모든 사용자에 대한 레벨 변경 작업 자체가 쪼갤 수 없는 하나의 작업 단위이므로

중간에 예외가 발생하면 아에 작업이 시작되기 이전 상태로 돌려놓아야 한다. (롤백)


DB는 그 자체로 완벽한 트랜잭션을 지원한다.

하나의 SQL 명령을 처리하는 경우는 DB가 트랜잭션을 보장해준다고 믿을 수 있다. 

(왜냐하면 자료를 삭제하거나 삽입할때는 전체를 다 집어넣거나 지우지 않을수 없기때문.. DB에서는 튜플단위로 삭제나 삽입을 하기 때문에..)


하지만 여러개의 SQL이 사용되는 작업을 하나의 트랜잭션으로 묶어야 하는 경우도 있다.

예를 들면 은행에서 계좌 이체 작업은 반드시 하나의 트랜잭션으로 묶여야 한다.

이체를 할 때는 출금 계좌의 잔고는 줄어들고, 입금 계좌에는 증가되어야 한다.

이 때 이체 프로그램은 DB에 최소 두번의 요청을 보낸다.

문제는 첫번째 SQL은 성공했지만 두번째가 장애로 인해 중단되는 경우이다.


이 때 두가지 작업이 하나의 트랜잭션이 되려면 두번째 SQL이 문제가 발생하여 실패한 경우 첫번째가 성공했어도 다시 취소해야 한다.

이런 취소 작업을 "트랜잭션 롤백" 이라고 한다.


반대로 여러개의 SQL을 하나의 트랜잭션으로 처리하는 경우 모든 SQL 수행 작업이 다 성공했다고 DB에 알려줘서 작업을 확정시키는 것을

"트랜잭션 커밋" 이라고 한다.


모든 트랜잭션은 시작하는 지점과 끝나는 지점이 있다,

시작하는 방법은 한가지이지만, 끝나는 방법은 두가지가 있는데

하나는 모든 작업을 무효화하는 롤백이고, 모든 작업을 확정하는 커밋이다.

그리고 애플리케이션 내에서 트랜잭션이 시작되고 끝나는 위치를 "트랜잭션 경계" 라고 한다.


이 트랜잭션 경계는 하나의 Connection이 만들어지고 닫히는 범위 안에 존재한다.



[트랜잭션 동기화]


트랜잭션 동기화란 특정 Service 에서 트랜잭션을 시작하기 위해 만든 Conection 객체를 특별한 저장소에 보관해두고 이후에 

호출되는 곳에서 지정된 Connection을 가져다 사용하게 하는 것이다.


문제는 멀티스레드 환경에서도 안전한 트랜잭션 동기화를 구현하는 일이 기술적으로 어려운데, 스프링은

JdbcTemplate과 더불어 이런 트랜잭션 동기화 기능을 지원하는 간단한 유틸리티 메소드를 제공한다.


스프링이 제공하는 트랜잭션 동기화 관리 클래스는 "TransactionSynchronizationManager" 이다.

이 클래스를 이용해 먼저 트랜잭션 동기화 작업을 초기화 하도록 요청한다.





-MVC-


MVC란 (Model View Controller) 에플리케이션을 세가지의 역할로 구분한 개발 방법론이다.

아래의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해서 통해서 데이터를 가져오고

그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.







-Web와 MVC-


위의 개념을 웹에 적용



    1. 사용자가 웹사이트에 접속한다. (Uses)
    2. Controller는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출한다. (Manipulates)
    3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.
    4. Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)
    5. 데이터가 반영된 VIew는 사용자에게 보여진다. (Sees)



-Codelgniter과 MVC-


  Controller


  사용자가 접근 한 URL에 따라서 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model에 의뢰하고, 데이터를 View에 반영해서

  사용자에게 알려준다.



  Model


  일반적으로 CI의 모델은 데이터베이스 테이블에 대응된다.

  이를테면 Topic 이라는 테이블은 topic_model 이라는 Model을 만든다.

  그런데 이 관계가 강제적이지 않기 때문에 규칙을 일관성 있게 정의하는 것이 필요하다.



  View


  View는 클라이언트 측 기술인 html / css / javascript 들을 모아둔 컨테이너이다.

 



Controller과 Model과 View 간의 관계







출처

https://opentutorials.org/course/697/3828

728x90
반응형
: