• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

API 통신 시, @Transactional 사용 관련 질문 드립니다.

20.03.09 20:44 작성 조회수 230

0

안녕하세요. 강사님

매번 질문을 남겨 볼까, 말까 고민하다가 처음으로 질문 드립니다.

저는 SpringDataJpa를 먼저 사용하다가, 강사님 강의를 통해 JPA와 queryDSL을 공부하고 있습니다.

또한, 사내에서 신규 프로젝트 또는 레거시 프로젝트를 작업할 때 SpringDataJpa를 도입해 나가고 있습니다.

현재 API 통신을 하는 메서드를 작성할 때, API 통신 전 과 후 히스토리를 남기고 있는데 @Transactional 없이 한 메서드에서 사용을 하고 있습니다. 제가 생각할 때 잘못 사용 하다가, 원치 않는 결과를 초래할 수도 있을 것이라 생각이 들어서 아래 예제 코드와 같이 사용하고 있습니다.

그러나 요즘 들어 제가 작성하는 코드가 효율적이지 못하다는 것과 update와 관련된 부분은 영속성컨텍스트 내에서 이뤄져야 하지 않을까란 생각이 들었습니다. 조언을 얻을 수 있는 분이 주위에 많이 안 계셔서 이렇게 부끄럽지만 질문 드립니다.  

감사합니다.

@Transactional에 noRollback 옵션을 주고, 적절한 timeOut 시간을 정의해서 사용하면 괜찮을까요??

ex)

//API 통신 전 히스토리 생성

Hist updHist = histRepository.save(hist);

//API 통신

ResponseEntity<Result> exampleResult = restTeamplte.postForEntity(uri,HttpEntitiy,Result.class);

result = exampleResult.getBody();

//API 통신 후, 히스토리 업데이트를 위한 값 변경 메서드 (setter)

updHist.updateResult(result.getCd(),result.getMsg());

//히스토리 업데이트

historyRepository.save(updHist);

답변 3

·

답변을 작성해보세요.

1

linesay님의 프로필

linesay

질문자

2020.03.09

바쁘실텐데 빠른 답변 남겨주셔서 너무 감사드립니다. 활용 1편과 2편은 수강 하지 않았는데, 듣고 있는 querydsl을 완강 하면 수강 하도록 하겠습니다. 좋은 강의 제공해주셔서 늘 감사 합니다. 편안한 밤 되시길 바랍니다. :)

0

더 나은 코드를 만들기 위해서 계속 고민하는 모습이 좋네요^^!

궁금한 내용은 언제든지 편하게 질문주세요^^

0

안녕하세요. Bulbasaur님 좋은 질문입니다^^

우선 이 부분은 비즈니스 상황에 따라 다를 수 있지만, 단순 로그성 데이터를 비싼 데이터베이스에 남기는 것은 좋지 않습니다. 이런 부분은 log4j, slf4j 같은 로그를 활용해서 단순한 파일로 남기는 것을 권장합니다.

예를 들어서 호출 전 로그, 호출 후 로그 이렇게 2개의 로그를 남기면 됩니다.

만약 그래도 정책상 지금과 같은 로그를 DB에 유지해야 한다면, 트랜잭션을 사용하지 않고, 이 상태로 코드를 두는 것이 더 나은 선택일 수 있습니다.

트랜잭션으로 묶으면 더 큰 문제를 유발할 수 있습니다.

예를 들어서 처음부터 트랜잭션으로 묶으면 히스토리를 업데이트하다가 문제가 발생하면, 롤백이 되고, API 통신을 했다는 기록 자체가 사라지게 됩니다^^!

이 주제와 약간 관련이 있는, 웹 환경에서 데이터를 변경할때, 어떻게 하는 것이 좋은지는 활용1편의 섹션 7 웹 계층 개발 - 상품 수정, 변경 감지와 병합(merge)에서 자세히 설명해드립니다.

감사합니다^^!

(추가로 궁금한 내용이 있으면 답변 주세요 :) )