전체 글47 [feat] QueryDsl PageDto 동적경로 생성 PathBuilder 를 활용하여 정렬하기 PageDto를 제대로 구현하기 위해 많은 고민을 하였다. PageDto를 구현하면서 스스로 건 제약 조건은모든 곳에서 사용 가능할 것동적으로 구현이 가능할 것(ex - 정렬, 키워드 검색 등)PageDto 초기 Entity첫번째 조건인 모든 곳에서 사용가능하게 하기 위해, PageDto에는 최소한의 데이터만 가지고 있도록 하였다. 데이터가 더 필요한 API에서는 PageDto를 상속받아 이용했다.@Getterpublic class PageDto { @Schema(description = "페이지 아이템 개수", example = "30", defaultValue = "10") private int pageSize = 10; @Schema(description = "현재 페이지 번호", .. 2024. 12. 17. Redis 캐시 스탬피드 현상 캐시 스탬피드란?레디스의 look-aside 방식에서 여러 개의 애플리케이션에서 바로보던 키가 레디스에서 만료돼 삭제되어 서버들이 한꺼번에 데이터베이스에서 데이터를 읽어오는 과정 이를 중복 읽기라 한다. 이후 중복 쓰기까지 발생하여 서비스의 이슈가 발생하고 한번 캐시 스탬피드 현상이 발생하면 더 많은 데이터가 이 현상의 영향을 받아 결과적으로 더 큰 문제로 이어질 수 있기에 계단식 실패라 한다. 해결 방법PRE(Probabilistic) 알고리즘currentTime - ( timeToCompute * beta * log(rand()) ) > expirycurrentTime : 현재 남은 만료 시간TimeToCompute : 캐시된 값을 다시 계산하는 데 걸리는 시간beta : 기본적으로 1.0 보다 큰 .. 2024. 11. 22. redis 캐시, 세션 캐시란?캐시란 데이터의 원본보다 더 빠르고 효율적으로 액세스 할 수 있는 임시 데이터 저장소를 의미한다.다음조건을 만족시킨다면 캐시를 도입했을 때 성능을 효과적으로 개선할 수 있다.원본 데이터 저장소에서 원하는 데이터를 찾기 위해 검색하는 시간이 올래 걸리거나, 매번 계산을 통해 데이터를 가져와야 한다.캐시에서 데이터를 가져오는 것이 원본 데이터 저장소 데이터를 요청하는 것보다 빨라야 한다.캐시에 저장된 데이터는 잘 변하지 않는 데이터다.캐시에 저장된 데이터는 자주 검색되는 데이터다. 캐시로서의 레디스특징사용이 간단하다. 단순하게 키 값 형태로 저장하므로, 데이터를 저장하고 반환하는 것이 굉장히 간단하다인메모리 데이터 저장소이기 때문에 데이터를 검색하고 반환하는 것이 상당히 빠르다.고가용성 기능을 가지고.. 2024. 11. 21. [fix] Enum 값 추가 시 발생하는 'Data truncated for column' 오류 해결 방법 (feat: AttributeConverter) 상황Enum에 새로운 상수를 추가해 주고, ddl-auto로 프로그램을 제 빌드 하였지만 추가된 enum 상수를 찾지 못하고 java.sql.SQLException: Data truncated for column 에러가 발생했다. 이는 Hibernate6 부터 ddl-auto 기능이 기본적으로, 데이터베이스 스키마 일부만 업데이트 되도록 변경되었기 때문이다. 따라서 새로운 enum 상수를 추가해 주어도 스키마에 반영되지 않았다.내용test - enum, entity 생성 지금 상황에서는 animalType 테이블 구조를 살펴보면 Data Type에 CAT,DOG,LION 잘 저장된 것을 확인 할 수 있다. 하지만 여기서 AnimalType에 BIRD 를 추가한다면 어떻게 될까??? BIRD를 추가한 후 .. 2024. 11. 14. REDIS - 메모리 관리와 maxmemory-policy 설정 레디스에서 키에 만료 시간을 설정해 데이터가 자동으로 삭제되도록 함으로써 데이터의 수명을 관리할 수 있다. 하지만 레디스의 메모리는 제한적이기 때문에 모든 키에 만료 시간을 설정하더라도 너무 많은 키가 저장되면 메모리가 가득 차는 상황이 발생할 수 있다. 메모리의 용향을 초과하는 양의 데이터가 저장되면 레디스는 내부 정책을 사용해 어떤 키를 삭제 할 지 결정한다. 레디스에서는 데이터의 최대 저장 용량을 성정하는 maxmemory 설정과 이 용량을 초과할 때의 처리 방식을 결정하는 maxmemory-policy 설정값을 사용해 메모리를 관리한다. Noeviction기본값은 noeviction 이다. 이 값은 레디스에 데이터가 가득 차더라도 임의로 데이터를 삭제하지 않고 더 이상 레디스에 데이터를 저장할 .. 2024. 11. 10. REDIS - TTL(만료시간) 레디스에서 만료 시간, 즉 TTL은 데이터가 얼마나 오래 저장될 것인지를 나타내는 시간 설정이다. 레디스는 데이터베이스 내의 특정 키에 대한 만료 시간을 설정 할 수 있으며, 이는 데이터의 유효 기간 또는 만료 시간을 정의하는데 사용된다. REDIS를 사용하여 조회수, 좋아요, 게임순위 매기기와 같은 실시간 데이터를 처리하는 것은 아주 효과 적일 수 있다. 하지만 Redis에 데이터를 계속해서 쌓아 두면 메모리 사용량이 점점 증가하게 되고, 메모리 한계를 초과하면 성능이 저하 될 수 있다. 이는 Redis의 장점인 빠른 성능을 제대로 활용하지 못하게 될 수 있다. 이를 해결하기 위해 Redis에서 제고하는 TTL(Time-to-Live) 기능을 활용할 수 있다. TTLTTL은 앞서 설명한 것처럼 특정 데.. 2024. 11. 9. REDIS - 비트맵 (조회수 활용) 비트맵은 독자적인 자료 구조는 아니며 String 자료 구조에 bit연산을 수행할 수 있도록 확장한 형태다. String 자료 구조가 binary safe하고 최대 512MB의 값을 저장할 수 있는 구조이기 때문에, 2^23의 비트를 가지고 있는 비트맵 형태라고 볼 수 있다. 참고서적 - 개발자를 위한 레디스(김가림 지음)활용예제 - 조회수, 방문자 수 구하기하루동안 게시글에 방문한 사용자의 수를 구하려면 어떻게 할까? 처음 redis를 활용하여 조회수 기능을 구현하였을때, 나는 sorted Set을 활용하였다. 키에 게시글의 아이디를 넣고 value 에 유저들의 id를 넣어 중복값이 들어갈 수 없게 하였는데, 참고서에 비트맵이라는 좋은 기능이 있어 기록해 보려 한다. 비트맵 활용 위의 그림과 같이 키에.. 2024. 11. 8. YAUAA -UserAgent활용하기(접속유저 정보 가져오기) 프로젝트를 진행하던 도중 유저의 로그인 기록을 자세히 남기고싶었다. 접속한 디바이스, 그리고 OS가 무엇인지도 같이 저장하여, 어떤 종류의 디비이스를 사용하는 유저들이 많이 젒속하는지 파악하기 위해 User-Agent 문자열을 분석해 주는 라이브러리인 YAUAA를 사용해 보기로 했다. YAUAA -> 공식문서 링크 라이브러리 설치YAUAA를 사용하기 위해서는 라이브러리를 추가해 줘야 한다. 나는 yml을 사용하고 있기에 메이븐 리포지토리를 활용하여implementation("nl.basjes.parse.useragent:yauaa:7.28.1")의존성을 추가해 주었다. config 생성공식문서를 살펴보면 UserAgentAnalyzer 인스턴스를 생성해서 사용해야 하는데, 초기화 비용이 많이 든다고 .. 2024. 11. 7. Redis 데이터 랜덤 뽑기 레디스에서 hsah는 필드 - 값 쌍을 가진 아이템의 집합이다. 레디스에서 데이터가 key-value 쌍으로 저장되는 것처럼, 하나의 hash 자료 구조 내에서 아이템은 필드-값 쌍으로 저장된다. 필드는 하나의 hash 내에서 유일하며, 필드와 값 모두 문자열 데이터로 저장된다. Redis 활용예제 - 이벤트 아이템 뽑기 위의 사진처럼 이벤트형 뽑기를 본적이 많을 것이다. 이러한 뽑기 기능을 관계형 데이터베이스에서 구현하려면 어떻게 해야할까? 아마 최소 두개의 테이블이 필요할 것이다. item 정보를 담고있는 item 테이블과 이벤트성 아이템을 저장하는 event 테이블이다.유저가 아이템 뽑기를 진행하면 event 테이블에서 item 테이블과 join해 데이터를 가져와야 한다. 실제 서비스를 하다보면 .. 2024. 10. 30. Redis Set (활용 예제) 레디스에서 set은 정렬되지 않은 문자열의 모음이다. 하나의 set 자료 구조 내에서 아이템은 중복해서 저장되지 않으며 교집합, 합집합, 차집합 등의 집합 연산과 관련한 커맨드를 제공하기 때문에 객체 간의 관계를 계산하거나 유일한 원소를 구해야 할 경우에 사용될 수 있다. 참고자료 - 개발자를 위한 레디스 김가람 지음 활용예제1 - set을 이용한 테그 기능웹툰이나 인스타그램을 보다보면 테그를 많이 볼 수 있다. #드라마, #우정 등등이것을 관계형 데이터 베이스로 나타내려면 어떻게 해야 할까 관계형 데이터베이스에서의 테이블 구조관계형 데이터베이스를 활용하여 테이블을 만든다면 위에 보는것과 같이 3개의 테이블이 필요하다. 물론 Spring JPA를 활용하면 웹툰과 테그 2개의 엔티티로 다대다 연관관계를 지.. 2024. 10. 29. 이전 1 2 3 4 5 다음