이번에 이미지를 클라우드 서버에 저장하는 기능을 구현했는데
외부 리소스에 접근하는 기능은 되도록 이면 트랜잭션 내에서는 하지 말라고 하더라구요.
요청하고 처리하는데 걸리는 시간 때문에 커넥션 소유 시간이 쓸데없이 길어진다고
그래서 컨트롤러에 이렇게 해놨는데
컨트롤러에 왠지 비즈니스 로직이 있는거 같아서 별로 인거같더라구요.
그래서 컨트롤러랑 서비스 사이에 레이어를 하나 넣으려는데 괜찮을까요?
아니면 다르게 해결 할 수 있는 방법이 있으면 알려주시면 감사하겟습니다.
투머치인거같은데 - dc App
컨트롤러에 저정도는 괜찮나보네요
근데 트랜잰셕 밖에 하는거랑 비즈니스 로직 컨트롤러에 쓰는거랑 관계가 있나요? 저도 초보라 물어봅니다. 그냥 처리할 객체 하나 만들고 거기서 비즈니스 로직 만들고 컨트롤러에서 요청 보내면 안 되나요? @Transactrioanl 어노테이션은 붙이지 않고 말이쥬 - dc App
제가 말한 레이어를 만든다는게 님께서 말씀하신 처리할 객체를 하나 만든다는 것이였습니당. 보통 서비스 객체에서 비즈니스 로직을 다루는데, 서비스 객체에서 못하면 컨트롤러에서 해야 되잖아요. 근데 서비스 계층에서 못한걸 컨트롤러에서 해버리니깐 컨트롤러랑 서비스 계층이 희석되지 않나 해서 중간에 레이어(객체)를 하나 더 둘지를 고민해봤습니다.
아하 그런데 서비스 레이어에서 처리하면 안 되는 이유가 있나요? - dc App
그냥 서비스 객체 안에 함수 하나 만들고 그 안에서 (외부 리소스 작업)-(트랜잭션 작업) 을 호출하면 되지 않을까? 라고 저도 생각하고 해봤는데, 함수 내부에서 트랜잭션 어노테이션이붙은 함수를 호출하면 프록시가 적용안되서 트랜잭션이 적용이 안되더라구요...
트랜잭션 안에서 트랜잭션 걸린 함수 호출에 관해선 트랜잭션 전파 키워드로 찾아보면 좋을 것 같습니당 - dc App
제가 원하는 건 트랜잭션이 필요없는 작업을 트랜잭션안에서 분리해 내는거라 그거랑은 별 상관이 없는거같습니다... 위에 함수를 하나 만든다는게 @Transactional이 붙지않은 함수를 말하는거라 제가 말을 자세히 안했네요
트랜잭션 처리 시간 길어지는거 보다 정합성 깨지는게 더 큰 문제다 게이야. 가서 이슈 제기한 사람한테 도와달라노~ 애교빔! 시전하면 잘 알려줄거 같네.
제 개인프로젝트라서 물어볼사람이 없어요ㅠㅠ
그러면 그냥 트랜잭션안에넣고 시간지나면 타임아웃예외던지도록 해보겟습니다.
음.. 1. 컨트롤러에서 서비스 분리 하고, 2. 이미지를 먼저 저장하고 나서 UI에서 콜백으로 아이템 저장하고, 3. 아이템에 이미지키를 저장 코드만 본다면 위 내용정도 지적할 수 있겠네.
밥 먹고 자세히 설명해드림. 비동기 이벤트 퍼블리셔 키워드로 찾으면 됨
오 감사합니다 잠깐 검색해서 보는데 제가 원하는 답이 있는거같아요
ㅇㅇ 이거 봐보셈.
https://newwisdom.tistory.com/75
가끔
비즈니스 로직을 작성하다가, 트랜잭션이 달려있는 특정함수에서 트랜잭션이 불필요한 로직이 존재하거나 같은 트랜잭션으로 묶이면 안 되는 부분이 있을 때,
위의 애들 말대로 별도의 서비스 클래스를 만들어 컨트롤러에서 주입받고 핸들링할 수 도 있지만, 나는 개인적으로 컨트롤러에 서비스 의존성이 덕지덕지 붙는 걸 안 좋아하기 때문에,
별도의 함수로 분리하고, @TransactionalEventListener 로 다루는 걸 선호하는 편임. 비동기로 할 지 안 할지는 선택사항임. 일반적으로 스프링 트랜잭션 어노테이션은 다른 스레드에게까지 전파가 안 되기 때문에, 특정 문맥에서 필요없으면 비동기로 다루어도 상관없슴.
암튼 구현할 수 있는 방법은 여러가지가 있슴. 트랜잭션 전파범위에 대해서 잘 알아보셈.
감사합니다. 여기서 이정도수준의 답을 얻을줄은몰랏어요. 물어보길잘했네요