Spring
[SpringBoot] AWS S3 상품 이미지 등록과 고아객체 처리 구현 예제
[SpringBoot] AWS S3 상품 이미지 등록과 고아객체 처리 구현 예제
2025.05.06상품 이미지 업로드 기능을 개발할 때는 단순히 파일을 저장하는 것에서 끝나지 않습니다. 저장소 선택, 업로드 방식, 그리고 사용되지 않는 리소스`(고아객체)`의 정리까지 종합적으로 고려해야 합니다. 특히 AWS S3와 같은 외부 스토리지를 사용하는 경우, 고아 객체를 방치하면 스토리지 비용은 물론, 전체 시스템의 관리 복잡도까지 높아질 수 있습니다.이번 포스팅에서는 고아 객체란 무엇인지, 상품 등록 과정에서 발생할 수 있는 고아 객체를 어떻게 처리할 수 있는지 A부터 Z까지 상세하게 알아보도록 하겠습니다. 1. 고아 객체(Orphan Object)란?`고아 객체(Orphan Object)`란, 더 이상 애플리케이션에서 참조하지 않지만 스토리지에는 여전히 남아있는 데이터를 의미합니다. 다음과 같은 상황으로..
[SpringBoot] Spring Docs + Swagger 적용하여 API 문서 자동화하기
[SpringBoot] Spring Docs + Swagger 적용하여 API 문서 자동화하기
2025.02.20API 문서화는 개발자들 간의 원활한 협업을 위한 필수 요소입니다. 명확한 문서가 없다면 API 사용법을 제대로 전달하기 어려워지고, 그로 인해 개발 과정에서 혼란이나 유지보수에 어려움을 겪을 수 있습니다.특히, API의 변경 사항이 있을 때마다 문서도 수동으로 업데이트 해야 한다면, 번거롭고 오류가 발생할 위험 또한 증가하게 됩니다. 이런 문제를 `Swagger`를 통해 해결할 수 있습니다.이번 포스팅에서는 Swagger란 무엇인지, 적용하는 방법, 사용되는 어노테이션에 대해 알아보겠습니다. Swagger란?`Swagger`는 웹 서비스 명세를 문서화 해주는 OpenAPI기반의 프레임워크로, 웹 서비스의 로직 수행, 요청 데이터, 응답 데이터가 무엇인지 정리해서 문서화를 자동화 해주는 기술입니다.웹 애..
[SpringBoot] Scale-out 환경에서 발생하는 Scheduler 중복 실행 문제 Shedlock으로 해결하기
[SpringBoot] Scale-out 환경에서 발생하는 Scheduler 중복 실행 문제 Shedlock으로 해결하기
2025.02.06스케줄러(Scheduler)를 사용해 정해진 시간에 반복 작업을 실행하고자 할 때, 다중 인스턴스 환경에서는 같은 작업이 여러 인스턴스에서 동시에 실행되는 상황이 발생하게 됩니다.이번 포스팅에서는 `ShedLock`의 개념과 라이브러리를 활용하여 여러 인스턴스에서 Scheduler 사용 시 발생하는 문제를 해결하는 방법에 대해 알아보도록 하겠습니다. 문제 상황Scheduler를 적용하면 지정한 일정 시간마다 실행하게 됩니다.그런데 만약 여러 인스턴스 서버(Scale-out)를 띄울 경우 각 서버마다 존재하는 Scheduler가 동작하게 될 것입니다. @Scheduled(zone = "Asia/Seoul", cron = "*/1 * * * * *") // 1초 간격으로 실행public void run() ..
[SpringBoot] 트랜잭션 전파 속성 (Transaction propagation)
[SpringBoot] 트랜잭션 전파 속성 (Transaction propagation)
2025.02.02애플리케이션을 개발할 때 데이터의 일관성을 유지하고 안정적인 동작을 보호하기 위해 트랜잭션 관리가 필수적입니다.트랜잭션은 데이터를 처리하는 동안 발생할 수 있는 오류나 시스템 장애에 대비해 작업을 `롤백(rollback)`하거나 `커밋(commit)`하는 중요한 역할을 합니다. `트랜잭션 전파(Transaction Propagation)`는 여러 개의 트랜잭션이 서로 어떻게 상호작용하고, 하나의 트랜잭션이 다른 트랜잭션에게 어떻게 영향을 미칠지 결정하는 중요한 개념입니다.이번 포스팅에서는 트랜잭션 전파에서 각 속성들의 개념과 동작과정에 대해 알아보도록 하겠습니다. 트랜잭션 전파 속성(Transaction Propagation)이란?Spring이 제공하는 선언적 트랜잭션(@Transactional)은 여러..
[SpringBoot] AWS S3 다중 이미지 파일 업로드 및 삭제 구현하기 (feat. MultipartFile)
[SpringBoot] AWS S3 다중 이미지 파일 업로드 및 삭제 구현하기 (feat. MultipartFile)
2025.01.17이미지와 같은 정적 파일을 효율적으로 관리하는 것은 웹 애플리케이션 개발에서 자주 마주하게 됩니다. 이때, 클라우드 기반 저장소인 `AWS S3 (Simple Storage Service)`는 높은 확정성과 안정성을 제공합니다. 이번 포스팅에서는 Java 기반 Spring Boot 환경에서 `MultipartFile`방식을 활용하여 다중으로 `AWS S3`에 이미지파일을 업로드하는 방법과 업로드된 이미지파일을 삭제하는 방법에 대해 알아보도록 하겠습니다. MultipartFile 업로드 방식 개념시작하기에 앞서 `MultipartFile 업로드 방식의 개념`에 대해 먼저 알아보도록 하겠습니다. `MultipartFile`은 Spring에서 제공하는 인터페이스로, 파일 업로드를 간편하게 처리할 수 있도록..
[SpringBoot] @Scheduled를 이용한 스케줄러 구현
[SpringBoot] @Scheduled를 이용한 스케줄러 구현
2025.01.13Spring 프레임워크에서 제공하는 @Scheduled어노테이션은 주기적으로 실행해야 하는 작업 데이터 정리, 알림 전송, 백업 등의 작업을 자동화하는 도구입니다.이번 포스팅에서는 @Scheduled어노테이션에 대한 개념과 이를 활용한 주기적인 작업 실행 예제를 다뤄보도록 하겠습니다. @Scheduled 란?`@Scheduled`는 Spring에서 제공하는 스케줄링 작업을 정의하는 어노테이션입니다. 이를 통해 특정 메서드를 주기적으로 실행하거나, 예약된 시간에 실행하도록 설정할 수 있습니다.Spring에서 `@Scheduled` 어노테이션은 기본적으로 `싱글 스레드`에서 실행되며, 만약 두 개 이상의 `@Scheduled` 작업이 정의되어 있어도, 별도의 `병렬 스케줄링 설정`을 하지 않으면 순차적으로 ..
[SpringBoot] AWS SES로 이메일 전송 기능 구현하기
[SpringBoot] AWS SES로 이메일 전송 기능 구현하기
2025.01.12이번 포스팅에서는 AWS SES 환경을 구축하고 Java SpringBoot에서 HTML 템플릿 기반의 이메일을 전송하는 방법에 대해 알아보도록 하겠습니다. AWS SES 란?AWS`Amazon Web Service`에서 제공하는 SES`Simple Email Service`는 클라우드 기반의 이메일 발송 서비스로 Email 전송 서비스를 이용할 수 있는 라이브러리입니다. AWS 환경 구축AWS 사이트에 접속 후 로그인 한 뒤 `우측 상단`에 위치한 리전을 서울로 설정합니다. `좌측 상단` 검색창을 통해 `ses`를 검색하여 `Amazon Simple Email Service`를 선택합니다. 이후 좌측 `자격 증명`탭을 선택하여 `자격 증명 생성`을 선택하여 자격 증명 생성을 시작합니다. `이메일 주소`..
[SpringBoot] 다양한 동시성 제어 방법
[SpringBoot] 다양한 동시성 제어 방법
2024.12.20동시성 제어는 여러 `스레드`나 `프로세스`가 공유 자원에 접근할 때 발생할 수 있는 문제를 방지하고, 데이터의 무결성을 유지하기 위한 방법입니다. 이를 해결하기 위한 여러 가지 접근법이 있으며, 각 방법마다 특정한 상황에서 효과적인 성능을 낼 수 있습니다.이번 포스팅에서는 다양한 동시성 제어 기법에 대한 개념과 예제를 통해 동시성 문제를 해결하는 방법을 알아보도록 하겠습니다. 동시성 제어에 대해 알아보기 전 레이스 컨디션`Race Condition`, 데드락`DeadLock`이란 무엇인지 먼저 알아보도록 하겠습니다. 레이스 컨디션(Race Condition)이란?레이스 컨디션은 여러 스레드나 프로세스가 동시에 공유 자원을 액세스하고자 할 때 발생하는 문제로, 이때 자원에 대한 경쟁 상태`race`가 ..
[SpringBoot] Prometheus, Grafana를 이용한 모니터링
[SpringBoot] Prometheus, Grafana를 이용한 모니터링
2024.12.10애플리케이션의 메트릭과 상태를 모니터링하는 것은 애플리케이션의 성능을 개선하고, 보다 나은 관리를 가녕하게 하며, 최적화되지 않은 동작을 발견하는데 큰 도움이 됩니다.이번 포스팅에서는 데이터 메트릭을 수집하는 `Prometheus`, 이를 시각화 하는 `Grafana`를 활용하여 `SpringBoot`에서 모니터링 환경을 구축하는 방법에 대해 알아보겠습니다. Prometheus`Prometheus`는 애플리케이션 트래픽에 대한 데이터를 수집합니다. 이를 통해 `CPU 사용량`, `메모리 사용률`, `요청 수`, `응답 시간` 등의 애플리케이션 성능 데이터를 추적할 수 있습니다.애플리케이션의 `/actuator/prometheus` 엔드포인트를 통해 이러한 메트릭 데이터를 확인할 수 있으며, `Promet..
[Spring] Redis를 사용한Session 로그인 구현, Security없이 인증, 인가 구현
[Spring] Redis를 사용한Session 로그인 구현, Security없이 인증, 인가 구현
2024.11.14애플리케이션의 인증과 인가는 사용자와 시스템 간의 신뢰를 형성하는 중요한 요소이며, 이를 통해 사용자의 신원 확인 및 접근 권한을 관리함으로써 보안성을 높일 수 있습니다.이번 포스팅에서는 `Session과 Redis`의 개념을 간단히 살펴본 후, `Redis를 세션 스토리지로 사용하는 로그인 구현`과 Spring Security 없이 `Custom Annotation을 통한 인증/인가`를 구현하는 방법을 알아보겠습니다. Session 이란? Session이란, 클라이언트와 서버 간의 상태를 유지하기 위한 방법으로, 사용자가 로그인하여 인증된 후 해당 사용자의 정보를 일정 기간 동안 서버가 기억할 수 있도록 합니다.HTTP는 기본적으로 비상태성`stateless`을 지니고 있어, 각 요청은 서로 독립적입니..
[Spring] offset, no offset 차이점과 페이지네이션 구현예제
[Spring] offset, no offset 차이점과 페이지네이션 구현예제
2024.10.23웹 서비스에서 페이지네이션은 흔하게 사용되는 기능 중 하나입니다.데이터를 효율적으로 조회하기 위해 많은 서비스에서 이 기능을 적용하고 있습니다. 데이터 조회에 대한 기능을 구현하며 페이지네이션 방식 중 offset과 no offset 방식의 페이지네이션에 대해 알게 되었고 이 두 가지 방식의 차이점과 각 방식에 대한 사용성에 대해 정리하고자 합니다. 이번 포스팅에서는 페이지네이션 기능 중 일반적으로 사용되는 `offset`과 `no offset`의 차이점과 각 기능의 장단점, 성능차이에 대해 알아보도록 하겠습니다.offset 이란?페이지네이션의 offset 방식은 주어진 페이지 번호(offset)에 따라 데이터를 조회하는 방법입니다.이 방식은 SQL 쿼리에서 LIMIT와 OFFSET을 사용하여 데이터를 ..
[Spring] RequestBody, Response의 값이 null 일 때, JSON의 직렬화 역직렬화
[Spring] RequestBody, Response의 값이 null 일 때, JSON의 직렬화 역직렬화
2024.10.10데이터 생성, 수정 등을 Postman을 통해 테스트하던 중 Request와 Response과정에서 에러가 발생하였습니다. Request Error`SQLIntegrityConstraintViolationException` Response Error`HttpMediaTypeNotAcceptableException`Request, Response 두 에러가 발생하였는데 에러내용으로 확인했을 때 많은 이유가 존재하지만 필자의 경우 결국 직렬화, 역직렬화 과정에서 null 값으로 처리되어 발생한 에러였습니다. 이번 포스팅에서는 에러가 발생한 원인인 null 값으로 처리되는 이유와 해결방법에 대해 알아보겠습니다. 우선 null 값으로 처리되는 이유와 해결방법에 대해 알아보기 전, JSON과 직렬화, 역직렬화에 ..