레디스를 이용한 스핀락을 사용시 트랜잭션 전파 속성에 관련해 주의해야할 점을 나름대로 정리했습니다.상위 레벨과 하위 레벨의 트랜잭션을 별개로 가져가야한다.→ 락을 거는 트랜잭션과 비즈니스 로직을 수행하는 트랜잭션을 분리해야한다.이유 - 하나의 락을 거는 트랜잭션과 비즈
Redis는 인메모리 데이터 저장소로 읽기 성능이 뛰어나 캐싱, 세션 저장소, RefreshToken 저장소 등 다양한 곳에 많이 사용됩니다.인메모리 데이터 저장소가 가지는 휘발성의 특성 때문에 종료되는 경우 데이터가 유실되게 됩니다. 이 단점을 Redis에서는 AOF
노션에 B-Tree에 대해 정리해놨던 글을 옮겼습니다!탐색 성능을 높이기 위해 고안된 트리의 한 종류로, 모든 leaf node가 같은 depth를 가지는게 특징인 균형잡힌(Balanced) 트리입니다.인덱스를 구성할 수 있는 자료구조는 Hash Table과 B+Tre
프로젝트 진행 중 CI/CD 환경 구축을 위해 CodeDeploy를 사용하던 중 쉘 스크립트로 JAR 실행 시 환경 변수를 사용하고 싶었는데 환경 변수가 읽어지지 않는 문제가 발생했습니다. 이 문제를 어떤 관점에서 바라보았고, 어떻게 해결했는지 공유합니다~CodeDep
프로젝트 진행 중 Cookie 설정을 환경별로 매번 바꿔야하는 번거로움이 있었습니다. 이 문제를 어떻게 바라보고 어떻게 해결했는지에 대한 글 입니다.Property를 환경별로 유연하게 바인딩해 사용해봤습니다현재 프로젝트에서는 HTTPS 설정과 Secure Cookie를
이전에 프로젝트 진행 중 @AuthenticationPrincipal을 사용 중 @AuthenticationPrincipal을 커스텀해서 사용해야하는 문제가 있었고 어떻게 해결했는지를 공유합니다.@AuthenticationPrincipal로 Principal 객체 사용
객체지향 설계에서 SOLID 5원칙을 빼놓을 수 없는 것 같습니다. 해당 글은 예전에 공부할 때 써놓았던건데 올리는걸 깜빡하고 있었습니다..! 다양한 글들을 읽어보고 제 방식대로 요리조리 한번 생각해본 SOLID 5원칙 입니다.하나의 모듈은 한 가지 책임을 가져야 한다
HashMap은 key의 해쉬값을 토대로 배열에 값을 저장합니다.table의 사이즈 - 1과 key의 해쉬값을 & 연산한 인덱스에 value를 저장합니다.(테이블의 크기는 필요시 동적으로 변합니다)해쉬값을 통해 값을 저장하므로 순서는 유지되지 않습니다.table의 0번
페이징이란?종류오프셋 페이징OffSet : 어디 부터 시작해서 가져올것인지?Limit : 몇개를 가져올 것인지?보통 offset 페이징은 프론트 엔드에서 이렇게 표현됩니다. 페이지 버튼과 함꼐 쓰이며 버튼을 클릭함으로써 페이지를 휙휙 넘길 수 있습니다.커서 페이징Cur
민감한 정보들을 private하게 관리하는 방법 중 .bash_profile을 설정을 통해 시스템 환경 변수를 사용하는 방법이 있습니다. 이 방법은 각각의 팀원 마다 운영체제 환경이 다를 수 있고, 또 시스템의 전체 환경변수를 건들이는 것으로 다른 프로젝트, 다른 프로
저희 프로젝트에서는 네 가지 Profile로 나눕니다.real - 실제 배포 환경의 Profile 입니다.dev - 개발 환경의 Profile 입니다.local - 로컬 환경의 Profile 입니다.mem - In-memory 환경의 Profile 입니다.아래 코드 블
local : 로컬 환경이고 MySQL DB를 사용한다.dev : 서버 환경이며 클라우드 서비스의 DB를 사용하거나 팀원들이 공용으로 사용할 수 있는 DB를 사용한다. 배포 전 QA를 수행한다.test : 테스트 환경이며 로컬 H2 DB를 사용한다.prod : 실제 배
Jasypt는 public한 곳에 애플리케이션을 배포할 때 DB 계정이나 중요 비밀 키 값들이 평문으로 그대로 저장되어 올라가는 것을 막기 위해 프로퍼티를 간단하게 암호화할 수 있는 라이브러리입니다.의존성 추가Bean 설정 encryptor.key를 환경 변수로 등록
Spring Cloud Config는 분산 서버 환경에서 사용될 일관된 서버의 설정이나, 각종 비밀키, Secret, I AM 정보 등 민감한 정보들을 서버내에서 관리하는 것이 아닌 외부에서 관리할 수 있도록 지원해주는 라이브러리다.Github Repository를 준
.yaml 파일의 프로퍼티들을 불러와서 사용하고 싶을 때가 있다.예를 들어 JWT의 header, 토큰 이름, 유효기간 등등... 어떻게 클래스에 바인딩을 해주는지 알아보자.제가 사용할 프로퍼티들은 다음과 같이 계층구조를 이루고 있습니다.Security 설정에 관한 프
현재 진행하는 팀프로젝트에 적용할 JWT에 대해서 알아보고 적용해봅니다.이 포스팅에서는 구현에 대한 세세한 코드를 모두 보여드리진 않습니다. JWT를 사용하고자 하지만 Refresh Token을 아직 사용해보지 못했거나 로직의 흐름을 이해하지 못한 사람들을 위해 로직의
NULL을 허용하지말라는 얘기는 클린코드에서도 나온다. 하지만 여기서 NULL을 사용하지말라고 하는 것은 조금 더 객체 지향적인 관점에서 NULL을 허용하지 마라고 하는 듯한 느낌이 들었다.객체 지향 패러다임에서는 객체에게 책임을 묻는다. 하지만 NULL을 사용할 경우
스프링 버전이 업데이트 됨에 따라 WebSecurityConfigurerAdapter와 그 외 몇 가지들이 Deprecated 됐습니다.스프링에서는 다른 방식으로 시큐리티 설정을 권장하고 있는 듯 해보였는데요. 방식이 바뀐 탓에 시큐리티 설정에 어려움을 겪었고 제가 사
SonarQube란? 다양한 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 수 있도록 코드 분석을 자동으로 해주는 정적 코드 분석 도구다. 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공해
트랜잭션이란 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.데이터베이스에서는 DB 데이터 변경 시 변경 내용들을 하나의 작업단위로 묶고 이 단위를 트랜잭션이라고 부른다.트랜잭션이 하나의 작업 단위라고 앞서 언급했다. 그렇다면 작업 도중 오류가 발생한다면? 작업을 취