자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi RAD Server에서 TFDConnection 트랜잭션 미작동 질문
2020.04.20 15:34
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
RAD Server 방식으로 서버 구성 중
FDConnection의 트랜잭션이 일반적인 경우와 다르게 동작하는것을 발견했습니다.
예를들어 설명하면
procedure TEbserverResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
begin
FDTransaction1.StartTransaction; //작동안함
end;
procedure TEbserverResource1.Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
begin
FDTransaction1.Commit;
end;
이렇게 코딩되었을때
클라이언트에서 Rest호출로 Get요청을 하면 트랜잭션이 정상적으로 작동하지 않습니다.
(물론 한번의 호출 내에서 트랜잭션 - 커밋 - 롤백을 한다면 작동합니다.)
이걸 다음 Commit이나 롤백이 호출 될 때까지 트랜잭션을 유지할 수 있게 할 수는 없을까요?
RAD Serverd의 KeepAlive등의 속성을 바꾸어봤지만 여전히 트랜잭션이 정상동작 하지 않습니다.
방법이 존재한다면 답변 꼭 부탁드립니다. 감사합니다.
댓글 4
-
험프리
2020.04.22 14:33
-
clogic
2020.04.22 15:33
험프리님 늘 정성스러운 답변을 주셔서 진심으로 감사드립니다~
사실 2-Tier로 개발되어져 있는 레거시 비즈니스 로직의 양이 엄청나게 방대하여
Client에 구현되어 있는 쿼리 관련 비즈니스 로직을 모두 미들웨어로 올리기는 현실적으로 불가능한 상황입니다.
그래서 비즈니스단의 작성된 쿼리는 그대로 둔 채,
DB호출부만 변경하여 REST방식으로 Client에서 작성된 쿼리를 body에 담아 호출하고
RAD Server에서 쿼리를 실행시킬 계획이었습니다.
RAD Server에서는 쿼리를 파라미터로 받아 처리하는
Open, Execute, BeginTran, Rollback, Commit 등의 메소드만 구현하고요.
해당 방법으로 구현이 불가능하다면 아무래도 REST방식의 RAD Server 사용을 포기하고
소켓방식의 DataSnap으로 구현하는게 맞겠네요.
아니면 Client에서 작성된 레거시 쿼리를 그대로 활용할 수 있는 좋은 방법이 있을까요?
-
얄리
2020.04.22 17:05
client에 있는 비즈니스 로직을 그냥 두고 사용한다면 기존 2-tier 구조로 사용하는게 낫죠. 굳이 미들웨어 서버를 통할 이유가 없습니다.
멀티티어로 구성하는 이유와 장점을 생각하신다면 비즈니스로직이 아무리 방대하더라도 미들웨어서버에 구현하는 것이 맞습니다.
-
clogic
2020.04.22 17:50
얄리님 답변 감사합니다.
하지만 3-Tier로 구성해야하는 사정이 있어서요. (고객사 클라이언트의 방화벽 허용 정책, 멀티DB 사용, 보안성 검토 등)
물론 말씀대로 구성상 미들웨어 서버에 구현하는게 맞다는건 잘 알지만
말씀드렸듯이 레거시 코드를 유지하면서 멀티티어를 구성해야하는 상황입니다.
RAD Server 를 사용하면 LifeCycle 을 Server로 구성할 수 있는 방법은 없을까요?
Delphi RAD Server에서 TFDConnection 트랜잭션 미작동 질문
2020.04.20 15:34
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
댓글 4
-
험프리
2020.04.22 14:33
-
clogic
2020.04.22 15:33
험프리님 늘 정성스러운 답변을 주셔서 진심으로 감사드립니다~
사실 2-Tier로 개발되어져 있는 레거시 비즈니스 로직의 양이 엄청나게 방대하여
Client에 구현되어 있는 쿼리 관련 비즈니스 로직을 모두 미들웨어로 올리기는 현실적으로 불가능한 상황입니다.
그래서 비즈니스단의 작성된 쿼리는 그대로 둔 채,
DB호출부만 변경하여 REST방식으로 Client에서 작성된 쿼리를 body에 담아 호출하고
RAD Server에서 쿼리를 실행시킬 계획이었습니다.
RAD Server에서는 쿼리를 파라미터로 받아 처리하는
Open, Execute, BeginTran, Rollback, Commit 등의 메소드만 구현하고요.
해당 방법으로 구현이 불가능하다면 아무래도 REST방식의 RAD Server 사용을 포기하고
소켓방식의 DataSnap으로 구현하는게 맞겠네요.
아니면 Client에서 작성된 레거시 쿼리를 그대로 활용할 수 있는 좋은 방법이 있을까요?
-
얄리
2020.04.22 17:05
client에 있는 비즈니스 로직을 그냥 두고 사용한다면 기존 2-tier 구조로 사용하는게 낫죠. 굳이 미들웨어 서버를 통할 이유가 없습니다.
멀티티어로 구성하는 이유와 장점을 생각하신다면 비즈니스로직이 아무리 방대하더라도 미들웨어서버에 구현하는 것이 맞습니다.
-
clogic
2020.04.22 17:50
얄리님 답변 감사합니다.
하지만 3-Tier로 구성해야하는 사정이 있어서요. (고객사 클라이언트의 방화벽 허용 정책, 멀티DB 사용, 보안성 검토 등)
물론 말씀대로 구성상 미들웨어 서버에 구현하는게 맞다는건 잘 알지만
말씀드렸듯이 레거시 코드를 유지하면서 멀티티어를 구성해야하는 상황입니다.
RAD Server 를 사용하면 LifeCycle 을 Server로 구성할 수 있는 방법은 없을까요?
트랜젝션은 되도록 짧게 하나의 메소드에 Start와 Commit을 모두 처리하는 것이 좋습니다.
위와 같이 Get과 Post에 트랜잭션을 시작과 커밋처리하는 것은 바람직하지 않은 구조입니다.
그 이유는, RAD 서버는 HTTP 기반으로 커넥션을 유지하지 않아 다른 DB 커넥션에서 트랜젝션을 다르게 처리될 것 입니다.
만약, 같은 커넥션을 찾아 처리한다해도 예상치 못한 문제로 Get 이후 Post를 요청하지 못할 경우 등의 예외처리가 필요합니다.
또한, 아무리 빠르게 요청한다해도 긴 트랜잭션이 발생하기 때문에 효과적이지 않습니다.
왜 위와 같은 구조가 필요한지 상황이 필요할 것 같습니다.
즉, 되도록 하나의 요청(메소드)에서 트랜잭션을 처리하도록 구현하는 것이 좋은 방법 같습니다.
참고로,
여러개의 REST 시스템간 트랜젝션이 필요하다면, 다음 글에서 설명하는 TCC(Try Confirm / Cancel) 방식을 검토해 보는것도 좋을 것 같습니다.
우선 적으로 데이터 등록 시도 후 모든 작업 완료 후 저장 또는 취소를 명시적으로 호출해 데이터의 원시성을 확보하는 방법 같습니다.
REST 기반의 간단한 분산 트랙잭션 구현 - 1편 TCC 개관
——————
답변에 대한 결과를 남겨주시면, 다른 분들이 같은(비슷한) 문제 해결에 큰 도움이 됩니다.
(미리 답변 결과 등록 감사합니다.^^)