키워드 'with' 근처의 구문이 잘못되었습니다. 이 문이 공통 테이블 식이거나, xmlnamespaces 절이거나, 변경 내용 추적 컨텍스트 절인 경우에는 이전 문을 세미콜론으로 종료해야 합니다.

  MSSQL에서 임시테이블(with)쿼리를 작성하다보면 위와 같은 에러가 종종 발생합니다.

해결은 허무할 만큼 에러 메시지에 간단하게 나와있습니다

'With'앞에 세미콜론(;)만 붙여주면 됩니다.

-- WITH 앞에 세미콜론을 붙여주세요 --
;WITH '임시테이블명' AS (
			SELECT *
			  FROM	A   
			
			UNION ALL
			
			SELECT *			 
			  FROM	B
			 )
     select * from '임시테이블명'

 앞서 예를 든 상황처럼 게시글이 등록했을 때 teams로 알림을 받고 싶은 내용 중에 '제목, 글쓴이, 내용, 날짜'등이 있을 수 있습니다.

 이런 내용들을 파라미터로 url에 실어서 호출해주면 그 내용도 teams로 받을 수 있습니다.

http://localhost/send_message.php?param0=0번&param1=1번&param2=2번&param3=3번

 위와 같이 (pram0 ~ param3, 4개의 파라미터)url을 호출하여 실제로 teams에 메시지가 어떻게 전송되는지 확인해보겠습니다. 


 1. 코드 작성

 php 서버에 'send_message.php'라는 파일을 생성하여 아래처럼 코드를 작성해줍니다.

param0 부터 param10까지 11개로 요청받은 파라미터를 처리하는 예제입니다.

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

if(extension_loaded("curl")){
	echo "cUrl extension is loaded";
}else{
 echo "cUrl extension is not available";
}

function WebhookSendMessage($text){
    $url = '생성한 WEBHOOK 주소';
    $ch = curl_init();
    
    $test =[
        "@type" => "MessageCard",
        "@context" => "http://schema.org/extensions",
        "summary" => $text["param5"]." ".$text["param4"]." ".$text["param3"]." ".$text["param2"],
        "themeColor" => "0076D7",
        "title" => "메시지 제목",
        "sections" => [
            [
                "activityTitle" => "",
                "activitySubtitle" => "",
                "activityImage" => "",
                "facts" => [
                    [
                        "name" => "Parameter 0",
                        "value" => $text["param0"]
                    ],
                    [
                        "name" => "Parameter 1",
                        "value" => $text["param1"]
                    ],
                    [
                        "name" => "Parameter 2",
                        "value" => $text["param2"]
                    ],                    
                    [
                        "name" => "Parameter 3",
                        "value" => $text["param3"]
                    ]    
                ],
                "text" => "테스트 메시지 입니다."
            ]
        ]
    ];

    $jsonDataEncoded = json_encode($test, true);  
    
    $header = array();
    $header[] = 'Content-type: application/json';

    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

    echo "<br><br> 전송결과 <Br>";
    $result = curl_exec($ch);
    curl_close($ch);
    echo "결과값 ";
    var_dump($result);
}

$messageArray = array(
    "param0" => trim($_GET['param0']),
    "param1" => trim($_GET['param1']),
    "param2" => trim($_GET['param2']),
    "param3" => trim($_GET['param3']),
    "param4" => trim($_GET['param4']),
    "param5" => trim($_GET['param5']), 
    "param6" => trim($_GET['param6']),
    "param7" => trim($_GET['param7']),
    "param8" => trim($_GET['param8']), 
    "param9" => trim($_GET['param9']), 
    "param10" => trim($_GET['param10']), 
);

echo "입력받은 파라미터 출력 <Br>";
print_r($messageArray);

WebhookSendMessage($messageArray);
?>

2. Get 방식으로 url에 파라미터를 전달하여 메시지가 전달되는지 확인해봅니다.

http://localhost/send_message.php?param0=0번&param1=1번&param2=2번&param3=3번

3. URL 호출 결과확인

 여기서 warning 경고는 무시하셔도 됩니다.

 위에 코드에서처럼 모든 에러를 출력하게 작성하였기 때문에 선언이 안 된 param4~ param10까지의 파라미터에 값이 없어서 발생한 경고입니다.

결과확인

 결과 화면을 살펴보시면 아래 부분에 http/2 200 부분에 정상적으로 호출된 것을 확인할 수 있습니다.


4. Teams 메시지 확인

 그럼 실제로 teams에 메시지가 잘 도착했을까요

팀즈에도 잘 도착한 것을 확인할 수 있습니다.


 php curl, json 처리 등의 방식을 활용하여 teams webhook을 활용하여 notification을 간단하게 구현해봤습니다.

 

 MS Teams 메신저의 Notification 기능을 간단하게 구현해봤습니다.

 예를 들어 웹 사이트에 게시글이 등록(수정) 될 때 마다 알림을 받고 싶은 경우를 들어 설명하겠습니다.

대략적인 시스템 구성은 아래와 같습니다.

API 순서

 먼저 teams에 알림을 받기 위해선 webhook을 생성해 줘야하며 순서는 아래를 참고해주세요

*참고 : Webhook(웹훅)이란?
https://simsimjae.medium.com/%EC%9B%B9%ED%9B%85%EC%9D%B4%EB%9E%80-e41cf1ba92f0
(참고 : https://g.co/kgs/Zv5x7p)

1. 팀즈 '팀 만들기'

팀 - 팀 만들기


2. 팀 - 채널 만들기

채널 만들기


3. 채널 - 커넥터 생성

 


4. 커넥터 - Incoming Webhook 구성하기


5. webhook 생성


5. Webhook 복사

 아래 생성된 Webhook URL을 복사해둡니다.

만약 URL을 다시 확인하려면?

왼쪽에 '구성됨' 메뉴를 선택후 구성한 Webhook을 클릭 후 '관리'를 누르시면 확인할 수 있습니다.


 

 

 

 

  회사의 API서버가 무려 ASP CLASSIC으로 되어 있었습니다.

같은 서버에 다행히 PHP도 설치가 되어있어서, 서버 구성에 손대지 않고 API를 이 참에 다 갈아엎고자 PHP로 작업을 진행하고 있습니다.

 보통 mysql(maria db)과 많이 사용하여서 Mssql과 연동하는 작업은 전무했던터라 자주사용하는 소스를 공유드리고자 합니다.


1. DB 접속정보를 갖고 있는 config.php

 config.php를 생성하여 상수로 자주 사용할 정보들을 define 해줍니다.

<?php
	// IP는 예시이므로 사용하실 IP로 변경해주세요
    // DB 주소 (메인 DB와 테스트 DB를 사용)
    define('DB_MAIN','192.100.100.111');
    define('DB_TEST','192.100.100.112');

	// 데이터베이스 이름
    define('DB_EMPL','사원관리DB');
    define('DB_SALARY','급여관리DB');

	// DB 접속 정보
    define('DB_ID_ADMIN','id_admin');
    define('DB_PW_ADMIN','pw_admin');

	// 인코딩 
    define('DB_CHARACTERSET','UTF-8');

?>

2. config.php를 include 해주고 같은 경로에 select.php 라는 예제 파일을 아래와 같이 작성해보겠습니다.

각 코드별로 주석을 기재하였으나 어려우신 분들은 언제든 댓글 달아주세요 :)

<?php
    header('Content-Type: text/html; charset=utf-8');

    // 테스트할 때 모든 에러를 출력해주는게 좋습니다.
    error_reporting( E_ALL ); 
    ini_set( "display_errors", 1 );

    // DB 연결과 관련한 상수에 대한 값을 불러와줍니다.
    // 예를들어 select.php, update.php 등의 CRUD 작업페이지가 여러개라 할 때, DB의 접속 정보가 변경된 상황이 발생할 경우 
    // Config.php만 변경해주면 됩니다. 
    include 'config.php';
?>

<html>
    <head>
    <meta charset="utf-8">
    </head>

    <body>
        <?php
        // 연결할 MSSQL 서버에 대한 정보를 입력해줍니다.
        $serverName = DB_TEST;
        $connectionOptions = array(
            "database" => DB_EMPL,        // 데이터베이스명
            "uid" => DB_ID_ADMIN,             // 유저 아이디
            "pwd" => DB_PW_ADMIN,             // 유저 비번
            "CharacterSet" => DB_CHARACTERSET // 한글꺠짐 방지!
        );

        
        // --------------------------------------------------------------------
        // SQL 조건문에 변수를 넣을 경우 활용 하는 방법 
        // 1) 변수에 그대로 값 대입
        $F_EMPL_CODE = '사번';
        $F_START_DATE = '날짜';

        // 2) URL에 입력된 변수를 불러올 경우
        // 테스트는 GET / API 호출은 POST 사용
        // ex) http://localhost/select.php?EMPL_CODE=사번&START_DATE=데이타
        $F_EMPL_CODE = $_GET['F_EMPL_CODE'];
        $F_START_DATE = $_GET['F_START_DATE'];
        // --------------------------------------------------------------------

        // 결과값을 받을 변수
        $F_START_TIME = '';

        // DB 연결
        $dbconn = sqlsrv_connect($serverName, $connectionOptions); 
        // 연결 확인
        if ($dbconn) {
            echo "DB 연결 완료<br><hr>";
        }else{
            echo "DB 연결 실패<Br>";
            die( print_r( sqlsrv_errors(), true));
            echo "<hr>";
        }

        // 쿼리 작성
        $query = "SELECT * FROM 출근기록테이블
                WHERE 사번 = '$F_EMPL_CODE' and 날짜 = '$F_START_DATE'"; 

        // 쿼리를 실행하여 statement 를 얻어온다
        $params = array();
        $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
        $stmt = sqlsrv_query($dbconn, $query, $params, $options );

        // 쿼리 결과 'row' 수를 반환해준다
        $row_count = sqlsrv_num_rows($stmt);
        
        // 결과가 1개 이상 있다면?
        if($row_count >= 1){
            // statement 를 돌면서 필드값을 가져온다
            while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
            {   
                //  출력할 $row['컬럼명']; 형태로 출력해줌
                $F_START_TIME = (string) $row['근무시간'];
                echo $F_START_TIME."<Br>";
            }   
        }else{
            echo "조회된 정보가 없습니다";
        } 
        
        // 데이터 출력후 statement 를 해제한다
        sqlsrv_free_stmt($stmt);    

        // 데이터베이스 접속을 해제한다
        sqlsrv_close($dbconn);
        ?>
    </body>
</html>

 

 PHP에서 CRUD 기능을 구축하던 중, 동작처리를 요청한 페이지가 호출 완료 된 후 브라우저를 닫지 않았을 경우에 중복으로 호출되는 문제가 발생하였습니다.

 단순하게 동작이 완료 된 후에 다른 사이트로 강제 이동시키는 방법으로 뗌질(?)한 경험이 있습니다.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>페이지 자동 리다이렉트 테스트</title>

	<style type="text/css">

	::selection { background-color: #E13300; color: white; }
	::-moz-selection { background-color: #E13300; color: white; }

	body {
		background-color: #fff;
		margin: 40px;
		font: 13px/20px normal Helvetica, Arial, sans-serif;
		color: #4F5155;
	}


	#body {
		margin: 0 15px 0 15px;
	}

	#container {
		margin: 10px;
		border: 1px solid #D0D0D0;
		box-shadow: 0 0 8px #D0D0D0;
	}
	</style>
</head>
<body>

<div id="container">
	<h1>Redirect Test</h1>

	<div id="body">
		<p>3초가 지나면 naver 사이트가 열립니다.</p>
	</div>
</div>

<script> 
    // 시간 변수, setTimeout() 함수는 ms(밀리 초 = 1/1000 초)를 사용함
    // ex) 3000ms = 3000 * 1/1000 = 3초
	var time = 3000;

	setTimeout(function(){
        // ms시간 후에 진행 될 코드 작성 
		alert('3초지남');
		location.href='https://www.naver.com';
		}, time);
 
</script>
</body>
</html>

 

'Programming > Javascript' 카테고리의 다른 글

버튼 중복 클릭 방지하기  (0) 2022.02.23

+ Recent posts