본문 바로가기

Backend

(18)
[JWT] RefreshToken의 DB에서 Redis로 이사하기 기존 JWT로 인증, 인가 시스템을 서칭했을 때 Redis를 활용한 방법, DB를 활용하는 방법을 통해 RefreshToken을 관리하는 것을 알고 있었지만 Redis를 활용해 본적이 없기도 하고, 빠른 구현을 위해 DB를 선택해 프로젝트를 진행하고 있었다.최근에 다시 알아보면서 성능, 관리, 확장성 부분에서 Redis가 훨씬 용이하다는 것을 알게 되어 시스템을 바꾸게 됐다.▼ - 기존 아키텍쳐https://sada-dev.tistory.com/61 [Spring] Spring Security와 JWT로 구현하는 인증 시스템Why?Spring Security- 강력한 인증 및 인가를 내장하여 로그인, 권한 검증, CSRF 보호, 세션 관리 등 여러 보안 기능을 쉽게 구현 가능하다.- 커스텀 필터, 핸들러..
[동시성 제어] JPA와 PostgreSQL을 활용한 동시성 제어 전략 (낙관적 락 vs 비관적 락) Why?동시에 같은 데이터를 접근하거나 변경하는 상황은 자주 발생한다. ex) 재고 수량의 변경 등이 상황에서 데이터를 안전하게 관리하기 위한 2가지 방법낙관적 락 (Optimistic Lock)비관적 락 (Pessimistic Lock)1. 낙관적 락 (Optimistic Lock)낙관적 락은 각 버전에 대한 정보를 가지고, 트랜젝션이 완료될 때 데이터 변경의 충돌을 감지한다. (별도로 DB 자체에 락을 걸지 않는다.)JPA에서는 @Version 어노테이션으로 사용장점락 대기 시간이 없어 동시성 성능 UP충돌이 없으면 빠르게 병행 처리가 가능JPA가 버전 관리를 자동으로 처리해 구현이 간편단점충돌 발생 시 트랜잭션이 롤백되며, 재시도나 사용자 알림 처리가 필요 (충돌 발생 시 별도의 로직 필요)빈번한 ..
[API문서화] Spring Boot 3.x 버전 Swagger 적용하기 필요성기존에는 프로젝트 진행할 때는 따로 API 문서를 만들지 않고 진행했던 기억이 난다.3그때 당시에는 JSON 텍스트 형식으로 프론트엔드 분과 데이터 모양 합의하고, 추가로 변경된 내용들이 있다면 메모했던 내용들을 가지고 다시 가져가 서로 맞추고 하는 과정들을 했던 것으로 기억한다. 매우 번거롭다API 문서화 자동화 라이브러리를 이용한다면,  API 호출시 반환될 데이터의 모양을 미리 볼 수도 있고 중복된 API를 개발하거나 불필요한 API들을 한눈에 알아보기 쉬운 장점이 있다. Spring Boot 기반 프로젝트에서는 일반적으로 2가지의 API 문서화 툴을 사용하는데 장단점을 알아보고 비교해보자 Swagger (OpenAPI)Spring REST Docs문서 자동화 방식코드 어노테이션 기반테스트 코..
[Spring] Spring Security와 JWT로 구현하는 인증 시스템 Why?Spring Security- 강력한 인증 및 인가를 내장하여 로그인, 권한 검증, CSRF 보호, 세션 관리 등 여러 보안 기능을 쉽게 구현 가능하다.- 커스텀 필터, 핸들러 추가로 세밀한 보안 정책을 추가, 관리할 수 있다.Jwt- 서버 측에 별도의 세션 정보를 저장하지 않는 토큰 기반 인증 방식으로 서버 확장이 용이해짐.- Jwt 토큰 자체에 필요한 사용자 정보와 권한 정보 (Claim) 이 포함되어 있어, 별도의 데이터베이스 조회 없이 토큰만으로 인증 및       인가 처리가 가능- 여러 서버나 마이크로서비스 환경에서 인증 상태를 공유해야 할 때 중앙의 세션 저장소가 필요없으므로 간편하게 인증처리가 가능- 토큰에 서명(Signature)을 포함하여 변조 방지, 만료 시간(expirati..
[JAVA] List #JAVA #컬렉션 #List[!NOTE] 개념순서가 있고, 중복을 허용하는 자료 구조를 리스트(List)라 한다.앞서 배운 [[ArrayList]], [[LinkedList]] 는 내부 구현만 다르며 같은 기능을 제공한다. 위의 공통 기능들을 인터페이스로 추상화 한 것이 List이다.리스트를 구현하고, 실행하다보면 의존관계 주입의 시점에 따라서 의존관계의 종류가 달라지는 것을 볼 수 있다. ( *[[컴파일 타임, 런타임 의존 관계]] )배열 리스트 vs 연결 리스트배열 리스트의 최적화자바 내부에서 메모리 고속 복사를 활용해 성능이 최적화된다.배열 리스트를 사용하는 것이 유리하나 드물게 첫번째 데이터에 접근, 삭제가 많은 경우에는 LinkedList를 사용 하는 것이 유리하다. 출처 : 인프런 "김영한..
[JAVA] HashSet #JAVA #컬렉션Set[!title] 주요 특징Set(세트/셋)은 유일한 요소들의 컬렉션이다.유일성 : 중복된 요소를 허용하지 않는다.추가시 이미 존재하는 요소시 무시순서의 미보장빠른 검색중복을 허용하지 않고, 요소의 유무만 중요한 경우 사용됨.한계Set는 구조는 단순하나 데이터 추가, 검색 모두 O(n)의 시간 복잡도로 성능이 좋지 않고 데이터가 많을 수록 더욱 더 효율이 떨어진다.검색의 경우 [[ArrayList]] 와 [[LinkedList]] 의 성능과 비슷하지만, 데이터 추가시 중복을 체크하기 위해 전체 데이터를 순회( O(n) )하는 단점이 있다.=> 이를 극복하기 위해 [[Hash(해시)]] 알고리즘을 도입한다.HashSet앞서 말한 Set의 단점을 Hash 알고리즘의 도입으로 보완한 자료..
[JAVA] Hash 알고리즘 #JAVA #컬렉션 #Set #알고리즘컴퓨터 세상에서 모든 객체는 정수로 표현이 가능하다. (메모리)즉, 모든 데이터를 정수로 표현하고, 특정 정수를 통해 나눈 나머지를 이용한다고 가정한다면 나머지의 집합 범위로 축소시켜 모두 저장할 수 있다.패러다임의 전환생각의 틀 변경기존의 배열은 메모리 공간에 데이터를 저장하고, Index를 통해 접근한다.=> ==배열의 Index 가 곧 데이터라면??==Index를 통해 데이터로 바로 접근 할 수 있으므로 O(1) 성능으로 데이터 검색 가능하지만 이 방법에는 문제가 발생한다.저장하는 데이터의 값이 늘어나면 배열의 크기가 늘어나고, 낭비되는 메모리의 양이 함께 늘어난다.배열의 크기를 고정시키고, 해당 크기로 데이터를 나머지 연산으로 데이터를 저장한다면 크기가 큰 데..
[JAVA] LinkedList #JAVA #컬렉션 #List[!NOTE] 주요 특징배열의 단점( [[ArrayList]] )을 극복하고 다양한 상황에서 유연한 자료 구조로 활용된다.Node(노드) 개념의 도입노드는 현 데이터 내부에 다음 데이터의 참조값을 포함해서 가지고 있다.-> 마치 데이터가 연결돼 있는 듯한 효과링크드 리스트에 A -> B -> C 순서로 저장한 경우의 개념도LinkedList의 장단점장점동적 메모리 할당 : 필요할 때마다 노드를 추가하기 때문에 메모리 효율 증가첫 번째 인덱스의 추가/삭제 시 O(1) 의 성능단점순차 검색 성능 O(n) : 링크를 타고 순차적으로 접근해서 검색하는 방식이리 때문메모리 사용량 증가 : 각 노드가 다음 노드를 가리키는 참조를 추가적으로 저장하기 때문LinkedList의 시간 복잡도추..