안녕하세요 강사님. 강의 잘 듣고 있습니다. 이번 시간에 강사님께서 Spring WebFlux와 Spring Web MVC를 혼용해서 사용하는 경우, 결국에는 Web MVC의 기본 스레드인 톰캣 스레드를 사용해서 스레드 고갈이 될 수 있다고 하셨습니다. 따라서 내부적으로는 WebFlux의 이벤트 루프 스레드가 아닌 톰캣 스레드를 사용해서 블로킹되는 현상이 발생한다로 해석하면 될까요? 저는 혼용할 경우, Mono/Flux 타입 응답에 한해서는 동시 요청 발생 시 이벤트 루프 스레드를 사용하여 IO 작업을 대기하지 않고 해당 스레드가 다른 일을 처리하러 가는 것으로 알고 있었습니다. 혹시 이러한 상황에서 어떤 스레드를 사용하는지 테스트 해볼만한 좋은 방식이 있을까요? 감사합니다.
안녕하세요!! 클라우드 관련 공부하다가 go에 관심이 생겨 수강하게 되었습니다. 백엔드는 이 강의와 책으로 처음 공부하는 중입니다. 현재는 강의 프로젝트 구조로 개인 프로젝트 진행해보려고 리펙터링 중 입니다. 수업과 관련은 없지만 3가지 질문이 있습니다. 1. 트랜잭션 구현을 위한 *sql.DB는 어디서 생성하고 어떻게 service에 주입해야 하나요? reposiory는 수정해서, *sql.DB 필드 하나만 위치하도록 했습니다. 다만, 트랜잭션 구현을 하다보니, db 커넥션 풀을 repository에서 service로 가져오거나, cmd에서부터 service까지 내려보내주어야 하더라고요. cmd에 db 커넥션 풀을 생성하도록 하면 안되는 걸까요? orm 도입하기 이전에 내장 패키지로 기본 로직을 구현하려는 건 쓸 데 없는 일일까요? 2. 프로젝트 구조를 어째서 cmd에 전부 주입하는 식으로 작성하셨나요? 테스트는 어떻게 하시나요? cmd를 main패키지 처럼 사용하시는 건지 궁금합니다. 제가 알고 있던 백엔드 구조(spring boot)와 많이 달라 보이네요. 또, 이 구조에서 테스트는 어떻게 진행해야 할지 잘 모르겠습니다. 대략적인 흐름이라도 알고자 여쭤봅니다. 3. 일하실 때에도 이 구조를 유지하시나요? 도메인별 패키지 분리(user, auth, member... etc)는 별로인가요? 개인적으로는 비즈니스 도메인별로 디렉터리를 나누는 것을 선호합니다. 다만, 현재 이 디렉터리 구조를 뜯어고칠 용기가 생기지는 않네요... 이 구조의 어떤 점 때문에 이렇게 사용하시는 지, 혹은 팀에서 이렇게 쓰길래 유지를 하고 계신건지 궁금합니다. 장단점이 있을까요? 궁금한걸 쌓아두면서 gpt로 해결하려다가, 쌓아둔게 터진 것처럼 장황하네요.. 강의를 들으면서 해결 못한 내용이라 그런 것 같아요. 좋은 강의 잘 듣고 있습니다 🥹 🙏
안녕하세요. 강사님 강의 잘 들었습니다. 한가지 질문이 있습니다. 주문 생성과 주문 처리api를 나누고 사용자가 결제가 되면 주문 처리 api를 호출하는걸로 알고있습니다. Orchestaration 방식으로 처리할 때 OrderConfirmEvent를 발행하면 제 서비스로 예를 들면 재고, 쿠폰, 적립금 서비스에서 consume하여 처리를 하고 있습니다. 그런데 주문 처리 api에서 재고는 처리되었지만 쿠폰은 실패할 경우 어떻게 보상 트랜잭션을 주어야할지 모르겠습니다. 결제가 된 주문이라 바로 보상을 하는것 보다는 dlt topic에 넣고 재처리를 하고 만약 재시도 3번을 하고 나서 실패할 경우 환불을 해줘야할까요? 주문 처리 api에서는 어디가 실패한지 모르니까요 혹시 어떤식으로 해야할지 조언좀 받을수 있을까요?
안녕하세요. 강의 잘 들었습니다. 분산 시스템이 맞는지는 모르겠지만,, 다른 회사의 API들을 여러개 사용할때에 궁금증이 있어서 질문 드립니다. 문제 상황은 아래와 같습니다. 우리 쪽에서는 이미 사용자가 토큰 기반으로 인증된 상태 이며, 이 사용자의 요청을 대신해 외부(회사1, 회사2)의 API를 호출 해야 하는 상황입니다. 또한, 사용자가 버튼을 눌렀을 때 새 브라우저 창을 띄워 회사2의 웹 애플리케이션으로 이동 해야 하는데, 이때 로그인 과정을 생략하고 자동으로 접속(SSO) 되도록 만들고 싶습니다. 질문 1⃣ API 인증 전파 관련 우리 서버가 회사1·2 서버로 요청을 보낼 때, 상대 서버에서는 “이 요청이 실제 인증된 사용자로부터 온 것”임을 어떻게 검증하는 게 일반적인가요? 2⃣ 브라우저 SSO 관련 새 탭을 열어 회사2 웹 서비스로 이동 시, 재로그인 없이 자동으로 인증(Single Sign-On) 되게 하려면 어떤 방식이 많이 사용되나요?
안녕하세요. 주문 처리에 관련해서 질문 있습니다!! 고민하다가 질문드려요 ㅠ! 중복 주문을 해결하기 위해 주문 생성 API , 주문 처리 API를 나누는걸로 이해하고 있습니다. 만약 쇼핑몰에서 사용자가 주문을 할때 주문 생성 API를 요청하고 결제처리 (PG사) 성공하면 주문 처리 API(재고차감 등등) 를 하는걸로 알고 있습니다. 하지만 주문 생성 API에서 수량을 검증한다고 하더라도 결제를 완료하고 주문 처리를 할때 다른 사용자에 의해서 재고가 부족할수 있는 상황이 있다고 생각합니다. 이럴때는 실무에서 어떻게 해결하는지가 궁금합니다!!!! 비동기적으로 보상해준다고 하면 뭔가 사용자입장에서 결제까지 했는데 재고가 부족해서 주문처리가 실패하여 환불까지된다?.... 이게 좀 비효율적이라 생각해서요!! 답변 부탁드립니당 실무에서는 어떻게 사용하나요 ! 궁금해요 ㅠㅁㅠ
안녕하세요 준형님! 우선, 강의 정말 잘 들었습니다. 정말 정말 많이 배웠습니다 🙇🏻🙇🏻🙇🏻 다름이 아니라, 데이터 버저닝 파트에서 컨슈머의 멱등성을 보장하기 위해 주문 서비스가 재고 차감 이벤트에 version을 담고, 상품 서비스에서는 JPA가 관리하는 상품 version과 이를 동등성 비교하여 중복 소비를 방지하는 방식에 대해 질문드리고 싶습니다. 이 접근 방식에서 많은 인사이트를 얻었지만, 상품의 version을 주문 서비스가 반드시 알아야 한다는 점은 조금 와닿지 않았습니다. 테스트에서는 version = 0부터 시작하니 문제가 없어 보였으나, 여러 이유로 두 version 값이 어긋나면 오히려 소비해야 할 이벤트까지 멱등 처리되어 버릴 수 있다고 생각했습니다. 그렇다고 이를 해결하기 위해 주문 서비스가 상품 서비스로부터 version 이벤트를 직접 받아 관리하는 것도 과한 방식처럼 느껴지는데요, 이 부분에 대해 준형님의 의견을 들을 수 있다면 좋을 것 같습니다. 시간 편하실 때 부담없이 답변 주시면 감사하겠습니다 🙂
안녕하세요. 먼저 좋은 강의 감사드립니다. 데이터 버저닝에서 이해가 가지 않는 부분이 있어서 질문 드립니다. 낙관적 락을 사용하는걸 봤습니다. 결과적으로 발행시와 소비시의 버전이 같아야 하는데, 대규모 시스템에서 장애가 발생하지 않으려면 프로듀서에 아이디 1인 상품 발행하고 나서 컨슈머에서 처리하기 전까지 절대 새로운 이벤트를 발행하면 안되는거 아닌가요? 만약 컨슈머에서 처리하기 전에 이벤트를 발행하면 똑같은 버전이 후에 계속 들어와서 이 재고 업데이트는 무시되는게 아닌가 해서 질문드립니다. 맞다면 재고 감소 멱등성은 어떻게 해결하면 좋을지 고견 듣고 싶습니다. 감사합니다.
만약에 @Transactional 어노테이션을 사용해서 트랜잭션을 만들었을때 내부 트랜잭션에서 롤백이 발생했다는건 일반적인 상황에서는 database에서 뭔가 예외가 발생해서 그런거라고 생각되는데, 그러면 예외처리기에서 알아서 runtimeException을 상속받은 예외로 바뀔것이고 외부 트랜잭션에서도 롤백이 발생한다는건 이 경우는 database에서 발생했던 예외가 외부 트랜잭션까지 넘어와서 자연스럽게 롤백된거라고 생각합니다. 그래서 UnexpectRollbackException이 발생하지 않는다고 생각됩니다. 제 생각이 맞나요? 그러면 UnexpectRollbackException 이 발생할 수 있는 경우는 뭐가 있나요? 강의에서 처럼 의도적으로 문제를 일으키는게 아니면 생각나는 경우가 딱히 없습니다. 하지만 제가 생각하지 못하는 것이지 예외가 발생한다는 경우가 있긴 있다는것이겠죠? 그렇다면 트랜잭션을 이용하는 순간부터는 그냥 @ControllerAdvice 에서 @ExceptionHandler로 UnexpectRollbackException을 캐치해줘서 처리하는 코드를 거의 무조건 작성해야할까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 트랜잭션 내부 호출관련하여 질문있습니다. 강의에서 언급해주신대로, 트랜잭션이 적용되지 않은 External()함수가 트랜잭션이 적용된 Internal() 함수를 내부 호출할 경우, Internal() 함수에 트랜잭션이 적용되지 않는 다는 것을 이해했습니다. 만약, 이 경우처럼 트랜잭션이 적용된 Login() 함수가 똑같이 트랜잭션이 적용된 getSocialInfo() 메서드를 호출할 경우에는, 어떻게 동작하는지 궁금합니다. 똑같이 내부 호출이기 때문에 무시되는지, 아니면 트랜잭션이 따로 적용되지만 전파 기본 옵션인 REQUIRED 에 따라 자동으로 같은 물리 트랜잭션으로 묶이는 방식으로 동작하는지 궁금합니다. 이 경우, getSocialInfo의 트랜잭션 전파 옵션을 NOT_SUPPORT 로 설정한다면 정상적으로 전파 옵션이 적용되는지도 궁금합니다.
트랜잭션 AOP 주의 사항 - 프록시 내부 호출2 강의 질문입니다. @TestConfiguration static class InternalCallV1TestConfig { @Bean CallService callService() { return new CallService(new InternalService()); } /*@Bean InternalService internalService() { return new InternalService(); }*/ } 위 코드에서 보시는 것과 같이 InternalService를 직접 빈으로 등록해주지 않고 CallService생성자 안에서 InternalService를 주입시켜주면 트랜잭션이 적용되지 않던데, 꼭 InternalService를 빈으로 직접 등록해줘야 하나요??
@tranactional 이 붙은 메소드 안에서 외부 서비스 api를 call 해야하는 상황이 있는데 컨트롤러 단에서 로직 분리가 힘든 상황입니다. @tranactional 이 붙은 메소드 안에서 아래와 같이 TransactionSynchronizationManager를 선언하고 override한 aftercommit 내부에서 호출하게 될 경우 마찬가지로 외부 서비스 api에 장애가 발생했을 때도 본 서비스에 장애로 이어질 수 있을까요?? TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { // 여기서 외부서비스 api 호출 } });
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 안녕하세요. 영한님 이번에도 유익한 강의 해주셔서 감사합니다. 다름이 아니라, 강의 내용 중 트랜잭션 관련하여 질문 드릴 것이 있습니다. DB Lock을 사용하지 않는 상황에서 서로 다른 세션이 같은 데이터를 수정할 때 트랜잭션의 원자성이 깨질 수 있다 고 하셨는데, 비슷한 시점에 실행되는 트랜잭션이 서로 영향을 미치는 격리성의 문제로도 볼 수 있을 것 같다는 생각이 들더라구요. 혹시 격리성이 아니라, 원자성이라고 설명해주신 이유가 있으신가요?