묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
- 
      
        
    해결됨FastAPI 완벽 가이드Optional체크를 어느 부분에서 해주고 하지 않아도 되는지 궁금합니다.(강의 색션 7_8 - 14:30)안녕하세요 선생님.좋은 강의 만들어 공유해 주셔서 진심으로 감사드립니다.Pydantic 모델 초기화 과정에서 아래의 코드처럼 Optional이 설정하지 않으면 Swagger UI에서 입력 값이 null이여서 엔티티 타입 불일치로 422 에러가 발생합니다.또한, parse_user_form에서 Optional 체크를 하고 Item에서는 별도로 설정하지 않으면 같은 에러가 발생하더군요.Q) FormData 부분은 Optional 체크를 하지 않아도 되고, pydantic model에서는 반드시 Optional 체크를 해야지만 문제 없이 정상 동작하는 이유에 대한 보충 설명 부탁드려도 될까요? 주석한 부분이 기존 코드입니다. 주석한 부분으로 코드를 변경하면 에러가 발생합니다.class Item(BaseModel): name: str = Field(..., min_length=2, max_length=50) # description: str = Field(None, max_length=500) description: Optional[str] = Field(None, max_length=500) price: float = Field(..., ge=0) # tax: float = None tax: Optional[float] = None @model_validator(mode='after') def tax_must_be_less_than_price(cls, values): price = values.price tax = values.tax # if tax > price: # tax가 NoneType이라 에러가 남. if tax is not None and tax > price: raise ValueError("Tax must be less then price") return values감사합니다. 
- 
      
        
    해결됨초보자를 위한 BigQuery(SQL) 입문총 정리 문제 풀이 2번 질문 있습니다안녕하세요. 선생님2번 풀이에서 저는 pokemon을 FROM 절에 쓰고, LEFT 함수로 trainer_pokemon을 썼는데요. 선생님과 결과가 다르게 나오더라구요.이 경우에는 "가장 많이 포획된" 기준으로 물었기 때문에 status가 있는 trainer_pokemon을 FROM 절에 써야하는 건가요??SELECT type1, kor_name, COUNT(tp.id) AS pokemon_cnt FROM basic.pokemon AS p LEFT JOIN basic.trainer_pokemon AS tp ON p.id = tp.pokemon_id GROUP BY type1, kor_name ORDER BY pokemon_cnt DESC 
- 
      
        
    미해결데이터 분석 SQL Fundamentalsrollup그러면 group by를 할때 rollup을 사용하게 되면, group by에 해당하는 컬럼들에 우선순위가 매겨지면서 그들의 합을 보는건가요?? group by(1, 2, 3)이라면 1끼리의 합계, 1+2의 합계, 1+3의 합계, 1+2+3의 합계 이런식으로 보는건가요? 
- 
      
        
    미해결FastAPI 완벽 가이드rollback에 대해 질문 드려요현재 "신규 Blog 글 생성하기 - 01" 강의를 수강 중입니다.강의 중에, 쿼리의 commit() 실패시 rollback()이 자동으로 수행된다고 말씀 하셨는데,코드상에 with를 사용한 것도 아니고, context_get_conn()의 에러 발생시 rollback() 호출도 하지 않는데rollback()이 자동으로 수행되는게 맞는가요?close를 하면 자동으로 rollback() 된다고 하시는데close는 성공시에도 호출하는 것으로 코드를 이해하고 있습니다.insert, update의 성공시에도 rollback()이 되는게 맞는지도 알고 싶습니다. 
- 
      
        
    미해결장래쌤과 함께하는 쉽고 재미있는 SQL 이야기json 배열 파싱안녕하세요..! JSON 파싱에 대해선 강의에 안나와서 질문드립니다..! 한 컬럼에 파싱해야될 제이슨이 배열 형태로 여러개 있을 경우 어떻게 추출해야될지 궁금합니다. 컬럼명을 a 라고 예시로 들자면 a = { 과일=[{"이름" : "사과", "가격" : 2,000}], 음식=[{"이름" : "햄버거", "가격" : 7,500}] , 과일=[{"이름" : "사과", "가격" : 2,000}]} 이런식으로 [ { } ] , [ { } ], [ { } ] 이렇게 여러개가 있습니다 ! unnest 활용해서 a 컬럼 내 "과일"에 대한 item들을 cross join 해서 가져오는건 성공했는데 나머지 값들은 어떻게 추출하는지 모르겠어서 다른 방법이 있는지 궁금합니다! 
- 
      
        
    해결됨SQL Server 컨설턴트가 알려주는, 쿼리 능력 레벨업(고급 T-SQL 쿼리)연장 문의의 건안녕하세요 선생님유익한 지식 나눔 강의 감사드립니다.회사 업무와 병행하기에 개인 시간을 효율적으로 쓰지 못하여기간내에 완강이 어려울거같습니다.한두달 정도 연장이 가능하면 부탁드리겠습니다.감사합니다! 
- 
      
        
    해결됨초보자를 위한 BigQuery(SQL) 입문5-3 문제 trainer_pokemon을 LEFT에 두면선생님, 안녕하세요. 강의 잘 듣고 있습니다!다름이 아니라 3번 문제에서 trainer를 LEFT에 두시고 계산하셨는데, 저는 trainer_pokemon을 LEFT에 두고 계산했더니 오류가 뜹니다.SELECT COUNT(DISTINCT tp.trainer_id) AS trainer_cnt FROM basic.trainer_pokemon AS tp LEFT JOIN basic.trainer AS t ON tp.location = t.hometown WHERE tp.location = t.hometown그렇다고, COUNT에 DISTINCT를 없애니결과값이 3003개로 나옵니다. 
- 
      
        
    해결됨[7일완성]생각하는 데이터베이스모델링쿼리 질문드립니다!안녕하세요 선생님."26_학사관리시스템(SQL실습3)"에 있는 쿼리 중에 조인과 서브쿼리 중 대체적으로 어떤 방법이 성능에 더 좋은지 궁금해서 질문드립니다.두 가지 질의에 대해서 3가지 방법으로 조인과 서브쿼리를 섞어보았는데 조언 부탁드립니다.감사합니다. -- 교양엉어 과목을 수강 신청한 학생의 이름-- 1. JOIN 2번select s.student_namefrom student_course scJOIN student s on sc.student_id = s.student_idJOIN course c on sc.course_code = c.course_codewhere c.course_name = '교양 영어';-- 2. JOIN 1번, where 절에 subQuery 1번select s.student_namefrom student_course scJOIN student s on sc.student_id = s.student_idwhere course_code = (select course_codefrom coursewhere course_name = '교양 영어');-- 3. where 절에 subQuery 2번select s.student_namefrom student swhere s.student_id in (select student_id from student_coursewhere course_code = (select course_code from coursewhere course_name = '교양 영어' ));-- 가교수의 과목을 수강신청한 학생수를 출력-- 1. JOIN 2번select count(student_id) as cnt -- count(student_id) as cntfrom student_course scJOIN course c on sc.course_code = c.course_codeJOIN professor p on c.professor_code = p.professor_codewhere p.professor_name = '가교수';-- 2. JOIN 1번, WHERE 절에 subQuery 1번select count(sc.student_id) as cntfrom student_course scwhere course_code in (select c.course_code from course cJOIN professor p on c.professor_code = p.professor_code where p.professor_name = '가교수');-- 3. where 절에 subQuery 2번select count(sc.student_id) as cntfrom student_course scwhere sc.course_code in (select c.course_code from course cwhere professor_code = (select professor_code from professor pwhere professor_name = '가교수')); 
- 
      
        
    미해결데이터 분석 SQL FundamentalsDbeaver에 접속해도 postgressql이 네비게이터에 안보입니다.- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.디비버에 접속을 하면 postgres는 안보이고 샘플 데이터 베이스만 보입니다. 혹시 디비버를 삭제하고 다시 설치해야 하는 걸까요? 
- 
      
        
    미해결MySQL 성능 최적화performance_schema.events_stages_history_long, performance_schema.events_statements_history_long 테이블에 데이터가 쌓이지 않고 있습니다.안녕하세요 우선 좋은 강의 남겨주셔서 감사합니다. 인덱스 다이브 최적화 영상을 보고 따라 해보았는데요. SHOW VARIABLES LIKE 'performance_schema';`performance_schema` 퍼포먼스 스키마 조회를 하게된다면 이렇게 ON 으로 되어 있습니다.UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'stage/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_stages%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_statements%%';퍼포먼스 스키마에 필요한 지표들을 수집 하도록 하고 테이블에 저장 할 수 있도록 해당 쿼리문을 실행 했습니다. 이에 대한 해당 테이블 조회 값 입니다. (performance_schema.setup_instruments 테이블은 너무 많아 생략하고 performance_schema.setup_consumers 만 보여드립니다.) 그리고 해당 orders 테이블을 조회 하고 나서SELECT stages.EVENT_ID, statements.EVENT_ID, statements.END_EVENT_ID, statements.SQL_TEXT, stages.EVENT_NAME, stages.TIMER_WAIT / 100 FROM performance_schema.events_stages_history_long AS stages JOIN performance_schema.events_statements_history_long AS statements ON (stages.EVENT_ID >= statements.EVENT_ID AND stages.EVENT_ID <= statements.END_EVENT_ID) WHERE stages.EVENT_NAME LIKE '%statistics%' AND statements.SQL_TEXT LIKE '%FROM orders%' AND statements.SQL_TEXT NOT LIKE '%SELECT stages.EVENT_ID,%' ORDER BY statements.EVENT_ID DESC; performance_schema 를 통해 성능 비교 했는데요. 아무것도 나오지가 않습니다. 실제로performance_schema.events_stages_history_longperformance_schema.events_statements_history_long이 테이블이 아무것도 쌓이지 않는다는 것을 확인하였습니다. 왜 이런 현상이 나타나는걸까요? 참고로 버전은 MySQL (ver. 9.1.0) 이고 docker 를 이용해 서버를 구동했었습니다. 
- 
      
        
    미해결FastAPI 완벽 가이드Depends()에 사용되는 인자는 어떤 것들이 가능한 것인가요?Path(), Query(), Form() 모두 Depends에 사용이 가능할까요? 물론 BaseModel에는 인자와 동일한 이름의 클래스 변수가 정의되어 있다는 가정에서 의미합니다.form의 일부 인자들만으로 구성되게 사용이 가능할까요?함수의 입력 인자로 정의된 값이, Depends에서도 중복으로 사용이 가능한가요? 
- 
      
        
    해결됨초보자를 위한 BigQuery(SQL) 입문테이블 만들기 오류설명해주신 대로 csv 파일 업로드해서 테이블 만들기를 누르면, 마우스 커서가 빙글빙글 돌기만 하고 아무 반응이 없습니다.해결방안이 있을까요? 
- 
      
        
    미해결FastAPI 완벽 가이드pydactic 5강의 ValidationError의 인스턴스에 대한 질문입니다.ValidationError가 valueerror보다 인스턴스 생성하기가 쉽지 않기 때문에 valueerror를 사용하셨다고 말씀하신 부분이 있는데, 어떤 부분의 어려움이 있는 것인지 좀 더 자세히 알고 싶어 질문을 드립니다. 검색으로 해당 부분에 대한 내용을 찾아 보려 했으나 잘 이해하지 못한 상태인 제가 선정할 수 있는 검색어들 자체가 모호하여 정확한 결과를 얻기가 힘들었습니다. 
- 
      
        
    미해결데이터 분석 SQL Fundamentals제발...오류가 계속 납니다uninstaller로 삭제하고 터미널에서도 2차 확인하고 다시 설치후에 비밀번호를 작성하였는데도 안됩니다.제발 도와주세요,,,, . 
- 
      
        
    미해결데이터 분석 SQL Fundamentals오류가 뜹니다..postgresql설치 후에 연결을 하는데 비밀번호를 맞게 입력했는데도 FATAL: password authentication failed for user "postgres"이런 오류가 뜨는데 어떻게 해야할까요ㅜㅜ맥북 사용중입니다 
- 
      
        
    해결됨실전 jOOQ! Type Safe SQL with Javakotlin jOOQ , 컴파일시 힙메모리 부족안녕하세요비슷한 이유로 queryDSL 에서 불편함을 가지고 있어 jOOQ 에 관심이 생겼습니다.마침 이렇게 좋은 강의 만들어주셔서 정말 감사합니다.다름이 아니라 kotlin 을 주로 사용해서 kotlin 으로 jOOQ 사용시 컴파일 단계에서 힙메모리 부족 현상이 생기는데 혹시 kotlin 으로 힙메모리 부족 현상을 겪으신 적 있으신가요만약 있으시면 해결하신 지혜를 얻고 싶어 글 남깁니다gradle 설정은 아래와 같이 했습니다해결과정 동안 힙메모리 설정 추가하여 늘려봐도 메모리 부족 현상이 발생하네요import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val jooqVersion: String by extra("3.19.5") plugins { kotlin("jvm") version "1.9.25" kotlin("plugin.spring") version "1.9.25" id("org.springframework.boot") version "3.4.0" id("io.spring.dependency-management") version "1.1.6" id("nu.studer.jooq") version "9.0" } group = "com.example" version = "0.0.1-SNAPSHOT" java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-jooq"){ exclude(group = "org.jooq", module = "jooq") } implementation("org.jooq:jooq:$jooqVersion") // jOOQ implementation(project(":jOOQ-custom")) jooqGenerator (project(":jOOQ-custom")) jooqGenerator("org.jooq:jooq:$jooqVersion") jooqGenerator("org.jooq:jooq-meta:$jooqVersion") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } kotlin { compilerOptions { freeCompilerArgs.addAll("-Xjsr305=strict") } } tasks.withType<Test> { useJUnitPlatform() } val dbUser: String = System.getProperty("db-user") ?: "root" val dbPassword: String = System.getProperty("db-password") ?: "passwd" jooq { version.set(jooqVersion) configurations { create("sakilaDB") { generateSchemaSourceOnCompilation.set(true) jooqConfiguration.apply { logging = org.jooq.meta.jaxb.Logging.WARN jdbc.apply { driver = "com.mysql.cj.jdbc.Driver" url = System.getenv("DB_URL") ?: "jdbc:mysql://localhost:3306/sakila" user = dbUser password = dbPassword } generator.apply { name = "org.jooq.codegen.KotlinGenerator" database.apply { name = "org.jooq.meta.mysql.MySQLDatabase" excludes = "sys" } generate.apply { isDaos = true isRecords = true isFluentSetters = true isJavaTimeTypes = true isDeprecated = false } target.apply { directory = "src/generated" } strategy.name = "com.example.jooq.custom.generator.JPrefixGeneratorStrategy" } } } } } sourceSets { main { java { srcDirs("src/main/kotlin", "src/generated") } } } 
- 
      
        
    미해결[7일완성]생각하는 데이터베이스모델링계산 로직을 Java 단이 아닌 쿼리문에서 하신 이유가 궁금합니다.select sum(cp.quantity * p.price) as totalAmount from customer_product cp inner join product p on cp.product_number = p.product_number where cp.customer_id = #{customer_id}장바구니에 들어있는 상품의 개수와 가격을 곱한 금액의 총합을 구하는 로직을 17:50 쯤에 보여주셨습니다.DB에 Connection하는 비용을 고려하면 계산 로직은 Java에서 처리하는 게 더 빠르지 않을까 생각했습니다. 실무에서 많이 사용한다던가, 아니면 더 좋은 방법이라고 생각하셨던 이유가 있었을까요? 
- 
      
        
    미해결데이터 분석 SQL FundamentalsMYSQL로 database 연결해도 되나요?안녕하세요! 기존에 SQL을사용했었어서, MYSQL이 설치되어있는 상태인데 MySQL을 기존 그대로 database로 설정해도 되나요? 
- 
      
        
    해결됨[백문이불여일타] 데이터 분석을 위한 중급 SQLCASE문제풀이 질문해당 쿼리문이 왜 정답이 아닌지 궁금합니다! 
- 
      
        
    해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)인덱스 많은 테이블에서 데이터 많아질 수록 insert 속도 증가-- 테이블 A: 인덱스가 없는 테이블CREATE TABLE test_table_no_index (id INT AUTO_INCREMENT PRIMARY KEY,column1 INT,column2 INT,column3 INT,column4 INT,column5 INT,column6 INT,column7 INT,column8 INT,column9 INT,column10 INT); -- 테이블 B: 인덱스가 많은 테이블CREATE TABLE test_table_many_indexes (id INT AUTO_INCREMENT PRIMARY KEY,column1 INT,column2 INT,column3 INT,column4 INT,column5 INT,column6 INT,column7 INT,column8 INT,column9 INT,column10 INT); -- 각 컬럼에 인덱스를 추가CREATE INDEX idx_column1 ON test_table_many_indexes (column1);CREATE INDEX idx_column2 ON test_table_many_indexes (column2);CREATE INDEX idx_column3 ON test_table_many_indexes (column3);CREATE INDEX idx_column4 ON test_table_many_indexes (column4);CREATE INDEX idx_column5 ON test_table_many_indexes (column5);CREATE INDEX idx_column6 ON test_table_many_indexes (column6);CREATE INDEX idx_column7 ON test_table_many_indexes (column7);CREATE INDEX idx_column8 ON test_table_many_indexes (column8);CREATE INDEX idx_column9 ON test_table_many_indexes (column9);CREATE INDEX idx_column10 ON test_table_many_indexes (column10); -- 높은 재귀(반복) 횟수를 허용하도록 설정-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)SET SESSION cte_max_recursion_depth = 100000; -- 인덱스가 없는 테이블에 데이터 10만개 삽입INSERT INTO test_table_no_index (column1, column2, column3, column4, column5, column6, column7, column8, column9, column10)WITH RECURSIVE cte AS (SELECT 1 AS nUNION ALLSELECT n + 1 FROM cte WHERE n < 100000)SELECTFLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000)FROM cte; -- 인덱스가 많은 테이블에 데이터 10만개 삽입INSERT INTO test_table_many_indexes (column1, column2, column3, column4, column5, column6, column7, column8, column9, column10)WITH RECURSIVE cte AS (SELECT 1 AS nUNION ALLSELECT n + 1 FROM cte WHERE n < 100000)SELECTFLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 1000)FROM cte;를 그대로 사용했는데,index 가 많은 테이블에 데이터가 많아질 수록 insert 시 속도가 느려져야 될 것 같은데 느려지지 않는 것 같습니다. auto commit 모드이고 결과는 1차 : 10만개 삽입시 소요시간 3s2차 : 10만개 삽입시 소요시간 4s3차 : 10만개 삽입시 소요시간 4s4차 : 10만개 삽입시 소요시간 4s5차 : 10만개 삽입시 소요시간 4s6차 : 10만개 삽입시 소요시간 4s입니다. 뭔가 db 환경 문제일까요? db : MariaDBversion: 10.6.15 입니다. 
