Spring(6)
-
알림톡과 예약 시스템의 트랜잭션 분리 - 아웃박스 패턴 도입기
문제 상황시작은 이랬습니다.“앤디(영어이름), 서버에 알림톡 에러 났다는 버그가 있던데요?”“앤디, 항공권이 예약이 제대로 안 됐다는데 확인좀 부탁드려요.”이런 문의가 들어왔을 때 가장 먼저 확인하는 것이 예약 상태입니다.일반적으로는 예약 실패시 즉시 사용자에게 피드백이 가야하는데, 해당 건은 예약도 실패했고 알림도 실패한 상황이었죠.로그를 확인해보니 ApiPlex(카카오 알림톡 대행사)와의 통신 오류로 인해 알림톡 발송에 실패했고, 이 실패가 예약 트랜잭션을 롤백시킨 것이었습니다.더 큰 문제는 사용자는 예약을 시도했다가 실패했다는 것조차 알 수 없었다는 점입니다.이는 출장 예약 시스템에서는 심각한 문제였습니다.항공권이나 호텔의 경우 실시간 재고(좌석, 객실)가 중요한데, 알림톡 장애로 인해 예약이 실패..
2025.01.29 -
비즈니스 확장성을 고려한 알림톡 발송 시스템 개선기: 전략 패턴의 실전 적용
알림톡이란?알림톡은 카카오톡이 제공하는 기업용 메시징 서비스입니다.일반적인 카카오톡 메시지와는 달리, 알림톡은 사용자가 해당 카카오톡 채널을 친구로 추가하지 않아도 정보성 메시지를 발송할 수 있다는 특징이 있습니다.기업들은 주로 주문 내역, 예약 확인, 배송 현황 등 사용자에게 꼭 필요한 정보를 전달하는 용도로 사용됩니다.알림톡의 장점은 다음과 같습니다:친구 추가가 없어도 발송 가능최대 1,000자까지 텍스트 전송 가능버튼을 통한 액션 유도 (최대 5개)높은 도달률과 신뢰도스팸이나 피싱의 위험이 낮음출장관리시스템에서의 알림톡 활용저희 회사가 만드는 출장관리시스템(이하 BTMS)에서는 다음과 같은 상황에서 알림톡을 활용하고 있습니다:항공권 예약 알림미확정(예약 실패)예약 완료 알림에약 취소발권 완료체크인 ..
2025.01.26 -
회사의 기존 인증/인가 시스템 유지보수 및 새로운 방안 도입
1. 배경과 한계저는 회사의 기존 인증/인가 시스템을 개선하기 위한 작업을 진행했습니다. 회사는 Spring Security를 사용해 인증/인가 시스템을 구축하려 했으나, 도입 과정에서 여러 문제에 직면했습니다. Spring Security는 강력한 기능을 제공하지만, 설정이 복잡하고 유지보수가 어려운 단점이 있었습니다.또한, 기존 전역 필터와 새롭게 도입하려는 Spring Security Filter Chain 간의 충돌 문제가 발생했습니다. 기존 시스템은 전역 필터를 통해 인증과 인가를 처리하고 있었고, 이 필터들이 Spring Security의 Security Context를 사용하고 있었습니다. 이로 인해 새로운 Spring Security Filter Chain과 충돌이 발생했고, 이를 해결하기..
2024.10.13 -
HttpMediaTypeNotAcceptableException: Could not find acceptable representation
위와 같은 코드를 작성했고 이 Controller에서 DB 조회 후 MemberResponseDTO에 담아 보내게 되는 단순한 로직이다. 전에는 갑자기 잘 되던 api 가 ResponseDTO로 바꾸고 나서 잘 안 되길래 뭔가 싶더니 HttpMediaTypeNotAcceptableException라는 에러가 났다. 그래서 직접 에러를 검색해 보니, 클라이언트가 받을 수 있는 response를 만들 수 없다는 에러이다. 실제로 postman에서도 다음과 같은 에러가 나온다. 하지만 로그를 보면 즉, DB에 쿼리를 하는 과정까지는 문제가 아니었음을 알 수 있다. 그렇다면 쿼리를 하고 나서 클라이언트에게 올바를 형태를 주지 못한다는 것이고, 그래서 DTO를 봤더니 @Getter 가 없었다. 여러분은 꼭 @Ge..
2023.10.30 -
비밀번호의 암호화 위치, 엔티티 내부 vs 서비스 계층?
위와 같은 단순한 게시판 프로젝트를 진행 중에 있다. 회원 엔티티의 password 필드는 프론트엔드에게서 받은 비밀번호를 암호화하여 저장하는 필드이다. 회원가입을 할 때 보통은 이 암호화라는 작업을 MemberService 계층 안에서 작업한다. public class MemberService { private final MemberRepository memberRepository; private final PasswordEncoder passwordEncoder; //회원 등록 @Transactional public void registerMember(MemberRegiDTO memberRegiDTO) { String name = memberRegiDTO.getName(); String passwor..
2023.10.17 -
Spring MVC? MVC 패턴? 뭐가 다른 건가
스프링의 정석(이하 스정)에서 Spring MVC 에 대한 이론적인 정리를 했을 때 다음과 같았다. 1. 컨트롤러의 코드들을 크게 분류하면 3 가지이다 입력 처리 출력 2. 각 컨트롤러마다 처리의 과정은 다르지만, 입출력의 과정은 거의 비슷하다. 즉, 모든 컨트롤러가 위의 3 가지를 다 가지고 있다면 입출력 코드의 중복을 초래한다. 3. 이를 위해 모든 입력을 받는 DispatcherServlet 을 만들고, 들어온 입력에 대해 처리를 하는 Controller, 그리고 이러한 처리의 결과를 출력한 View 로 나누게 된다. 4. 이때 Controller 와 View 는 별개이므로, 처리의 결과물을 출력쪽으로 보내기 위한 매개체로 Model 을 사용한다. 그리고 이는 DispatcherServlet 이 만..
2022.09.28