반응형
어느 프로젝트에나 쉽게 적용 가능한 분산락 컴포넌트 개발 (feat. Spring)
개발/ETC2025. 1. 30. 23:41어느 프로젝트에나 쉽게 적용 가능한 분산락 컴포넌트 개발 (feat. Spring)

Intro항해플러스에서 진행중인 프로젝트인 콘서트 예약 서비스를 분산환경이라고 가정하고, 기존에 DB 락을 통하여 동시성 제어가 되어있던 부분을 분산락을 통해 제어하도록 리팩토링하고자 하였습니다. 이전에 인프런 강의를 수강하며 가볍게 스프링 프로젝트에 분산락을 적용해봤던 경험은 있었으나, 어디까지나 간단하게 "적용만" 해봤던 터라 프로젝트에 어떻게 "잘" 적용할 수 있을지에 대한 고민을 해본 것은 이번이 처음이였습니다. 이에 대하여 컬리 기술블로그의 풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson 글이 많이 도움이 되었는데, 해당 글을 참고하여 다음과 같은 부분들을 고려하고, 좀 더 범용적으로 사용할 수 있도록 수정하여 적용하게 되었습니다. (이해를 위하여 한번 읽어보고..

Spring RestDocs 개선기(2) - 리플렉션을 이용한 Enum 문서 작성 자동화
개발/Spring2025. 1. 29. 22:43Spring RestDocs 개선기(2) - 리플렉션을 이용한 Enum 문서 작성 자동화

이전 글에서 Enum값을 팝업 형태로 띄워 UX를 개선하는 방법에 대하여 소개해드렸는데요, 이번 글에서는 작성에 대한 부분 또한 자동화를 해보겠습니다. 모든 예제 코드는 깃허브에서 확인하실 수 있으며, 여기에서 개선된 문서 체험을 해보실 수 있습니다. 링크 작성 자동화하기잠깐 이전 글에서 작성했던 테스트 코드에서 팝업 링크 문자열을 확인해보면 반복적인 부분이 있기에 따로 유틸 메소드를 만들어 링크가 걸리도록 해주겠습니다. EnumPopupLinkGenerateUtil.ktimport kotlin.reflect.KClassconst val ENUM_DOC_URL = "enums" // Enum Asciidoc 문서 경로fun generateEnumPopupLink(linkText: String, docum..

Spring RestDocs 개선기(1) - 커스텀 스니펫적용 + Enum 값 확인 UX 개선
개발/Spring2025. 1. 29. 19:00Spring RestDocs 개선기(1) - 커스텀 스니펫적용 + Enum 값 확인 UX 개선

Intro이전에 Spring RestDocs를 처음 사용하시는 분들을 위하여 Spring Rest Docs 예제 코드로 학습하기 라는 포스팅을 작성했습니다. 회사에서도 도입 이후 꽤나 만족하면서 잘 사용하고 있었지만, 아래와 같은 몇가지 불편한 부분이 있었습니다. 1. 기본 스니펫 템플릿 사용 시 필수 여부에 대하여 작성하기 힘들다.2. Enum에 대한 값을 수동으로 작성해주어야 한다.3. Enum의 값이 많을 경우 문서 상 설명 란이 너무 길어진다. 위 불편사항에 대하여 우아한 형제들 기술블로그의 Spring REST Docs에 날개를... (feat: Popup) 글을 참고하여 기존의 불편사항을 개선하고 실제로 적용한 내용을 예제와 함께 1편과 2편으로 나누어서 소개해드리려고 합니다. 모든 예제 코드..

EC2 스왑메모리 설정 방법
개발/DevOps2025. 1. 13. 01:25EC2 스왑메모리 설정 방법

EC2 스펙이 매우 낮은 경우 가끔 빌드를 하거나 테스트를 수행할 때 메모리 부족으로 인하여 EC2가 먹통이 되는 현상이 자주 일어나는데, 이럴 땐 스왑 메모리 설정을 해주어 사용할 수 있는 메모리를 늘려줄 수 있다. 개인적으로는 사이드 프로젝트를 배포할 때 EC2 인스턴스를 생성하고 필수적으로 해주는 설정이다. 스왑메모리란?스왑메모리는 컴퓨터 시스템에서 물리적인 RAM이 부족할 때, 디스크의 일부를 임시 메모리 공간으로 사용하는 기능을 말한다.주로 운영 체제의 가상 메모리 관리에서 중요한 역할을 한다. - 스왑 메모리는 RAM이 부족할 경우 동작한다. 시스템이 실행 중인 프로그램이나 프로세스가 사용할 수 있는 물리적인 RAM이 부족하면, 덜 자주 사용되는 데이터를 디스크의 스왑 공간으로 옮긴다. 이렇게..

Mysql DATETIME vs TIMESTAMP 차이 정리
개발/Mysql2024. 11. 17. 04:53Mysql DATETIME vs TIMESTAMP 차이 정리

Mysql에서 날짜와 시간을 저장할 때 자주 사용되는 데이터 타입인 DATETIME과 TIMSTAMP는 비슷해 보이지만, 중요한 차이점을 가지고 있습니다. 이 글에서는 두 데이터 타입의 차이점에 대해서 알아보고, 간단하게 실습을 해보겠습니다.실습에 사용된 Mysql 버전은 9.1.0입니다.  차이점DATETIME : 날짜와 시간을 YYYY-MM-DD HH:MM:SS 형식으로 저장하는 데이터 타입입니다.- 시간대(Timezone)에 영향을 받지 않습니다.- 저장 범위: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 TIMESTAMP: Unix Epoch Time(1970년 1월 1일 00:00:01 UTC) 이후의 초 단위로 저장합니다.- 시간대(TimeZone)에 영향을 받습..

Java 리플렉션 정리
개발/Java2024. 11. 15. 01:48Java 리플렉션 정리

안녕하세요 ! 오늘은 Java에서 제공하는 강력한 기능 중 하나인 리플렉션에 대해서 알아보겠습니다.예제에 쓰인 모든 코드는 깃허브 에서 확인하실 수 있습니다. 리플렉션이란?리플렉션이란, 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능입니다.  리플렉션을 이해하기위해서 먼저 JVM의 동작 방식에 대해 살펴볼 필요가 있습니다.1. Java 컴파일러(javac)가 소스코드를 바이트 코드(.class)로 변환합니다.2. 컴파일된 바이트 코드를 클래스 로더에게 전달합니다.3. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 링크하여 런타임 데이터 영역에 올립니다. 여기서 Method Area의 클래스 정보들을 조작할 수 있는 기능이 바로 리플렉션입니다.  어떻게 Method Area에 접근하는가..

Inner Class를 Bean으로 등록할 수 있는 경우와 없는 경우
개발/Spring2024. 11. 13. 11:37Inner Class를 Bean으로 등록할 수 있는 경우와 없는 경우

Inner Class를 Bean으로 등록할 수 없는 경우public class OuterClass { @Component class InnerClass { }}스프링 프로젝트 내부에 위와 같이 선언한 이너 클래스가 있습니다. 이너 클래스에 @Component를 붙여서 Bean으로 등록하려 하면 과연 Bean으로 등록이 잘 될까요? import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplicat..

예제 코드로 알아보는 Spring RestDocs
개발/Spring2024. 11. 13. 08:19예제 코드로 알아보는 Spring RestDocs

서버 API를 개발할 때, 프론트엔드 개발자와의 원활한 소통과 효율적인 관리를 위해 API 명세서를 작성하는 것은 필수적입니다. 다양한 API 문서화 도구가 있지만, 저는 개인적으로 사이드 프로젝트나 업무에서 Spring RestDocs를 선호합니다. Spring RestDocs는 테스트를 기반으로 문서를 생성하기 때문에 API 스펙이 변경되면 문서화 테스트도 수정해야 합니다. 이 과정에서 API 스펙과 실제 문서 간의 불일치를 방지할 수 있습니다. 또한, 프로덕션 코드에는 문서 작성을 위한 코드가 포함되지 않아, 코드의 가독성과 유지보수성이 뛰어납니다. 제가 일하고 있는 회사의 경우, 이전에는 체계적인 API 문서가 없어 프론트엔드 개발자와의 협업이 어려웠습니다. 그러나 Spring RestDocs를 ..

Java CompletableFuture 비동기 처리 학습하기
개발/Java2024. 10. 13. 12:32Java CompletableFuture 비동기 처리 학습하기

java로 개발을 하다보면 비동기적으로 처리를 해서 성능을 높여야 하는 경우가 생깁니다. 저 또한 이런 경우가 많았는데요, 이럴 때 Java에서 제공하는 CompletableFuture를 이용하면 쉽게 해결할 수 있습니다. CompletableFuture에 관하여 검색을 해보니, 박우빈님이 작성하신 CompletableFuture 톺아보기  가 가장 정리가 잘 되어 있어서 한번 따라해보고, 해당 글을 기반으로 저 또한 정리를 해두고자 합니다! CompletableFuture란?CompletableFuture는 Java에서 비동기 프로그래밍을 지원하는 강력한 클래스입니다. Java 8부터 도입되었으며, 사용하기에 따라서 Async-Blocking, Async-Non-Blocking 하게 사용할 수 있습니다..

Jenkins Pipeline Script로 슬랙에 배포 알림 메세지 보내기(2) - 스크립트 작성
개발/DevOps2024. 9. 1. 11:53Jenkins Pipeline Script로 슬랙에 배포 알림 메세지 보내기(2) - 스크립트 작성

안녕하세요? 지난 시간에는 슬랙 알림 메세지를 보내기 위한 토큰발급, 젠킨스 플러그인 설치 및 설정에 대하여 알아보았습니다. 만약 아직 플러그인 설정이 완료되지 않으신 분들은 Jenkins Pipeline Script로 배포 결과 슬랙 알림 메세지로 보내기(1) - 토큰발급, 플러그인 설치 및 설정 을 참고해주시기 바랍니다. 자, 그럼 이번에는 슬랙 알림 메세지를 보내기 위한 파이프라인 스크립트를 작성하고, 실제로 배포 결과를 슬랙 알림 메세지로 받아보겠습니다. Jenkins Pipeline Script로 슬랙 메세지 보내보기파이프라인 스크립트를 작성하기에 앞서 젠킨스 파이프라인은 Scripted와 Declarative 두가지 문법을 지원하는데, 이 글에서는 Declarative Script 문법을 이용..

Jenkins Pipeline Script로 슬랙에 배포 알림 메세지 보내기(1) - 토큰발급, 플러그인 설치 및 설정
개발/DevOps2024. 8. 19. 20:05Jenkins Pipeline Script로 슬랙에 배포 알림 메세지 보내기(1) - 토큰발급, 플러그인 설치 및 설정

제가 일하고 있는 회사에서는 CI 도구로 Jenkins를 사용하여 어플리케이션을 배포하고 있습니다.  위 사진과 같은 flow로 배포를 하고 있는데요. 순서는 다음과 같습니다. 1. 개발자는 열심히 개발을 하여 Bitbucket에 코드를 Push합니다.2. 젠킨스에 접속하여 로그인한 뒤, 배포하고자 하는 Item을 실행합니다.3. 젠킨스는 어플리케이션 서버에 ssh 접속하여, 설정된 Shell Script를 실행하여 어플리케이션을 배포합니다. 위와 같은 flow를 통하여 어플리케이션을 "배포" 하는 것 자체는 굉장히 편했지만, 젠킨스에 직접 들어가보지 않는 이상 다른 구성원들은 지금 배포를 하고있는지 아닌지 모르기 때문에 "배포 직전 수동으로 슬랙 채널에 배포 정보를 올린 뒤 배포하기"를 그라운드 룰로 ..

트랜잭션 전파속성과 UnexpectedRollbackException
개발/ETC2024. 8. 11. 15:37트랜잭션 전파속성과 UnexpectedRollbackException

회사에서 서비스 로그를 보던 중 `UnexpectedRollbackException`이라는 예외가 발생한 에러로그가 종종 발견되었습니다.뭔가 기대하지 않은 롤백이 발생했다는 내용같은데, 왜 롤백이 발생했는지 호기심이 생겨 관련 내용을 쭉 파헤쳐 보았고, 그 과정 속에서 알게된 내용들을 글로 정리해두려 합니다. ※ 아래의 예제 코드들은 전부 여기 에서 확인할 수 있습니다. 예외 상황 재현먼저, 예외가 발생하는 상황을 재현해보고 실습해보기 위하여 아래와 같이 코드를 구성해보겠습니다. - ParentServicepackage com.devchw;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframe..

반응형
image
loading