기본 콘텐츠로 건너뛰기

Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제

Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제

AI 생성 이미지: Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제
AI 생성 이미지: Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제

이 글에서는 Java TelegramBots 라이브러리를 활용해 사용자가 1을 입력하면 자동으로 ReplyKeyboard가 나타나는 실용적인 예제를 단계별로 소개합니다. Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제는 초보자도 따라 하기 쉽도록 핵심만 추려 설명합니다.

텔레그램 봇을 개발하다 보면 흔히 발생하는 요구는 “메시지 내용에 따라 버튼 메뉴를 보여주고 싶다”는 것입니다. 본 예제는 바로 그런 상황을 빠르게 구현할 수 있는 기본 뼈대를 제공합니다.

1. 예제 기능 개요

이 Java 예제는 다음 흐름으로 동작합니다. Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제의 목적은 최소한의 코드로 버튼 메뉴를 띄우는 방법을 분명히 보여주는 것입니다.

  • 사용자가 봇에게 1 이라는 텍스트를 보낸다.
  • 봇은 해당 메시지에서 chatId를 읽어 키보드를 생성한다.
  • 키보드에는 “버튼1” 텍스트 버튼이 포함된다.
  • 봇이 "메뉴를 선택하세요" 텍스트와 함께 ReplyKeyboard 를 전송한다.
  • 예제에는 CallbackQuery를 처리할 수 있는 기본 분기 구조도 포함되어 있다.
텔레그램 ReplyKeyboard 버튼 예시 화면

▲ 텔레그램 ReplyKeyboard 버튼 예시

💡 이 예제는 기본 구조에 초점을 맞추고 있습니다. 실제 운영 환경에서는 getBotUsername()getBotToken()에 공인된 봇 이름과 토큰을 넣어야 합니다.

2. 전체 소스 코드 (Java 텔레그램 봇 예제)


public class telegramV2 {
    public static void main(String[] args) {
        // TelegramBots API 초기화
        ApiContextInitializer.init();
        TelegramBotsApi api = new TelegramBotsApi();

        // 익명 클래스로 TelegramLongPollingBot 구현
        TelegramLongPollingBot bot = new TelegramLongPollingBot() {

            @Override
            public void onUpdatesReceived(List<Update> updates) {
                // 여러 Updates가 한 번에 들어오는 경우 사용 (기본 구현 호출)
                super.onUpdatesReceived(updates);
            }

            @Override
            public void onUpdateReceived(Update update) {

                // 1) 일반 메시지 처리 (텍스트)
                if (update.hasMessage() && update.getMessage().hasText()) {

                    // 사용자가 '1'을 보냈을 때만 키보드 전송
                    if ("1".equals(update.getMessage().getText())) {

                        long chatId = update.getMessage().getChatId();

                        // 키보드 행 리스트
                        List<KeyboardRow> keyboard = new ArrayList<>();
                        KeyboardRow row1 = new KeyboardRow();

                        // 버튼 1개 생성
                        KeyboardButton btn1 = new KeyboardButton("버튼1");
                        row1.add(btn1);

                        // 키보드에 행 추가
                        keyboard.add(row1);

                        // SendMessage 생성
                        SendMessage msg = new SendMessage()
                                .setChatId(chatId)
                                .setText("메뉴를 선택하세요")
                                .setReplyMarkup(new ReplyKeyboardMarkup(keyboard));

                        try {
                            // 메시지 전송
                            execute(msg);
                        } catch (TelegramApiException e) {
                            e.printStackTrace();
                        }

                    } else {
                        // '1' 이외의 메시지에 대한 처리(필요 시 구현)
                    }

                // 2) CallbackQuery 처리 (InlineKeyboard 사용 시)
                } else if (update.hasCallbackQuery()) {

                    long chatId = update.getCallbackQuery().getMessage().getChatId();
                    String callData = update.getCallbackQuery().getData();
                    long messageId = update.getCallbackQuery().getMessage().getMessageId();

                    System.out.println("callData : " + callData);

                    // callData 값에 따라 분기 처리 가능
                }
            }

            @Override
            public String getBotUsername() {
                // 텔레그램 BotFather에서 생성한 봇 이름 입력
                return "";
            }

            @Override
            public String getBotToken() {
                // 텔레그램 BotFather에서 발급받은 봇 토큰 입력
                return "";
            }
        };

        // 봇 등록 및 초기 메시지 전송
        try {
            api.registerBot(bot);

            // 특정 chatId에 초기 메시지 전송 (chatId는 실제 값으로 교체해야 함)
            bot.execute(new SendMessage("", "안녕하세요"));

        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}
        
주의: getBotToken()에 들어가는 실제 토큰은 절대 깃허브, 블로그, 공개 저장소에 노출하지 마세요. 토큰 유출 시 외부에서 봇을 완전히 제어할 수 있습니다.

3. 코드 설명 – main & 봇 등록

3-1. ApiContextInitializer와 TelegramBotsApi

ApiContextInitializer.init();는 TelegramBots API가 내부적으로 필요로 하는 초기 설정을 수행합니다. 이후 TelegramBotsApi를 통해 만든 봇 인스턴스를 텔레그램 서버에 등록해 실제 동작하도록 합니다. Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제의 핵심 초기 단계입니다.

3-2. 익명 클래스로 TelegramLongPollingBot 구현

예제는 별도 파일이나 클래스를 만들지 않고 TelegramLongPollingBot를 익명 클래스로 정의해 설명을 단순화했습니다.

  • onUpdateReceived(Update update) – 들어오는 메시지와 이벤트를 한 건씩 처리합니다.
  • getBotUsername() – 봇의 공개 이름을 반환합니다.
  • getBotToken() – BotFather에서 발급받은 토큰을 반환합니다.

3-3. registerBot() & 초기 메시지

api.registerBot(bot);을 호출하면 봇이 텔레그램에 등록됩니다. 등록 직후 bot.execute(new SendMessage("","안녕하세요"));처럼 특정 chatId로 초기 메시지를 보낼 수 있습니다.

실전에서는 빈 문자열 대신 실제 chatId를 넣어야 합니다.

4. onUpdateReceived와 키보드 버튼 처리

4-1. 사용자가 보낸 메시지 확인


if (update.hasMessage() && update.getMessage().hasText()) {
    if ("1".equals(update.getMessage().getText())) {
        // 키보드 전송 로직
    }
}
        

먼저 hasMessage()hasText()로 텍스트 메시지임을 확인한 뒤, 텍스트가 정확히 "1"일 때만 메뉴 키보드를 반환하도록 분기합니다. 이 방식은 불필요한 오탐을 줄여줍니다.

4-2. ReplyKeyboard 생성


long chatId = update.getMessage().getChatId();

List<KeyboardRow> keyboard = new ArrayList<>();
KeyboardRow row1 = new KeyboardRow();

KeyboardButton btn1 = new KeyboardButton("버튼1");
row1.add(btn1);

keyboard.add(row1);

SendMessage msg = new SendMessage()
        .setChatId(chatId)
        .setText("메뉴를 선택하세요")
        .setReplyMarkup(new ReplyKeyboardMarkup(keyboard));

execute(msg);
        
  • KeyboardRow에 개별 버튼을 추가하고,
  • 여러 행을 List<KeyboardRow>로 묶어,
  • 마지막으로 ReplyKeyboardMarkup에 전달합니다.

이렇게 구성하면 사용자의 입력 창 아래에 “버튼1” 버튼이 표시되어, 클릭으로 간단히 메뉴 선택을 유도할 수 있습니다.

5. CallbackQuery 처리(버튼 클릭 후 데이터)

샘플 코드에는 InlineKeyboard 사용 시 필요한 CallbackQuery 처리 구조도 포함되어 있습니다. 이 부분은 ReplyKeyboard와는 별도로 더 정교한 상호작용을 구현할 때 유용합니다.


} else if (update.hasCallbackQuery()) {

    long chatId = update.getCallbackQuery().getMessage().getChatId();
    String callData = update.getCallbackQuery().getData();
    long messageId = update.getCallbackQuery().getMessage().getMessageId();

    System.out.println(" callData  " + callData);

}
        
  • callData : 버튼 생성 시 설정한 콜백 데이터
  • chatId, messageId : 특정 메시지를 수정하거나 응답할 때 사용
💡 예제에서는 콘솔에 callData를 출력하는 정도지만, 실무에서는 이 값을 기준으로 메뉴 분기, 상태 관리, DB 저장 등 다양한 로직을 연결할 수 있습니다.

6. 마무리 정리

여기까지 Java와 TelegramBots API를 이용해 사용자가 보낸 메시지(“1”)에 반응해 ReplyKeyboard 버튼 메뉴를 표시하는 과정을 다뤘습니다. Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제는 최소한의 코드로 바로 적용 가능한 패턴을 보여줍니다.

  • Java로 텔레그램 봇을 만들 때는 TelegramLongPollingBot를 상속하거나 구현합니다.
  • onUpdateReceived() 안에서 hasMessage(), hasCallbackQuery()로 이벤트를 분기합니다.
  • ReplyKeyboardMarkup, KeyboardRow, KeyboardButton 조합으로 간단한 메뉴를 구현합니다.
  • 좀 더 복잡한 상호작용은 InlineKeyboardCallbackQuery로 처리할 수 있습니다.

이 예제를 바탕으로 버튼을 여러 개 추가하거나 단계형 메뉴(1차 → 2차 → 상세)를 구성하면 간단한 챗봇형 메뉴 시스템을 빠르게 구축할 수 있습니다. Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제는 그런 확장을 염두에 둔 출발점으로 적합합니다.

© 2025 Java 텔레그램 봇 ReplyKeyboard 예제. 모든 권리 보유.

🚀 이 주제, 우리 서비스에 어떻게 적용할까요?

Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제
AI 생성 이미지: Java로 텔레그램 봇 만들기 – ReplyKeyboard 버튼 메뉴 구현 예제

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...