[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..
[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] 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 만료 → 재발급 (로그..
[Spring] Global Exception Handler에서 Enum 사용하기
·
Framework/Spring
부트캠프 과제 中 트러블슈팅 과정 작성 글일정 관리 앱 서버 ver.2  ※ 이용 방법만 필요하면 목차에서 [구현 과정] 클릭    💡트러블 슈팅 1. 문제상황마다 Exception을 만들고, Global Exception Handler를 사용하다 Exception Class를 여러 개 만들어야 하는 문제가 생겼다. 상황에 맞는 정확한 이름이 담긴 Exception을 만드는 것이 좋지만, 대부분 접근 권한이나 path입력, null입력 등 유효성 문제에 대한 예외 처리였기 때문에 그 의도는 모두 같았다. 발생되는 원인만 다른 것 뿐. 2. 원인문제가 발생될 시점에서 if로 확인하고, throw new로 상황에 맞는 Exception을 만들어 발생시키고 있었지만, 최종 응답은 같은 모양이었다. 응답에 필..
[Spring] HttpServlet에 대해
·
Framework/Spring
HttpServlethttp프로토콜에 특화된 기능을 처리하기 위한 용도  요청 Request를 처리해서 응답 Response하는 목적으로 설계되었다.httpServlet을 상속받은 객체는 WAS 내부에서 자동으로 객체가 생성, 관리 된다.멀티스레드에 의해 동시 실행될 수 있도록 처리할 수 있다. 객체 자동 관리서블릿은 웹이라는 특수한 환경으로 인해 개발자가 직접 객체를 생성하는 대신 톰캣에서 객체를 관리한다.서블릿 관점에서 톰캣은 서블릿 컨테이너로 볼 수 있다.  처리 과정서블릿이 처리해야 하는 특정 경로 호출경로에 맞는 서블릿 클래스를 로딩하고 개체를 생성 → init()메서드 실행요청 정보를 분석해 쿼리 스트링의 파라미터를 HttpServletRequest로 전달 받는다.응답에 필요한 기능은 Http..
[Spring] Spring MVC 구조 알아보기
·
Framework/Spring
Model View Controller어플리케이션 구성 시 요소를 세가지 역할로 구분해 서로 영향을 주지 않고 수정 가능한 MVC구조  Model비즈니스 로직을 담당하며, 데이터를 처리하는 것. 데이터베이스와 연동하는 DAO와 데이터 구조의 DO로 구성되어 있다. 데이터베이스에서 처리하여 데이터를 가공한 뒤 뷰로 전달한다. View데이터를 별도 보관하지 않고 화면에 보여주는 자체 영역 Controller모델과 뷰 사이 다리 역할을 하는 컨트롤러는 입력에 대한 모델과 뷰의 업데이트 로직이 포함되어 있다. 사용자의 요청을 받는 역할은 이 컨트롤러에서 진행된다. 각 영역이 독립적으로 구성되어 의존성이 낮아진다. 개발자 간 협업이 원활하지만, 데이터 처리가 커지면 컨트롤러가 해야 할 일이 많아져 역할 분담이 필..
[Spring] HTTP로 요청 주고 받는 방법 GET, POST
·
Framework/Spring
서버와 클라이언트가 정보를 주고 받을 때 HTTP 프로토콜을 사용 한다. 클라이언트에서 서버로 이동은 요청 request라고 하며, 서버에서 클라이언트로 이동은 응답 response라고 한다. 서버가 응답을 보낼 때 데이터 형태에 따라 다르게 사용하는데, 정적 데이터를 전송하는 건 '웹 서버 Web Server'라고 하고 동적인 데이터를 보낼 때는 '웹 애플리케이션 서버 Web Application Server: WAS'라고 한다.  서버에 요청을 할 때 '어떤 목적으로 정보를 요청'하는 지에 따라 GET과 POST방식으로 나뉜다. GET직접 원하는 데이터를 적거나 링크를 클릭하여 정보를 요청한다. 주로 특정한 정보를 조회하는 용도로 GET을 사용하며 URL 뒤에 값을 적기 때문에 정보 노출에 위험이 있..