BACKEND.*

XA와 Non-XA

초코푸딩 2021. 8. 29. 18:39

1. 상속 추상클래스 및 인터페이스

 

2. CORS란? 해결책?

1. 프록시서버 사용하기 (프록시서버 URL + 요청 URL)

2. cors는 브라우저에 관련된 정책이기때문에, 브라우저를 통하지 않고 서버간 통신을 할 때는 이 정책이 적용되지 않는다. 서버에서 통신을 보내면 됨.

http-proxy-middleware 사용하기

서버  Access-Control-Allow-Origin 헤더 셋팅하기

 

1. 요청시 JSONP를 활용한다. -> get 요청만 가능...

2. 미들웨어 CORS 추가. -> 서버설정을 직접할 수 가 없다...

3. 백엔드 서버를 거친다. -> 개발자가 구축하면 되서 확실하다.!

4. 프록시 서버 구축 -> 실무에서 많이 사용한다고 한다.

 

 


3. XA와 Non-XA란?

XA : extended Architecture 확장된 아키첵쳐

Non-XA : 확장되지 않은 아키텍쳐

 

[XA]

- 사용하는 DB가 여러개이거나, 트랜잭션의 주체가 여러개일 때 사용할 수 있다.

- 보통 2-phase-commit(2PC) 으로 진행되며, 양쪽 DB에 준비가 되었는지 묻는다. -> 양쪽 모두 준비가 되었다고 한다. -> 준비가 완료되었다. -> 커밋을 진행한다. (begin -> end -> prepare -> commit) 

- 여기서 한쪽이라도 문제가 있다면 전부 다 롤백이 된다.

 

[Non-XA]

- 사용하는 DB가 하나일때 Non-XA로 단순하게 Commit과 Rollback을 처리할 수 있다. 

- DB 세션 하나에 하나의 트랜잭션을 모두 담아 놓고, 둘다 성공하면 커밋하고 하나라도 실패하면 세션을 롤백시킨다.

 

* XA가 Non-XA보다 OverHead가 발생하므로 조회성 업무는 Non-XA를 사용한다.

* Non-XA는 AP에서 RM(Resource Manager)에 직접 연결하고, XA는 AP에서 RM에 직접 맺어야 할 세션을 TM(Transaction Manager)에서 맺는다. DBMS는 SQL문 단위로 트랜잭션을 관리하지만, TM은 서비스단위로 트랜잭션을 관리한다. 

* XA로 관리해야하는 경우에는 

- global transaction에 묶여야 하는 서비스 (글로벌 트랜잭션을 하려면 반드시 2PC를 해야하는데, 글로벌 트랜잭션은 여러 리소스 사이에서 처리하는 작업이기 때문에 분산 트랜잭션이라고도 한다. )

- client가 transaction coordinator가 되는 경우 (클라이언트가 커밋해야하는 경우)

- timeout 관리가 필요한 경우

* 2PC

begin -> end -> prepare  -> commit

글로벌 트랜잭션을 하려면 반드시 2PC를 해야만 한다.

글로벌 트랜잭션은 여러 리소스 사이에서 처리하는 작업이기 때문에 "분산" 트랜잭션(Distribute Transaction)이라고도 함. = XA

비 XA 데이터 소스는 자원 관리자 로컬 트랜잭션(RMLT)만을 지원할 수 있으나,

XA 데이터 소스는 로컬 트랜잭션 뿐만 아니라 2단계 커미트 조정을 지원할 수 있다.(?)

 

* 1PC

begin -> end -> commit

트랜잭션에 참여한 리소스들이 서로 같은 리소스라고 확인이 되었을 경우에는 prepare가 필요없다

위와 같이 처리하는것을 1PC(one-phase-commit)이라고 부름.

이렇게하면 prepare를 안해도 되므로 트랜잭션의 처리 성능 향상에 도움을 줄 수 있다.

따라서 1PC는 트랜잭션 성능 향상(Transaction optimization)의 한 방법이다.

※ 주의할 것은 1PC도 글로벌 트랜잭션이다. 로컬 트랜잭션 아님.

 

[DataSource]

데이터베이스에 연결하는 방법을 캡슐화한 것으로 RDBMS와 상관없이 공통의 인터페이스를 사용해 연결할 수 있도록 하는 방식이다. 

 


 [DB Session Container  / Database Pool] 

 

[DB Link 지양이유] XA는 사용하면서????