[SpringBoot] Redis 적용 시 @Indexed 사용 문제점
·
Framework/SpringBoot
🩸 문제redis에 refresh token을 저장 중 → idx가 붙은 것과, value이름과 함께 토큰 값이 여러 개가 한번에 나오고 있다. redis:filed:value 형태가 옳게 나오는 걸까?    🩺 원인 value를 이용해 검색할 수 있는 @Indexed를 이용하면 인덱스 처리가 된다.@Getter@RedisHash(value = "refresh_token", timeToLive = 86400)public class RefreshToken { @Id private String userId; @Indexed private String token; public RefreshToken(String userId, String token) { this.userId = userId; this...
[SpringBoot] 테스트 코드 작성 시 Mock과 Spy, 그리고 BCryptPasswordEncoder의 encode
·
Framework/SpringBoot
첫번째 이슈: BCryptPasswordEncoder 동작  1. 문제Mock으로 BCryptPasswordEncoder 를 주입 받아 proxy로 생성돼 비밀번호가 제대로 저장되지 않는 문제 발생비밀번호가 인코딩되어 저장되지 않고, 비밀번호 검증도 하지 못해 예외가 발생하고 있다.  2. 원인 @Mock private BCryptPasswordEncoder passwordEncoder; 테스트 주체는 UserService니 BCryptPasswordEncoder는 Mock으로 지정하였다.그로 인해 matches()와 encode()가 동작하지 않았고, password를 제대로 검증하지 못하고 있었다.  3. 해결 방안 given - willReturn 이용given(passwordEncoder.matc..
[프로그래머스] 서버 증설 횟수 -java
·
CodingTest/programmers
문제 설명 당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 m명 늘어날 때마다 서버 1대가 추가로 필요합니다. 어느 시간대의 이용자가 m명 미만이라면, 서버 증설이 필요하지 않습니다. 어느 시간대의 이용자가 n x m명 이상 (n + 1) x m명 미만이라면 최소 n대의 증설된 서버가 운영 중이어야 합니다. 한 번 증설한 서버는 k시간 동안 운영하고 그 이후에는 반납합니다. 예를 들어, k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영됩니다. 하루 동안 모든 게임 이용자가 게임을 하기 위해 서버를 최소 몇 번 증설해야 하는지 알고 싶습니다. 같은 시간대에 서버를 x대 증설했다면 해당 시간대의 증설 횟수는 x회입니다. 모든 게임 이용자를 감당하기 위해 최소 7..
[SpringBoot/JPA] 조회 성능 개선하기 - FULLTEXT Index 사용
·
Database/JPA
부트캠프 과제 구현 중 기록100만 건의 데이터를 생성해 저장하고, 목록을 조회 하기목록 조회 시 성능을 개선하기 위한 방법 기록대용량 데이터 생성 후 저장: https://rvrlo.tistory.com/entry/SpringBootJPA-JDBC-Batch-Insert를-통해-대용량-데이터-저장하기      🔎 과제 분석저번 글에서 대용량 데이터를 생성하여 테이블에 저장했으니, 이번에는 조회 성능을 개선해보기로 한다.조회 속도를 개선하기 위해 여러 방법을 고려해보라고 했고, 제일 먼저 떠오른 것은 인덱스를 이용하는 것이었다.   ✨ MySQL - Searchall, index: 테이블 전체 스캔(인덱스x)range: 인덱스를 사용한 범위 검색fulltext: MATCH .. AGAINST 구문을 사..
[SpringBoot/JPA] JDBC Batch Insert를 통해 대용량 데이터 저장하기
·
Database/JPA
부트캠프 과제 구현 중 기록100만 건의 데이터를 생성해 저장하고, 목록을 조회 하기대용량 데이터를 저장하기 위한 방법 기록데이터 조회 성능 개선: https://rvrlo.tistory.com/entry/SpringBootJPA-조회-성능-개선하기-FULLTEXT-Index-사용      🔎 과제 분석100만 건의 데이터를 저장하기 위해 랜덤한 값을 생성해야 했다.먼저 목표인 users 테이블은 pk인 id와 unique로 지정된 email이 존재한다.id는 auto_increment로 지정되어 상관없지만, 공통된 값이 나오면 곤란할 email을 랜덤하게 생성해야 했다. 그리고 과제에 주어진 조건은 → 닉네임은 랜덤으로 지정하고, 동일한 닉네임이 들어가지 않도록 하는 것  결국 email과 nickn..
[SpringBoot] Cache 값을 저장하지 못하던 문제 해결 및 @Cacheable과 @CachePut 차이
·
Framework/SpringBoot
부트캠프 과제 中 트러블슈팅 과정 작성  🛠️ 트러블 슈팅0. 배경사장이 어떤 가게를 소유하고 있는지 한번에 처리하기 위한 로직을 빼기 위해 고민했다.Filter, Inteceptor 등 방법을 생각했지만, 다 포기하고 말았다. 사장이 소유하고 있는 가게를 확인하기 위해서는 결국 DB에 접근해야 하는데, 구현 로직이 아닌 완전 밖에 있는 filter나 interceptor에서 repository접근이 옳지 않아 보였다. 결국 공통으로 처리하는 걸 포기해야 하나 싶을 때 'Cache를 사용하라'는 조언을 들었다.   1. 문제가게가 생성될 때 userId를 key로 캐시에 저장하고, 그 캐시는 List형태로 만들고 싶었다.하지만 가장 첫단추인 캐시 저장부터 문제가 생겼다. 가게 생성 메서드 안에 있는 캐..
[SpringBoot] access token과 refresh token을 만들어 postman으로 테스트하기 (1)
·
Framework/SpringBoot
내배캠 4ch 개인 과제 수행 중 lv5에 해당하는 "스스로 문제 정의"를 진행하며 작성한 글    🔒 Access Token접근을 위해서 사용하는 access token정보가 저장되어 노출되지 않도록 로컬 변수에 저장하여 보호해야 한다.백엔드가 Authorization헤더에 저장하면 프론트에서 로컬 변수에 저장한다.  🔑 Refresh Token토큰을 재발급받기 위해 사용하는 refresh tokenaccess token이 만료되었을 때 재발급을 받을 수 있게 하며, access token과 refresh token을 비교한다.cookie에 저장해 외부로 노출될 위험이 있기 때문에 아무 정보도 담지 않는다.  🔐 재발급 방법access token & refresh token 만료 → 재발급 (로그..
[SpringBoot] AOP를 이용해 Log를 남겨보자 -로깅
·
Framework/SpringBoot
🔍 AOP: Aspect-Oriented Programming관점 지향 프로그래밍 → [ 핵심 기능 | 공통 기능 ] 으로 나눈 뒤, 핵심 기능에서 공통 기능을 불러와 적용하는 방법.비즈니스 로직이 핵심 기능이라면 인증이나 로깅은 부가 기능에 속한다. 공통 기능을 분리해서 사용하는 것에는 Filter나 Interceptor와 같은 기능도 포함이지만, 이 기능들은 각각 실행되는 시점이 다르며, 시점에 따라 순서도 다르다. Filter - Interceptor - AOP - Interceptor - Filter 순으로 실행된다. (요청에서 응답까지)  그 중 AOP를 활용해서 요청과 응답에 대한 정보를 남기는 것을 선택했다.  1. Advice부가 기능을 정의한 코드핵심 기능을 담고 있는 Target에 제..
[SQL] ERD와 UML의 관계(Relationship) 차이
·
Database/basic
✔️ ERD의 관계1. 존재에 의한 관계 (존재적 관계)먼저 erd에서 말하는 '존재적 관계'는 말 그대로 '존재를 통해서 이루어지는 관계'를 의미한다. 한 쇼핑몰의 Category에 Books, Pens, Cosmetics 등이 존재한다.Books에는 Humanity, IT, Science 등이 존재하고, Cosmetics에는 Cream, Toner, Aftershave 등이 존재한다. 이런 단순한 존재로 인하여 관계가 형성되는 경우에는 존재적 관계라고 말한다.  2. 행위에 의한 관계 (행위적 관계)'어떤 행위를 통해서 생기는 관계'를 '행위적 관계'라고 하는데, 어떠한 행동 상태를 의미한다. Adam이라는 고객이 Books카테고리에 있는 책 한 권을 구입했다.Adam과 Books 사이에는 '구입하다..