묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Real MySQL 시즌 1 - Part 1
Mysql table avg_row_length
TEXT, LONGTEXT 타입 칼럼이 존재하는 테이블의 경우에 informatino_schema.TABLES에 존재하는 avg_row_length의 값은 LOB 칼럼들의 평균바이트 수도 같이 계산이 되는걸까요?
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
MariaDB 사용 시 EXPLAIN ANALYZE 이용 불가 문의
MariaDB 사용하고 있고 버전은 아래와 같은데 회사 DB로 버전 변경은 불가능한 상태입니다. 버전 : 10.4.12-6-MariaDB-enterprise-log EXPLAIN ANALYZE 사용 시 에러가 발생하여 구글링 해보니 MariaDB 에서는 사용이 불가능한 것 같더라고요.Mysql 에서 EXPLAIN ANALYZE 로 조회되는 내용을 동일하거나 유사하게 볼 수 있는 방법이 없을까요?
-
미해결Real MySQL 시즌 1 - Part 2
질문드립니다.
안녕하세요. 1,2 강의 전부 잘봤습니다!! 많은 도움 되었습니다.근데 강의에 대한 질문은 아닌데 도저히 여쭤볼 사람이 딱히 없어서요..현재 백엔드 취준생인데 프로젝트에 mysql 레플리카를 도입해서 master / slave1,2 아키텍처를 구성 하였습니다.--master[mysqld]log_bin = mysql-binserver_id = 10binlog_do_db = reservationdefault_authentication_plugin = mysql_native_password-- slave[mysqld]log_bin = mysql-binserver_id = 11relay_log = /var/lib/mysql/mysql-relay-binlog_slave_updates = ONread_only = ONdefault_authentication_plugin = mysql_native_password master와 slave에 맞게 설정을 해주고 master의 LOG_FILE, LOG_POS를 토대로 각각의 슬레이브에 설정하여Slave_IO_Running, Slave_SQL_Running slave1,2 각각 YES 인걸 확인하고 데이터 복제 및 인덱스 복제 까지 잘 동작하는것 까지 확인하였습니다. 그래서 백엔드 로직에서 ReadOnly 쿼리 비지니스로직은 SLAVE1,2의 dataSource가 할당 되어서 동작 하도록 구성하였고 실제로 테스트 해봤는데 master가 아닌 SLAVE1,2에서만 읽는것을 확인 하였습니다. 근데 여기서 문제인게 읽기작업에 대해서만 부하를 줘서 성능테스트를 진행하였는데 실제로 레플리카를 도입하기 이전 1대의 mysql 서버만 존재했을때가 성능이 20~30% 가 더좋게 나옵니다.저는 실제로 이미 쓰기작업을 끝낸 데이터에 대해 읽기 작업을 slave1,2가 트래픽을 분산(라운드 로빈 방식으로 정확히 50프로 확률로 분산) 하여 처리하니까 성능이 올라갈것으로 기대했는데 왜그런지 도저히 모르겠습니다.추가로 쓰기작업(JPA 긍정적 락), 읽기작업을 동시에 요청하는 부하테스트도 진행 했는데 물론 이 경우도 쓰기는 master만 진행하고 읽기작업은 나머지 slave1,2에서만 진행하는걸 확인했지만 성능 결과 1대의 mysql서버가 읽기,쓰기를 다 처리하는것이 성능이 더 좋았습니다. 그래서 제가 내린 결론은 만약 제가 한 테스트 방법이 잘못되지 않았다고 가정할 경우SLAVE 아키텍처를 가져 갈 경우 성능 향상보다는 부하를 분산시켜 최대 허용 TPS 향상 및 아키텍쳐의 안정성을더 해주는게 의미가 있다고 생각되고,만약에 SLAVE1,2를 두었는데 무조건 읽기작업의 성능향상이 이뤄져야 한다고 말씀 하시면 어떤 부분에서제가 무엇을 잘못 설정한걸 수 도있는지 아니면 어떤 이유가 존재할 수도 있는지 해결가능성이 있는 키워드정도 알려주시면 정말 감사하겠습니다. 추가로 상황에 따라 다르겠지만, 마스터 슬레이브 간의 동기화 문제를 해결하는 가장 보편적이고 추천 해주실만한 방법(제가 생각한 방법은 쓰기작업 직후의 읽기작업은 슬레이브가 아닌 마스터에서 하는 방식)이 있는지 알려주시면 정말 감사하겠습니다! 긴글 읽어주셔서 감사합니다.
-
해결됨Real MySQL 시즌 1 - Part 2
Real MySQL 시즌1 part 2 에피소드 16의 인덱스가 null인 컬럼을 포함한다는 것에 대한 질문
인덱스가 null인 컬럼을 포함하고 있고대상컬럼이 nullable column인지 not null column인지상관없이 어떤 인덱스를 읽어도 테이블의 정확한 레코드 수를 가져올 수 있다는게 무슨 뜻인지 이해가 잘안가서 질문 드립니다. 1. 인덱스가 null인 컬럼을 포함하고 있다는것은,인덱스가 존재하지 않는 컬럼을 의미하는 건가요 아니면 nullable 컬럼에 생성한 인덱스를 의미하는 건가요?2.nullable column이 존재하더라도 not null column에서 레코드를 읽는 덕분에 라는 건가요?
-
해결됨Real MySQL 시즌 1 - Part 1
12강 FULL GROUP BY
안녕하세요.8:01에서 FULL GROUP BY 형태에 대해 설명해 주시고 있습니다. 그 중 오른쪽의 FULL GROUP BY의 쿼리에 질문이 있습니다. GROUP BY로 fd1을 명시했으니 적절한 쿼리는SELECT fd1, SUM(fd1), COUNT(*) FROM tab GROUP BY fd1이 되어야 하지 않을까요?*변경 부분: SUM(fd2) -> SUM(fd1)
-
해결됨Real MySQL 시즌 1 - Part 1
ep11) Prepared Statement에서 질문
안녕하세요 강사님Client Side PreparedStatement 는 어떻게 SQL Injection을 막을 수 있다는게? 에 set하기전에 application에서 체크해서 막는다는의미인가요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
로컬에서 docker compose 명령어 실행 시
로컬에서 docker compose up --build -d 명령어 실행 시 아래와 같은 에러가 발생합니다.Cannot connect to the Docker daemon at unix:///Users/milaju/.docker/run/docker.sock. Is the docker daemon running?따로 설정을 해줘야 하는 부분이 있을까요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
EC2 서버 실행시키기 관련하여
# 스프링 프로젝트 경로로 들어가서 아래 명령어 실행$ ./gradlew clean build -x test $ cd build/libs$ java -jar -Dspring.profiles.active=prod {빌드된 jar 파일명}서버 실행시키기 명령어 단계에서 $ java -jar -Dspring.profiles.active=prod {빌드된 jar 파일명} 실행 시 ec2 터미널 창에서 아래와 같은 에러가 발생하게 됩니다. 현재 jar 파일은 그림과 같이 생성되었고 명령어는 java -jar -Dspring.profiles.activate=prod demo-0.0.1-SNAPSHOT.jar 이렇게 진행하였습니다.Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-10-03T16:57:37.160Z WARN 5523 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-10-03T16:57:37.166Z INFO 5523 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]2024-10-03T16:57:37.213Z INFO 5523 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-10-03T16:57:37.243Z ERROR 5523 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1806) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.13.jar!/:6.1.13] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.13.jar!/:6.1.13] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.4.jar!/:3.3.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.4.jar!/:3.3.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.4.jar!/:3.3.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.4.jar!/:3.3.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.4.jar!/:3.3.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.4.jar!/:3.3.4] at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[!/:0.0.1-SNAPSHOT] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102) ~[demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.13.jar!/:6.1.13] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.13.jar!/:6.1.13] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.13.jar!/:6.1.13] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.13.jar!/:6.1.13] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) ~[spring-beans-6.1.13.jar!/:6.1.13] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.1.13.jar!/:6.1.13] ... 22 common frames omittedCaused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:153) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:364) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
캐싱 객체 직렬화/역직렬화
안녕하세요! 강의를 수강하고 제 프로젝트에서 캐싱을 적용하고 싶어서 따라 적용해보고 있습니다. package com.ecommerceproduct.api.controller.product.dto.response; import com.ecommerceproduct.domain.product.repository.dao.ProductDetailDao; import com.ecommerceproduct.domain.product.type.OptionType; import com.ecommerceproduct.domain.product.type.ProductCategory; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import lombok.Builder; @Builder public record ProductDetailResponse( Long id, String name, StoreInfo store, int quantity, ProductCategory category, String thumbnailImgUrl, int basePrice, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) LocalDateTime createdDateTime, List<ProductOptionInfo> options ) { public static ProductDetailResponse from(List<ProductDetailDao> daos){ List<ProductOptionInfo> options = new ArrayList<>(); daos.forEach(dao -> options.add(ProductOptionInfo.from(dao.option()))); ProductDetailDao dao = daos.get(0); return ProductDetailResponse.builder() .id(dao.id()) .name(dao.name()) .store(StoreInfo.from(dao.store())) .quantity(dao.quantity()) .category(dao.category()) .thumbnailImgUrl(dao.thumbnailImgUrl()) .basePrice(dao.basePrice()) .createdDateTime(dao.createdDateTime()) .options(options) .build(); } public record StoreInfo( Long storeId, String name ) { public static StoreInfo from(ProductDetailDao.StoreInfo daoStore){ return new StoreInfo(daoStore.storeId(), daoStore.name()); } } public record ProductOptionInfo( Long optionId, String name, int count, int price, OptionType optionType ){ public static ProductOptionInfo from(ProductDetailDao.ProductOptionInfo option){ return new ProductOptionInfo( option.optionId(), option.name(), option.count(), option.price(), option.optionType() ); } } } 해당 클래스를 반환하는 메서드에 @Cacheable을 적용하려고 합니다.@Cacheable(cacheNames = "getProduct", key = "'product:productId:' + #productId", cacheManager = "매니저이름") public ProductDetailResponse get(Long productId) { return ProductDetailResponse.from(productRepository.findWithOptions(productId)); }강의에서 알려주신 매니저와 동일하게 매니저를 bean으로 등록해서 사용해본결과직렬화/역질렬화가 안되는것으로 보입니다. 매니저에 설정을 serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer( new Jackson2JsonRedisSerializer<>(objectMapper, ProductDetailResponse.class)))처럼 명시적으로 타입을 지정해주면 문제가 없는 것 같은데 record여서 안되는 걸까 싶어서 class로 바꾸어도 되지는 않더라고요! 강의에서의 Board 클래스는 문제없이 직렬화/역직렬화가 되는데 제가만든 dto가 안되는 이유는 강의의 Board가 @Entity클래스여서 인걸까요??그렇다면 dto로 쓰려면 매니저를 각각의 dto마다 매니저를 하나씩 만들어주어야할까요?
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
SQL 튜닝에 대한 사례나 Best Practice 등을 모은 자료를 알려주실 수 있나요?
안녕하세요 선생님강의 잘 듣고 실무에서 배운 대로 인덱스를 좀 더 적극적으로 사용하려고 하는데, 평소에 깊은 고민하지 않다가 이제 해보려고 하니까 많이 고통스러운 시기를 지나고 있는 것 같습니다. 혹시 선생님께서 튜닝과 관련하여 도움을 받았거나, 혹은 추천할 만한 자료, 저서, 사이트 등이 있으시면 추천해주실 수 있으실까요? 좀 더 다양한 사례를 보면서 인덱스에 익숙해지고 싶습니다. 감사합니다.
-
해결됨Real MySQL 시즌 1 - Part 1
7)select for update 강의에서 질문
안녕하세요 강사님 gpt o1에게 물어보다가 질문이 생겼습니다.read committed 상태일 때 select for update를 쓰면 해당 statement가 끝나면 lock이 풀린다는데 이는 잘못된거지요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
@Cacheable key 속성에서 page, size 파라미터값 null
BoardService.class@Cacheable( cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager" ) public List<Board> getBoards(int page, int size) { log.info("page={},size={}", page, size); Pageable pageable = PageRequest.of(page - 1, size); Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable); return pageOfBoards.getContent(); }BoardController.class@GetMapping public List<Board> getBoards( @RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "size", defaultValue = "10") int size ) { log.info("page={}, size={}", page, size); return boardService.getBoards(page, size); }#page, #size 값에 모두 null이 저장되는 것 같습니다.위 코드에서처럼 BoardService.getBoards(), BoardController.getBoards() 두 메서드 전부 page, size 값을 로그로 출력해보니 각각 1, 10으로 여기서는 정상적으로 나오는데, 어디서 문제가 있는지 모르겠습니다.구글링을 해도 마땅한 답을 구할 수 없어서 질문 남깁니다!
-
해결됨Real MySQL 시즌 1 - Part 1
12강. LEFT JOIN 사용 방법 준수 5:42
안녕하세요 강의 잘 듣고 있습니다.강의 내용 중 오른쪽 쿼리에서 LEFT JOIN이 불필요하게 들어가서 쿼리들에서 LEFT JOIN을 제거하는게 쿼리 성능에 도움이 된다고 하셨는데요.LEFT JOIN 대신 INNER JOIN을 사용하는 것으로 이해하는게 맞을까요? 제거하라하면 JOIN 자체를 제거하라는 의미인지 헷갈려서 질문 남기게 되었습니다. 감사합니다.
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
도커 컴포즈
현재 개인 프로젝트에 EC2에 도커 컴포즈로 프론트, 백엔드, db까지 실행되도록 아키텍처를 구성 했습니다.그런데 말씀하신 것처럼 RDS, elastiCache 를 분리시켜서 아키텍처를 구성 해야 할 필요성이 있을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
6강. Top N 데이터 조회와 관련해 질문있습니다.
안녕하세요. 강의 마지막에 카테고리별 조회수가 가장 높은 3개 기사를 추출 하는 쿼리 소개해 주셨는데요. 관련해서 질문 있습니다. Q1) 만약 categories 테이블에 id가 1,2,3인 데이터가 있다면 SELECT FROM WHERE category_id = 1 ORDER BY LIMIT 3SELECT FROM WHERE category_id = 2 ORDER BY LIMIT 3SELECT FROM WHERE category_id = 3 ORDER BY LIMIT 3이렇게 3번의 서브쿼리가 실행되고 각 결과를 전부 Union해서 최종 결과를 반환하게 되는건가요?Q2) LIMIT 3을 제거했을 때 내림차순 정렬이 안된 상태로 데이터가 반환되는데요. 그 이유가 뭔지 알 수 있을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
5강에서 사례로 언급하신 DETERMINISTIC 예제에 대해 질문있습니다.
5강 2분50초쯤에 '사용자의 수를 가져오는 함수'를 예시로 설명해 주셨는데요.- 이 Stored Function이 실행되는 순간에도 사용자의 가입은 계속된다.- 그로 인해 이 Stored Function은 호출할 때마다 결과값이 달라질 수도 있다.- 하지만 이러한 사용자 테이블의 레코드가 달라지는 것도 입력이 달라지는 것이라고 생각하기 때문에 MySQL서버에서 SELECT를 포함해서 하나의 Statement는 반드시 시작 시점의 스냅샷을 보도록 구현되어 있다.- 그래서 MySQL서버에서 실행되는 쿼리 문장 하나는 동일한 데이터 상태를 보게 된다.- 따라서 하나의 문장 내에서는 Stored Function이 여러번 호출되더라도 테이블의 데이터는 해당 시점의 스냅샷을 보기 때문에 함수의 인자만 동일하다면 입력이 달라지지 않는 것으로 본다.Q) DETERMINISTIC으로 정의된 함수에 대해서 스냅샷을 바라보도록 설정돼 있고, 이로 인해 함수가 참조하는 데이터(인자)가 변경돼도 그 외 나머지 입력값이 동일하다면 동일한 결과값을 반환하게 된다는 내용이 맞을까요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
vCPU 할당량 증가
안녕하세요 강의 잘 듣고 있습니다!You have requested more vCPU capacity than your current vCPU limit of 1 allows for the instance bucket that the specified instance type belongs to. Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit. <EC2, RDS, Spring Boot, Redis 셋팅>강의 중t3s.small 로 인스턴스를 설정하려 하는데 위와 같이 문구가 나오면서 '인스턴스 시작 실패'가 떴습니다.할당량 증가 요청을 보내기 위해 ' 새 할당량 값'을 넣어야 되는데 얼마를 넣어야 되는지 알 수 있을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
deternmistic 질문
안녕하세요deterministic 관련해서 궁금증이 있어 질문드립니다. 그럼 mysql stroed function을 생성할때 무조건 deterministic 으로 생성을 해야하는지요??예를들면, 함수 내에는 파라미터값을 받아서 select 결과값을 도출하는 가령, id값등등 있다고 가정하겠습니다. 그럼 select * from test where 함수('value') 등으로 넣어서 값을 도출받아 where 조건에 걸수있다고 가정해보면non deterministic 일 경우 fullscan을 탈거같은데요. 결론적으로 , 모든 함수를 전부 deterministic 으로 명시를 해줄경우 단점이 무엇인가요?? 감사합니다.
-
미해결Real MySQL 시즌 1 - Part 1
1강 CHAR타입에 대해 질문드립니다
안녕하세요. 우선 이렇게 좋은 강의 해주셔서 감사합니다. 강의를 듣다가 궁금한 부분이 있어 질문드립니다.Q1) 10:00분 경에 "CHAR여도 utf8mb4같은 가변길이 캐릭터 셋을 사용하면 때로는 예약된 빈 공간이 없을 수 있다"라고 말씀해 주셨는데요. 제가 강의를 듣고 이해하기로는 '1~4byte값을 가질 수 있다는 가변길이 캐릭터 셋' 성질 때문이 아니라 '문자 하나당 크기가 1byte를 초과했기 때문에' 예약된 빈 공간이 없어지는 걸로 생각했습니다. 즉, 가변길이 캐릭터 셋인 utf8mb4가 아닌 하나당 크기가 3byte인 어떤 고정길이 캐릭터 셋을 이용하더라도 동일하게 예약된 빈 공간이 없을꺼 같은데 혹시 제가 이해한게 맞을까요?Q2) 마지막 내용 정리하시는 부분에서 "인덱스된 컬럼이라면 CHAR가 효율적일 가능성이 더 높다"고 말씀해 주셨는데 어떤 이유로 인덱스된 컬럼에 CHAR가 더 좋을 가능성이 높은건지 알려주실 수 있으실까요?
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Cacheable key값 설정에서 null
@Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager") public List<Board> getBoards(int page, int size) { Pageable pageable = PageRequest.of(page - 1, size); Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable); return pageOfBoards.getContent(); } }여기서 key = "'boards:page:' + #page + ':size:' + #size"레디스에 저장되는 키값은 "getBoards::boards:page:null:size:null" 이렇게 저장이 됩니다. 혹시 null이 들어가는 이유가 있을까요? page와 size의 데이터도 잘 넘어오고 레디스에서 저 키값으로 조회를 하면 안에 데이터는 잘 들어가 있습니다. #page와 #size가 null인 이유가 있을까요?