Tomcat 설치 디렉토리 구성

과거에 Tomcat Multi Instance 설치에 관해서 쓴 글이 있다. Multi Instance 설치에서 핵심은 CATANINA_HOME과 CATALINA_BASE 를 분리하는데 있다.

오늘은 한발 더 들어가서 배포를 위한 설정과 시작, 종료 스크립트의 변경등에 대해서 이야기해보고자 한다.

Multi Instance 구성

Tomcat 을 다운로드 받아 압축을 풀면 그것이 곧 CATALINA_HOME 이 된다. 그리고 CATALINA_BASE 를 위해서 conf 디렉토리를 복사해주고 bin, lib, logs, temp, webapps, work 디렉토리를 생성해준다. 그리고 더블어서 war 파일을 배포를 위한 디렉토리를 Deployments 를 생성해주고 PID 저장을 위한 run 디렉토리도 생성해준다.

CATALINA_HOME 에서 복사해주는 디렉토리는 conf 밖에 없다는걸 상기해야 한다.

setenv.sh 작성

catalina.sh 스크립트를 보면 Tomcat 를 위한 설정등은 setenv.sh 를 읽어오도록 되어 있다.

CATALINA_BASE/bin/setsenv.sh 를 먼저 확인하고 없으면 CATALINA_HOME/bin/setenv.sh 를 찾도록 되어 있다.

setenv.sh 에는 CATALINA_OPTS, JAVA_OPTS 등의 환경변수등을 설정할 수 있다.  환경변수에 대해서는 catalina.sh 파일을 열어보면 자세히 나온다.

‘-Dport.http’ 와 같은 변수 선언은 server.xml 에 다음과 같이 활용할 수 있다.

그리고 이제 start.sh 와 shutdown.sh 는 다음과 같이 아주 간단하게 작성하면 된다.

CATALINA_HOME, CATALINA_BASE 디렉토리를 함께 정의해 준다.

기본적은 환경 변수를 start.sh, shutdown.sh 에 넣어주거나 하니면 별도로 빼서 소스해줘도 된다.

배포

Tomcat 에는 appBase, docBase 와 같은 지시자가 존재한다. 이것을 별도로 지정하지 않으면 webapps 디렉토리가 appBase, docBase 가 된다. 이를 분리하면 war 파일 배포와 app 실행 디렉토리를 분리할 수 있게 된다.

이를 위해서 먼저 server.xml 에서 다음과 같이 설정을 변경한다.

위와같이 Context 에서 docBase 로 war 파일을 지정하면 된다. 이렇게하면 war 파일을 읽어서 webapps 디렉토리에 압축을 해제하게 된다.

이렇게해야 하는 이유가 있는데, war 파일을 배포하는 디렉토리의 소유권을 배포계정으로 하고 others 에 읽기(read) 퍼미션만 준다. 즉, 운영계정과 배포 계정을 분리해서 운영할 수 있게 된다는 것이다.

배포는 conf/CATALINA/${virtualhost}/ 디렉토리에 context 이름으로 xml 파일을 작성해도 배포가 된다. Multi Instance 를 구성하게 되면 Manager 가 없게 된다. 그런데, 많은 사람들은 이를 CATALINA_HOME/webapps/manager 디렉토리를 CATALINA_BASE/webapps 디렉토리에 복사해 넣는다. 하지만 그렇게 하지 않아도 된다.

이를 ${catalina.base}/conf/Catalina/localhost/manager.xml 파일로 작성한다.

그러면 Tomcat 은 이를 읽어서 manager context 를 실행 준다.

왜 이렇게 하나?

CATALINA_HOME 과 CATALINA_BASE 를 분리하면 좋은 점이 업그레이드를 해야할 경우 나타난다.

몇몇 프로젝트하는 곳에서 Tomcat 설치된 것을 보면 CATALINA_HOME 에 startup.sh 파일이나 catalina.sh 파일을 직접 수정하는 경우를 볼 수 있다. 만일 보안 업데이트가 발생해 이를 Tomcat 업데이트를 해야한 경우라면 startup.sh, catalina.sh 파일을 새롭게 수정해줘야 한다.

하지만 CATALINA_HOME 과 CATALINA_BASE 를 분리하면 CATALINA_HOME 은 건드린게 없기 때문에 그냥 새로운 버전의 Tomcat 으로 바꿔치기하면 그만이다.

이는 휴먼 에러를 줄이는 확실한 방법이며 보안 업데이트 시간을 단축시켜준다.

 

Spring5 requirements

Spring5 를위한 필요사항들을 정리.

  1. java 8. 원래 Spring5 는 Java 9를 기반으로 하려고 했지만 변경됐다. 이로 인해서 Reactive Programming을 하기 위해서는 의존성 라이브러리를 필요로 한다. 현재Java 9 은 지원이 중단된 상태다. Java 10 을 사용해도 된다.
  2. Java EE 8 호환. Servlet 4.0, Bean Validation 2.0 등을 지원한다.
  3. HTTP/2 지원한다.
  4. Jackson 2.9, Protobuf 3.0 지원.

 

컴퓨터 영역이 너무 어려워 지고 있다.

컴퓨터 영역이 너무 어려워 지고 있다. 어찌보면 그런 수순으로 가고 있는게 당연한건지도 모르겠다. 과거에 등안시 했던 것들, 대표적으로 알고리즘 같은 것들을 요즘에는 중요하게 여기는 걸 보면 말이다.

과거나 지금이나 알고리즘은 중요하다. 하지만 유독 그것이 부각되고 나머지는 좀 덜한 중요도를 갖는것처럼 왜곡되고 있는게 문제가 되지 않을까 싶다. 그동안에 개인의 역량이란게 무엇으로 평가 되었는지는 모르겠지만, 요즘에는 코딩 알고리즘 문제가 기본이 되다보니 책방에 가서 보면 알고리즘 관련 서적들이 아주 많다.

거의 15년정도를 컴퓨터 분야에 있다보니, 요즘들어 그런 생각이 더 깊어지는 것 같다.  코딩으로 알고리즘을 구현하는 것도 중요하지만 그것보다 더 중요한 것이 ‘상황인식’ 그리고 ‘아이디어’가 아닐까 싶은데 나보다 어린 사람들을 보면 알고리즘은 잘 아는데 나머지는 모두 부족함으로 다가온다.

개인적으로 어떤 사람이 경력을 봤을때에 다음과 같은 질문을 먼저한다.

  • 문서 작성은 잘하는가? 그렇다면 어떻게 작성하나?
  • 협업을 할때에 주로 어떤걸로 하나? 메신저? E-메일?
  • Java 를 쓴다고 하는데 객체지향 프로그래밍이 뭔가?
  • 디자인 패턴을 잘 사용하나?
  • 코드 재사용성 고려에는 어떤게 있나?
  • 뭔가 관심을 넓히려고 하는가?

나는 문서 작성을 중요시 한다. 어느 회사에 잠깐 있었을때에 어떤 개발자는 ‘소스코드에 다 있다’ 라고 말했던게 기억난다. Jira 와 소스코드를 보라는 말만 되풀이했던 곳이 였다.

정작 소스코드를 보고 있자면 커다란 배치 프로그램을 보는 느낌이 들곤 한다. 하나의 메소드에서 여러가지 조건들을 처리하기 위해서 if 문이 수십게 있었던 기억들… 클래스 하나에 조건마다 메소드를 작성하다보니 1000 라인이 넘었던 클래스…..

알고리즘으로 뭘썻네 하기전에 객체지향 프로그래밍이라도 먼저 해줬으면 하는 바람이 요새는 더 크게 다가온다.

알고리즘은 대략 이런게 있다정도의 내용을 인지하고 있고 상황에 맞게 활용할수 있도록 떠올리는 정도면 그만이다. 현업에서 알고리즘을 온전히 내 머리속에서 생각해서 구현해보적은 별로 없었던게 이유이기도 했지만, 혼자 일하고 있다면 알고리즘만 생각하겠지만, 협업을 하는 경우에는 알고리즘 만큼이나 중요한 여러가지가 존재한다는 사실도 잊지 않았으면 좋으련만…  (사실 많은 사람들이 사용하는 킬러 애플리케이션들에서는 독창적인 알고리즘이 중요하다. OS를 제작한다던가, Office 와 같은 것들… 거대하기도 하지만 내부적인 기능들이 정교하면서도 깊이가 있는 것들은 알고리즘을 속속들이 알고 응용하고 독창적으로 개발하기도 해야한다.  하지만 지금 경력을 뒤돌아볼때에 그러한 정교한 것들을 만들어보긴 했지만 깊이가 있는 것들을 작성해본적은 거의 없다. 웹, 서버개발들을 했었지만 사실 주어진 알고리즘 라이브러리를 잘 활용해도 왠만한 안전한 프로그램은 나온다)

어떤 일을 하던간에 많은 고민을 하면서 했으면 하는 바람이 있다. 자바 프로그래밍을 할 경우에 java 8 로 프로젝트를 한다고 하더라도 미래에는 바꿀 수밖에 없는 운명일 거다. 그렇다면 호환성을 고려해 제작해야하는건 개발자라면 당연한 역량인데도 나중에 생각하자는 식..

지금은 모로가던 서울로 가기만 하자라는 식의 사고방식의 개발자들이 너무나 많아 보인다. 그런 사고방식을 하면서 결국에는 남탓, 환경탓을 하고 있는 사람들이 너무나 많아 보인다.

MyBatis Error – The content of elements must consist of well-formed character data or markup.

MyBatis 의 Mapper XML 파일에서 다음과 같은 오류가 발생 했다.

MyBatis Mapper XML Error
“The content of elements must consist of well-formed character data or markup.”

이는 SQL 연산자인 <, =, > 와 같은 엔터티가 MyBatis 문법과 혼동되서 나오는 문제다. 이럴때는 CDATA 를 적용해주면 된다.

이렇게하면 에러를 없앨 수 있다.

Java 시간 대역 체크하기

Java 프로그래밍을 하다보면 시간을 다루게 된다. 만일 점심시간인지 아닌지를 시간을 체크하고 싶다면 어떻게 할까? 대략 다음과 같이 할 수 있다.

isAfter, isBefore 메소드를 이용하면 손쉽게 체크할 수 있다.

Virtual Image 만들기

dd 명령어를 사용해서 다음과 같이 Virtual Image 만들기가 가능하다.

10GiB 의 용량을 가진 가상 이미지를 만들어 줍니다.

인생이란게 노력만으로는 안되는 거다.

요새 느끼는 거지만 인생은 노력만으로는 안되는 것 같다. 뭐랄까 잠깐 이나마 외모에 신경을 쓰는 연예인들의 기분을 이해할 수 있다라고 할까? 잠깐, 내 인생이 외모 때문이다라고 하는거 같은데 그건 아니다. 외모야 뭐.. 오징어지.. 찐따에 오징어면 뭐.. 그냥 혼자살 인생은 결정된거라 딱히 불만은 없다.

무슨 말을 하고 싶은거냐하면 IT 직업이란게 환경도 중요하다는 걸 말하고 싶다. 내가 개발자로서 입지를 다지고 싶다면 개발자로서 다양한 개발과 경험을 할 수 있는 곳이 좋다. 이왕이면 개발을 하는데 필요한 것들도 모두 경험할 수 있는 곳 말이다. 코딩만 잘한다고 개발을 잘한다고 할 수 있는가… 애자일이나 기타 개발을 위한 각종 기반이되는 지식도 중요한데 그런것까지 모두 경험할 수 있는 곳이면 좋다.

개인적으로 나는 인프라를 다루는 분야에서 일을 하고 있다. 좀 더 구체적으로는 AWS 인프라를 다룬다. AWS 를 하는 사람은 알겠지만 AWS 의 인프라는 정말 방대하고 각 종 서비스를 조합하는 방법도 천차만별이다.

그런데, 어떤 곳에서는 IAM 사용을 막아놓고 또 어떻곳에서는 Billing 을 막아놓는다. 또 어떻곳에서는 RDS 를 막아놓기도 한다. 이런식으로 사용에 제약을 받는 경우가 있는데 그런 환경은 별로 좋지 않다.

자신이 하는 분야에서 성공을 하고 싶다면 그러한 성공을 뒷받침해줄 환경 또한 중요하다는 것이다. 하지만 그 환경을 내 노력만으로 쉽게 구축을 되냐 이 말이지… 정책이다 보안이다 하면서 제약을 받기도 한다. 때로는 프로젝트의 세팅이 덜됐다면서 몇개월째 AWS 계정은 고사하고 Linux 시스템에 접근하는 것도 불가능했던 적도 있다. “꿀 빨고 좋았겠다” 라고 부러워하지 마라… 몇개월이 지난뒤에 나는 바보가 되어 있었으니까…

나이가 먹어감에 따라 지금까지 내가 쌓아올린 것을 현상유지하는 것도 벅차다. 불과 몇년전까지만 해도 이런 생각을 할거라는 걸 꿈에도 생각을 못했다. 죽을때까지 Fresh 할줄 알았지. ㅎㅎ. 점점 더 뭔가를 하고 싶어도 나이때문에 못하게 되는  것을 목격하기도 한다. 그런 모습을 지켜보면서 나도 곧 저렇게 될거 같다는 두려움에 휩싸이게 된다.

한국에서의 삶이 많이 고달프다. 나이때문에 안된다는 말을 들을 시기가 다가와가니 한국에서의 삶이 많이 고달프다. 누군가 내게 존댓말을 쓴다는 것도 이상하고… 한국이란 사회에서 내가 너무 이상한 놈인가 싶기도 하고.. 암튼 머리가 복잡하네..

Ubuntu 18.04 도메인을 찾을 수 없을때

Ubuntu 18.04 를 사용중인데, 보안 업데이트를 하기 위해서 apt 명령을 입력했더니 다음과 같이 도메인을 찾을 수 없는 이유로 오류가 생긴다.

“Temporary failure resolving” 이게 뭘까 싶어서 알아본 내용을 정리한다.

resolve.conf 파일을 열어보면 다음과 같이 되어 있을 것이다.

resolv.conf 파일은 다들 알다시피 도메인 네임 서버를 지정해주는 설정 파일로 이 파일이 잘못되면 도메인을 ip로 변환할 수가 없게되어 결국에는 인터넷 연결을 할 수가 없게 된다.

그런데, 위 내용을 보면 도메인 서버 ip는 로컬 호스트로 보이고 코멘트에 이것을 수동으로 바꾸지 말것을 경고하고 있다. 거기다 resolve 상태를 “systemd-resolve –status”로 확인하라고 친절히 안내하고 있다. 이 명령어는 uplink DNS 서버에 대한 상태를 알려준다.

그러면 이 uplink DNS 를 바꿀 수는 없을까?

systemd-resolve 데몬이 이를 수행하는데, 이는 다음과 같은 위치의 파일들을 읽어서 동작한다.

Ubuntu18.04 에서는 /etc/systemd/resolved.conf 파일이 존재하며 여기에 DNS= 부분에 DNS 서버를 space 로 구분해 리스트로 적어놓을 수 있다.

실제로 ‘DNS=8.8.8.8’ 을 입력하고 ‘systemctl restart systemd-resolved’ 하면 적용되어 apt update 가 잘 동작했다.

내가 보기에 구조적인 문제의 시작은….

내가 보기에 한국 사회의 구조적인 문제의 시작은 ‘계급’ 인거 같다. 민주주의 한국에서 무슨 계급이냐고 하겠지만, 제도화되지 않은 계급은 엄연히 존재한다.

사회적인 직위도 어찌보면 사회적인 제도이기도 하지만, 내가 말하고자 하는 계급은 ‘내가 너보다는 잘났다’ 하는 의식구조를 말한다.

문제는 ‘내가 너보다 잘났다’ 라고 한다면 뭔가 현실을 바꿀수 있는 액션, 예를들어 번뜩이는 아이디어를 낸다던지 그 많은 사회생활과 자기분야의 경험을 기반으로 어려운 문제를 해결해나간다든지 하는 것이 있어야 한다. 쉽게말해서 자타공인 능력자소리는 들어야 그런 말쯤은 할 수 있지 않겠나?

하지만 한국 ‘내가 너보다 잘났다’ 는 것은 조선시대의 ‘양반’ 계급의식을 말한다. 양반이 고된 논밭일을 하는 걸 봤나? 망한 집안이 아니라면 절대로 그것은 양반이 할일이 아니다.

이 양반 계급의식은 나이나 성별을 뛰어넘어 어떤 상황이 발생하면 그 상황에서 ‘나는 양반이 되어야 해!’ 하는 일념으로 말과 행동을 하는 인간들이 사회전반에 넘쳐나는게 문제다. 이런 양반이 되기 위해서 그 상황에서 키를 잡고 있는 사람과 깊은 관계를 갖고 그들과 어울려 논다. 그러면서 그 권력자에게 주위사람들에 대해서 평가하기 시작한다. 얘는 어떻게 제는 어떻고….

대부분의 권력자는 주위 사람들에 대한 평가 이야기를 흥미로워하면서 귀담아 듣는다. 그러다보면 그 권력자조차도 그런 말을 하는 인간에게 감화되어 어떤 중요한 결정사항을 그와함께 의논하는 지경까지 이르게 된다.

소위 말만하는, 이빨만 까는 인간들이 한국 사회를 망치는 조선시대의 양반계급의식을 그대로 가지고 생활하는 놈들이다. 문제는 한국에서 이러한 사람들 주위에 사람들이 모인다는 거다. 서로 뒷담화를 안당하기 위해서 친하게 곁에 붙어있어야 하지 않겠나…

능력을 가지고 현실세계를 바꾸는 일을 하는 사람은 이 ‘양반’ 계급의 먹잇감이 된다. 이 양반 계급은 현실에서의 능력을 가진사람을 자신이 관리하려고 한다. 그래서 나온 말이 ‘사람 관리도 능력이다’ 아니겠나. 천하의 개소리다. 그런말 하는 사람치고 사람을 제대로 관리하는 인간 못봤다.

나는 지금까지 현실 능력을 갖추기 위해서 노력해왔다. 말보다는 행동 아니겠나…. 한국사회의 구조적인 문제를 알면서도 이렇게 하는대에는 내가 가진 신념때문이였다. 몰라서 그렇게 행동한게 아니였다.

하지만 이제는 바꾸기로 했다. 자꾸 양반같은 놈들이 내게 꼬인다. 이런게 해달라 저런거 해달라도 부족해 이제는 돈까지 빼갈려는 인간들… 매일 새벽 2시까지 컴퓨터 앞에 앉아서 키보드를 두드린 이유가 고작 그 쌍놈같은 양반들 인생 밑바닥 깔아줄려고 했던게 아니다. 그런데 이 쌍놈의 양반놈들은 날 호구로본건지…

신념은 버리지 않는다. 하지만 나도 사람을 대하는 방법을 교체할 필요는 느낀다. 이제는 그렇게 해야 겠다. 자꾸자꾸 뭘 해주면 그걸 권리인줄 아는지… 이제는 도장깨기를 해야지, 그래야 이놈들이 자신들이 양반이다 라는 소리를 안하지…

오랫동안 그래도 인간들인데,,, 인간들인데,,,, 했지만 이제는 털끝만큼도 그런 생각을 가지지 않기로 했다. 다들 자신들의 이익을 위해서 인생을 살지 않나… 남보다 내가족, 나가 최우선일뿐인데.. 그럼 나도 내 자신을 최우선두고 인생을 살아볼련다.. 겁나 악날하게..