묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Real MySQL 시즌 1 - Part 1
5강에서 사례로 언급하신 DETERMINISTIC 예제에 대해 질문있습니다.
5강 2분50초쯤에 '사용자의 수를 가져오는 함수'를 예시로 설명해 주셨는데요.- 이 Stored Function이 실행되는 순간에도 사용자의 가입은 계속된다.- 그로 인해 이 Stored Function은 호출할 때마다 결과값이 달라질 수도 있다.- 하지만 이러한 사용자 테이블의 레코드가 달라지는 것도 입력이 달라지는 것이라고 생각하기 때문에 MySQL서버에서 SELECT를 포함해서 하나의 Statement는 반드시 시작 시점의 스냅샷을 보도록 구현되어 있다.- 그래서 MySQL서버에서 실행되는 쿼리 문장 하나는 동일한 데이터 상태를 보게 된다.- 따라서 하나의 문장 내에서는 Stored Function이 여러번 호출되더라도 테이블의 데이터는 해당 시점의 스냅샷을 보기 때문에 함수의 인자만 동일하다면 입력이 달라지지 않는 것으로 본다.Q) DETERMINISTIC으로 정의된 함수에 대해서 스냅샷을 바라보도록 설정돼 있고, 이로 인해 함수가 참조하는 데이터(인자)가 변경돼도 그 외 나머지 입력값이 동일하다면 동일한 결과값을 반환하게 된다는 내용이 맞을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
deternmistic 질문
안녕하세요deterministic 관련해서 궁금증이 있어 질문드립니다. 그럼 mysql stroed function을 생성할때 무조건 deterministic 으로 생성을 해야하는지요??예를들면, 함수 내에는 파라미터값을 받아서 select 결과값을 도출하는 가령, id값등등 있다고 가정하겠습니다. 그럼 select * from test where 함수('value') 등으로 넣어서 값을 도출받아 where 조건에 걸수있다고 가정해보면non deterministic 일 경우 fullscan을 탈거같은데요. 결론적으로 , 모든 함수를 전부 deterministic 으로 명시를 해줄경우 단점이 무엇인가요?? 감사합니다.
-
미해결데이터 분석 SQL Fundamentals
where in절 서브쿼리
where in절에서 서브쿼리를 사용하면 서브쿼리의 결과로 중복되는 컬럼이 유니크 하게 처리된다 하셨는데 이거는 in절의 특징인가요?
-
미해결Real MySQL 시즌 1 - Part 1
1강 CHAR타입에 대해 질문드립니다
안녕하세요. 우선 이렇게 좋은 강의 해주셔서 감사합니다. 강의를 듣다가 궁금한 부분이 있어 질문드립니다.Q1) 10:00분 경에 "CHAR여도 utf8mb4같은 가변길이 캐릭터 셋을 사용하면 때로는 예약된 빈 공간이 없을 수 있다"라고 말씀해 주셨는데요. 제가 강의를 듣고 이해하기로는 '1~4byte값을 가질 수 있다는 가변길이 캐릭터 셋' 성질 때문이 아니라 '문자 하나당 크기가 1byte를 초과했기 때문에' 예약된 빈 공간이 없어지는 걸로 생각했습니다. 즉, 가변길이 캐릭터 셋인 utf8mb4가 아닌 하나당 크기가 3byte인 어떤 고정길이 캐릭터 셋을 이용하더라도 동일하게 예약된 빈 공간이 없을꺼 같은데 혹시 제가 이해한게 맞을까요?Q2) 마지막 내용 정리하시는 부분에서 "인덱스된 컬럼이라면 CHAR가 효율적일 가능성이 더 높다"고 말씀해 주셨는데 어떤 이유로 인덱스된 컬럼에 CHAR가 더 좋을 가능성이 높은건지 알려주실 수 있으실까요?
-
미해결견고한 결제 시스템 구축
동시성 제어 (optimistic locking) 재시도 부분 질문 드립니다.
동시성 제어를 optimistic 방식으로 구현을 하시고 retry 를 직접 구현하셨느데요- 혹시 직접 구현하지 않고스프링 @Retryable 을 이용안하신 이유가 있으실까요? @Retryable을 하면 더 간단하게 재처리가 가능할것 같아서요~!
-
해결됨장래쌤과 함께하는 쉽고 재미있는 SQL 이야기
테이블 생성 후 조건 수정 방법
안녕하세요 View 로 임시테이블 생성에 관한 파트 듣고 질문드립니다 View로 생성하는것과 Create 테이블명 ( ~ 이렇게 테이블 생성하는것의 차이점이 있을까요? Create 테이블 > 이렇게 해서 테이블 생성한 경우 수정이 필요할 때 어떻게 하는지도 궁금합니다.
-
미해결견고한 결제 시스템 구축
결제 복구의 세부 과정을 병렬로 처리한 이유가 궁금합니다
안녕하십니까 여정민 강사님! 강의 도중 궁금한 점이 있어 질문 드리고자 합니다. 질문은 12:32 초의 코드를 보면package com.example.paymentservice3.payment.application.service import com.example.paymentservice3.payment.application.port.`in`.PaymentConfirmCommand import com.example.paymentservice3.payment.application.port.`in`.PaymentRecoveryUseCase import com.example.paymentservice3.payment.application.port.out.* import org.springframework.scheduling.annotation.Scheduled import reactor.core.scheduler.Schedulers import java.util.concurrent.TimeUnit class PaymentRecoveryService ( private val loadPendingPaymentPort: LoadPendingPaymentPort, //결제 처리가 완료되지 않은 상태의 결제를 조회 하기 위해 private val paymentValidationPort: PaymentValidationPort, //결제 유효성 검사 private val paymentExecutorPort: PaymentExecutorPort, //결제 승인 요청 private val paymentStatusUpdatePort: PaymentStatusUpdatePort //결제 상태 업데이트 ) : PaymentRecoveryUseCase { @Scheduled(fixedDelay = 180, timeUnit = TimeUnit.SECONDS) override fun recovery() { loadPendingPaymentPort.getPendingPayments() .map { PaymentConfirmCommand( paymentKey = it.paymentKey, orderId = it.orderId, amount = it.totalAmount() ) } .parallel(2) .runOn(Schedulers.parallel()) .flatMap { paymentValidationPort.isValid(it.orderId, it.paymentKey).thenReturn(it) } .flatMap { paymentExecutorPort.execute(it) } .flatMap { paymentStatusUpdatePort.updatePaymentStatus(PaymentStatusUpdateCommand()) } } }위와 같이 작성되어있는데 여기서결제 유효성 검사결제 승인 요청결제 상태 업데이트위 3가지 기능 수행을 병렬로 처리한 이유가 궁금합니다.강의에서 언급된 이유로는 "각 작업 간의 수행 순서가 중요하지 않은 작업들은 병렬로 처리하여 전체 처리 시간을 단축" 이라고 말씀하셨습니다. 제가 생각했을 때는 유효성 검사에 성공하면 결제 승인을 요청하고 결제 승인 요청에 대한 결과를 바탕으로 결제 상태 업데이트가 수행이 되어야 한다고 생각되어 병렬처리를 하는 부분에 있어 타당함을 잘 모르겠습니다. 제 짧은 견해로는 결제 유효성 검사결제 승인 요청결제 상태 업데이트위 순서를 지켜 수행되어야 한다고 판단하였습니다. 이 부분에 대해서 강사님의 생각이 궁금합니다. p.s. 좋은 강의를 제공해주셔서 감사합니다. 여태 수강한 강의 내용들이 모두 새로워 덕분에 공부할 부분을 많이 찾게 되어 감사드립니다. 앞으로도 좋은 강의를 만들어주시면 많은 도움이 될 것 같습니다 화이팅!
-
미해결데이터 분석 SQL Fundamentals
exists 와 in 차이
안녕하세요, Where절 서브쿼리 사용 시 유의사항 part 듣다가 질문드립니다 앞전에 exists 사용법에 대해 나오지 않아서 이 파트 들으면서 처음 봤는데요! 비상관 서브 쿼리 - in 을 사용해서 설명상관 서브쿼리 exists 를 사용해서 설명해주셨는데 in을 사용한 비상관 서브쿼리에서도 상관서브쿼리처럼 메인쿼리의 연결 컬럼을 넣어줘도 작동이되어서요 그럼 비상관 서브쿼리랑 상관 서브쿼리랑 차이가 없는것처럼 보여서 헷갈립니다 ㅠ 그리고 언제 in 을 사용한 서브쿼리를 활용하는지, exists 를 사용하는지 궁금합니다 from ( 서브쿼리 ) 이렇게 해줘도 될것같은데 어떤 차이인지 해서요!
-
해결됨Real MySQL 시즌 1 - Part 2
시퀸셜하게 증가하지 않는 PK의 insert성능도 문제가 있을까요?
좋은 강의 제공해주셔서 감사합니다!강의를 듣다보니 의문점이 하나 생겼는데요. 에피소드 14의 시퀸셜하지 않은 UUID사용시 범위 검색의 조회 효율성 문제를 언급해주셨는데요 데이터 삽입시 인덱스가 리밸런싱되거나 리프노드의 실제 데이터 위치가 이동하는 문제가 발생할수도 있을까요?
-
해결됨실무형 데이터 분석을 위한 핵심 SQL
만약 데이터 웨어하우스에서 분석한 내용을 다시 고객에게 서빙하고 싶다면 어떻게 하나요?
안녕하세요 한기용 강사님! 궁금한 내용이 있어 질문드려요 OLTP에 저장되어 있는 데이터를 OLAP로 가져와서 내부 직원들이 테이블을 분석하던 중 고객들에게 제공하면 좋을 새로운 데이터(예: 통계 데이터 등)가 재가공된다면 이 데이터를 어떻게 서빙하나요?재가공된 데이터를 OLTP 데이터 저장소(Postgres 등)에 다시 저장해서 이를 API에 연결해서 서빙하는지 궁금합니다.
-
해결됨[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
(맥환경) workbench 이용할 때 패스워드 입력 안해도 자동으로 활성화 가능해져요..
본문제목 그대로 워크 벤치 이용할 때, 항상 패스워드를 입력한 후 활성화 되는 것으로 알고 있었는데, 현재 패스워드 입력 안하고 그냥 클릭만 해도 활성화됩니다. 보안상으로 좋지 않은 것 같은데, 혹시 이런 경우 어떻게 변경이 가능할까요? 오랜만에 mysql을 공부하는데 몇년 전에는 항상 패스워드 입력했던 것 같은데 이번에 새로 깔아보니 패스워드 입력 안해도 실행이 되어 불안합니다. 참고로 저는 맥 환경에서 사용하고 있습니다.
-
미해결처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
db.movies.aggregate() 질문
MongoDB Aggregateion 기본 명령 이해하기1 수업 3분쯤에 db.movies.aggregate([{$match:{year:1995}]) 문법을 그대로 따라 쳤는데, 에러같은건 전혀 나지 않고이 화면이 나옵니다. movies콜렉션에 데이터가 아무것도 안들어있는건가요?? 뭐가 문제인건지 모르겠습니다 ㅠㅠ 이것저것 찾아보니 제가 설치한 movies 컬렉션에는 데이터가 0건인거 같은데 왜 이런건가요? 강의에서 하라는대로 그대로 따라했습니다 ㅠ 몇 번 삭제하고 다시 해봐도 똑같이 데이터가 0건인거같아요
-
미해결처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
아나콘다 설치가 어려운데 아나콘다가 꼭 필요 할까요 ?
강의 내용을 듣는데 아나콘다를 필수로 설치 해야 할까요? 아나콘다 없이 강의를 들을 수 있는 방법도 있을까요?
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
강의 커리큘럼 질문 있습니다.
안녕하세요 저는 선생님이 만들어놓으신 플스택 개발자 로드맵을 따라가고 있는 학생입니다. 지금까지 파이썬 입문과 크롤링 기초, 처음하는 SQL과 데이터베이스 강의 완강했는데요, 이 다음 로드맵이 MongoDB 강의인데, MongoDB 강의를 잠시 뒤로 미루고 그 다음 강의인 가장 빠른 풀스택: 파이썬 백엔드와 웹기술 부트캠프 (flask/플라스크와 백엔드 기본) [풀스택 Part1-1] 를 수강해도 괜찮을까요?? 제가 백엔드 개발자가 되고싶어서 해당 강의를 먼저 빨리 좀 들어보고 싶은 마음이 큰가봅니다 ㅠㅠ 추가적으로 한가지 더 질문이 있습니다.선생님 커리큘럼이 파이썬을 기반으로 진행되는데, 한국 백엔드 시장에 파이썬 기반 백엔드 개발자에게 주어지는 기회가 적더라구요. 파이썬 기반 백엔드 개발자는 대부분 AI쪽이라 석박들과 경쟁해야 하는 이유도 있고, 대부분의 기업에서 JAVA기반 백엔드 개발자를 채용하는게 그 다음 이유인 것 같습니다.그래서 저는 아무래도 기회의 폭이 넓은 java기반 백엔드 개발자가 되고싶은데, 그러려면 선생님 커리큘럼을 어떻게 활용 하는게 가장 좋을지 궁금합니다. 주변에 이쪽 분야인 사람도 없고 인터넷에는 정보가 너무나도 다양한데, 어떤 정보가 진실인지 거짓인지 구별할 힘이 아직 저에겐 없습니다. 선생님께서 꼭 좀 조언을 해주셨으면 좋겠습니다. 감사합니다. 강의 정말 좋은 것 같습니다. 좋은 강의를 찍어주시고 합리적인 가격에 팔아주셔서 감사합니다.
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
강의 자료 이미지가 보이지 않습니다.
섹션2 [데이터베이스와 RDBMS] 수강을 하면서 다운받은 강의 자료를 보려고 열면 다음과 같이 삽입된 이미지가 보이지 않습니다. 어떻게 해결할 수 있을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
EXPLAIN ANALYZE 수행 시 쿼리 실행 계획이 예상과 다릅니다.
먼저 강의 내용이 아닌 책내용을 질문하게 되서 죄송합니다. 하지만 여기 말고 질문할 곳이 마땅치 않아 부득이하게 이곳에 적게 되었습니다. 부디 사정을 봐주시길 부탁드립니다. Real MySQL 1권의 10.2 실행 계획 확인(415pg)에서는 EXPLAIN ANALYZE 실행 시 나타나는 결과에서는 다음과 같은 규칙이 적용된다고 설명되어 있습니다. 들여쓰기가 같은 레벨에서는 상단에 위치한 라인이 먼저 실행들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행 이 말대로라면 아래 그림에서의 실행순서는 F, D, E, C, B, A 가 됩니다. 하지만 책에서는 실행순서가 D, F, E, C, B, A 로 된다고 적혀있습니다. 들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행된다고 하여 F 가 가장 먼저 실행될 줄 알았는데 D 부터 시작된다고 적혀있어서 혼동이 왔습니다. 혹시 왜 D 부터 시작하는지 설명을 부탁드릴 수 있을까요?감사합니다.
-
미해결견고한 결제 시스템 구축
전체적인 헥사고날 아키텍쳐 설명
안녕하세요, 좋은 강의 감사합니다. 제공해 주신 코드를 분석해 보고있는데요,구현한 헥사고날 아키텍쳐에 대한 다이어그램이나 설명이 있으면 이해하기 쉬울것 같은데 혹시 작성하신 게 있으실까요? 예를들어서, 이런 부분의 코드는 어디서 메시지를 가져오는지 intellij 로 검색해봐도 나오질 않아서요.package com.example.paymentservice2.payment.adapter.`in`.stream @Configuration @StreamAdapter class LedgerEventMessageHandler ( private val paymentCompleteUseCase: PaymentCompleteUseCase ) { @Bean fun ledger(): Function<Flux<Message<LedgerEventMessage>>, Mono<Void>> { return Function { flux -> flux.flatMap { message -> paymentCompleteUseCase.completePayment(message.payload) .then(Mono.defer { message.headers.get(KafkaHeaders.ACKNOWLEDGMENT, ReceiverOffset::class.java)!!.commit() }) }.then() } } } 그리고, adapter 내부의 in, out 폴더와 application 내부의 in, out 폴더의 차이점은 뭔가요?? P.S 수준 높은 코드라서 매우 좋습니다. 다른 강의도 이정도 수준이면 수강할 것 같습니다. 타강사님들의 강의는 쉬운것들이 많아서 경쟁력이 있으신것 같아요.
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
혹시 심화 수업은 계획이 없으신가요..?
강의 너무 잘 보았습니다.혹시 힌트 도 주요 튜닝 방법중 하나인데.이쪽은 강의계획이 없으신지 여쭤보고싶습니다.
-
미해결견고한 결제 시스템 구축
주문, 결제 로직에 대해서 질문이 있습니다.
이커머스를 기반으로 가정하고 사용자의 결제가 진행되는 과정을 정리했을 때 다음과 같이 고려해볼 수 있을 것 같습니다. 단일 구매 혹은 장바구니를 통해 결제 페이지로 이동결제 페이지에서 사용자가 필요한 데이터를 작성한 후 결제하기 버튼을 클릭백엔드 서버는 해당 결제 요청으로부터 PSP에게 결제 진행을 요구하기 위해서 요청을 보내고 토큰과 같은 형태로 받아옴토큰을 사용자에게 반환한 후 사용자가 결제를 진행결제가 성공적으로 진행되었을 경우 백엔드 서버는 결제 승인 요청을 PSP로 전송결제 승인 응답이 돌아오면 결제 완료이커머스는 상품의 유효성 검증은 2번과 3번 모두 검증한다고 해도 재고 감소와 같은 로직 및 주문 번호를 생성하는 로직은 어느 시점에 두어야 될 지 고민이 됩니다.재고 수량의 감소를 3번에서 진행하는 것으로 고려하고 있는데 이와 같은 경우 결제 페이지로 사용자가 결제에 필요한 데이터를 입력하고 재고가 부족하다는 입력을 받을 수 있어서 사용자 경험 측면에서 안좋을 수 있다고 생각이 되긴 합니다. 하지만 2번에서 진행할 경우 재고를 결제 페이지로 이동할 때 감소시켜야 하기 때문에 실제로 결제가 이루어지지 않을 수 있는 많은 상황이 있을 수 있기 때문에 이 또한 고려해야 되는 부분이라고 생각합니다. 어떤 시점에 재고를 감소시키는 것이 좋을지 의견을 듣고 싶습니다. 추가적인 질문으로 현재 강의에서 진행하고 있는 결제 이벤트를 DB에 반영하는 시점이 정확히 어떤 시점인지 헷갈립니다. NOT_STARTED 상태로 저장되는 시점이 결제 페이지로 이동하는 시점인지 아니면 결제 구매 버튼을 누른 시점인지 알려주시면 감사하겠습니다!
-
미해결견고한 결제 시스템 구축
주문 번호 생성 방식 관련 질문 있습니다
현재 주문 번호를 생성하는 방식은 결제 페이지로부터 들어오는 데이터들을 이용해서 그것을 String 형태로 변형해줌으로써 모든 요청들이 같은 형태의 String Key값을 가지게 되고 그것을 주문 번호로 사용하는 것으로 이해했습니다!주문 번호의 경우 쿠팡이나 다른 이커머스사들을 확인해보면 숫자 혹은 거기에 문자정도로 생성되어 있고 결제 완료시 주문 번호를 확인해볼 수 있습니다.이와 같은 방식으로 주문 번호를 생성하려면 위와 같은 방식이 아닌 별도의 로직을 통해서 주문 번호를 생성해야되며, 요청이 1번만 처리되기 위해서 Unique한 값으로 생성되어야 됩니다.현재 제가 진행하고 있는 프로젝트에서는 결제 페이지로 사용자가 진입했을 때 주문 번호를 특정 로직을 통해 Unique한 값으로 생성해주고 DB를 확인하고 Redis에 기록하는 절차를 진행하여 멱등성을 보장하고 있습니다. 이와 같이 진행하다 보니 주문 번호를 생성하기 위해서 DB에 쿼리를 1회 이상 날리는 상황이 발생하게 되는데 이와 같이 진행하는 것은 안좋은 형태일까요?