Last Modified 2020.2.27

우분투 개발환경

Ubuntu 설치

https://ubuntu.com/#download에서 Ubuntu LTS를 내려받는다.

설치를 위한 부팅 USB 만들기

윈도 시스템을 사용한다면 다음 링크를 참조한다.
http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows

우분투를 사용할 수 있다면 다음 과정을 따른다.
USB를 꼽고 USB 디바이스를 확인한다.

sudo ls -l /dev/disk/by-id/*usb*

만일 sdb, sdb1, sdb2가 함께 보이면, 뒤에 숫자가 없는 sdb가 USB 디바이스를 가리킨다.
우분투 ISO 파일을 내려받은 폴더로 이동한다.
아래 명령을 수행한다. filename.iso 대신 내려받은 우분투 ISO 파일명을, of=다음엔 USB 디바이스를 입력한다.

sudo dd if=filename.iso of=/dev/sdb bs=4M; sync

우분투에 오라클 11g XE 설치

우분투(Ubuntu)는 오라클이 공식 지원하는 리눅스 배포판이 아니다.

몇 가지 조치를 하면 우분투에 오라클 11g XE를 설치할 수 있다.
원글: http://meandmyubuntulinux.blogspot.com/2012/05/installing-oracle-11g-r2-express.html

https://www.oracle.com/database/technologies/xe-prior-release-downloads.html으로 이동한다.
64-비트 시스템이면 Oracle Database 11gR2 Express Edition for Linux x64를 선택한다.
파일을 내려받기 위해선 로그인이 필요하다. --오라클 웹사이트의 회원이 아니면 회원 가입을 한다-- 로그인하면 내려받기가 시작된다. 내려받기가 끝나면 파일이 있는 디렉터리로 이동해 다음 명령을 수행한다.

unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
sudo apt install alien unixodbc
sudo apt install libaio1
만일 sudo apt install libaio1 명령이 실패한다면
libaio-dev를 대신 설치한다. --우분투 24.04는 libaio1를 지원하지 않는다--
sudo apt install libaio-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
cd Disk1
sudo alien --scripts -d oracle-xe-11.2.0-1.0.x86_64.rpm

/sbin/chkconfig 파일을 만든다.

sudo nano /sbin/chkconfig

다음을 복사하여 파일에 붙여넣는다.

#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Ubuntu
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
echo >> $file
echo '### BEGIN INIT INFO' >> $file
echo '# Provides: OracleXE' >> $file
echo '# Required-Start: $remote_fs $syslog' >> $file
echo '# Required-Stop: $remote_fs $syslog' >> $file
echo '# Default-Start: 2 3 4 5' >> $file
echo '# Default-Stop: 0 1 6' >> $file
echo '# Short-Description: Oracle 11g Express Edition' >> $file
echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01

파일을 저장하고 실행 권한을 부여한다.

sudo chmod 755 /sbin/chkconfig

커널 파라미터를 설정한다.

sudo nano /etc/sysctl.d/60-oracle.conf

다음 내용을 복사하여 파일에 붙인다.

# Oracle 11g XE kernel parameters  
fs.file-max=6815744  
net.ipv4.ip_local_port_range=9000 65000  
kernel.sem=250 32000 100 128 
kernel.shmmax=536870912

Swap이 4000 이상인지 확인한다.

free -m
             total       used       free     shared    buffers     cached
Mem:          3942       3809        133        947         50       1571
-/+ buffers/cache:       2186       1756
Swap:         4083        378       3705

위와 달리, Swap이 4000을 넘지 않는다면 다음을 차례로 실행한다.

sudo ln -s /usr/bin/awk /bin/awk
sudo mkdir /var/lock/subsys
sudo touch /var/lock/subsys/listener

커널 파라미터를 검증한다.

sudo cat /etc/sysctl.d/60-oracle.conf

새로운 커널 파라미터를 올린다.

sudo service procps start

다음 명령으로 검증한다. --위에서 설정한 값과 다르게 나오더라도 설치를 완료할 수 있다--

sudo sysctl -q fs.file-max

오라클 설치 파일이 있는 Disk1 디렉터리에서 다음 명령으로 설치를 시작한다.

sudo dpkg --install oracle-xe_11.2.0-2_amd64.deb
sudo /etc/init.d/oracle-xe configure

Oracle Application Express의 디폴트 포트 번호인 8080을 바꾸어 주는 게 좋다. --아래는 9090로 설정했다--

리슨너 포트는 디폴트 값인 1521을 그대로 사용한다. --엔터 키만 치면 디폴트 값이 선택된다--

관리자 계정인 SYS와 SYSTEM의 비밀번호를 지정한다.

마지막으로 부팅 시 오라클이 자동으로 시작하도록 설정한다. (엔터)

Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express 
Edition.  The following questions will determine whether the database 
should be starting upon system boot, the ports it will use, and 
the passwords that will be used for database accounts.  
Press Enter to accept the defaults. 
Ctrl-C will abort.

Specify the HTTP port that will be used 
	for Oracle Application Express [8080]:9090

Specify a port that will be used for the database listener [1521]:

Specify a password to be used for database accounts.
Note that the same password will be used for SYS and SYSTEM.
Oracle recommends the use of different passwords 
for each database account.
This can be done after 
initial configuration: <관리자 비밀번호>
Confirm the password: <관리자 비밀번호>

Do you want Oracle Database 11g Express Edition to be started 
on boot (y/n) [y]:

Starting Oracle Net Listener...Done
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.

환경변수를 추가한다.

nano ~/.bashrc

아래를 .bashrc 가장 아래에 붙여넣는다.

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export ORACLE_BASE=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH

다음 명령으로 환경 변수를 적용한다.

source ~/.bashrc

오라클을 시작한다.

sudo service oracle-xe start

부팅 시 오라클이 자동으로 시작하므로 재부팅 후 이 명령은 필요 없다.

SCOTT 계정 만들기

관리자 계정으로 SQL*PLUS에 접속한다.

sqlplus sys as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on 월 6월 29 12:04:33 2015

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Enter password: <관리자 비밀번호>

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL>@/u01/app/oracle/product/11.2.0/xe/rdbms/admin/utlsampl.sql

MySQL 설치

sudo apt install mysql-server mysql-client

JDK 설치

sudo apt update
sudo apt upgrade
sudo apt install default-jdk

다음 명령으로 자바 버전을 확인한다.

java -version

JDBC 테스트

다음 GetEmp.java 파일을 만든다.

import java.sql.*; 

public class GetEmp {
	public static void main(String[] args) {
		String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String USER = "scott";
		String PW = "tiger";

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		String query = "SELECT * FROM emp";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		try {
			conn = DriverManager.getConnection(URL, USER, PW);
			stmt = conn.createStatement();
			rs = stmt.executeQuery(query);

			while (rs.next()) { 
				String empno = rs.getString(1);
				String ename = rs.getString(2);
				String job = rs.getString(3);
				String mgr = rs.getString(4);
				String hiredate = rs.getString(5);
				String sal = rs.getString(6);
				String comm = rs.getString(7);
				String depno = rs.getString(8);
				
				System.out.println(empno + 
				    " : " + ename + 
				    " : " + job + 
				    " : " + mgr	+ 
				    " : " + hiredate + 
				    " : " + sal + 
				    " : " + comm + 
				    " : " + depno);
				    
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {}
		}
	}
}

GetEmp.java 파일이 있는 디렉터리에서 다음을 수행한다.

javac GetEmp.java
java -cp .:/u01/app/oracle/product/11.2.0/xe/jdbc/lib/ojdbc6.jar GetEmp

메이븐 설치

sudo apt 명령어로 설치하지 말자.
https://maven.apache.org/download.cgi에서 최신 바이너리 파일을 내려받는다.
내려받은 디렉터리로 이동하여 압축을 풀고 생성된 디렉터리를 /opt/maven으로 옮긴다.

cd ~/다운로드/
tar -xvzf apache-maven-3.5.4-bin.tar.gz
sudo mv apache-maven-3.5.4/ /opt/maven

.bashrc 파일을 연다.

nano ~/.bashrc & 

.bashrc 파일의 가장 아래에 다음을 추가한다.

export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH

환경 변수 설정을 적용한다.

source ~/.bashrc

메이븐 버전을 확인한다.

mvn -v

톰캣 설치

톰캣을 설치한다.

sudo apt update
sudo apt upgrade
sudo apt install tomcat8

http://localhost:8080을 방문한다.
http://localhost:8080에서 CATALINA_HOME과 CATALINA_BASE 디렉터리를 확인한다.
/conf/Catalina/localhost 디렉터리를 확인한다.
(이 디렉터리는 CATALINA_HOME과 CATALINA_BASE 둘 중 하나에 있다)

이클립스 설치

apt install 명령으로 이클립스를 설치하지 말자.
https://www.eclipse.org/downloads/packages/의 오른쪽 More Downloads 메뉴에서 자신의 시스템에 맞는 버전을 선택한다. 시스템 자원이 넉넉하다면 가장 최신 버전을 선택할 수 있으나 메모리 4G 이하의 시스템에선 여러 버전을 테스트하고 선택하자. Eclipse IDE for Java EE Developers를 내려받는다. 내려받은 파일이 있는 디렉터리로 이동하여 압축을 푼다.

tar -xvf eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz

생성된 eclipse 디렉터리를 /opt 디렉터리로 옮긴다.

sudo mv eclipse /opt/

eclipse.desktop 파일 생성

cd ~/.local/share/applications/
gedit eclipse.desktop

다음을 복사하여 eclipse.desktop 파일에 붙여넣는다.

[Desktop Entry]
Name=Eclipse
Type=Application
Exec=/opt/eclipse/eclipse
Terminal=false
Icon=/opt/eclipse/icon.xpm
Comment=Integrated Development Environment
NoDisplay=false
Categories=Development;IDE
Name[en]=eclipse.desktop

eclipse를 검색하여 실행하고 이클립스를 런처에 고정한다.

Git 설치

sudo apt install git

git 버전을 확인한다.

git --version

사용자 정보를 설정한다.

git config --global user.name "Gildong Hong"
git config --global user.email hong@gmail.org

설정을 확인한다.

git config --global --list

스프링 게시판 예제 테스트

SpringBbs 프로젝트를 설치하려면 다음을 수행한다.

git clone https://github.com/kimjonghoon/SpringBbs

ojdbc6.jar 파일이 있는 디렉터리로 이동한 후 다음 명령으로 오라클 JDBC 드라이버를 로컬 레포지토리에 저장한다.

cd /u01/app/oracle/product/11.2.0/xe/jdbc/lib
mvn install:install-file -Dfile=ojdbc6.jar \
-DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.2.0 -Dpackaging=jar

이클립스를 열고 SpringBbs를 임포트한다.
컨텍스트 메뉴에서 Import
이클립스에서 메이븐 프로젝트 Import
pom.xml과 이클립스를 동기화한다.
Package Explorer 뷰에서 프로젝트를 선택하고 마우스 오른쪽 버튼으로 컨텍스트 메뉴를 연다.
Maven - Update Project Configuration을 차례로 선택한다.

오라클 테이블 생성

관리자 계정으로 접속해(sqlplus sys as sysdba) 다음 SQL 문을 실행한다.

sqlplus sys as sysdba

Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Enter password: 

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO java IDENTIFIED BY school;

conn java/school
Connected.


create table member (
    email varchar2(60) PRIMARY KEY,
    passwd varchar2(200) NOT NULL,
    name varchar2(20) NOT NULL,
    mobile varchar2(20)
);

create table board (
    boardcd varchar2(20),
    boardnm varchar2(40) NOT NULL,
    boardnm_ko varchar2(40),
    constraint PK_BOARD PRIMARY KEY(boardcd)
);

create table article (
    articleno number,
    boardcd varchar2(20),
    title varchar2(200) NOT NULL,
    content clob NOT NULL,
    email varchar2(60),
    hit number,
    regdate date,
    constraint PK_ARTICLE PRIMARY KEY(articleno),
    constraint FK_ARTICLE FOREIGN KEY(boardcd) REFERENCES board(boardcd)
);

create sequence SEQ_ARTICLE
    increment by 1
    start with 1;

create table comments (
    commentno number,
    articleno number,    
    email varchar2(60),    
    memo varchar2(4000) NOT NULL,
    regdate date, 
    constraint PK_COMMENTS PRIMARY KEY(commentno)
);

create sequence SEQ_COMMENTS
    increment by 1
    start with 1;

create table attachfile (
    attachfileno number,
    filename varchar2(50) NOT NULL,
    filetype varchar2(30),
    filesize number,
    articleno number,
    email varchar2(60),
    constraint PK_ATTACHFILE PRIMARY KEY(attachfileno)
);

create sequence SEQ_ATTACHFILE
    increment by 1
    start with 1;

create table authorities (
    email varchar2(60) NOT NULL,
    authority varchar2(20) NOT NULL,
    constraint fk_authorities FOREIGN KEY(email) REFERENCES member(email)
);

CREATE UNIQUE INDEX ix_authorities ON authorities(email, authority); 

create table views (
    no number,
    articleNo number,
    ip varchar(60),
    yearMonthDayHour char(10),
    constraint PK_VIEWS PRIMARY KEY(no),
    constraint UNIQUE_VIEWS UNIQUE(articleNo, ip, yearMonthDayHour)
);

create sequence SEQ_VIEWS
    increment by 1
    start with 1;

-- for test records  
insert into board values ('chat', 'Chat', '자유게시판');
commit;

MySQL 테이블 생성

루트 계정으로 접속한다.
루트 계정의 비밀번호는 ""이니 그냥 엔터를 치면 된다.

mysql --user=root --password mysql

다음 명령을 실행한다.

mysql --user=root --password mysql
	
create user 'java'@'%' identified by 'school';
grant all privileges on *.* to 'java'@'%';

create database javaskool;
exit;

mysql --user=java --password javaskool

create table member (
    email varchar(60) PRIMARY KEY,
    passwd varchar(200) NOT NULL,
    name varchar(20) NOT NULL,
    mobile varchar(20)
);

create table authorities (
    email VARCHAR(60) NOT NULL,
    authority VARCHAR(20) NOT NULL,
    CONSTRAINT fk_authorities FOREIGN KEY(email) REFERENCES member(email)
);

CREATE UNIQUE INDEX ix_authorities ON authorities(email,authority); 

create table board (
    boardcd varchar(20),
    boardnm varchar(40) NOT NULL,
    boardnm_ko varchar(40) NOT NULL,
    constraint PK_BOARD PRIMARY KEY(boardcd)
);

create table article (
    articleno int NOT NULL AUTO_INCREMENT,
    boardcd varchar(20),
    title varchar(200) NOT NULL,
    content text NOT NULL,
    email varchar(60),
    hit bigint,
    regdate datetime,
    constraint PK_ARTICLE PRIMARY KEY(articleno),
    constraint FK_ARTICLE FOREIGN KEY(boardcd) REFERENCES board(boardcd)
);

create table comments (
    commentno int NOT NULL AUTO_INCREMENT,
    articleno int,
    email varchar(60),
    memo varchar(4000) NOT NULL,
    regdate datetime,
    constraint PK_COMMENTS PRIMARY KEY(commentno)
);

create table attachfile (
    attachfileno int NOT NULL AUTO_INCREMENT,
    filename varchar(255) NOT NULL,
    filetype varchar(255),
    filesize bigint,
    articleno int,
    email varchar(60),
    filekey varchar(255),
    creation datetime,
    constraint PK_ATTACHFILE PRIMARY KEY(attachfileno)
);

create table views (
  no int primary key AUTO_INCREMENT,
  articleNo int,
  ip varchar(60),
  yearMonthDayHour char(10),
  unique key (articleNo, ip, yearMonthDayHour)
);

insert into board values ('chat','Chat','자유게시판');
commit;

exit;

1. 톰캣에서 테스트

업로드 디렉터리 수정

net.java_school.commons 패키지의 WebContants.java 파일을 열고 업로드 디렉터리를 자신의 시스템에 맞게 수정한다.

업로드 디렉터리로 이동하여 다음 명령을 실행한다.

chmod 777 .

SpringBbs 루트 디렉터리로 이동하여 다음과 같이 빌드한다.

mvn clean compile war:inplace

톰캣 루트 애플리케이션 변경

/conf/Catalina/localhost에 ROOT.xml 파일을 생성한다.
/home/kim/SpringBbs가 루트 디렉터리라면 다음과 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context
    docBase="/home/kim/SpringBbs/src/main/webapp"
    reloadable="true">
</Context>

톰캣을 재실행한다.

systemctl restart tomcat8

http://localhost:8080을 방문해 테스트한다.

2. Maven Jetty Plugin으로 테스트

Maven Jetty Plugin으로 테스트하면 톰캣과 같은 WAS가 따로 필요하지 않고 업로드 디렉터리에 대한 권한 수정도 필요없다.

톰캣을 중지시킨다.

systemctl stop tomcat8

이전에 빌드로 생성한 모든 산출물을 제거한다.

mvn clean

pom.xml 파일에서 <!-- $ mvn jetty:run --> 아래 build 엘리먼트를 감싸는 주석을 제거한다.
<!-- $ mvn compile war:inplace and run tomcat --> 아래 build 엘리먼트를 주석처리한다.

SpringBbs의 루트 디렉터리에서 다음 명령을 실행한다.

mvn jetty:run

http://localhost:8080을 방문해 테스트한다.

Google Cloud SDk 설치

원본 https://cloud.google.com/sdk/docs/downloads-apt-get

export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee \
-a /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt update && sudo apt install google-cloud-sdk
sudo apt install google-cloud-sdk-app-engine-java
gcloud init
참고