알림톡 사용법 가이드

개요

알림톡은 **CommonModule의 IAlimtalkService**를 통해 간단하게 발송할 수 있습니다.

특징


기본 사용법

1️⃣ Service에 IAlimtalkService 주입

import com.akc.b2c.common.service.IAlimtalkService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class YourService { @Autowired private IAlimtalkService alimtalkService; // 나머지 코드... }

2️⃣ 알림톡 발송 (2가지 방법중 선택 사용)

방식 1️⃣: 편의 메서드 - 더 간단하고 직관적

alimtalkService.send( memberId, // 회원 ID (또는 null) "01012345678", // 수신자 전화번호 "APH0001", // 템플릿 ID Map.of( "전화번호", "01012345678", "가입일시", LocalDateTime.now().toString() ) );

방식 2️⃣: AlimtalkRequest 빌더 - 더 명확하고 확장성 좋음

alimtalkService.send( AlimtalkRequest.builder() .memberId(1L) // 회원 ID .phoneNumber("01012345678") // 수신자 전화번호 .templateId("APH0001") // 템플릿 ID .templateParams(Map.of( "전화번호", "01012345678", "가입일시", LocalDateTime.now().toString() )) .build() );

템플릿 ID 목록

📋 등록된 알림톡 템플릿 (총 24개)

탬플릿아이디 | 필수로 포함할 파라미터들,
알림 메세지 내용 일부분

회원 관련 템플릿 - APH (개인회원, 8개)

APH0001 | 전화번호, 가입일시
[아마노파킹허브] 회원가입을 축하합니다! 든든한 파킹 파트너, 아마노파킹에 오신 것을...

APH0002 | 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 주의안내
[아마노파킹허브] 상품구매 완료 주차장 이용권을 구매하셨습니다. [구매내역] 상품명...

APH0003 | 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 상품 환불 승인 안내 요청하신 상품의 환불이 승인되었습니다. 환불은...

APH0004 | 거절사유, 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 상품 환불 거절 안내 [거절사유] [구매내역] 상품명: #{상품명}...

APH0005 | 취소사유, 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 강제 취소사유 안내 [취소사유] [구매내역] 상품명: #{상품명} 차량번호...

APH0006 | 상품명, 차량번호, 주차장명, 이용날짜
[아마노파킹허브] 상품 만료 전 안내 이용 중인 정기권이 7일 후 만료될 예정입니다.

APH0007 | 결제실패사유, 상품명, 사용종료일, 주차장명, 차량번호
[아마노파킹허브] 자동연장 - 만료 7일 전 안내! 정기권 사용 기간이 곧 만료됩니다.

APH0008 | 주차장명, 동/호수
아마노파킹 허브 [동/호수 사용자 승인 안내] 신청하신 주차장의 내부정기권 사용자 승인이...

인증/계정 관련 템플릿 - APHA (5개)

APHA0001 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 상품 취소가 발생 했습니다. 유저타입: #{유저타입}...

APHA0002 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 환불요청건이 대기중 입니다. 유저타입: #{유저타입}...

APHA0003 | 유저타입, 주차장명, 동/호수, 회사명, 아이디
아마노파킹 허브(관리자) 새로운 [동/호수 승인 요청] 요청이 등록되었습니다. 유저타입...

APHA0004 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 장바구니 승인요청건이 등록 되었습니다. 유저타입...

APHA0005 | 유저타입, 주문번호, 상품명, 기존차량번호, 변경차량번호, 주차장명, 회사명
[관리자아마노파킹]차량변경 신청 새로운 차량 변경 신청건 입니다. 유저타입: #{유저타입}...

법인회원 관련 템플릿 - APHB (11개)

APHB0001 | 법인명, 아이디, 가입일시
아마노 파킹 허브(기업전용) 법인 회원가입을 환영합니다! 귀사의 든든한 파킹 파트너,...

APHB0002 | 상품명, 차량번호, 신청차량수, 주차장명, 승인요청일
아마노 파킹 허브(기업전용) [장바구니 상품 승인 안내] 요청하신 상품이 승인되었습니다....

APHB0003 | 거절사유, 상품명, 차량번호, 신청차량수, 주차장명, 승인요청일
아마노 파킹 허브(기업전용) [장바구니 상품 승인 거절 안내] 요청하신 상품의 승인이...

APHB0004 | 주차장명, 동/호수
아마노파킹 허브(기업전용) [동/호수 사용자 승인 안내] 신청하신 주차장의 내부정기권...

APHB0005 | 주차장명, 동/호수, 거절사유
아마노파킹 허브(기업전용) [동/호수 사용자 거절 사유 안내] 신청하신 주차장에 내부정기권...

APHB0006 | 상품명, 기존차량번호, 변경차량번호, 주차장명
아마노파킹 허브(기업전용) [차량변경 거절 사유 안내] 신청하신 차량번호 변경이 거절되었습니다....

APHB0007 | 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [상품 환불 승인 안내] 요청하신 상품의 환불이 승인되었습니다....

APHB0008 | 거절사유, 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [상품 환불 거절 안내] #{거절사유} [구매내역] 상품명...

APHB0009 | 취소사유, 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [강제 취소사유 안내] #{취소사유} [구매내역] 상품명...

APHB0010 | 상품명, 사용종료일, 주차장명, 차량번호, 차량신청대수
아마노파킹 허브(기업전용) [상품 만료 전 안내] 이용 중인 정기권이 3일 후 만료될...

APHB0011 | 결제실패사유, 상품명, 사용종료일, 주차장명, 차량번호, 차량신청대수
아마노파킹 허브(기업전용) [자동연장 결제 실패 안내] 정기권 사용 기간이 곧 만료됩니다.


코드 예시

예시 1: 회원가입 완료 알림

public class AuthService { @Autowired private IAlimtalkService alimtalkService; public UserResponse registerUser(UserRegisterRequest request) { // 회원가입 로직 User newUser = createUser(request); // 알림톡 발송 try { alimtalkService.send( newUser.getId(), newUser.getPhoneNumber(), "APH0001", // 개인회원 가입 완료 템플릿 Map.of( "전화번호", newUser.getPhoneNumber(), "가입일시", LocalDateTime.now().toString() ) ); } catch (Exception e) { log.error("알림톡 발송 실패", e); // 알림톡 실패해도 회원가입은 진행 } return UserResponse.from(newUser); } }

예시 2: 예약 확정 알림

public class ReservationService { @Autowired private IAlimtalkService alimtalkService; public ReservationResponse confirmReservation(Long reservationId) { Reservation reservation = getReservationById(reservationId); // 예약 상태 업데이트 reservation.setStatus(ReservationStatus.CONFIRMED); save(reservation); // 알림톡 발송 alimtalkService.send( reservation.getMemberId(), reservation.getMemberPhone(), "APH0002", // 상품구매 완료 템플릿 Map.of( "상품명", reservation.getParkingLotName(), "차량번호", reservation.getVehicleNo(), "주차장명", reservation.getParkingLotName(), "이용날짜", reservation.getUsageDate().toString(), "결제금액", reservation.getPrice().toString() ) ); return ReservationResponse.from(reservation); } }

예시 3: 결제 완료 알림

public class PaymentService { @Autowired private IAlimtalkService alimtalkService; public PaymentResponse processPayment(PaymentRequest request) { // 결제 처리 Payment payment = createPayment(request); payment.setStatus(PaymentStatus.COMPLETED); save(payment); // 알림톡 발송 alimtalkService.send( payment.getMemberId(), payment.getMemberPhone(), "APP0002", // 결제 완료 안내 템플릿 Map.of( "주차장명", payment.getParkingLotName(), "금액", payment.getAmount().toString(), "결제일시", payment.getPaymentTime().toString() ) ); return PaymentResponse.from(payment); } }

예시 4: 전화번호 변경 알림

public class MemberService { @Autowired private IAlimtalkService alimtalkService; public void updatePhoneNumber(Long memberId, String newPhoneNumber) { Member member = getMemberById(memberId); String oldPhoneNumber = member.getPhoneNumber(); // 전화번호 업데이트 member.setPhoneNumber(newPhoneNumber); save(member); // 알림톡 발송 (기존 전화번호로) alimtalkService.send( memberId, oldPhoneNumber, "APH0002", // 전화번호 변경 안내 템플릿 Map.of( "기존전화번호", oldPhoneNumber, "신규전화번호", newPhoneNumber, "변경일시", LocalDateTime.now().toString() ) ); } }

자주 사용하는 패턴

패턴 1: 비동기 발송 (권장)

@Async public void sendAlimtalkAsync(Long memberId, String phoneNumber, String templateId, Map<String, String> params) { try { alimtalkService.send(memberId, phoneNumber, templateId, params); } catch (Exception e) { log.error("비동기 알림톡 발송 실패 - Phone: {}, Template: {}", phoneNumber, templateId, e); } } // 사용 sendAlimtalkAsync( member.getId(), member.getPhoneNumber(), "APH0001", Map.of("전화번호", member.getPhoneNumber(), "가입일시", LocalDateTime.now().toString()) );

패턴 2: 여러 명에게 발송

public void sendBulkAlimtalk(List<MemberInfo> members, String templateId, Map<String, String> params) { for (MemberInfo member : members) { try { alimtalkService.send( member.getId(), member.getPhoneNumber(), templateId, params ); } catch (Exception e) { log.warn("알림톡 발송 실패: {} ({})", member.getId(), member.getPhoneNumber(), e); } } } // 사용: 법인회원 신청 목록에 알림 발송 List<MemberInfo> newMembers = memberRepository.findNewCorporateMembers(LocalDate.now()); sendBulkAlimtalk(newMembers, "APHB0001", null);

패턴 3: 조건부 발송

public void sendConditionalAlimtalk(Member member, String templateId, Map<String, String> params) { // 알림 수신 동의 확인 if (member.isAlimtalkNotificationEnabled()) { alimtalkService.send( member.getId(), member.getPhoneNumber(), templateId, params ); } else { log.info("회원 {} - 알림톡 수신 비동의", member.getId()); } } // 사용: 예약 확정 시 회원 수신 의사 확인 후 발송 Reservation reservation = confirmReservation(reservationId); sendConditionalAlimtalk( reservation.getMember(), "APP0001", Map.of("예약번호", reservation.getNo(), "주차장명", reservation.getParkingLot().getName()) );