본문 바로가기

Projects25

Refactoring : 좋아요테이블을 기존 퀴즈-유저 정보 테이블에 합치기 현재 상황 1. 퀴즈(Quiz)와 유저(User) 둘 다 외래키로 갖는 중간테이블인 두 객체 존재 quiz_like : 좋아요를 표시하기 위한 객체. 존재한다면 해당 유저가 해당 퀴즈를 좋아요 누른 것이다. quiz_user_data : 특정 유저가 특정 퀴즈에 관련된 기록을 저장(퀴즈열람, 힌트열람, 정답). 2. 두번의 요청이 이루어지고 있다. 개발자 도구를 통해 위처럼 두번의 요청을 통해 따로 데이터를 받아오고 있는 것을 확인할 수 있다. 이 둘은 비동기적으로 동작한다. 각 559B, 598B 크기로 받아오고 있다. 거의 비슷하게 통신이 시작되어 각 68ms, 77ms 시간이 소요 됐다. 시도 : quiz_user_data로 like 데이터 통합하기 1. AS-IS As-Is ) 좋아요 여부를 qu.. 2024. 1. 3.
[트러블 슈팅] QueryDsl 도입후 테스트시 빈생성 문제 문제상황 myPageRepositoryCustomImpl이라는 빈생성을 못 한다는 에러 메시지가 나온다. 사실상 테스트 코드 작성 전인데도 해당 오류가 나온다. 해결방법 TestConfig생성 & JpaQueryFactory Bean 등록 @TestConfiguration은 @SpringBootApplication 에 의해 자동 탐색되지 않는다. @TestConfiguration public class TestConfig { @PersistenceContext private EntityManager entityManager; @Bean public JPAQueryFactory jpaQueryFactory() { return new JPAQueryFactory(entityManager); } } @Impo.. 2023. 12. 4.
[리팩토링] QueryDSL 도입기 0. 현재 상황 미뤄왔던 QueryDSL을 도입해보려 한다. 도입해야할 시기라는 것을 가장 크게 느낀 것은 아래 쿼리메소드를 작성했을 때이다. 메소드의 이름만으로도 쿼리문을 자동으로 작성해주는 Spring Data JPA 의 기능이지만 단점으로는 저렇게 너무 길어지기도 한다. 알아보기가 어렵다. QueryDSL는 동적쿼리를 생성하는 데에 있어서도 장점이 있지만, 한눈에 쿼리의 내용이 잘 파악이 되기도 하니 이를 기대해보며 개선해보려 한다. 1. QueryDsl 세팅 이전에 관련해서 설정을 마쳤기에 세팅관련한 자료는 아래 이전에 작성해뒀던 포스팅을 참고했다. 이전 포스팅 링크로 방법은 갈무리한다. https://thiswooin.tistory.com/68 TIL 230801 : QueryDSL 쓰려고 정리.. 2023. 12. 1.
[리팩토링] 작은 깨달음 : 리팩토링을 하기엔 데이터 수가 너무도 적었다 지난 번 Redis 서버가 미국에 있는 바람에 캐싱을 적용하자 오히려 느려졌다(?) https://thiswooin.tistory.com/134 [리팩토링] 레디스 캐싱을 통한 인증과정 유저정보 조회 속도 개선하기 개발환경 Java 17 / Spring Boot 3.x / Spring Security 3.x / MySQL 8.0 / Redis / JWT 테스트 DB는 로컬환경에서 진행. 현재코드 Spring Security를 통해 인증이 필요한 API의 경우 JWT 토큰을 기반으로 유저정보를 가져온 thiswooin.tistory.com ElastiCache는 추후 적용해보려 하고 우선은 빠르게 EC2 인스턴스에 Redis-server를 설치하여 이를 통해 해결해보려 한다. Redis 설치 on EC2 .. 2023. 11. 28.
[리팩토링] 레디스 캐싱을 통한 인증과정 유저정보 조회 속도 개선하기 개발환경 Java 17 / Spring Boot 3.x / Spring Security 3.x / MySQL 8.0 / Redis / JWT 테스트 DB는 로컬환경에서 진행. 현재코드 Spring Security를 통해 인증이 필요한 API의 경우 JWT 토큰을 기반으로 유저정보를 가져온다. 아래는 인증 구현체에서 유저정보를 가져오는 코드. username을 기반으로 select 쿼리를 보내서 가져온다. //UserDetailsServiceImpl.java @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsernam.. 2023. 11. 28.
[리팩토링] Redis 캐싱을 통한 조회 성능 개선 도전기 캐시 이해하기 한번 꺼내온 데이터 캐시에 저장해둬서 빠르게 다시 꺼내주기 쉽게 생각하면 캐시란 쉽게 생각하면 퀵슬롯처럼 한번 조회한 데이터의 사본을 밖에 가지고 있다가 다시 부르면 빠르게 사본을 주는 것이다. 사본? 주방을 예로 들어보자. 주방안에서 재료가 떨어져서 A메뉴가 주문불가 상태이다. 홀에서는 예상되는 메뉴의 사본인 메뉴판만 보고 주문을 하게되고 A메뉴를 return할 수 없게되어 문제가 발생한다. (가격이 변동됐다거나) 이는 주방과 홀 사이에 같은 정보를 토대로 사본으로 나눈 시점으로부터 데이터의 변경이 일어났음에도 즉시 반영이되지 않아 생긴일이다. 캐시도 원본 데이터의 복사본을 들고있기 때문에 빠른속도를 얻는 대신 정합성을 조심해야하는 기능은 것이다. 이러한 특징 때문에 원본 캐시데이터 간의.. 2023. 11. 28.