Java 에 보면 native 라는 키워드가 존재한다. 이 코드는 java 가 구현된 부분이 C 또는 C++ 같은 코드로 구현되는 경우 이런 키워드를 사용한다고 배웠다. 내 기억으로는 난 java를 2003년 정도에 배웠던 것 같다. 그 때 이런 키워드를 공부했던 기억이 있다. 

 2010년 중반 쯤에 웹뷰를 이용해서 안드로이드 앱을 개발했다. 이 때 javascript 에서 java 를 호출 하는 코드는 native 라고 했다. 

뭔지 모르겠지만 뭔가 새로운 언어 또는 상위 계층언어 입장에서 오래된 언어 또는 하위 계층(여기서 하위계층은 기계에 가깝다는 의미다.)을 native 라고 부른다는 느낌이 든다. 

아마 오래전 C 언어 입장에서는 assembly 어가 native 일 것이다. assembly 입장에서는 01 로 이루어진 바이너리가 native 일 것이다. 


AI 로 프로그래밍 하는 바이브 코딩이  활성화 된다면 AI 가 만드는 코드 입장에서는 사람이 만드는 코드를 native 라고 인식하는 시대가 곧 도래할 것 같다. 

서버 재부팅 때마다 flask 웹서버가 500에러가 발생하는 에러를 확인했다. 회사내 서버로 서버의 안정성을 위해 수요일 아침마다 서버를 재부팅 시키고 있다. 그런데 이렇게 재부팅 되고 나면 이상하게 flask 웹서버에서 에러가 발생했다. 

로그를 분석해 보면 이상하게 flask 웹서버가 시작되면서 postgresql 서버에 접속하지 못하고 에러가 발생했다. 그런데 수동으로 uwsgi 서비스를 재시작 시켜보면 정상적으로 DB에 접속해서 웹서버가 정상적으로 동작했다.

Ubuntu 24.04 에 시스템을 설정하면서 처음 겪는 현상으로  Postgresql 서버 서비스가 동작하기 전에 uwsgi 서비스가 동작하면서 문제를 일으키는 것으로 추정했다. 찾아보니 Systemd 설정 파일에서 Before 와 After 를 이용해서 다른 시스템과 순서를 제어하는 방법이 있다는 것을 알게되었다. 그래서 아래와 같이  변경했다.

vim /etc/systemd/system/uwsgi.service

==== uwsgi.service ====
[Unit]
Description=uWSGI Emperor service
After=postgresql.service

........
================

After 를 이용해서 "postgresql.service" 가 동작하고 나면 이 서비스가 동작하도록 설정했다. 

이 설정후 정상적으로 웹서버가 동작하는 것을 확인 했다. 

뭔지 모르겠지만 Ubuntu 버전, 클라우드 종류 이런 것들에 따라서 Ubuntu 가 다양하게 변경되어 배포되는 것 같다. 그래서 이번 PC는 서버 Ubuntu 가 아닌 데스크탑 Ubuntu를 설치해서 이런 문제를 겪는 것 같다. 

Postgresql 에도 여러 제어문이 존재한다. IF, FOR 같은 구문이 존재한다.  (https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING)
그런데 실제 동작시켜보면 에러가 발생한다. 보통 이 구문 예제에는 함수에서 등작하는 편이다. 그래서 이 것은 함수 밖에 동작하지 않는다고 생각하고 있었다. 그런데 do 라는 것과 같이 사용할 수 있다는 것을 알게 되었다.

참고: Postgresql DO 구문 ( https://www.postgresql.org/docs/current/sql-do.html)

 code block 에 대해 찾아보면 딱히 설명이 메뉴얼에 안 나와있는데, 이상하게 DO 구문 설명에서는 "anonymous code blocks" 이라는 단어가 나온다. 내 추측으로는 저 설명은 Structure of PL/pgSQL(https://www.postgresql.org/docs/current/plpgsql-structure.html)을 말하는 것 같다. 

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

이 형태는 일반적으로 function 을 정의할 때 사용되는데 DO 라는 구문과 조합할 수 있다. 

이 때 https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS 에기 나온 control 구문을 조합할 수 있다. 

여기에 더해서 Postgresql 에서는 마치 print 처럼 사용할 수 있는 구문이 있다. 

DO
$$ BEGIN
    raise notice 'Hello world';
END $$;

이 구문을 이용하면 'Hello world' 를 출력할 수 있다. psql 나 dbeaver 에서 이것을 출력할 수 있다. 

그래서 IF 문 다음과 같이 만들 수 있다.

DO
$$
DECLARE
  a INTEGER := 10;
  b INTEGER := 20;
  result INTEGER := 0;
BEGIN
  IF a > b THEN
    result := 1;
  ELSIF a < b THEN 
    result := -1;
  ELSE
    result := 0;
  END IF;  

  raise notice 'result : %', result;
END;
$$ LANGUAGE plpgsql;


그리고  아래 같은 For 문도 만들 수 있다.

DO
$$ 
DECLARE
  n INTEGER := 10;
  total INTEGER := 0;
BEGIN
  FOR i IN 1..n LOOP
    total := total + i;
  END LOOP;
  raise notice 'total : %', total;
END;
$$ LANGUAGE plpgsql;