728x90
반응형

Java 19

[Spring] 실무 예외 처리: 500 에러와 비즈니스 예외(422) 완벽 분리하기 (feat. 하이브리드 패턴)

지난 글에서는 @Valid와 @Validated를 비교하고 ResponseEntityExceptionHandler를 활용해 요청 값의 형식을 검증하는 방법을 다뤘습니다.하지만 실무 개발은 여기서 끝나지 않습니다.입력 값의 형식은 맞지만, 비즈니스 규칙 때문에 거절해야 하는 상황이 훨씬 더 많기 때문이죠."사용자 ID 형식은 맞는데(400 아님), 이미 탈퇴한 회원이라 로그인이 안 돼." "결제 요청 양식은 완벽한데(400 아님), 잔액이 부족해서 결제할 수 없어." 이걸 단순히 400으로 퉁치자니 모호하고, 그렇다고 500을 뱉으면 모니터링 알람이 빗발칩니다.오늘은 비즈니스 예외를 422(Unprocessable Entity)로 명확히 분리하고, 시스템 장애(500)와 공존하며 유연하게 관리하는 실무 패..

Backend/Spring 2026.01.30

[Spring] 메일 발송 실패가 비즈니스 로직을 막지 않도록: RestClient와 @Async 도입기

기존 사내 프로젝트의 메일 발송 모듈은 동기(Synchronous) 방식으로만 동작하고 있었습니다.즉, 메일 서버에 요청을 보내고 응답이 올 때까지 메인 스레드가 기다려야 했고, 무엇보다 "메일 발송 실패 = 전체 로직 실패(Exception & Rollback)"라는 공식이 성립되어 있었습니다.물론 회원가입 인증 메일처럼 발송 성공이 필수적인 로직에서는 이 방식이 맞습니다.하지만, 단순 알림 메일의 경우, 메일 발송이 실패하더라도 핵심 비즈니스 로직(예: 등록 성공, 결재 성공)은 정상적으로 마무리되어야 합니다."주문은 성공했는데 주문 완료 메일 발송이 터졌다고 결제까지 롤백된다면?"이건 사용자 경험(UX) 측면에서 최악의 시나리오입니다.그래서 이번 기회에 Spring 6.1(Boot 3.2)의 Res..

Backend/Spring 2026.01.23

[MSA] Spring Cloud Gateway + Bucket4j로 트래픽 공격 방어하기

MSA(Microservices Architecture)로 프로젝트를 진행하다 보면 서비스가 구체화될수록 보안에 대한 고민이 깊어집니다."누군가 악의적으로 매크로를 돌려 트래픽 공격(Brute Force)을 하면 어떡하지?"라는 걱정, 한 번쯤 해보셨을 텐데요.무차별적인 요청으로 서버 리소스가 고갈되는 것을 막기 위해, 오늘은 Spring Cloud Gateway 앞단에서 트래픽을 제어하는 Rate Limiting 기능을 구현해 보겠습니다.특히, 아직 인프라가 완벽하지 않아 Redis가 없는 환경에서 로컬 캐시를 활용해 빠르게 방어막을 구축하는 방법을 소개합니다.1. 왜 Rate Limiting이 필요할까?서버는 무한한 자원을 가지고 있지 않습니다.특정 IP에서 비정상적으로 많은 요청을 보내면, 정상적인..

[SMTP] 메일에서 base64 이미지 깨지는 현상 CID로 해결해보기

개요사내 메일 서비스 내에서 태그에 base64로 이루어진 이미지들이 깨지는 현상이 발견되었다.원인을 찾아보고자 사내 메일 서비스 담당자에게 연락을 취했으나"base64를 사용하는 이미지는 지원하지 않으며 https로 되어있는 url을 직접 걸어 이미지를 붙이면 됩니다." 라는 답변을 받았다하지만 현재 MSA의 서비스 구성상 https로 열려있는 파일 서비스가 없었으며, gateway를 제외한 서비스는 모두 내부망으로 되어있다.gateway를 통해 파일 서비스의 특정 디렉토리의 파일만 접근 가능하게 구현은 할 수 있으나 이런 방식은 올바른 형식이 아니라 판단되어 다른 방법을 고민했다.해결 방안메일 서비스에서는 CID(Content ID)라는 기능이 있었다.메일 본문 내에 포함된 이미지에 고유 식별자를 ..

Backend/Java 2025.11.11

[java] 한/영 타자 전환 클래스 만들기

최근 보안팀에서 Password에 개인 정보가 포함될 경우에는 패스워드 변경이 불가하게 해 달라는 지적사항이 들어왔다.2025년에 아직까지도 안막아둔게 이상하긴 하지만... 부랴부랴 로직을 짜기 시작했다.근데 개인 정보가 포함되지 않게 하려면 사람 이름도 포함이 되면 안 되는데, DB에 이름은 한글로 저장이 되어있으니 이것을 판단하려면 한/영 타자 전환 클래스를 만들어서 판단해야 했다.그래서 한글 -> 영어 변환 클래스를 만들었다.구현 public class KoreanToEnglishHelper { final static char[] initialConsonantList = {'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', '..

Backend/Java 2025.09.30

9. [java] 조건문 if문, switch문

if문 조건식 결과에 따라 블록 실행 여부가 결정된다. 조건식에는 true/false 결과값을 가지는 비교연산자나 논리연산자 혹인 boolean 타입 변수가 사용된다. if문의 기본 구조는 if (조건식){ 실행문; 실행문; } 위와 같다. 만약 조건식이 참(true) 이면 아래의 실행문들을 실행하고, 그렇지 않고 거짓(false) 라면 실행하지 않고 넘어가게 되는 구조이다. if(조건문) 실행문; 만약 실행문이 한줄이라면 위와같이 쓸 수 있다. 한줄만 사용할 때 실행문을 아래줄로 내리면 가독성이 굉장히 불편해지고, 위와같이 우측으로 빼는경우도 실행문이 짧을 때만 사용해주고 어지간하면 중괄호{,} 를 이용해서 사용해주도록 하자. if문은 조건문이 만족할경우 실행하는 것이지만, 만약 if문을 만족하지 못할..

Backend/Java 2021.06.15

3. [java] 변수(Variable) 선언과 초기화(Declare & initialization)

변수(Variable)란 메모리 공간을 차지하여 값을 저장할 수 있는 이름을뜻한다. 언어마다 변수를 사용하는 방법은 좀씩 다르지만 거의 모든 언어에서 변수가 사용되며, 변수를 지정할땐 중요한 2가지가 있다. 첫번째로는 변수를 사용하기 위해선 반드시 '선언(declare)'이 필요하다. 기본적으로 변수는 위와 같이 선언한다. 좌측에는 변수 타입을 선언해주고 우측에는 그에 따른 내가 사용할 변수 명을 적는다. 변수 타입같은 경우는 제한되어져서 몇가지가 정해져있다. 변수 타입에 대해서는 다음번에 자세하게 기술하도록 하고, 변수 명에서도 몇가지 규칙이 존재한다. * 첫 글자는 반드시 문자이거나 '&', '_'로 시작해야 한다. 숫자나 다른것으로 첫 글자를 사용하게 되면 에러가 발생한다. * 영어의 대소문자는 구..

Backend/Java 2021.06.09

2. [java] 프로젝트 생성하기 및 Hello World 출력하기

오늘은 자바로 프로젝트를 생성하여서 소스코드 작성후에 Hello World 를 출력해볼 것이다. 우선 cmd(명령 프롬프트)로 자바가 어떤 방식으로 동작하는지 확인해본다. 자바는 기본적으로 위와 같이 작동하게 된다. 처음으로 자바 소스코드를 작성하고 그것을 javac의 명령어로 컴파일을 하게 되면 class파일의 형식으로 바이트코드 파일이 형성된다. 그리고 그 파일을 실행하면 터미널에 Hello가 출력되는 것을 볼 수 있다. 우선 메모장을 이용해 아래와 같이 작성해주었다. public class Hello { public static void main(String[] args){ System.out.println("Hello!"); } } 그후 저장을 txt 파일이 아니라 .java 파일로 저장해주고 c..

Backend/Java 2021.06.08

1. [java] JAVA설치 및 개발 환경 구축

java는 현재 웹 어플리케이션 개발에 가장 많이 사용되는 언어 중 하나이다. 객체지향언어를 사용하고 있고, 큰 특징 중 하나가 모든 운영체제에서 실행이 가능하다는 점이다. 따라서 윈도우에서 개발을 하고 그것을 리눅스 운영체제로 옮겨도 똑같이 컴파일하여 실행할 수 있다. 자바는 기본적으로 실행용 JRE와 개발용 JDK로 나뉘어져있고, JRE같은 경우는 무료로 쉽게 이용할 수 있다. 개발용 JDK같은 경우에는 또 Open JDK와 Oracle JDK로 나뉘어져 있고, Open JDK같은 경우에는 자바가 잘 동작하는지 테스트용으로만 사용되기 때문에 오늘은 교육용 무료 Oracle JDK를 설치하고 개발환경을 구축할 것이다. JDK 8.202까진 무료로 제공되기 때문에 구글에 JDK 8.202라 검색을 해주면..

Backend/Java 2021.06.07