본문으로 건너뛰기

CentOS Tomcat 및 Java(JDK) 설치

· 약 2분

rpm이 설치되어있지 않은 환경에서의 compile 설치 방법을 다룬다.

운영체제 확인​

$ cat /etc/issue
## bit 확인
$ getconf LONG_BIT

JDK 설치​

다운로드​

여기에서 다운로드하면 된다. image from hexo

업로드 및 압축 해제​

tar -zxvf jdk.tar.gz

경로 설정​

$ vi .profile

## 추가 내용
export JAVA_HOME=/유저경로/java
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH=/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin

## 저장
$ :wq!

bin 폴더 PATH들은 명령어를 위해 필요하고 $PATH < 기존 PATH를 추가하지 않는 이유는 TOMCAT 실행시 기본 설치 PATH를 먼저 읽어오기 때문이다.

경로 갱신​

source .profile

설치 확인​

javac -version

Tomcat 설치​

다운로드​

여기에서 다운로드하면 된다.

업로드 및 압축 해제​

apache-tomcat-...의 이름이 길어 tomcat으로 변경 후 업로드하시면 편합니다.

tar -zxvf tomcat.tar.gz

경로 설정​

$ vi .profile

## PATH 뒤에 tomcat/bin 경로를 추가
export PATH=/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin:/home/myuser/tomcat/bin

경로 확인​

$ $PATH

/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin:/home/myuser/tomcat/bin
## 위에 설정한 PATH의 값이 보이면 정상

Tomcat 설정 추가​

tomcat\bin\catalina.sh를 열고 Tomcat과 Java의 경로를 추가해준다.

CATALINA_HOME="/where/to/tomcat"
CATALINA_BASE="/where/to/tomcat"

JAVA_HOME="/where/to/java"

주의​

catalina.sh의 주석 표시된 내용을 읽으면 변수를 추가하지 말고 setenv.sh를 만들어서 커스터마이징 옵션을 분리하라고 나온다.

setenv.sh를 수정하고 싶으면 파일을 열고 아래와 같이 추가해준다.

export CATALINA_HOME="/where/to/tomcat"
export CATALINA_BASE="/where/to/tomcat"

export JAVA_HOME="/where/to/java"

서버 실행​

tomcat\webapps에 war파일을 옮긴 후 서버를 실행한다.

$ startup.sh

Tomcat started.

org.apache.ibatis.exceptions.PersistenceException

· 약 1분

원인​

서버 Mysql이 예전 커넥션을 그대로 가지고 있어서 발생한다.

해결​

Mybatis Config에 아래처럼 커넥션과 관련된 옵션을 추가한다.

<!-- @author http://linuxism.tistory.com/580 -->
<environments default="default">
<environment id="default">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

<!-- 동시 커넥션 수 -->
<property name="poolMaximumActiveConnections" value="20"/>
<!-- 유휴상태의 커넥션 수 -->
<property name="poolMaximumIdleConnections" value="20"/>
<!-- 커넥션 요청 후 획득까지 기다리는 시간 -->
<property name="poolMaximumCheckoutTime" value="20000"/>
<!-- 커넥션 ping 테스트 -->
<property name="poolPingEnabled" value="true"/>
<!-- 커넥션 확인 쿼리 -->
<property name="poolPingQuery" value="select 1"/>
<!-- 커넥션이 얼마동안 사용하지 않으면 닫히는지 시간 설정 -->
<property name="poolPingConnectionsNotUsedFor" value="43200"/>
<!-- 사용불가능한 커넥션을 기다리는 시간 설정 -->
<property name="poolTimeToWait" value="30000"/>
<!-- 인코딩 -->
<property name="driver.encoding" value="UTF-8"/>
</dataSource>
</environment>
</environments>

java localhost HTTPS Connection

· 약 1분

localhost 에서 Https 페이지로 httpcon 을 열면 오류가 발생한다. 인증을 받아야하기 때문인데 함수하나만 호출하면 연결이 가능해진다.

소스​

private void setTrustAllCerts() throws Exception{
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) {}
public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) {}
}
};

// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance( "SSL" );
sc.init( null, trustAllCerts, new java.security.SecureRandom() );
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
});
}
catch (Exception e) {
//We can not recover from this exception.
e.printStackTrace();
}
}

원본에서 가져왔다.

예제​

HTTPCON 전에 호출하면 인증서 없이 HTTPS 연결이 가능하다.

Google Cloud Instance 무료 사용

· 약 2분

구글 클라우드 인스턴스를 생성해 무료 서버를 만들어보자.

프로젝트 생성​

구글 클라우드 플랫폼에 로그인해 프로젝트 만들기 버튼을 클릭해 프로젝트를 생성한다. image from hexo

클라우드 서버 생성​

좌측 메뉴 > Compute Engine > VM 인스턴스 메뉴에서 인스턴스 만들기 버튼을 클릭해 인스턴스를 생성한다. image from hexo

인스턴스 생성​

이름은 하고싶은 이름으로 영역은 한국이니 아시아 데이터센터로 설정하고 머신 유형은 테스트용이니 초소형 공유 CPU를 사용하면 된다.

US 데이터 센터, 공유 CPU, **HDD 30GB↓**를 선택한다면 평생 무료로 바뀌었다. Free Tier 페이지에서 정책을 확인할 수 있다.

이미지에 원하는 OS 를 선택하면 되는데, CentOS 가 막강하니 선택해주자. 액세스 범위 영역에서 모든 Cloud API 액세스 허용을 해줘야 구글 내부 API 를 사용할 수 있다. image from hexo

돈이 나간다고 하는데 이미 무료 $300 이 있고, 6 개월간은 무료다. 기본 상품을 업그레이드 하지 않으면 과금이 발생하지 않는다.

SSH KEY 생성​

직접 생성​

ssh 접근을 위해 Git-bash 창을 열어 구글 계정으로 키를 생성한다.

ssh-keygen -t rsa -C "your google [email protected]"

Putty 로 생성​

PuTTY Key Generator를 여기서 다운로드 받고 키를 생성한다. image from hexo Key Comment에 구글 계정을 넣어주고 Generate한 뒤 Key 를 추출하자

SSH Public KEY 등록​

키 복사​

유저 디렉토리의 .ssh 폴더로 이동해 공개 키 파일(.pub) 데이터를 복사하고 등록한다.

등록​

메타데이터 메뉴에서 등록할 수 있다. image from hexo

SSH Private KEY 등록​

각자 사용하는 쉘 프로그램에 Private Key 를 저장하는 기능이 있을 것이다. image from hexo Token2Shell 을 이용해 등록 후 접속한 화면

서버 세팅​

yum 등의 root 명령어를 사용할 때는 sudo 를 붙혀주고 명령어를 입력하면 된다. yum update 를 먼저 실행해보자

sudo yum update

.NET에서 MySQL 사용자 변수 사용

· 약 1분

@value, @reg 같은 사용자 변수가 들어간 쿼리에서 오류가 발생한다.

해결​

Connection을 맺을 때 Allow User Variables=True 옵션을 추가해줘야한다.

string conf = "Server=$Server;Port=$port;Database=$DataBase;Uid=$User;Pwd=$Password;Allow User Variables=True";

C# String Split

· 약 1분

javascript 의 split 을 생각하고 split 을 사용했다간 예상치 못한 오류를 맞게된다.

원인​

일반 Split 함수는 Char 로만(한 글자로만) 자를 수 있다.

해결​

string str = "cat__dog__animal__person";
string[] animals = Regex.Split(str, "__");

Regex.Split 을 사용하면 된다.

C# MySQL Singleton DB Connection

· 약 1분

소스​

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;

namespace WebApplication.ClassFolder{

public class DBConfig{
private static string Server = "";
private static string Database = "";
private static string ID = "";
private static string PASS = "";

static string conf = "Server=" + Server + ";Database=" + Database + ";Uid=" + ID + ";Pwd=" + PASS;

static MySqlConnection db;

public static MySqlConnection Connection{
get{
if (db == null){
LazyInitializer.EnsureInitialized(ref db, CreateConnection);
}
return db;
}
}

static MySqlConnection CreateConnection(){
var db = new MySqlConnection(conf);

db.Open();
return db;
}

// 강제로 커넥션을 끊어야될 경우가 있을 때
static void CloseConnection(){
if(db != null) {
db.Close();
db.Dispose();
db = null;
}
}

}
}

예제​

// get Connection
var db = DBConfig.Connection;

.NET targetFramework 오류

· 약 1분

targetFramework가 인식할 수 없다고 페이지가 안 띄워지는 경우가 있다.

원인​

IIS의 .NET버전과 프로젝트의 .NET버전이 달라 발생한다. image from hexo

해결​

IIS > 응용프로그램 풀 > 내 프로젝트 클릭 > 기본설정 메뉴에서 .NET Framework 버전 속성을 변경해준다. image from hexo