반응형

자바 진영은 정말 볼때마다 개발자, 기획자들이 작심하고 딴지 거는 느낌을 갖도록 만든 툴의 요소가 한두개가 아니다.
M$가 정말이지 볼수록 혜자임

토드도 가뜩이나 불편한데(계속 시간 지나면 session이 지멋대로 끊기질 않나) 기본 에디터에 주석을 입력하면 아주 그냥 상콤하게 가독성을 망가뜨려준다.
가독성 뿐만 아니라 커서가 도대체 어디에 위치해 있는지 조차 알 수 없게 만들어 편집 자체를 방해한다.

이렇게


이딴건 바퀴벌레 없애듯 그때 그때 발견 즉시 없애야 한다.
에디터에서 빈땅 클릭하고 마우스 우측 눌러 맨 아래쪽 보면 Editor Options... 메뉴를 눌러준다.
뭔노무 메뉴는 또 이리 많은지

나온 메뉴에서 좌측 트리에 보면 Editor가 있다.
그 안에서 Behavior 클릭

우측 하단 Languages의 ... 클릭


하.. 이제 슬슬 딥빡침이 밀려온다. 
거기서 Highlighting탭을 눌러 Comment를 누르고 중앙에 Font style의 Italic에 체크를 풀어준다.


이제서야 비정상의 정상화가 되었다.

툴을 만들어 판매하려면 여러 기능이 들어가는건 좋지만 애시당초 이용자들이 불편함을 느끼지 않게 배려함이 백만번 맞거늘 변태들도 아니고 -_-

 

추가로 사용하다보니 하.. 진짜 가지가지도 이런 야물찬 가지가 또 있을까
이번엔 줄이 너무 길면 HOME 키를 눌러도 맨 앞으로 커서가 이동하지 않는게 확인되었다.
마찬가지로 Options까지 온 다음 Editor의 Behavior의 Word wrap를 체크해주면 

이렇게 짧아진다.

그런데 짧아도 너무 짧다.
Editor < Display로 이동해서 Gutter and Margin의 Position이 80자로 되어 있는걸 자기 컴에 맞게 설정하면 된다.

반응형
Posted by Hippalus
,

반응형

pm2란?
pm2는 Node.js 애플리케이션을 관리하기 위한 프로세스 매니저로 애플리케이션을 백그라운드에서 실행하고, 자동으로 재시작하며, 여러 가지 기능을 제공한다.

설치와 실행
npm install pm2 -g를 실행하면 설치가 가능하다.
반드시 -g로 전역설치를 해야만 한다.
안그러면 command not found오류를 만나게 될 것이야~

기본 실행방법은 아래와 같다.
(참고로 내 node.js 푸시 서버 이름은 pushServer.js다.)

시작
pm2 start pushServer.js

중지
pm2 stop pushServer.js

만약 실행중인 프로그램을 또 실행하려 들면 기특하게도 이런 오류를 내뱉어준다.

pm2를 사용하는 이유는 로그아웃을 해도 pm2로 돌리면 나중에 관리가 되기 때문이다.



자동 재실행
여기가진 좋다.
그.런.데 
내가 만든 푸시 서버 node.js는 node-cron을 사용하여 1분마다 체크 로직이 들어있는데 이상한게 계속 메모리 점유율이 올라갔다. 59M .. 60M .. 71M ...
의심가는 로직을 주석처리 해보고 별짓 다 해봐도 아무리 용을 써도 메모리 점유율이 그대로였다.
node-cron만 사용하면 그랬다.
혹시나 싶어 pm2 대신 그냥 node pushServer.js로 실행한들 동일했다.

그러다 pm2는 자동 재실행하거나 메모리 사이즈가 일정 수치를 넘어서면 자동 재실행 등 다양한 옵션질이 가능하니 이를 활용하기로 했다.

일단 메모리 오버시 자동 재실행을 하기 위해선 별도의 js를 만들어야 한다.
이름은 process.config.js라 지었다.

module.exports = {
    apps: [{
      script: "pushServer.js",
      instances: "max",
      exec_mode: "cluster",
      max_memory_restart: '100M' // 프로세스의 메모리가 100MB에 도달하면 reload 실행
    }]
  };

이 process.config.js를 저장하고 실행을 시킨다.
pm2 start process.config.js   (종료는 pm2 stop process.config.js)

이 경우 인스턴스가 max로 되어 있는데
내 경우 새벽 3시마다 재실행을 하고 싶고 1개의 인스턴스만 실행되어야 하므로 내용을 이렇게 바꿔줬다.
max대신 1, cluster대신 fork

module.exports = {
    apps: [{
      name: "pushServer",
      script: "/node/push/pushServer.js",
      instances: 1,
      exec_mode: "fork",
      cron_restart: '0 3 * * *',
      log: "/node/push/log/pushServer.log",
    }],
}

이후 pm2 start process.config.js를 실행하면 알아서 잘 동작한다.
해당 파일안의 script를 원하는 인스턴스의 개수 만큼 실행해주고 로그 또한 원하는 위치에 만들어준다.

혹시라도 실수로 instances를 이미 max로 실행해서 프로세스가 여러개 생성되었다면 pm2 list를 실행해보고 
pm2 delete all 명령어로 깨끗하게 다 지워버리면 된다.
성형 후 다시 새롭게 시작할 수 있다.

모니터링
실행중인 node.js 프로그램의 상태를 확인하고 싶다면 monit 기능을 이용하면 된다.
pm2 monit
좌측 상단엔 실행중인 프로세스 리스트로 화살표로 이동이 가능하다.
우측 하단에 Metadata에서 앱 이름과 버전 재실행 횟수 실행기간 등등 정보와 
좌측 하단엔 메모리 정보들을 확인 가능하다.

모니터 툴을 빠져나올 땐 ctrl+c로 빠져나오면 된다.
하단에 기본적인 사용 안내가 나와있는것을 확인할 수 있다.

로그파일
pm2로 실행중인 node.js 프로그램에서 console.log를 찍으면 로그가 .pm2/logs 폴더에 파일로 계속 쌓이는데 이것도 로그 파일 사이즈별로 컨트롤이 가능하다.
이거 안해주면 나중에 어마어마한 사이즈의 로그파일을 경험하게 되니 반드시 해주자.

방법은 특이하게 npm i가 아닌 pm2 install pm2-logrotate 이렇게 설치해야 한다.
당연히 pm2는 제일 위에 언급하였듯이 npm으로 설치를 미리 해두어야 한다.


pm2 set pm2-logrotate:max_size 1K 또는 pm2 set pm2-logrotate:max_size 1M 이런식으로 실행 후 pm2 start pushServer.js를 실행하면 이후 console.log로 찍은 로그는 저 사이즈를 넘을 경우 자동으로 새로운 파일이 생성된다.

만약 이것도 싫고 하루마다 파일을 생성하고 싶다면?
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'




끝으로 자동재실행까진 괜찮은데 이 경우 메모리 누수가 발생하는건 아닌가 불안하다.
여기까진 확인을 못해봤다.

반응형
Posted by Hippalus
,

반응형

개발하다 8976 포트를 사용하는 node.js 프로그램을 개발하였는데 
listen이 안되길래 분명히 kill을 해줘도 계속 되살아 났다.

포트 현황을 확인하기 위해 리눅스에서 netstat를 실행해보니 아래처럼 주루룩 나온다.

netstat -tnlp


보다 간단하게 확인하기 위해 grep와 포트번호를 입력하고 실행하면 하나만 나오는게 확인 된다.

netstat -nap | grep :8976

(이때 root권한으로 실행을 해야 프로세스아이디 확인이 된다는 이야기를 본것 같다.)
21688을 실행시키고 있는 부모의 프로세스ID를 찾는 명령언데
ps -o ppid= -p 21688

이걸 실행하니 부모의 프로세스 아이디가 내 경우 11811이었다.

ps -p 11811
이 process id로 조회를 해보면 pm2로 실행되고 있었다.
해당 프로세스 아이디를 kill 11811 해주고 pm2가 실행하던 프로세스 아이디도 kill해주면 증상이 해결된다.


반응형
Posted by Hippalus
,

반응형

그냥 이것 저것 만지다 svn을 다시 한 번 연결해 봤는데 어라? 같은 repository가 두개나 존재하네? 잘못본건가?
하나 삭제해야지 싶어 svn 리스트 중 하나를 삭제하였더니 project explorer에서 svn 연결이 그냥 끊겨버렸다.


project explorer의 파일에서 Team을 선택하면 우측에 이런 메뉴들이 나와야 하는데 덩그러니 몇 안되는 메뉴만 나온다.

아마 연결되어 있던 svn을 삭제했나보다. -_-
아 연결되어 있는 svn이면 경고를 주던가!

다시 연결해야하니 일단 project에서 오른쪽 마우스 클릭 → [Team] → [Share Project]
Use existing repository location 라디오 버튼을 선택하고 next를 하면 다시 살아난다.




반응형
Posted by Hippalus
,

반응형

먼저 Controller 생성
Project Explorer의 Java Resources에서 마우스 우측 버튼을 눌러 New를 선택하자.

우측에 나온 메뉴의 Class를 선택

Name에 알맞은 컨트롤러 이름을 지정해주자
.java는 안 적어도 된다.

다음엔 Mapper class
똑같이 해되 이번엔 Interface를 선택한다.

똑같이 이름을 적고 Finish를 선택하면

이렇게 컨트롤러 클래스와 매퍼 클래스가 이클립스에 나타난다.

src쪽으로 이동해 보면
나는 log란 폴더 아래에 두길 원했으므로 log밑에 컨트롤러 클래스와 mapper 폴더 아래에 매퍼 클래스가 위치한게 보인다.


이제 마지막으로 매퍼와 연결되는 xml을 만들어 본다.
src폴더 하위의 resources폴더를 찾아간 후 log 폴더를 만든다.

그리고 log폴더에서 New, File을 선택하여 

아까와 마찬가지로 이름을 정해주되 xml을 붙여주자.
애시당초xml을 선택하는 방법도 있겠지만 난 이 방법을 선호한다.

그럼 이렇게 mapper 클래스에서 호출할 xml이 생성된다.
x아이콘은 파일이 xml 규격을 따르지 않기 때문인데 이건 뭐 내용 채워주면 없어진다.




반응형
Posted by Hippalus
,

반응형

아까까지만 해도 잘만 되던 이클립스(eclipse)의 톰캣 서버가 맛이 가 있다.


아무리 서버를 중지했다 다시 실행해도 여전하다.

방법은 간단하다.

그냥 이클립스를 재실행 하면 된다.
만약 그래도 안 된다면 server > clean 후 project > clean

그 이외 방법들은 이 블로그를 봐도 된다.
https://october-east-sea.tistory.com/160

 

[에러]Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지

1.Server Modules탭에서 /path 바꿔도 안 될 때 https://jnju.tistory.com/7 [404 에러 eclipse 설정]Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것 jsp 만으로 돌아가는 테스트페이지를

october-east-sea.tistory.com


참고로 chatgpt에는 기대하지 않는게 좋다.

반응형
Posted by Hippalus
,

반응형

DROP SEQUENCE DB.MY_SEQ;

CREATE SEQUENCE DB.MY_SEQ
  START WITH 2393359
  MAXVALUE 999999999999
  MINVALUE 1
  CYCLE
  CACHE 1000
  NOORDER;

대충 이런식으로 MY_SEQ를 만들었다 치자.
그럼 MAPPER의 XML에서 MY_SEQ.nextval를 이용하여 대충 이런식으로 사용하면 되겠다.

<insert id="mailInsert" parameterType="dMap">
insert into mail (seq, email)
select
MY_SEQ.nextval, 
<choose>
<when test='!email.equals("")'>
, #{email} 
</when>
</choose>
from .....
</insert>

 

 

반응형
Posted by Hippalus
,

반응형

요즘 java 프로젝트를 하며 느끼는것이지만 툴은 정말 Microsoft사가 잘 만든다.
java진영의 이클립스는 정말 불편하고 뭐 이리 꼬이게 만들어놨는지 이해가 안간다.

Wrap search를 체크하지 않을 경우 Forward인 경우 문서 끝까지 가버리면 더이상 찾질 못한다.
따라서 반드시 Wrap search를 체크하여야 한다.

반응형
Posted by Hippalus
,

반응형

다들 git을 쓰는 마당에 요즘 svn을 쓰는 회사가 얼마나 될진 모르겠다만 이클립스에서 SVN을 사용하려면 
eclipse의 상단 메뉴에서 Help > Eclipse Marketplace를 선택해 

Subversive - SVN Team Provider란 녀석을 설치해줘야 한다.

여기까지만 진행하면 헤피엔딩이지만 java환경 설정은 늘 그렇듯 헬피엔딩이다.

SVN Connector를 또 깔아줘야 한다. -_-
그래서 SVN Connector를 설치하기 위해 Window > Preferences > Version control (Team) > SVN > SVN Connector > Get Connectors로 가면 Connector를 찾을 수 없다며 오류메지가 떠버린다. 

 

스샷에선 나와있지만 원래 안 된다.
자유 오픈 소스 진영의 아주 훌륭한 시스템 덕분인데 더 이상 지원을 해주지 않아서 수동설치를 해야한다는데.
Help > Install New Software > Add에서 Location을 입력해주면 된다.

오호라~  검색해보니 저런 링크가 뜬다.
사실 이 링크도 찾아내고 이해하는게 힘들었다.
http://download.eclipse.org/technology/subversive/4.0/update-site/

 

${project.name}

 

download.eclipse.org

이 링크를 Work with에 붙여넣어보면 안 된다.
진행되나 싶다가 중단된다. 멈춘다.

그래서 되는 URL을 찾아 제공한다.
https://osspit.org/eclipse/subversive-connectors

 

Index of /eclipse/subversive-connectors

 

osspit.org

넣고 체크박스 선택하고 계속 네네 굽신 대며 설치 완료 되면 svn을 eclipse에서 사용 가능하다.

망할 JAVA

망할 SVN

망할 ECLIPSE

대환장 파티 JAVA 설정

끝으로 저 URL은 이곳에서도 확인 가능하다.
https://www.eclipse.org/forums/index.php?t=msg&th=1112054&goto=1857010&

반응형
Posted by Hippalus
,

반응형

이클립스를 깔고 SVN으로 check out을 하기 위해 Eclipse Marketplace에서 svn을 검색하여 설치하였다.
그랬더니 망할 자바가 이런 오류를 낸다.
SVN Connector discovery completed without finding any connectors
어쩌구 저쩌구..
검색해보니 수동으로 아래 주소를 입력해서 svn connector를 다운받네 마네
https://community.polarion.com/projects/subversive/download/eclipse/6.0/update-site/

잡설 집어치우고 SVN을 잘못 깐거다.
이클립스 마켓플레이스에서 svn을 검색하면 여러개가 나오는데 Subversive - SVN Team Provider 4.8 이거 설치하면 뭐된다.

스샷처럼 하단에 반드시 S자가 길다랗게 늘어진 Subclipse 버전을 설치하여야 한다.
install하고 나면 기능 선택하라는데 초장부터 다 선택되어 있을것이다. 
그냥 confirm이든 뭐든 다 좋다 하자.

중간에 약관 나오고 뭐 허용할거냐 나오는데 그냥 다 좋고 다 선택해서 넘어가면 마지막에 
Restart Now 뜬다. 이거 누른다.

그럼 아래처럼 우측 상에 SVN Repository Exploring 아이콘이 나타난다.

그거 누르면 좌측에 SVN Repositories가 뜨고 거기서 마우스 우측 눌러서 New누르고 보통 프로젝트 끌어오듯이 svn url 넣고 진행하면 된다.
괜히 헛고생말자.

 

반응형
Posted by Hippalus
,