묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨AI 를 활용한 안드로이드 프로젝트(Android Project with AI Coding Gemini)
강의 오류
13강이 20초이고 14강에는 강의자료로 영상이 없는 상태입니다. 업데이트 오류인지 저만 그런건지 모르겠네요
-
미해결코틀린 고급편
KType 관련 Kotlin 2.3 변경점
Kotlin 2.3버전에서 달라진 점을 하나 더 말씀드릴려고 합니다.기존 KClass.createType()은 제네릭 인자(Arguments)를 명시적으로 전달해야 하는 등 사용이 번거로웠습니다.구 방식:List::class.createType(arguments = listOf(KTypeProjection.invariant(String::class.createType())))신 방식 (권장):typeOf<List<String>>()import kotlin.reflect.KType import kotlin.reflect.typeOf // 1. 단순 타입 val intType: KType = typeOf<Int>() // 2. 제네릭 타입 (중첩 제네릭 가능) val listType: KType = typeOf<List<String>>() val mapType: KType = typeOf<Map<Int, List<String>>>() // 3. 널러블 타입 val nullableType: KType = typeOf<String?>()혹시나 안되시는 분들은 참고하면 좋을 것 같아요!
-
미해결코틀린 고급편
Kotlin 2.0(K2 컴파일러)에서 달라진 Java SAM 변환 동작
Kotlin에서 Java의 함수형 인터페이스(SAM Interface)를 사용할 때, 이전 버전과 2.0 이후 버전에서 동작이 달라진 부분을 발견해서 공유합니다.@FunctionalInterface public interface StringFilter { boolean filter(String s); }위와 같은 함수형 인터페이스가 있다고 하면은 Kotlin 1.x (구 컴파일러) 에서는 다음과 같이 SAM 생성자를 명시적으로 사용해야만 했습니다. val filter = StringFilter { s -> s.startsWith("A") }Kotlin 2.0+ (K2 컴파일러) 에서는 아래와 같은 방식이 정상 동작 됩니다.val filter: StringFilter = { s -> s.startsWith("A") }왜 바뀌었는지 찾아보니 Kotlin 2.0에서 정식 도입된 K2 컴파일러는 프론트엔드를 완전히 새로 작성하면서, 타입 추론(Type Inference)과 호출 해석(Call Resolution) 시스템이 크게 개선되었습니다. K2 컴파일러 마이그레이션 가이드에서는 이를 다음과 같이 설명합니다."Improved call resolution and type inference."The compiler behaves more consistently and understands your code better.구체적으로 K2 컴파일러는 기대 타입(Expected Type)이 Java SAM 인터페이스인 모든 위치에서 람다의 암시적 SAM 변환을 지원하도록 확장되었습니다. 이전에는 SAM 변환이 함수 인자 전달 등 제한된 위치에서만 적용됐지만, K2에서는 변수 대입을 포함한 더 넓은 범위에서 일관되게 동작합니다.실습하다가 너무 잘 되어서 한번 찾아본 결과를 한번 정리해서 드립니다!https://kotlinlang.org/docs/k2-compiler-migration-guide.htmlhttps://kotlinlang.org/docs/whatsnew20.htmlhttps://kotlinlang.org/docs/fun-interfaces.htmlhttps://kotlinlang.org/docs/compatibility-guide-20.html
-
해결됨카카오 면접관과 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법
이벤트 발행이 불필요한 것은 어떻게 구분하나요?
Debezium이 데이터베이스 트랜잭션 로그(binlog, WAL 등)를 읽어서 변경사항을 Kafka로 발행한다는 것은 이해했습니다. 그런데 혼란스러운 부분이.... 일반적인 CRUD API 요청도 결국 DB에 변경을 가하는데, Debezium이 이를 어떻게 구분하는지 궁금합니다. 예를 들어주문 생성 API → DB INSERT → 이건 CDC 이벤트로 발행해야 함 사용자 세션 저장 API → DB INSERT → 이건 CDC 불필요 이런 경우에는 어떻게 구분되나요?
-
미해결SpringAI + React로 만들어보는 나만의 감정일기 서비스
혹시 git 주소 혹은 소스코드 공유될까요???
강의보면서 하나하나 따라적는게 좀 불편한데, 소스코드도 제공가능한지 문의드립니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
안드로이드 에뮬레이터가 실행이 안 되요...ㅠ
안녕하세요, 안드로이드 스튜디오는 설치했는데 애뮬레이터 실행이 안 됩니다.. otter3를 설치했고 android 31을 받았고 AVD는 Pixel 7a를 받았습니다. 다른 pc에서 똑같이 받아보니 실행이 잘 됩니다.예상되는 문제는 AVD를 생성하면 생성되는 폴더인 .android 경로에 한글이 들어가서 그런 것 같습니다. 그런데 환경 변수에 사용자, 시스템 각각 ANDROID_AVD_HOME 등과 같은 이름으로 변수명에 넣고 제가 C드라이브 바로 아래에 생성한 AVD라는 폴더 경로를 변수값에 넣어주었습니다. 그리고 pc를 껐다 다시 켜서 실행시켜보면 아래와 같이 새로 생성한 폴더에 파일이 생성 되지만아래 이미지처럼 기존에 한글이 포함된 경로에 .android가 생성되고 그 안에 다른 파일들이 생성됩니다. 시스템 환경 변수에는 제가 예전에 새로 만들었던거 같은 영어로된 user가 상단에 적혀있고 c드라이브 user에 들어가면 한글로 된 user와 영어로된 user 이렇게 2개가 있는 것 같습니다. 무엇이 문제일까요?? 제발 도와주세요ㅠ
-
해결됨Claude + IntelliJ로 TodoList 개발하기 - MCP 완전 정복
가상의컨테이너에 파일생성이 됩니다.
인텔리제이와 MCP를 모두 연결 한것 같은데파일생성이 되지않고 실행시켜달라고하면 가상의컨테이너에 만들었다고 답변을 합니다.어떻게 해결해야할까요?
-
해결됨Claude + IntelliJ로 TodoList 개발하기 - MCP 완전 정복
claude_desktop_config.json 설정도 해야하는거죠?
- 학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요!- 마크다운과 단축키를 활용하면 글을 더 편하게 작성할 수 있어요.- 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해보세요.- 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요.- 잠깐! 인프런 서비스 관련 문의는 1:1 문의하기를 이용해 주세요 변경된 Claude 설정법 영상[변경된 Claude 설정법 영상]만 하면 되는건가요? 아니면 claude_desktop_config.json에 "mcpServers": { "jetbrains": { "command": "npx", "args": ["-y", "@jetbrains/mcp-proxy"] } }...이거 복사 붙여넣기하는건 꼭 하고 진행해야 하는건가요? 근데 저게 뭘하는건지 궁금하긴하네요
-
미해결
Kotlin + Spring MVC 사용 시 Dispatchers 생략
안녕하세요~현재 아래 기술 스택을 사용한 API 서버가 존재합니다.Spring Boot 3KotlinJPA(JDBC)WebClient예를 들면 아래와 같이 구성되어 있고,@RestController class SampleController( private val service: SampleService ) { @GetMapping("/sample") suspend fun start() { service.withoutDispatchers() } } @Component class SampleClient { private val webClient: WebClient by lazy { WebClient.builder() .baseUrl("https://api.com") .build() } suspend fun fetch(): Int { return webClient.get() .uri { uriBuilder -> uriBuilder.path("/number").build() } .retrieve() .awaitBody() } } interface SampleRepository : JpaRepository<SampleEntity, Long>@Service class SampleService( private val client: SampleClient, private val repository: SampleRepository, ) { suspend fun withoutDispatchers(): Int = coroutineScope { // non-blocking val deferred: Deferred<Int> = async { client.fetch() } // blocking val entity: List<SampleEntity> = repository.findAll() deferred.await() + entity.size } }Controller에서부터 suspend function으로 시작되면 Dispatchers.Unconfined를 사용하여 API 요청에 의해 할당받은 Tomcat 스레드를 그대로 사용하는 것으로 알고 있습니다.이후 Service 레이어에서 suspend function이 동일하게 Dispatchers.Unconfined를 유지하기 때문에 요청 시 Tomcat 스레드는 그대로 사용되고 WebClient 요청 시 Dispatchers.IO를 사용하면, Tomcat 스레드와 별개로 Dispatchers 스레드 풀에서 스레드를 가져와 사용하는 것으로 알고 있습니다. 1번의 요청에서 Tomcat 스레드 1개 + Dispatchers 스레드 1개 = 총 2개가 사용됩니다.WebClient 요청 시 Dispatchers.IO를 생략하고 Dispatchers.Unconfined를 유지하면,코루틴의 재개 시 WebClient 응답을 동일한 Tomcat 스레드가 처리하게 하여 스레드 1개만을 사용하는 것이 서버에 더 효율적이지 않을까? 하는 생각이 들었습니다.스레드가 Blocking되어도 WebClient의 NIO 이벤트 루프에 들어온 요청은 처리되어 응답에 대한 처리만 대기하고 있을 것이고, 테스트해보았을 때도 WebClient의 요청을 시작한 스레드가 JPARepository를 사용하는 코드에 의해 Blocking되어도 await()에서 문제 없이 응답을 받아올 수 있었습니다.혹시 제가 생각하지 못한 또 다른 문제가 있을까요?제가 혹시 잘못 알고 있는 부분이 있거나 Dispatchers.IO를 생략하지 못 하는 이유가 있다면설명해주시면 감사하겠습니다!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
의존 방향에 대한 고민
안녕하세요. 최근 객체 간 의존 방향 고민에 많은 시간을 쏟고 있어 질문드립니다.핵심 질문도메인/서비스 간 의존 방향을 결정할 때 어떤 기준을 적용하면 좋을까요? "누가 누구를 알아야 하는가"에 대한 판단 기준이나 원칙이 있을까요? 저는 덜 중요한 개념의 변경이 중요한 개념에 영향을 주면 안된다고 생각하고 있었습니다. 그래서 중요한 개념이 덜 중요한 개념을 모르도록 코드를 짜려고 노력하는데요. 막상 개발할 때는 이게 잘 안되어서 고민에 시간을 많이 사용하거나, 타협하곤 합니다. 이런 상황이 이번 강의를 보면서도 나타나 질문글을 작성하게 되었습니다. 구체적인 상황그런데 강의에서 download 메서드를 CouponService로 이동하는 과정을 보고 다음과 같은 의문이 들었습니다:변경 후 구조:CouponService → OwnedCoupon, OwnedCouponRepository 의존OwnedCoupon → Coupon, CouponRepository 의존우려 사항:Coupon과 OwnedCoupon이 서로를 알게 되는 것이 순환 참조나 강결합을 유발하지 않을까? OwnedCoupon에 필드 추가 시, 기존에는 OwnedCouponService만 수정하면 됐지만 이제는 CouponService도 함께 수정해야 함논리적으로는 CouponService에 download 기능이 있는 것이 맞아 보이지만, Coupon과 OwnedCoupon이 서로 알게 되는 것이 괜찮은 설계인가? 이런 고민에 시간을 많이 쓰다 보니 개발 시간이 부족하다고 느껴집니다. 마감을 위해 구현 후 리팩토링하는 방식으로 진행하고 있지만, 리팩토링을 못할 때도 많고 마음의 짐으로 남는 것 같습니다.조언 부탁드립니다. 감사합니다.
-
해결됨카카오 면접관이 알려주며 가장 쉽게 배우는 Kafka
Zookeeper vs KRaft 모드
안녕하세요.항상 유익한 강의를 제공해 주셔서 감사드립니다. 입문 강의들을 제외한 모든 강의를 수강하며 많은 도움을 받고 있습니다.다름이 아니라, 개인적으로 Kafka 관련 내용을 공부하던 중 KRaft 모드에 관한 내용이 공식 문서 및 여러 자료에서 업데이트되고 있는 것을 확인하게 되었습니다. KRaft는 Kafka의 아키텍처에서 중요한 변화를 가져온 만큼, 관련 내용을 강의나 추가 자료로 공유해 주신다면 수강생들에게 큰 도움이 될 것 같아 노티 드립니다.항상 좋은 강의 제공해 주셔서 감사하며, 앞으로도 많은 배움을 기대하겠습니다.
-
해결됨실시간 채팅 서버 구축: 분산 처리부터 성능 최적화까지
RedisMessageBroker.kt setLocalMessageHandler 관련 문의
RedisMessageBroker 가 @Service 로 관리 되기 때문에 싱글톤으로 관리 되는걸로 알고 있는데, 아래처럼 핸들러를 할당하는 경우 여러곳에서 setLocalMessageHandler 호출 시 문제가 발생할거 같은데 맞는건지 궁금합니다. fun setLocalMessageHandler(handler: (Long, ChatMessage) -> Unit) { this.localMessageHandler = handler }
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
어드민(Back-office)에서 예약 변경 시, '할인 조건 재검증(쿠폰 회수)' vs '기존 혜택 유지' 중 어떤 정책이 일반적인가요?
안녕하세요실무에서 '관리자(Admin) 예약 변경 기능' 정책을 두고 기획팀과 이견이 있어, 실무에서는 어떤 방식이 범용적인지 여쭙고 싶습니다.[시스템 상황]유저가 예약할 때 다양한 할인(이벤트, 타임세일, 쿠폰, 기업지원 등)이 적용되며, 이 정보는 예약 시점에 스냅샷(Snapshot)으로 저장됩니다.현재 어드민(상담원/운영팀)이 유저의 예약 시간/날짜를 변경하는 기능을 개발 중입니다.[이슈 사항]기획상으로는 어드민에서 시간을 변경할 때도 모든 할인 조건을 '실시간'으로 재검증하라고 합니다.문제는 재검증 과정에서 '쿠폰 박탈' 같은 상황이 발생한다는 점입니다.예시 상황:유저가 5만원짜리 예약에 5만원 이상 결제 시 사용 가능한 10% 쿠폰을 씀.어드민이 사정상(또는 유저 요청으로) 가격이 저렴한 타임이나 옵션으로 변경함 -> 결제액이 4만원이 됨.기획 요구사항: "최소 결제 금액(5만원) 조건을 불만족하게 되었으니, 자동으로 쿠폰 적용을 해제(원복)하고 금액을 재계산한다."[제(개발자) 의견 및 고민]저는 위 기획이 어드민 기능의 목적과 UX(고객 경험)에 맞지 않는다고 생각합니다.고객 경험 훼손: 유저는 단지 시간을 바꿨을 뿐인데, 시스템이 엄격하게 검증해서 "조건 미달이니 쿠폰 뺏어가겠습니다"라고 하면 컴플레인 요지가 다분합니다. (유저 입장에선 혜택 유지를 원하니까요.)데이터 복잡도: 이미 스냅샷으로 저장된 할인 정보를, 수정 시점에 다시 현재 기준의 마스터 데이터(쿠폰 유효기간, 최소금액 등)와 대조해서 '줬다 뺏는' 로직을 짜는 건 구현 복잡도 대비 실익이 너무 적습니다.관리자의 재량: 어드민에서의 변경은 보통 '강제성(Override)'을 띠는 경우가 많은데, 시스템이 칼같이 혜택을 잘라버리는 게 맞나 싶습니다.[질문]보통 예약 도메인에서 관리자(Admin)가 개입하여 예약을 변경할 때도, 이렇게 엄격하게 유저의 할인 자격(최소금액, 유효기간 등)을 재검증하여 박탈시키는 게 맞나요?아니면 어드민 권한 변경인 경우 "기존 스냅샷(혜택)을 최대한 유지"해주거나, 가격 변동이 불가피하면 "취소 후 재예약"을 하는 프로세스가 더 일반적인가요?개발자로서 이 복잡한 '조건부 쿠폰 회수' 로직을 방어하고 싶은데, 설득력 있는 논리가 필요합니다. 조언 부탁드립니다!
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
싱글톤과 스프링
안녕하세요. 싱글톤 관련 질문 드립니다.특정한 의문점에 대한 질문은 아니고요. 스프링 컨테이너는 핸들러나 서비스 빈을 싱글톤으로 관리하게 되는데,혹시 강의에서 등장한 자바와 코틀린의 싱글톤 사용 방식의 차이에 의해 발생하는 스프링 싱글톤 관련된 이슈가 있는지 궁금합니다.싱글톤 관리는 언어와 관계없이 스프링 컨테이너가 맡게 되니 별 상관이 없을 것으로 예상되긴 합니다만.. 혹시 싶어 질문 드립니다.감사합니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
OrderKeyGenerator 인스턴스화 generate() 질문
안녕하세요! 수업 잘 듣고 있습니다.사소한 내용이긴한데..OrderService.create 에서 OrderKeyGenerator 객체를 를 주입받아 generate() 를 호출해서 orderKey 를 생성하는 부분에서OrderKeyGenerator class 는 상태를 가지지도 않고 Property 를 가지지도 않는데 static method, 함수로 구현 되어도 되지 않았을까 하는 생각이 들었는데요.어떤 고려사항이 있는지 궁금합니다.static 이든 함수든 객체 메서드이든 상관 없다?나중에 OrderKeyGenerator 가 확장되는 것이 고려된 것?OrderSerivce 에서 사용하는 기능이니 주입되는 것이 더 응집되어 보여서 더 좋다?그냥 함수를 가져다 쓰는 것보다 객체를 주입하는 쪽이 테스트 하기 좋다?generate 가 순수함수가 아니라서?class OrderKeyGenerator { fun generate(): String { return Base64.getUrlEncoder().withoutPadding().encodeToString( ByteBuffer.allocate(16).apply { UUID.randomUUID().also { putLong(it.mostSignificantBits) putLong(it.leastSignificantBits) } }.array(), ) } }
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
get() = 3
안녕하세요. 상속과 별로 연관된 질문은 아닌 듯 하지만 강의에서 나온 부분에 궁금증이 생겨 질문 남깁니다. val swimAbility: Int get() = 3 이라는 예제 코드를 작성하셨는데요. 코틀린은 어차피 필드를 선언하면 게터, 세터를 만들어주고필드 선언 시 디폴트 값도 지정해줄 수 있는데그렇다면 위와 같은 형태의 커스텀 게터는 굳이 구현할 필요 없는 것 아닌가? 하는 생각이 듭니다. 그냥 초기값 3을 갖는 필드를 선언하기만 하면 게터까지 알아서 만들어질 테니까요. 그냥 인터페이스의 게터 상속 의도를 표현하기 위해 별 의미나 실 용례는 없는 코드를 작성하신 거라고 봐도 될지? 아니면 저런 방식의 커스텀 게터에 제가 이해하지 못하는 어떤 의미가 있는 것일지가 궁금합니다. 감사합니다.ㅇ
-
미해결개발하는 정대리 코틀린 기초 문법
notion 페이지가 열리지 않습니다.
해당 강의 notion 페이지가 열리지 않던데 혹시 볼 수 있는 방법이 있을까요?
-
미해결Springboot 모니터링 시스템 구축 (프로메테우스 + 그라파나)
[프로메테우스] Error scraping target: server returned HTTP status 404
https://github.com/laboratory-kkoon9/prometheus-grafana-lab 프로메테우스 화면에서 다음과 같은 에러가 발생하고 있습니다.원인 같이 확인해주실 수 있나요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
외부 API 통합 시 데이터 제어 범위 설계 질문
상황 정리저희가 매장 관리자용 통합 예약 관리 시스템을 개발하고 있습니다.현재 시스템 구조[외부 예약 플랫폼 (네이버 같은)] ↓ 자동 연동 [매장 POS 시스템 (티오더 같은)] ↓ API 폴링 [우리 통합 관리 시스템] 고객이 외부 플랫폼에서 예약하면 POS에 자동으로 들어옴우리는 POS API를 폴링해서 예약 데이터를 가져옴우리 어드민에서 직접 예약 등록 기능도 곧 추가 예정문제 상황POS 업체에 확인해보니:API에서 외부 플랫폼 예약 구분이 안 됨 → 구분값 추가 예정외부 예약은 원칙적으로 수정 불가현재는 수정이 되지만 플랫폼 API 키가 연결 안 되어 사실상 불가능DB만 바꿔서는 의미 없고, 외부 플랫폼 API 재호출이 필요POS와 외부 플랫폼 간 연동이 아직 불완전한 상태논의된 두 가지 방향A안 (readonly 방식)- 우리 어드민 생성 예약 → POS 직접 등록 (수정 가능) - 외부 플랫폼 예약 → POS에서 폴링해서 조회만 (수정 불가) - UI에서 "외부 예약" 표시하고 수정 버튼 비활성화 - 수정 필요시 원본 플랫폼 바로가기 링크 제공 B안 (통합 수정 방식)- 모든 예약을 우리 시스템에서 직접 수정 가능하게 - 외부 예약 수정 시 POS API → 외부 플랫폼 API 호출까지 처리 장단점 분석A안 장점각 시스템의 책임 범위가 명확함동기화 정합성 이슈 없음외부 플랫폼 정책 변경에 영향 안 받음여러 플랫폼을 한 곳에서 조회만 해도 관리자 리소스 절감 효과A안 단점수정은 여전히 각 플랫폼에서 해야 함"진정한 통합 관리"는 아님B안 장점완전한 통합 관리 경험관리자가 한 곳에서 모든 예약 제어B안 단점외부 플랫폼 API 직접 연동 불가 (계약 주체가 매장)POS가 외부 플랫폼 제어 API를 제공해야 하는데 현재 없음POS-외부 플랫폼 양쪽 동기화 복잡도 높음외부 플랫폼 정책(취소규칙 등) 변경 시 계속 대응 필요문제 발생 시 책임 소재 애매질문이런 다중 오리진 데이터를 통합하는 시스템에서:readonly로 가는 게 맞을까요, 아니면 수정까지 구현해야 할까요?단계적으로 접근한다면 어떤 순서가 좋을까요?1단계: 통합 조회만2단계: POS가 API 제공하면 그때 수정 추가비슷한 사례에서 일반적으로 어떻게 접근하나요?현재 상황에서는 A안(readonly)이 합리적이라고 판단됩니다.하지만 시간이 지나서 다음 조건들이 충족된다면:POS에서 외부 예약 플랫폼 식별값을 제공외부 예약 플랫폼 API를 저희가 제공받을 수 있음그때는 어떤 아키텍처로 가야 할까요?옵션 1: 직접 호출 방식[우리 시스템] → [외부 플랫폼 API] (직접 호출) → [POS API] (동기화용) 우리가 외부 플랫폼 API를 직접 호출POS는 조회 + 동기화 확인용으로만 사용옵션 2: POS Proxy 방식[우리 시스템] → [POS API] → [외부 플랫폼 API] POS가 외부 플랫폼 제어 API를 제공하도록 요청우리는 POS API만 호출하면 POS가 내부적으로 플랫폼 API 처리외부 플랫폼 변경사항은 POS가 책임옵션 3: readonly 유지[우리 시스템] → [POS API] (조회만) 기술적으로 가능해져도 readonly 유지각 플랫폼 바로가기만 제공어떤 방식이 일반적이고, 각 옵션의 trade-off는 무엇인가요?특히 옵션 1 vs 옵션 2에서:우리가 직접 여러 외부 API를 관리하는 게 나을까요?아니면 POS가 Proxy/Gateway 역할을 하게 하는 게 나을까요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
PG 결제 승인 로직
안녕하세요!PG 결제 승인 API 구현 중 고민이 되는 부분이 있어서 질문드립니다! PG사로 부터 /callback/success 등과 같이 콜백 url로 요청을 받았을때 결제 승인을 서버에서 진행하는 플로우인데결제 승인 요청 전 결제 검증PG 결제 승인 API 호출정상 승인 or 승인 실패 시 transaction_history 저장의 흐름인 것 같은데 추가적으로 3번에서 정상 승인 시에 PG사로 부터 응답받은 paymentKey, amount 등을 요청한 paymentKet, amount와 동일한지 검증이 필요할까? 라는 생각이 들었습니다. 궁금한 점은실무에서 PG사 연동 시에는 결제 승인 응답 후 검증 로직을 다루는지? 다룬다면 실제 승인 요청 내역과 응답 내역이 다르다면 어떻게 처리하는지? (클라이언트로 응답, 불일치 시 보정 전략 등..)외부 API 호출 시 서킷 브레이커를 사용하는 걸 선호하는지?정도가 있습니다!제미니님 덕분에 항상 많이 배워갑니다 감사합니다~!