묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
Spring MVC에서 Dispatchers.IO에 관한 고찰
안녕하세요~현재 회사에서 아래 기술 스택을 사용한 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 스레드는 그대로 사용되며, async이 사용된 WebClient 요청에서 Dispatchers.IO를 생략하고 요청하여, 코루틴의 재개 시 동일한 Tomcat 스레드가 처리하게 하는 것이 더 효율적이지 않을까? 하는 생각이 들었습니다.Dispatchers.IO를 사용하면 Tomcat 스레드와 별개로 Dispatchers.IO 스레드 풀(기본 64개)에서 스레드 풀을 가져와 사용하는 것으로 알고 있습니다.이것은 1번의 요청에서 Tomcat 스레드 1개 + Dispatchers.IO 스레드 1개 = 총 2개가 사용되어 컴퓨팅 자원의 낭비가 된다고 느꼈습니다.혹시 WebClient의 비동기 요청이 처리되는 Event Loop가 요청했던 스레드의 Blocking 시 문제가 발생하기 때문에 병렬성을 위해서는 다른 스레드에서 처리해야 하는걸까요? 제가 혹시 잘못 알고 있는 부분이 있거나 Dispatchers.IO를 생략하지 못 하는 이유에 대해 설명해주시면 감사하겠습니다!
-
미해결카카오 면접관이 알려주며 가장 쉽게 배우는 Kafka
Zookeeper vs KRaft 모드
안녕하세요.항상 유익한 강의를 제공해 주셔서 감사드립니다. 입문 강의들을 제외한 모든 강의를 수강하며 많은 도움을 받고 있습니다.다름이 아니라, 개인적으로 Kafka 관련 내용을 공부하던 중 KRaft 모드에 관한 내용이 공식 문서 및 여러 자료에서 업데이트되고 있는 것을 확인하게 되었습니다. KRaft는 Kafka의 아키텍처에서 중요한 변화를 가져온 만큼, 관련 내용을 강의나 추가 자료로 공유해 주신다면 수강생들에게 큰 도움이 될 것 같아 노티 드립니다.항상 좋은 강의 제공해 주셔서 감사하며, 앞으로도 많은 배움을 기대하겠습니다.
-
해결됨프로덕션 레벨 실시간 채팅 서버 구축: 분산 처리부터 성능 최적화까지 (Kotlin & Spring)
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 호출 시 서킷 브레이커를 사용하는 걸 선호하는지?정도가 있습니다!제미니님 덕분에 항상 많이 배워갑니다 감사합니다~!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
QnA에서 Join 필드 표현법
강사님의 코드를 보니 Question 클래스 등에 id, userId, title, content 등만 넣어두신 것 같은데 일반적으로 자주 표현되는 다른 필드를 표현하려면 어떻게 하는 것이 좋을까요?예를 들어 QnA 조회시 질문 목록에서 질문 작성자의 이름이 표시되는 형태가 많습니다. 이때 그렇다면 QnAResponse 에 questionAuthor 필드가 있어야 할 것 같은데 해당 필드가 추가된다면 어떻게 username 정보를 넣어주어야 할지 궁금합니다. 1안. Question 클래스가 userId 대신 User 클래스를 가지고 있는다...2안. Controller에서 user 목록을 조회해서 response 팩토리 메서드에서 매핑한다.2안이 더 나을 것 같긴 합니다만, 리스트이다 보니 매핑로직이 복잡해 질 것 같기도 하고... qnsList->question->userId 모아서 userList조회... map생성 후 매핑 등등 이런 과정이 괜찮은건지 궁금합니다.또 2안이 더 나은 방법이라면 response에 노출해야하는 join 필드 5-6개 처럼 많을때는 어떻게 처리하시는 편인지도 궁금합니다
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
30 강 소스 좀 올려 주십시요
선생님 명언리스트 페이지 제작 - ListView 소스 좀 올려 주십시요. 어떤 곳이 잘못되었는지 비교하고 싶습니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
onBackPressed 함수가 동영상 하고 다르게 동작합니다.
선생님 안녕하세요.아래 함수만 추가 하고 back버튼을 클릭 한번만 해도 오류 없이 자동으로 앱이 종료 됩니다.로그도 다르게 나옵니다.전체 소스 공유 드립니다. https://drive.google.com/file/d/1pywWeGHuAAZb0a0nC1IZZdje1wLZxlLv/view?usp=sharing override fun onBackPressed()
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
ListView 초기 실행 안됩니다.
강의대로 실행하면 검은 앱 화면만 나옵니다.몇번을 반복해서 타이핑해도 같은 증상이 나옵니다. 현재 저는 아래 버전 입니다.Android Studio Otter 2 Feature Drop | 2025.2.2 Patch 1Build #AI-252.27397.103.2522.14617522, built on December 19, 2025Runtime version: 21.0.8+-14196175-b1038.72 amd64VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.Toolkit: sun.awt.windows.WToolkitWindows 11.0GC: G1 Young Generation, G1 Concurrent GC, G1 Old GenerationMemory: 2048MCores: 8Registry: ide.experimental.ui=trueNon-Bundled Plugins: com.levinzonr.arch.jetpackcompose.plugin (1.6.0) Dart (500.0.0) io.flutter (88.2.0) 동영상이 너무 낮고, 등록된 소스하고도 차이가 나서 비교하면서 하기가 참 어렵네요 ㅜ..ㅜ미묘하게 다른게 있는것 같은데 기초를 따라하기가 어려워요. --activity_main.xml<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ListViewandroid:id="@+id/mainListview"android:layout_width="match_parent"android:layout_height="match_parent" /></androidx.constraintlayout.widget.ConstraintLayout>--ListViewAdapter.ktpackage com.chpang.listview_expimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.BaseAdapterclass ListViewAdapter(val List: MutableList<String>) : BaseAdapter(){override fun getCount(): Int {return List.size}override fun getItem(position: Int): Any {return List[position]}override fun getItemId(position: Int): Long {return position.toLong()}override fun getView(position: Int, convertView: View?, parent: ViewGroup? ): View {var converView =convertViewif (converView==null) {converView = LayoutInflater.from(parent?.context).inflate(R.layout.listview_item, parent, false)}return converView!!}}--listveiw_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="80dp"><TextViewandroid:id="@+id/listviewItem"android:textSize="30sp"android:layout_margin="5dp"android:text="리스트뷰 아이템"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>--MainActivity.ktpackage com.chpang.listview_expimport android.os.Bundleimport android.widget.ListViewimport androidx.activity.enableEdgeToEdgeimport androidx.appcompat.app.AppCompatActivityimport androidx.core.view.ViewCompatimport androidx.core.view.WindowInsetsCompatclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val list_item = mutableListOf<String>()list_item.add("A")list_item.add("B")list_item.add("C")val listview =findViewById<ListView>(R.id.mainListview)val listAdapter = ListViewAdapter(list_item)listview.adapter = listAdapter}}
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
결제서비스 콜백 동시성문제 가능성
안녕하세요 결제 코드느끼기 강의를 보며 궁금한점이 있어서 질문을 남깁니다.여러 주문들을 동시에 넣었고createPayment가 되고 PG사로부터 success가 콜백 호출 된다 했을때, 동시성 문제가 우려되는데요 각 주문마다 point 혹은 coupon을 쓴다고 했을때, 고객이 가진 point 이상으로 point가 차감된다든지, 쿠폰 재사용 문제를 직면했을때 예외처리가 없어보이며, 이 때문에 이를 복구하는 방안같은건 없어보입니다.(괜히 예외처리를 했다가 고객의 돈이 빠져나가고 결제상태가 안바뀔 염려때문)그럼에도 각 Value Object에서 valid및 예외처리하는 로직이 success api에 추가할 수 있을까요? 아니면 주문 결제 전 단계에서 막으면 좋을까요?아니면 그럴 가능성이 자주는 없으니, 결제 상태는 Ready인 부분을 찾아서 수동 수정하는것도 방법이라고 보시나요?
-
해결됨누구보다 빠르게 배우는 Springboot + React RestAPI 게시판 만들기
강의자료문의
react ui 만들기 강의에서 헤더의파일같은거는 강의자료에 있다고 하셨는데 강의자료는 어디에 있나요?? 노션에도 없던데
-
해결됨누구보다 빠르게 배우는 코틀린 (1시간)
섹션 4 연산자 실습 영상의 앞부분이 잘린 것 같습니다.
안녕하세요.먼저, 코틀린 강의를 올려주시고 무료로 학습할 수 있게 해주셔서 감사합니다. 다름이 아니라, 섹션 4의 연산자 실습 영상의 앞 부분이 맥락상 잘린 것 같습니다. 확인 부탁드리겠습니다. 🙇🏻♂️
-
해결됨누구보다 빠르게 배우는 Kotlin + Springboot + JWT 로그인
10번 영상이 중간부터 시작하는 것으로 보여요
영상을 시작하면 갑자기 JwtUtils 코드가 이미 어느 정도 작성된 상태에서 뭔가 에러 체크 하시는 부분부터 시작이 됩니다
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
굿
좋아요.하드코딩에 대해 알려주는 강의가 95% 인데,일 하는 법에 대해 알려주는 강의인 것 같아요. 제가 강의 듣다가 가만 생각이 들던데, 일 잘하는 사람이 되기 위해 필요한 것들을 알려주는 강의가 아닐까 라는 생각이 드문드문 들더군요.