묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
redis 적용을 위한 service 반환값
안녕하세요. redis 강의를 통해 간단한 프로젝트로 적용을 하려고 합니다. @Cacheable( value = "reviewList", key = "'review:store:' + #storeId + ':page:' + #pageable.pageNumber", cacheManager = "reviewCacheManager", condition = "#pageable.pageNumber == 0") @Transactional(readOnly = true) public Page<ResViewReviewDto> getReviews(UUID storeId, ReviewRepositorySearchConditionDto condition, Pageable pageable) { Page<ResViewReviewDto> reviews = reviewRepository.findReviews(storeId, condition, pageable); return new PageImpl<>(reviews.getContent(), pageable, reviews.getTotalElements()); }원래는 return reviews를 했더니 계속 조회를 누르면 ClassCastException: LinkedHashMap cannot be cast to Page 이 오류가 나오게 됩니다. 강의에서는 그냥 getContent를 List로 반환값을 보냈는데 혹시 위 코드처럼 new PageImpl 형식으로 return 해도 괜찮을까요?
-
미해결개발자라면 알아야 할 redis 기본
실무에서의 복잡한 쿼리 결과 캐싱 전략(크기, TTL 등) 관련 질문
강사님, 캐싱 관련해서 실무적인 관점의 질문이 있습니다.강의에서 String 타입의 value에 JSON 형식으로 데이터를 저장해서 캐싱 처리를 한다고 배웠는데, 실무에서 어느 범위까지 캐싱하는 게 적절한지 감을 잡고 싶습니다. 과거에 MyBatis의 동적 쿼리처럼 조건부 로직이 포함된 200줄짜리 복잡한 쿼리가 DB에서 파싱되는 시간 자체만으로도 성능 부하를 유발했던 경험이 있습니다.쿼리 자체를 수정하는 것이 베스트겠지만, 현실적으로 어려울 때가 있었습니다. 이런 '고치기 힘든 악성 쿼리'의 실행 자체를 회피하는 목적으로 Redis 캐싱을 적극적으로 사용하는 전략에 대해 궁금합니다. 실무에서는 이런 경우:1. 쿼리 결과 데이터가 어느 정도 크기(예: 수십 MB)까지 Redis에 캐싱을 허용하시나요?데이터가 너무 크면 오히려 Redis에 부담이 될 것 같아서요. 2. 만약 결과가 너무 크다면, 페이징 처리된 일부만 캐싱하시나요?아니면 보고서처럼 핵심 요약 데이터만 따로 캐싱하는 전략을 사용하시나요? 3. 특히 이런 복잡한 집계/통계 쿼리는 데이터 변경이 잦지 않은데,이런 경우 TTL은 보통 어느 정도로 설정하시는지 강사님의 경험이 궁금합니다.
-
해결됨개발자라면 알아야 할 redis 기본
레디스 서버 구성
안녕하세요 강사님 수업 잘 듣고 있습니다.강의 범위에서 조금 벗어난 것 같긴 하지만.. 레디스 서버 구성에 대해 궁금한 점이 있어서 질문 드립니다.강의에서는 여러 대의 웹서버에서 레디스 서버 한 대로 요청을 보내는 구성에 대해서 설명하시는데, 레디스 서버는 이중화/다중화를 고려하지 않는 건지 궁금해서요.웹서버가 수십 대로 구성되어 있더라도 레디스 서버는 보통 한 대로 운영하는 것인지 궁금합니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
redis 사용으로 인한 비용
안녕하세요. redis에 대해 궁금한점이 있어서 문의드립니다! redis는 고객사에서 사용 허락을 받지 않는 한 사용하면 안 되나요?추가로 비용이 들까요? 선배님이 비용이 든다고 하더라고요 저는중복 로그인이나 조회수 관련해서 사용을 해보려고 했었는데요.그냥 기존 방식대로 사용하라고 하시더라고요. 이런 고민 없이 개발을 해오다보니 문득 궁금해서 여쭤봤습니다!
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Redis를 적용했음에도 불구하고 조회 성능의 큰 차이가 없고 오히려 더 안좋은 조회속도를 보이는 것 같습니다.
간단한 영화 목록 조회입니다. 총 약 10000개의 데이터가 있습니다. redis를 적용하고 조회성능이 좋아진것은 맞지만 이상하게 redis를 적용하기 전에도 같은 조회를 계속해도 조회속도가 똑같이 빨라지는 현상을 겪고있습니다. 현재 이 movie는 MSA 의 여러 서비스 중 하나입니다. 혹시 MSA 아키텍쳐 자체가 문제가 될 수도 있나요?@Cacheable(cacheNames = "getMovies", key = "'movie:all'", cacheManager = "movieCacheManager") public List<Movie> getAllMovies() { return movieRepository.findAll(); } @GetMapping("/movies") public ResponseEntity<List<MovieDto>> getAllMovies() { List<Movie> allMovies = movieService.getAllMovies(); List<MovieDto> dtos = new ArrayList<>(); for (Movie movie : allMovies) { dtos.add(new ModelMapper().map(movie, MovieDto.class)); } return ResponseEntity.status(HttpStatus.OK).body(dtos); } @Configuration @EnableCaching // Spring Boot의 캐싱 설정을 활성화 public class RedisCacheConfig { @Bean public CacheManager movieCacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration .defaultCacheConfig() // Redis에 Key를 저장할 때 String으로 직렬화(변환)해서 저장 .serializeKeysWith( RedisSerializationContext.SerializationPair.fromSerializer( new StringRedisSerializer())) // Redis에 Value를 저장할 때 Json으로 직렬화(변환)해서 저장 .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( new GenericJackson2JsonRedisSerializer() ) ) // 데이터의 만료기간(TTL) 설정(1분) .entryTtl(Duration.ofMinutes(1L)); return RedisCacheManager .RedisCacheManagerBuilder .fromConnectionFactory(redisConnectionFactory) .cacheDefaults(redisCacheConfiguration) .build(); } } @Configuration public class RedisConfig { @Value("${spring.data.redis.host}") private String host; @Value("${spring.data.redis.port}") private int port; @Bean public LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port)); } }
-
미해결개발자라면 알아야 할 redis 기본
레디스에 저장하는 토큰 질문입니다.
안녕하세요.토큰 관련해서 레디스에 저장하는 게 리프레시 토큰이라고 하셨는데요. 액세스 토큰을 저장 안 하는 건지 궁금합니다.리프레시 토큰은 액세스 토큰이 만료될 떄 필요하니까 상대적으로 사용 빈도가 낮고 매 요청 시에는 액세스 토큰이 쓰이는 걸로 알고 있어서요. 그렇다면 수시로 검증해야 하는 토큰은 액세스 토큰이 아닐까 해서요.감사합니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Elastic Cache 에러
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.5.3.jar:3.5.3] Caused by: org.springframework.data.redis.listener.adapter.RedisListenerExecutionFailedException: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:383) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.listener.RedisMessageListenerContainer.start(RedisMessageListenerContainer.java:361) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:405) ~[spring-context-6.2.8.jar:6.2.8] ... 19 common frames omitted Caused by: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1858) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1789) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceC Redis 에러 (백엔드 에러는 이렇게 뜨고) 프론트 엔드 (로그인 하고 들어가는 거 잘됩니다. 채팅만 치면 저렇게 뜹니다.)EC2에서 redis 접속은 잘 됩니다.프론트는 S3+cloudfront (도메인 적용 안함)백엔드는 Redis(Elastic) + EC2+RDS +nginx 로 배포했고 몇시간 쨰 하는데 저 에러가 뜹니다.혹시 프론트 배포가 잘 못 된건가요? 강사님 도와주세여ㅠㅠㅠ
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Elastic
Caused by: org.springframework.data.redis.listener.adapter.RedisListenerExecutionFailedException: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:383) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.listener.RedisMessageListenerContainer.start(RedisMessageListenerContainer.java:361) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:405) ~[spring-context-6.2.8.jar:6.2.8] ... 19 common frames omitted Caused by: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1858) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1789) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1586) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.lambda$getConnection$0(LettuceConnectionFactory.java:1566) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.doInLock(LettuceConnectionFactory.java:1527) ~[spring-data-redis-3.5.1.jar:3.5.1] 위에꺼는 백엔드 서버 에러이고 밑에는 프론트엔드 서버 에러입니다. 안녕하세요 강사님 채팅 서버와 프론트를 배포를 해서 Elastic Cache를 이용을 하고 있는데 EC2 랑 연결이 잘 되어 있으면서도 이런 에러가 뜹니다. 아무리 찾아봐도 더 해결사항이 보이지 않아 질문드립니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
AWS 리소스 삭제에 관하여
강의에서 사용한 리소스를 모두 삭제를 했습니다. 그러나 청구서에 여전히 비용이 조금씩 남아있는데 혹시 이건 제가 예전에 사용한 것이 아직 결제되지 않은 상태기 때문에 남아있는 것인가요? 분명히 모든 리소스를 삭제했음에도 불구하고 비용이 나가게 될까봐 걱정입니다.
-
미해결개발자라면 알아야 할 redis 기본
redis 개발 환경 수정 시 질문 입니다.
안녕하세요. 일반적은 DB는 운영되고 있는 것은 개발로 구성할 때 운영에 사용되는 테이블을 백업 받아 개발로 이동시켜 테이블들을 구성합니다. redis도 위와 같은 작업을 해야 되는 건가요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
ec2안에서 pull 받는 이유가 뭔가요 ?
ec2에서 깃을 그대로 풀받아서 ec2 안에서 jar를 생성 하는 이유가 따로 있나요 ? 소스코드를 내려받게 되는데 필요하지 않은 용량을 사용하고 소스파일이 서버에서 관리되는 느낌이라서요
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Nest.js + Redis 구현 문제
안녕하세요레디스 강의를 재미있게 수강하고 있는데요문제가 있어서 여러가지 찾아보았지만 잘 해결이 되지 않아서 여기에 문의 남깁니다 import { Module } from '@nestjs/common'; import { BoardController } from './board.controller'; import { BoardService } from './board.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Board } from './board.entity'; import { CacheModule } from '@nestjs/cache-manager'; import * as redisStore from 'cache-manager-ioredis'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: '', // 임시로 삭제 password: '', // 임시로 삭제 database: 'mydb', autoLoadEntities: true, synchronize: true, // Note: set to false in production }), TypeOrmModule.forFeature([Board]), CacheModule.register({ store: redisStore, host: 'localhost', port: 6379, ttl: 60, }), ], controllers: [BoardController], providers: [BoardService], }) export class AppModule {} import { Inject, Injectable } from '@nestjs/common'; import { Board } from './board.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { CACHE_MANAGER, Cache } from '@nestjs/cache-manager'; @Injectable() export class BoardService { constructor( @InjectRepository(Board) private boardRepository: Repository<Board>, @Inject(CACHE_MANAGER) private cacheManager: Cache, ) {} async getBoards(page: number, size: number): Promise<Board[]> { const cacheKey = `boards:page:${page}:size:${size}`; const cachedData = await this.cacheManager.get<Board[]>(cacheKey); if (cachedData) { return cachedData; } const skip = (page - 1 ) * size; const boards = await this.boardRepository.find({ order : {created_at: 'desc'}, skip: skip, take: size, }); await this.cacheManager.set(cacheKey, boards); const cachedData3 = await this.cacheManager.get(cacheKey); console.log('stores:', this.cacheManager.stores); console.log('stores 타입:', typeof this.cacheManager.stores); console.log('stores 내용:', JSON.stringify(this.cacheManager.stores, null, 2)) return boards; } } 현재 이렇게 2개의 파일을 레디스 적용하기 위해서 작성을 하였는데요레디스에서 검색을 하면 정상적으로 조회가 되지 않습니다(mysql에서 가지고 온 데이터는 정상적으로 조회가 됩니다) 그래서 중간에 로그도 찍어보았는데 레디스가 아니라 keyv 여기에 저장이 되는거 같습니다왜 그런지 원인을 알고 싶습니다 참고로 레디스 cli, 서버는 정상적으로 동작 중 입니다이유는 스프링으로 레디스 연동은 정상적으로 잘 됩니다
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
데이터를 안가져와요
똑같이 해서 돌렸는데 데이터가 안보여서 로그 찍어 봤어요 컨트롤러에서 page 파라미터는 불러오는데 size 값만 안불러와요
-
미해결개발자라면 알아야 할 redis 기본
key값에 대한 작성 컨벤션
좋은 강의 만들어주셔서 감사합니다. 질문드리고 싶은 내용은 key 값은 아래 처럼 리소스 관점에서 계층 방식, 스네이크 케이스로 작성하는게 일반적인 컨벤션인가요? user:email:1 user:email:{id} user:{id}:refresh_token 아래 강의에서 보여주신 user:email:{id} 은 리프레쉬 토큰의 예시랑 좀 다른 패턴인데, 무슨 차이가 있을까요?
-
미해결개발자라면 알아야 할 redis 기본
수업 자료는 어디 있을까요?
수업 자료 전달 요청 드립니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Spring Boot 프로젝트에 Redis 셋팅 추가하기에서 13분 질문있습니다.
Spring Boot 프로젝트에 Redis 셋팅 추가하기에서 13분에서요.스프링부트 종료하고 다시 사작한 화면에서 cmd에서 cash * 누르면 캐시가 없던데 캐시는 휘발성인가요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
레디스 환경 셋팅 질문있습니다.
선생님 코드 복붙했는데 어느 부분이 틀린지 잘 모르겠습니다.class RedisCacheConfig 부분에서 RedisConnectionFactory redisConnectionFactory 이 부분이 에러가 나고class BoardService애서 cacheManager = "boardCacheManager" 여기서도 에러가 납니다.파일 첨부합니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
엘라스틱 서치와 레디스의 차이점을 알고 싶습니다.
엘라스틱 서치와 레디스의 차이점을 알고 싶습니다. 그리고 강의 중에 엘라스틱 서치도 redis-cli로 접속하여 값을 볼수있는데. 이것은 왜 redis-cli 를 사용하는지도 알고 싶습니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
-parameters
http://localhost:8080/boards 로 접근시 해당 에러가 발생합니다
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Redis vs Memcached
안녕하세요. 강의 잘 듣고 있습니다!현재 개인 프로젝트에 Redis를 적용해보려고 합니다.구현하려는 기능은 주식 가격 요청 API로, 동일한 주식 종목을 여러 번 호출했을 때 캐시에서 값을 가져오는 로직입니다.Redis 외에도 Memcached라는 인메모리 캐시 서버가 있는데, 이 두 가지 서버 중 어떤 기준으로 선택하는 것이 좋을지 고민입니다.기술을 선택할 때, 근거를 명확히 하는 연습을 하는 것이 중요한가요?예를 들어, Redis는 리스트, 셋, 해시, 정렬된 셋 등 다양한 데이터 구조를 지원하고, 영속성 기능도 제공하는데, 이런 이유로 Redis를 선택해야 한다고 말할 수 있을까요?제가 구현하는 기능은 단순 조회 기능이라 Memcached도 적합할 수 있을 것 같지만, 이를 다른 사람들에게 설득할 근거와 이유는 어떻게 제시하는 것이 좋을까요?