전체 글 8

코틀린과 JPA, 어떻게 타협하면 좋을까?

서론코틀린으로 개발하는 백엔드 개발자들 대부분에게 나타나는 고민이 하나 있다. 바로 코틀린의 불변성을 유지하면서 JPA와 같은 ORM의 가변 요구사항 사이에서 어떤 해결책을 가져가야 하는가? 이다.본 글에서는 몇가지 해결책에 대해 알아보고 선택 기준을 제시하려고 한다.본론해결책1. 첫번째 선택지는 JPA == Domain, 현실 타협형 해결책이다.@Entityclass User( @Id @GeneratedValue var id: Long? = null, var name: String)이 방식의 장점은 구현이 단순하고, 러닝 커브가 높지 않아 생산성이 높다는 것이다.반대로 단점은, 코틀린의 가장 큰 장점 중 하나인 객체 불변성을 활용할 수 없다는 것, 또 인프라에 의존하게 되어 테스트가 어렵다는..

개발 2026.01.06

Instant와 LocalDateTime, 어떻게 다를까?

서론현재 도메인 객체와 영속성 객체를 따로 두어 개발을 진행하고 있다.개발을 진행하던 중 Entity와 Domain에 시간 값이 다르게 적용되는 내용을 보고 이유를 알기 위해 정보를 확인해보았다.본 글에서는 객체의 생성 시간을 저장할 때 Entity 객체에는 Instant, Domain 객체에는 LocalDateTime을 적용하는 이유와 차이점을 기술한다.본론아래는 간단하게 작성한 Entity, Domain 객체이다.@Entityclass UserEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, var createdAt: Instant)data class UserDomain( val id: Long? ..

개발 2025.12.01

Spring Security에 Redis를 활용한 토큰 관리를 적용해보자

서론많은 서비스들이 세션 방식과 토큰 인증 방식을 활용해 사용자에게 서비스를 제공한다. 이 중 토큰 인증 방식에서 사용하는 JWT는 서버에서 클라이언트의 상태를 저장하지 않고도 인증 상태를 유지할 수 있게 한다. 그러나 짧은 유효기간을 갖는 access token 만으로는 보안성과 사용자 경험을 모두 충족하기 어렵기 때문에, refresh token을 통한 access token 재발급 전략이 필수적이다. 본 글에서는 스프링 시큐리티(Spring Security)를 적용한 웹 애플리케이션에서 JWT(Json Web Token) 기반의 인증 전략을 설계하고, access token의 짧은 만료시간과 refresh token의 장기 사용을 안전하게 사용하는 방법을 확인한다. 이를 위해 Redis를 활용한 토..

개발 2025.07.04

Redis 분산락을 구현해보자

서론다수의 사용자가 동시에 같은 데이터에 접근하면서 발생하는 race condition에서 결과가 예상과 달라지는 오류를 예방하기 위한 방법에는 여러가지가 있다.그 중 단일 서버 환경에서는 synchronized 키워드만으로도 쓰레드간의 공유 자원 접근을 제어해 동시성 제어 문제를 해결할 수 있다.본 글에서는 분산 시스템 환경에서 동시성 제어 문제를 해결하기 위해 Redis 기반의 분산락(Redis Distributed Lock) 기법을 활용한 방법을 서술한다. 특히 Redisson 라이브러리를 이용하여 Java, Spring Boot 환경에서의 락 획득 및 해제를 구현하고, 다중 서버 환경에서의 동시성 테스트를 통해 그 유효성을 검증한다. 구현 결과, 분산 시스템(2개 서버) 환경에서 synchroni..

개발 2025.06.26

Redis에 메서드를 만들어보자 2

2025.05.17 - [개발] - Redis에 메서드를 만들어보자 Redis에 메서드를 만들어보자이번 포스팅에서는 Redis에 메서드를 추가하는 과정과 방법을 알아보고, Redis의 기본 메서드 중 하나인 echo와 동일한 동작을 하는 메서드를 추가해봅니다.준비Redis의 오픈소스 프로젝트인 valkey를dewveloperr.tistory.com지난 포스팅에서 Redis에서 사용할 수 있는 echo와 같은 동작을 하는 메서드를 추가하는 작업을 진행했습니다.이번 포스팅에서는 입력한 문자열에 원하는 문자열을 붙여서 반환하는 prefix_echo메서드를 만들어 추가해 봅니다.echo와 같은 기능을 추가할 때는 구현체 함수를 그대로 가져와 사용하면 됐지만, 문자열을 바꿔 출력하기 위해서는 Redis에서 문자열..

개발 2025.05.20

Redis에 메서드를 만들어보자

이번 포스팅에서는 Redis에 메서드를 추가하는 과정과 방법을 알아보고, Redis의 기본 메서드 중 하나인 echo와 동일한 동작을 하는 메서드를 추가해봅니다.준비Redis의 오픈소스 프로젝트인 valkey를 clone해서 사용합니다.https://github.com/valkey-io/valkey GitHub - valkey-io/valkey: A flexible distributed key-value database that is optimized for caching and other realtime workloads.A flexible distributed key-value database that is optimized for caching and other realtime workloads. ..

개발 2025.05.17

백준 11053 가장 긴 증가하는 부분 수열

문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)접근 방식1. 숫자가 증가하는 가장 긴 배열을 구한다면2. 뒤의 증가하는 배열은 앞 선 증가하는 배열 안에 포함되어 있을 것이다. (예를 들어, 뒤의 증가하는 배열 {20, 30, 50} 은 앞 선 증가 배열 {10, 20, 30, 50} 안에 포함되어 있다.)3. 이러한 방식은 이미..

알고리즘 2025.04.28

git의 내부동작

Git이란 무엇일까? 또 어떤 기능을 가지고 있고 어떻게 동작할까?Git을 활용하는 예시를 통해 Git에 대해 이해해 보자. git init우선 git_test 라는 폴더를 만들어준다.git init 명령어를 입력해준다..git 폴더가 생성됐다.HEAD에는 현재 브랜치가 무엇을 가리키는지 작성되어 있다. config는 Git 저장소에 대한 설정값을 확인할 수 있다.git add [파일명]hello world! 내용을 가지고 있는 hello.txt 파일을 생성한다.git status를 통해 add 가 필요한 untracked 파일을 확인할 수 있다.git add 한 파일에 대한 스냅샷이 생성됐다.git commit -m [커밋메세지]git commitcommit 해시값을 확인할 수 있다.git log 통해..

개발 2025.04.25