Spring (35) 썸네일형 리스트형 동적쿼리와 인덱싱 적용하여 성능 개선하기 (+ 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그러면 아래 경로에 잘 생긴다! 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는 다양한 자료구조를 지원함 -> 이번에 구현해야.. failed to create jar file 문제 해결하기 팀원분이 올려주신 프로젝트를 클론하고 실행하려는데java.util.concurrent.executionexception: org.gradle.api.gradleexception: failed to create jar file에러가 발생한 것이다😱 다른 분들은 잘 실행된다고 해서 더 멘붕에 빠졌다문제 상황을 파악해보니gradle 파일에 문제가 있었음 -> 다른 팀원분들은 컴퓨터에 gradle이 깔려있어서 해당 gradle이 작동해서 빌드가 잘 됐음-> 나는 gradle이 내컴퓨터에 없었기 때문에 저 에러가 뜬 것gradle -v 을 했을때 gradle이 존재하지 않는다고 떴다! 해결방법1. 컴퓨터에 gradle깔기 brew install gradle 2. 다시 실행하기!Gradle Wrapper : (G.. 테스트 코드 작성하기 테스트 작성하는 법테스트하고 싶은 레이어에 가서 cmd + n 을 누른다! H2가 아닌 다른 데이터베이스에 연결하고 싶을 때1. 아래 경로에 설정 파일 만들기 2. 테스트 코드 파일에 어노테이션 2개 추가하기replace = AutoConfigureTestDatabase.Replace.NONESpring Boot가 테스트를 위해 다른 데이터베이스(H2 등)로교체하지 않도록 설정@TestPropertySource(locations = {"classpath:/application-test.properties"})해당 경로의 application.properties를 사용하겠다는 뜻 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.. JPA와 Transaction JPA자바에서 orm기술 표준으로 사용하는 인터페이스 orm자바 객체와 관계형 db의 데이터를 자동으로 매핑해주는 방법 Hibernate자바 언어를 위한 orm 프레임워크JPA 인터페이스를 구현하고 내부적으로 JDBC API를 사용 Spring Data JPAjpa를 더 쉽고 편하게 사용할 수 있게 도와주는 spring에서 제공되는 모듈jpa를 한 단계 더 추상화 시킨 jparepository 인터페이스 제공entitymaniger는 jpa에서 관리하는 것@transactional은 스프링에서 관리하는 것 Raw JPA Persistence Context엔티티 객체가 생성, 관리, 소멸 되기까지 데이터베이스와 상호작용하는 모든 과정엔티티를 JPA 영속성 컨텍스트에 영속화(persist) 하게 되면, 이.. 이전 1 2 3 4 5 다음 목록 더보기