[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] 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에 제..
[Spring] Enum에 i18n 적용하는 방법
·
Framework/Spring
부트캠프 과제 中 트러블슈팅 과정 작성 글일정 관리 앱 서버 ver.2  ※ 이용 방법만 필요하면 목차에서 [구현 과정] 클릭    💡트러블 슈팅 1. 문제Exception을 처리할 Enum을 만들 때 message_ko와 message_en을 한번에 같이 전달하고 있었다.USER_NOT_FOUND(HttpStatus.NOT_FOUND,"해당 id를 찾을 수 없습니다.", "The ID cannot be found.")   2. 원인다국어처리를 지원하는 i18n에 대해서 이야기를 들었고, 이 방법을 이용하면 사용자가 설정한 언어에 따라서 그에 맞는 메세지가 전달할 수 있다는 방법을 알았다. 이 방법을 이용하기 위해서 i18n에 대해서 알아보았지만, Enum에서 이 값을 전달하기 위해서는 추가 설정이 필..
[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] 의존 관계 주입(DI) & 의존 관계 검색(DL)
·
Framework/Spring
의존 관계 Dependency스프링은 의존관계 주입 컨테이너, DI컨테이너라고도 불린다. 여기서 말하는 의존관계 즉, 의존성은 한 객체가 다른 객체에 의존하고 있다는 의미를 가지고 있다. 객체 지향 프로그래밍에서는 다른 객체를 사용하기 위해 호출을 할 때, 파라미터를 이용해 메세지를 주고 받거나, 객체를 직접 가져오기도 한다. 이 모두 의존관계가 형성되어 있는 것이다.의존성은 컴파일 의존성과 런타임 의존성으로 나뉘게 된다.  컴파일 의존성 Compile Dependency (정적 의존성, Static Dependency) 컴파일은 소스코드가 기계어로 변환하는 시점으로, 컴파일타임 의존성은 컴파일러가 직접 관리하여 코드를 통해 의존성을 확인한다. 코드 자체에서 어떤 객체를 참고할지 결정하고 있기 때문에 정..
[Spring] 싱글톤 레지스트리(Singleton Registry)란?
·
Framework/Spring
싱글톤 패턴일반적으로 객체를 여러번 생성하면 그 객체가 가지고 있는 정보는 같지만, 객체 자체는 모두 다른 객체이다.완전히 같은 오브젝트는 동일하다고 하고, 동일한 정보를 가지고 있는 건 동등하다고 한다.하지만 스프링에서는 여러번 빈을 요청해도 매번 동일한 오브젝트를 돌려준다.이는 스프링이 싱글톤을 적용하고 있기 때문이다.2024.12.06 - [Knowledge/디자인패턴] - [디자인 패턴] 싱글톤 패턴(Singleton Pattern) 싱글톤은 이와 같이 유일한 인스턴스를 사용해 메모리를 절약하고, 이미 생성된 인스턴스에 접근해 속도가 빠르다는 장점이 있다. 하지만 싱글톤의 사용은 위 글에서처럼 장점보다 큰 단점을 가지고 있다. private로 생성되어 객체 지향의 특징인 다형성 적용이 불가능하고,..