알림톡은 **CommonModule의 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;
// 나머지 코드...
}
방식 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()
);
탬플릿아이디 | 필수로 포함할 파라미터들,
알림 메세지 내용 일부분
APH0001 | 전화번호, 가입일시
[아마노파킹허브] 회원가입을 축하합니다! 든든한 파킹 파트너, 아마노파킹에 오신 것을...
APH0002 | 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 주의안내
[아마노파킹허브] 상품구매 완료 주차장 이용권을 구매하셨습니다. [구매내역] 상품명...
APH0003 | 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 상품 환불 승인 안내 요청하신 상품의 환불이 승인되었습니다. 환불은...
APH0004 | 거절사유, 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 상품 환불 거절 안내 [거절사유] [구매내역] 상품명: #{상품명}...
APH0005 | 취소사유, 상품명, 차량번호, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
[아마노파킹허브] 강제 취소사유 안내 [취소사유] [구매내역] 상품명: #{상품명} 차량번호...
APH0006 | 상품명, 차량번호, 주차장명, 이용날짜
[아마노파킹허브] 상품 만료 전 안내 이용 중인 정기권이 7일 후 만료될 예정입니다.
APH0007 | 결제실패사유, 상품명, 사용종료일, 주차장명, 차량번호
[아마노파킹허브] 자동연장 - 만료 7일 전 안내! 정기권 사용 기간이 곧 만료됩니다.
APH0008 | 주차장명, 동/호수
아마노파킹 허브 [동/호수 사용자 승인 안내] 신청하신 주차장의 내부정기권 사용자 승인이...
APHA0001 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 상품 취소가 발생 했습니다. 유저타입: #{유저타입}...
APHA0002 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 환불요청건이 대기중 입니다. 유저타입: #{유저타입}...
APHA0003 | 유저타입, 주차장명, 동/호수, 회사명, 아이디
아마노파킹 허브(관리자) 새로운 [동/호수 승인 요청] 요청이 등록되었습니다. 유저타입...
APHA0004 | 유저타입, 주문번호, 상품명, 상품유형, 신청구분, 차량번호, 신청차량수, 주차장명, 회사명
아마노파킹 허브(관리자) 새로운 장바구니 승인요청건이 등록 되었습니다. 유저타입...
APHA0005 | 유저타입, 주문번호, 상품명, 기존차량번호, 변경차량번호, 주차장명, 회사명
[관리자아마노파킹]차량변경 신청 새로운 차량 변경 신청건 입니다. 유저타입: #{유저타입}...
APHB0001 | 법인명, 아이디, 가입일시
아마노 파킹 허브(기업전용) 법인 회원가입을 환영합니다! 귀사의 든든한 파킹 파트너,...
APHB0002 | 상품명, 차량번호, 신청차량수, 주차장명, 승인요청일
아마노 파킹 허브(기업전용) [장바구니 상품 승인 안내] 요청하신 상품이 승인되었습니다....
APHB0003 | 거절사유, 상품명, 차량번호, 신청차량수, 주차장명, 승인요청일
아마노 파킹 허브(기업전용) [장바구니 상품 승인 거절 안내] 요청하신 상품의 승인이...
APHB0004 | 주차장명, 동/호수
아마노파킹 허브(기업전용) [동/호수 사용자 승인 안내] 신청하신 주차장의 내부정기권...
APHB0005 | 주차장명, 동/호수, 거절사유
아마노파킹 허브(기업전용) [동/호수 사용자 거절 사유 안내] 신청하신 주차장에 내부정기권...
APHB0006 | 상품명, 기존차량번호, 변경차량번호, 주차장명
아마노파킹 허브(기업전용) [차량변경 거절 사유 안내] 신청하신 차량번호 변경이 거절되었습니다....
APHB0007 | 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [상품 환불 승인 안내] 요청하신 상품의 환불이 승인되었습니다....
APHB0008 | 거절사유, 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [상품 환불 거절 안내] #{거절사유} [구매내역] 상품명...
APHB0009 | 취소사유, 상품명, 차량번호, 차량신청대수, 주차장명, 이용날짜, 이용가능시간, 결제일시, 결제금액, 환불정책
아마노파킹 허브(기업전용) [강제 취소사유 안내] #{취소사유} [구매내역] 상품명...
APHB0010 | 상품명, 사용종료일, 주차장명, 차량번호, 차량신청대수
아마노파킹 허브(기업전용) [상품 만료 전 안내] 이용 중인 정기권이 3일 후 만료될...
APHB0011 | 결제실패사유, 상품명, 사용종료일, 주차장명, 차량번호, 차량신청대수
아마노파킹 허브(기업전용) [자동연장 결제 실패 안내] 정기권 사용 기간이 곧 만료됩니다.
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);
}
}
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);
}
}
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);
}
}
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()
)
);
}
}
@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())
);
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);
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())
);