묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
논리적 shard 통해 router 가 특정 shard로 라우팅 해줄때 질문 있습니다.
일단 해당 영상 강의에서 article_like 이라는 독립 데이터베이스 기준으로 질문 드리도록 하겠습니다. 여기를 보면 강의 내용에서 각각 테이블 따라 샤드키 기준 컬럼이 다른것을 확인 되었습니다.예를들어서 'article_like' 테이블 경우 샤드키는 article_id 컬럼 으로 이용하고당연히 연관관계 테이블인 'article_like_count' 테이블 경우도 샤드키를 article_id 컬럼으로 하고 있습니다.그런데 outbox 테이블 경우는 'shard_key' 컬럼으로 해주고 있는데요. 여기서 질문은client (애플리케이션) 에서 일단 곧장 해당 특정 샤드 데이터베이스로 보내지 않고 router 를 이용해서 정해진 샤드키 통해 어디 샤드로 전송할지 역활을 할텐데요. router 역활의 개념을 이해가 되었지만 구체적으로 어떻게 구현되어 있는것인지 잘 몰라서 질문 드립니다.각각의 테이블 마다 샤드키에 해당되는 컬럼명이 다 다르기 때문에 이때 router 에서는 각각 어떻게 분기해서 알맞게 특정 샤드키에 해당되는 컬럼명을 추출해 특정 샤드 데이터베이스로 보내는지 궁금합니다. 그냥 무식하게 if else 조건문으로 'outbox' 테이블은 'shard_key' 컬럼값을 추출해 분기 처리하고'article_like' 테이블하고 'article_like_count' 테이블은 'article_id' 컬럼값을 추출해 분기 처리해서 특정 샤드 데이터베이스로 보내는지 궁금 합니다!
-
미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출
12_5 질문3
3번 질문에서 1년 동안 완전히 이용 가능한 listings를 찾기 위해서 SELECT COUNT(DISTINCT id)FROM openairbnb.listings AS lWHERE l.availability_365 = 365;1년 이용가능한 날이 365일인 고유한 id를 추출하는 쿼리를 이용하면 왜 답이 다르게 나온건지 모르겠습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
좋아요 수 설계
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요!10:30초 쯤부터 설명해주시는 내용이 잘 이해가 안가서 질문드립니다.article 테이블에insert 문과 update 문을 동시에 실행한다고 하더라도 서로 다른 레코드에 대한 작업이어서 update문이 실행될 때 x-lock이 걸리는 레코드는 insert하는 레코드와 상관 없을 거라고 생각했는데게시글 쓰기와 좋아요 수 쓰기 작업을 할 때 어떻게 동일한 레코드에 락이 걸릴 수 있는지 상황이 잘 안그려지네요..게시글을 새로 작성하는 경우가 아니라 게시글 수정 - 좋아요 수 업데이트 간에 동일한 레코드에 대한 락이 잡힐 수 있는 상황을 말씀하신 건가요??
-
미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출
12_6강 질문
4번 문제를 혼자 먼저 풀어볼 때,SELECT COUNT(DISTINCT l.id)FROM openairbnb.listings AS lWHERE l.availability_365 = 0;이렇게 풀어서 같은 답이 나왔는데 해답에서는 서브쿼리를 이용하는 이유가 뭔지, 차이점이 있는지 궁금합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
무한 depth 설계에 path enumeration 방식을 선택한 이유?
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 무한 depth는 이전 강의에 소개된 adjency list로도 구현이 가능하고 또 adjacency list, path enumeration 방법 외에도 nested set, closure table 방법도 있는 걸로 알고 있습니다. path enumeration 방법을 선택한 이유가 따로 있을까요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
N번 페이지 M개 조회에서 Left Join에 대한 궁금증
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.페이지네이션에서 N번 페이지 M개의 댓글 조회에서Left Join을 쓰는 이유가 궁금합니다.Article, Comment를 하면서 inner join을 해도 되지 않을까 생각을 했습니다. 당연히 PK이기 때문에 null 이 없어LEFT JOIN이나 INNER JOIN이나 제 생각엔 성능 차이가 없을 거라고 생각은 해서 Query Plan으로 확인해 보니 똑같더라고요.하지만 제가 모르는 부분들이 있어서 그런건 아닐까 생각을 해서 질문드립니다. 조금 찾아보니까 Inner Join은 양쪽 인덱스 활용이 가능해 옵티마이저가 최적의 조인 순서를 선택하고, Left Join은 왼쪽 -> 오른쪽 고정이니까 옵티마이저에게 맡기기 보다는 확실하게 하려는 것 때문인가 하는 생각도 들었습니다. 답변 주시면 감사하겠습니다 ㅎㅎ
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
카프카 설치 오류
카프카 설치 과정에서 뭔가 오류가 발생한거 같은데 해결이 어려워 글 남겨봅니다. 2025-02-05 20:04:47 ===> User2025-02-05 20:04:47 uid=1000(appuser) gid=1000(appuser) groups=1000(appuser)2025-02-05 20:04:47 ===> Setting default values of environment variables if not already set.2025-02-05 20:04:47 CLUSTER_ID not set. Setting it to default value: "5L6g3nShT-eMCtK--X86sw"2025-02-05 20:04:47 ===> Configuring ...2025-02-05 20:04:47 ===> Launching ... 2025-02-05 20:04:47 ===> Using provided cluster id 5L6g3nShT-eMCtK--X86sw ...2025-02-05 20:04:47 # # A fatal error has been detected by the Java Runtime Environment: # # SIGILL (0x4) at pc=0x0000ffff9513fc5c, pid=13, tid=390 # # JRE version: (21.0.4+7) (build ) # Java VM: OpenJDK 64-Bit Server VM (21.0.4+7-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-aarch64) # Problematic frame: # j java.lang.System.registerNatives()V+0 java.base # # No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # # An error report file with more information is saved as: # /tmp/hs_err_pid13.log [0.016s][warning][os] Loading hsdis library failed # # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # 오류 로그는 이렇구요.대강.. 자바 버전? 제 로컬환경과 뭔가 문제가 있는거 같은데.. 맥미니 M4 이구,java -versionopenjdk version "21.0.5" 2024-10-15OpenJDK Runtime Environment Homebrew (build 21.0.5)OpenJDK 64-Bit Server VM Homebrew (build 21.0.5, mixed mode, sharing) 검색해보니 M4에서만 일어나는 문제인거 같기도 하고.. sve 라는 옵션을 꺼보래서docker run -d --name kuke-board-kafka -p 9092:9092 -e FAFKA_JVM_PERFORMANCE_OPTS="-XX:UseSVE=0" apache/kafka:3.8.0 이런식으로 설치 해봤는데 마찬가지네요.뭘 시도해봐야할지 도움 좀 부탁드립니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
강의 완강 후 다시 듣는 중, 배포 도전...?
만들어진 게시판을 간단하게 배포를 하려면 어떤 순서로 하는 것이 좋을까요? 직접 배포를 해보고 데이터의 이동 흐름을 보고 싶어서요. GPT 선생님은 아래와 같이 하라고 하는데, 선생님께서 생각하는 간단한 방법이 있는지 궁금합니더... 🚀 간단한 배포 방법Docker Compose 파일 작성 (docker-compose.yml)애플리케이션 컨테이너화 (Dockerfile)서버(배포 환경)에서 실행1⃣ docker-compose.yml을 작성해서 모든 서비스(MySQL, Redis, Kafka, App)를 한 번에 실행2⃣ Dockerfile을 작성해서 애플리케이션을 컨테이너화3⃣ 서버에서 docker-compose up -d --build 실행으로 배포 완료
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Error: Could not find or load main class ArticleApplication
안녕하세요. 스프링부트 프로젝트 세팅 중 계속해서 같은 예외가 발생해 문의드립니다.해당 예외 발생 관련해 검색해서 Settings, Project Structure의 버전도 확인하였고, 혹시 build.gradle에서 문제가 있는건가 싶어 강사님의 build.gradle 파일을 복사해서 재빌드 해보았지만 계속 같은 예외가 발생하고 있습니다.File > invalidate Caches > Invalidate and restart도 안되네요..어떻게 해야하나요?? ㅜㅜ
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
질문있습니다!!!
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 샤드키가 데이터 분산을 위한 키값으로 활용이 되잖아요.어떤 데이터베이스에 저장이 될 지 를 결정하는 키값으로 활용되는 것으로 알고있는데, 이 샤드키가 논리적으로 다른 테이블과 연관관계를 맺는 역할도 수행한다라고 이해하면 될까요??
-
미해결입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
리액트 연결
안녕하세요! 프론트엔트 초보 개발자입니다.백엔드는 단 한 번도 건드려본적이 없어서 어떤 구조인지도 잘 몰라요 ㅠㅠ아직 정말 지식 수준이 얕습니다.이 강의를 완강한 후에, 리액트로 프론트를 만져보고 싶은데요...이후에 프로젝트에서 프론트, 백 따로 개발 후에 둘이 연결을 하려면 어떻게 해야하나요..?초보자 수준에서 간단히 설명 가능한가요..?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
mysql 연결관련 에러 질문있습니다
application.yml파일을 작성하기 전에는 libraryappapplicition을 실행하면 잘 되었었은데강의를 따라 yml파일을 작성이후 연결이 되지않는다는 에러가 발생하였습니다 driver-class-name에서 driver를 찾을수 없다고 나오는데 이 문제 때문인것 같아요 혹시 버전이나 어떤 문제 때문인지 궁금합니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글 CRUD 구현 오류 질문입니다.
안녕하세요 강의 잘 듣고 있습니다. 게시글 CRUD 부분에서 오류가 발생하는데yml 설정은 강의랑 똑같이 해줬습니다.서버 실행시키면java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]이런 오류가 발생하고 테스트 실행시키면Invalid status line: "ÿ900" at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:575) at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:498) at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.retrieve(DefaultRestClient.java:460) at kuke.board.article.api.ArticleApiTest.create(ArticleApiTest.java:24) at kuke.board.article.api.ArticleApiTest.createTest(ArticleApiTest.java:14) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.net.ProtocolException: Invalid status line: "ÿ900" at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:962) at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133) at org.springframework.http.client.JdkClientHttpRequest.executeInternal(JdkClientHttpRequest.java:102)이런 오류가 발생합니다.구글링 해보고 권한 설정이랑 인코딩 설정도 다 했는데 도저히 안돼서 질문 남깁니다.. 추가)server: port: 9000 spring: application: name: kuke-board-article-service datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/article username: root password: root jpa: database-platform: org.hibernate.dialect.MySQLDialect open-in-view: false show-sql: true hibernate: ddl-auto: noneyml 설정입니다. 추가)artile의 build.gradledependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' implementation project(':common:snowflake') }이 부분은 강의 코드 보면서 그대로 쳤어서 runtimeOnly 'com.mysql:mysql-connector-j'는 원래 있었습니다. 스프링 버전 관련plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' } group = 'kuke' version = '1' allprojects { java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } }강의에 나온 버전 그대로 맞췄습니다. DB관련아이디 root에 비밀번호 root로 하면 접속 잘 되고 DB랑 테이블도 article로 통일했습니다. MySQLDialect -> MySQL8Dialect로 변경해도 안되는데 이유를 모르겠네요!... 추가)이렇게 나오는데 USER는 본명이라 가렸습니다!.. 추가)테스트 실행시키면 발생하는 오류입니다.. package kuke.board.article.api; import kuke.board.article.service.response.ArticleResponse; import lombok.AllArgsConstructor; import lombok.Getter; import org.junit.jupiter.api.Test; import org.springframework.web.client.RestClient; public class ArticleApiTest { RestClient restClient = RestClient.create("http://localhost:9000"); @Test void createTest() { ArticleResponse response = create(new ArticleCreateRequest( "hi", "my content", 1L, 1L )); System.out.println("response = " + response); } ArticleResponse create(ArticleCreateRequest request) { return restClient.post() .uri("/v1/articles") .body(request) .retrieve() .body(ArticleResponse.class); } @Getter @AllArgsConstructor static class ArticleCreateRequest { private String title; private String content; private Long writerId; private Long boardId; } @Getter @AllArgsConstructor static class ArticleUpdateRequest { private String title; private String content; } }코드는 강의랑 똑같은데 왜그럴까요..
-
해결됨Real MySQL 시즌 1 - Part 1
ORDER BY가 필요한 이유
데이터 개수 기반 방식 (동등 조건 사용시) 에서 이미 인덱스를 설정 했기 때문에KEY ix_userid_id (user_id, id)따로 후에 ORDER BY id를 해주지 않아도 정렬이 되어 있을 것이라고 예상되는데 작성해 줘야 하는 이유가 무엇일까요
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
mysql 설치가 되지 않습니다.
아래와 같은 에러로 mysql의 설치가 되지 않습니다. 분명, 제어판에서 mysql을 모두 삭제하고 다시 재설치를 진행하였는데도 불구하고, 계속해서 에러가 발생하여 강의 진행이 어렵습니다. Beginning configuration step: Writing configuration file Saving my.ini configuration file... Saved my.ini configuration file. Ended configuration step: Writing configuration file Beginning configuration step: Updating Windows Firewall rules Adding a Windows Firewall rule for MySQL92T on port 3306. Attempting to add a Windows Firewall rule with command: netsh.exe advfirewall firewall add rule name="Port 3306" protocol=TCP localport=3306 dir=in action=allow 확인됨 Successfully added the Windows Firewall rule. Adding a Windows Firewall rule for MySQL92T on port 33060. Attempting to add a Windows Firewall rule with command: netsh.exe advfirewall firewall add rule name="Port 33060" protocol=TCP localport=33060 dir=in action=allow 확인됨 Successfully added the Windows Firewall rule. Ended configuration step: Updating Windows Firewall rules Beginning configuration step: Adjusting Windows service Attempting to grant the required filesystem permissions to the 'NT AUTHORITY\NetworkService' account. Granted permissions to the data directory. Granted permissions to the install directory. Adding new service New service added Ended configuration step: Adjusting Windows service Beginning configuration step: Initializing database (may take a long time) Attempting to run MySQL Server with --initialize-insecure option... Starting process for MySQL Server 9.2.0... Failed to start process for MySQL Server 9.2.0. Database initialization failed. Ended configuration step: Initializing database (may take a long time)
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
article_id에 대해서
comment기능에서 comment테이블에 article_id을 shard key로 사용한다고 하셨는데 comment기능은 article기능에 뎃글을 다는 기능으로 article테이블에 article_id와 연관관계를 맺는 컬럼이 아닌건가요? 만약맞다면 article테이블에 article_id를 comment테이블에 article_id에 저장되게끔 해야 할 듯 한거 같은데 1고정값으로 넣는게 이해가 안되서 질문드렸습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
안녕하세요!! 질문있습니다!!
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Comment 엔티티 생성시 연관관계를 Long articleId로 해줌으로써 Article 엔티티와 연관관계를 맺어준것일까요?Article과 Comment는 1:N 관계로 보이는데, comment 테이블 설계 당시 Article에 대한 외래키 관리를 comment 테이블에서 안해준 이유도 궁금합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글목록 최적화 전략설계 질문
조회용 게시글 목록 캐시가 미리 있는 상태에서 게시글이 수정이 된다면 게시글 조회 서비스에서 구독을 통해서 캐시 수정이 이뤄져야 하는걸까요?강의에서는 작성/삭제 두가지만 말해주시는거 같아서 수정인경우도 알고싶습니다~
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Snowflake 강의 질문입니다.
1. intelliJ java file outside of source root 에러가 뜹니다Snowflake 강의를 듣다가 질문이 생겨서 질문올립니다.강의자료에 있는 Snowflake 자료를 복사 붙여넣기 하다가 intelliJ java file outside of source root 에러가 뜹니다. 아래와 같이 시도를 해보았습니다.https://stackoverflow.com/questions/63521181/java-file-outside-of-source-root-intellij 이싸이트에 나와있는IntelliJ의 오른쪽 도구 모음에서 "gradle"을 클릭한 다음 새로 고침 버튼을 클릭합니다.File > Project Structure > Modules > Sources그리고 Java 파일 디렉토리를 소스로 표시를 변경하라고 나옴. 이 방법 시도 하지만common->src로 변경했더니 IntelliJ IDEA에서 동일한 resources 디렉터리가 두 개의 모듈에서 중복으로 설정되어 있을 때 발생하는 문제가 생겨 적용 불가능현재 프로젝트 close하고 다시 open함.java버전과 스프링부트 버전 확인 build.gradle에서 버전 확인위와 같이 해결방법을 모색해봤는데 해결방법을 모르겠습니다. 프로젝트 파일 첨부합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
무한 스크롤 질문있습니다
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.갑자기 페이징 쿼리 설명하다가 다음 강의에서 무한 스크롤에 대한 설명을 하시는데요. 1.이는 분산환경에서의 페이징 쿼리시의 단점을 보완하기 위한 방법으로 무한 스크롤을 설명하시는건가요??2.아니면 단순 무한 스크롤의 장점에 대해서 설명하시는건가요??3.아니면 분산 환경에서의 페이징 쿼리의 단점으로 인해 분산 환경에서는 무한 스크롤 방식을 선호한다는 것일까요??저는 SpringDataJPA를 사용하여 페이징과 Slice를 구현해본적이 있는데 해당 기능이라던가 QueryDSL과 같은 기능을 사용하지 않고 네이티브 쿼리를 사용하는 이유는 무엇일까요??