본문 바로가기

전체 글

(261)
동적쿼리와 인덱싱 적용하여 성능 개선하기 (+ Like 검색은?) 구현할 기능이번에 구현할 기능은 의사 다건 조회였다.이때 검색 조건은 총 3가지였다.1. 아무 조건없이 그냥 페이징만 적용하여 조회하기2. 의사 전공별로 검색하기3. 의사 이름으로 검색하기3. 의사 이름 + 전공으로 검색하기 인덱스  고려 사항WHERE 에서 OR을 사용할 때는 or 연산자는 비교해야할 ROW가 더 늘어나기 때문에 풀 테이블 스캔이 발생할 확률이 높기에 걸어도 의미가 없을 수 있음복합 인덱스는 카디널리티(중복도)가 높은순에서 낮은순으로 할 것복합 인덱스에 사용되는 컬럼은 가급적 UPDATE가 안되는 값을 선정해야 함 -> 업데이트 되는 순간 인덱스를 무수히 다시 업데이트 하기 때문인덱스는 가급적 테이블 당 3-5개를 넘지 않도록 하는 것이 좋음 첫 번째 고민 : 조건이 3가지나 있기 때문..
컨트롤러 테스트 작성시 주의할 점 기능 구현을 완료한 다음 컨트롤러 부분 테스트 코드를 짜는 중이었다...컨트롤러 부분만 테스트 코드를 짜면 되니까 이제 금방 끝날 줄 알고 행복한 마음으로 룰루랄라 짜고 있던 도중 생각지도 못한 난관에 부딪히게 됐다@WebMvcTest(DoctorController.class)class DoctorControllerTest { @Autowired private MockMvc mockMvc; @MockitoBean private DoctorService doctorService; @Test public void 의사_단건_조회() throws Exception { // given long userId = 1L; String usernam..
QClass 구현 안 될때 해결법 의존성 다시 한 번 확인// QueryDSLimplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api" 터미널에 입력./gradlew clean compileJava그러면 아래 경로에 잘 생긴다!
Spring에 Redis적용하기 1. 라이브러리 설정하기implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. RedisConfig 생성하기@Configuration@EnableCachingpublic class RedisConfig { @Bean // RedisTemplate를 빈으로 등록하여 애플리케이션에서 사용할 수 있게 함 public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redis..
QueryDSL을 이용하여 동적 쿼리 구현하기 1. 의존성 추가implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"의존성이 제대로 추가되었다면 Q 클래스가 생성됨 2. QuerydslConfig 파일 생성@Configurationpublic class QuerydslCo..
조회수 및 어뷰징 방지 Redis로 구현하기 요구사항1. 상품 조회 시 해당 게시글의 조회수를 카운팅 + 어뷰징을 방지할 것2. 상품을 조회할 때 상품의 상세정보와 함께 조회수도 같이 볼 수 있어야 함3. 조회수를 기준으로 상위 10개의 상품정보를 랭킹을 포함하여 조회할 수 있어야 함 조회수 카운팅 구현Global Cache 방식 사용Local Cache 전략을 사용하게 되면 속도가 빠르지만 다중 서버 환경에서는 각 서버마다 중복된 데이터를 보관해야 하고, 동기화되지 않기 때문에 데이터의 정합성 문제가 발생하기 때문에 속도가 Local Cache 보다는 느리지만 정합성과 중복성 문제를 해결하기 위한  Global Cache 방식을 선택! Redis 선택 이유다양한 캐시 데이터베이스 중에서도 Redis는 다양한 자료구조를 지원함 -> 이번에 구현해야..
Redis 캐싱 전략과 조회 성능 비교 Redis 네이밍 컨벤션콜론(:)을 활용해 계층적으로 의미를 구분해서 사용한다!users:200:profile ->  users 중에서 pk가 200인 user의 profile 캐시 (Cache)원본 저장소보다 빠르게 데이터를 가져올 수 있는 임시 데이터 저장소임시 저장소를 의미한다고 보면 됨 캐싱 (Caching)캐시에 저장해서 데이터를 빠르게 가져오는 방식Cache Hit : 데이터를 요청했을 때 캐시에 데이터가 있는 경우Cache Miss : 데이터를 요청했을 때 캐시에 데이터가 없는 경우 캐싱전략Cache Aside : 조회시에 캐시를 먼저 찌르고, 없으면 DB에서 조회하는 방식데이터를 조회할 때 캐시에서 먼저 조회하고, 없으면 데이터베이스를 통해서 조회해오는 방식 1. 캐시에 데이터가 있을 경우..
Redis의 정의와 기본 명령어 간단한 컴퓨터 구조 지식RAM컴퓨터가 작업할 때 임시로 사용하는 공간컴퓨터가 실행중에 값을 임시로 저장하는 공간 → 램이 크면 클수록 작업을 빠르게 할 수 있음휘발성실행 속도를 좌우함ROM시스템이 부팅될 때 필요한 기본적인 데이터를 저장비휘발성부팅할 때 꼭 필요한 정보가 저장되어 있는 공간 (몇 MB~GB)디스크 (SSD/HDD)데이터를 저장하는 저장 장치운영체제, 프로그램 사용자 데이터를 저장비휘발성저장용량이 매우 큼(GB~TB 단위)NoSQL키-벨류 형태로 저장되는 데이터베이스Redis데이터 처리 속도가 매우 빠른 NoSQL 데이터베이스데이터를 일정 시간이 지나면 삭제되게 할 수 있음 : 만료시간 (TTL) Redis의 데이터 처리 속도가 빠른 이유RMDBS는 디스크에 데이터를 저장함 → 속도 느림R..