Zabbix Server Install Manual (자빅스 서버 설치 매뉴얼)


Zabbix

  • 네트워크나 서버(가상)등을 포함한 서비스들을 감시하고 실시간으로 자원을 체크하여 관리자에게 신속히 알리기위한 네트워크 관리 솔루션 소프트웨어 입니다.
  • zabbix 에이전트를 Unix, Linux, Windows 등의 OS에 설치하여 CPU,MEM,파일시스템(용량),특정 TCP 등을 포함한 많은 정보를 포함하여 감시를 할수 있으며 장애대비 모니터링으로써도 탁월합니다.

설치환경

  • OS: CentOS 7 64bit 1708
  • Kernel: 3.10
  • Zabbix: 3.4
  • mariadb: 5.5.56
  • php: 5.4.16
  • Zabbix-server-mysql: 3.4.5
  • zabbix-web-mysql.noarch: 3.4.5

Zabbix 설치

Zabbix Server

Yum 설치를 위한 EPEL 저장소 추가

# yum install epel-release -y
 
Installed:
epel-release.noarch 0:7-9
 
Complete!

Zabbix Package 설치

# rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm
 
Updating / installing...
1:zabbix-release-3.4-1.el7 ################################# [100%]############### webtest11.com End #################

[Zabbix-DB, Zabbix-Web / DB(mariadb) / WEB(Apache) / PHP] yum 으로 한번에 설치

# yum -y install zabbix-server-mysql zabbix-web-mysql mysql mariadb-server httpd php

DB 실행 및 설정

DB 실행 및 프로세스 확인

# systemctl start mariadb
# systemctl enable mariadb
 
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
 
# ps -ef | grep mysql
 
mysql 11918 1 0 12:09 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 12080 11918 1 12:-0 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 12134 11523 0 12:09 tty1 00:00:00 grep --color=auto mysql
 

기본설정 (DB 구동된 상태)

# mysql_secure_installation
 
Enter current password for root (enter for none): (패스워드 입력)
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

DB 접속 및 설정

  • 프록시는 생략 가능
# mysql -u root -p
Enter password: (패스워드 입력)
 
MariaDB [(none)]> create database zabbix_server;
MariaDB [(none)]> grant all privileges on zabbix_server.* to zabbix@localhost identified by 'ironman';
 
MariaDB [(none)]> create database zabbix_proxy;
MariaDB [(none)]> grant all privileges on zabbix_proxy.* to zabbix@localhost identified by 'ironman';
 
MariaDB [(none)]> flush privileges;
 
MariaDB [(none)]> exit;

Zabbix 테이블값 정보 데이터베이스에 적용

# cd /usr/share/doc/zabbix-server-mysql-3.4.5
# gunzip create.sql.gz
# ls
AUTHORS COPYING ChangeLog NEWS README create.sql (해당파일)
# mysql -u root -p zbx_server < create.sql
Enter password: (DB ROOT 패스워드 입력)
Zabbix Proxy
  • 프록시 생략 가능
# cd /usr/share/doc/zabbix-proxy-mysql-3.4.6
# gunzip schema.sql.gz
# ls
AUTHORS COPYING ChangeLog NEWS README schema.sql (해당파일)
# mysql -u root -p zbx_proxy < schema.sql
Enter password: (DB ROOT 패스워드 입력)

Config 설정

Zabix Config 설정

# vi /etc/zabbix/zabbix_server.conf
 
(맨 아래 추가)
 
DBHost=localhost
DBName=zabbix_server
DBUser=zabbix
DBPassword=ironman
 
:wq (저장)
Zabbix Proxy
  • 프록시 생략 가능
# vi /etc/zabbix/zabbix_proxy.conf
 
(맨 아래 추가)
 
# 0 - active mode
# 1 - passive mode
ProxyMode=0
Server=[서버 아이피 입력]
Hostname=[원하는 호스트명 입력 예) Zabbix proxy]
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=ironman

PHP Config 설정

# vi /etc/php.ini
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
date.timezone = Asia/Seoul (앞에 ; 주석제거후 한국시간으로 설정)
:wq (저장)

iptables 방화벽 포트 허용 및 재시작

# CentOS 7
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --permanent --add-port=10051/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
systemctl restart firewalld
 
# CentOS 6
vi /etc/sysconfig/iptables
 
# Zabbix Agent Port
-A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT
# Zabbix Server Port
-A INPUT -p tcp -m tcp --dport 10051 -j ACCEPT
# Zabbix Web Port
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# 포트 변경시 그에 맞춰 변경
 
service iptables restart

Apache & Zabbix 서버 구동

Apache Server 구동 및 재부팅시 자동시작 처리

#systemctl start httpd
#systemctl enable httpd

Zabbix Server 구동 및 재부팅시 자동시작 처리

#systemctl start zabbix-server
#systemctl enable zabbix-server

Zabbix 서버 웹으로 접속

  • http://localhost/zabbix
  • 하단의 설정 DB설정/server details 설정 후
  • 관리자 페이지 로그인(admin/zabbix)
  • VM일경우 ifconfig를 통해 inet 주소/zabbix, 연결이 안될경우 NAT 혹은 BRIDGE 방식 등의 관련하여 VM에서 웹서버 접속하는 법 찾기

Configure DB connection

  • 웹 관리자 페이지의 DB 설정을 위의 mariaDB에서 zabbix-server 설정한 것과 동일하게 설정
  • Database type: MySQL
  • Database host: localhost
  • Database port: 0
  • Database name: zabbix_server
  • User: zabbix
  • Password: ironman

Zabbix server details

  • Host: localhost
  • Port: 10051
  • Name: (웹 페이지 접속시 보여주고 싶은 메인페이지 명)

Trouble Shooting

아파치 80 Port 막혀서 웹페이지 안 뜰 경우

# 80 포트 방화벽 추가 확인
# 방화벽 확인
netstat -nlp | grep 80
 
# iptables 등록 확인
iptables -nL | grep 80
 
# 등록되어있을 경우 포트 변경
vi /etc/httpd/con/httpd.conf
Listen 다른 포트
# 다른 포트 방화벽 등록
위의 방화벽 포트 허용 및 재시작 부분 참고

SElinux

# SElinux 해제
vi /etc/sysconfig/selinux
SELINUX=disabled
 
reboot
 
# reboot 해도 SElinux 활성화 되어있을 경우
vi /etc/grub.conf
kernel ..., selinux=0 # 맨뒤에 selinux=0 추가
 
# SElinux 활성화 된 상태에서 등록
 
vi /etc/zabbix/zabbix_agent_t.te
 
# 아래 내용 신규 생성된 파일에 추가 후 저장/종료 (:wq)
module local-zabbix 1.0;
 
require {
    type zabbix_agent_t;
    class process setrlimit;
}
 
#============= zabbix_agent_t ==============
allow zabbix_agent_t self:process setrlimit;
 
:wq
 
semanage permissive -a zabbix_agent_t

올초부터 make 님의 기반기술세미나 에 참가하여 공부를 하다보니

새해 계획의 꾸준한 블로그 업데이트와 알고리즘 코딩 및 깃헙 커밋, 오픈소스 컨트리뷰트 등은 거의 하질 못하고 있습니다.

(결혼 준비에 게임도 꾸준히 하는건 비밀)


기반기술세미나에서는 비전공자 개발자로서 부족함을 느꼈던 

CS Fundamental (어셈블리, 운영체제, 네트워크, 시스템 프로그래밍, 자료구조, 리눅스 등)을 배우고 있어요.


매주 토,일 2시간씩 하기에 이 모든 것을 놀면서 하려니 벅차네요.

(어셈블리 서적만 3권에 관련 아티클 2~3개 읽어야 하고 ARM CPU 설계도에 C언어, TCP/IP 강의 등....)


일단 9월까지 예정된 세미나 잘 듣고, 연말에는 복습하면서 블로그에 정리할 생각입니다.


사실 4월까지 하기로 했었는데 멤버들 진도가 좀 늦어서 9월까지 하기로 됐거든요. 

근데 제가 4월에 끝날 줄 알고 6~7월 스프링 스터디를 잡아버려서 이중고지만.. 둘다 잘 해보겠습니다.


스프링 스터디는 토비의 스프링 3.1 요약 발표 형식이라, 나중에 스터디 끝나고 스프링 블로그 글도 잘 정리해서 올리겠습니다.


그리고 내년에 2년차 개발자가 되는데, 3년차까지 1년 남았네요.

올해는 기본기를 탄탄히 했으니 내년에 알고리즘과 개인 프로젝트를 통해 더 레벨업 할 생각입니다.



저도 여러 좋은 분들의 블로그에서 도움을 받았듯이, 부족하지만 이 곳에서 제 글들도 누군가에게 도움이 되었으면 합니다.

부족함이 많은 글들이라 부끄럽지만 더 노력하여 개선해가겠습니다.


스프링의 소개

스프링이란?

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
  • EJB(Enterprise Java Beans)의 단점을 보완한 프레임 워크
  • DI(Dependency Injection, 의존성 주입)과 AOP(Aspect-Oriented Programing, 관점 지향 프로그래밍)이 지원되는 경량 컨테이너 & 프레임워크


  • 자바 플랫픔으로서 자바 애플리케이션을 개발하는데 필요한 하부 구조를 포괄적으로 제공한다.
  • 스프링이 하부 구조를 처리하므로 개발자는 애플리케이션 개발에 집중할 수 있다.

경량화

  • 스프링 자체가 가볍거나 작은 규모의 코드로 이루어진 것은 아니다.
  • 오히려 스프링은 20여개의 모듈로 세분화되고 복잡하고 방대한 코드를 가진 프레임워크이다.
  • 경량화가 특징인 이유는 기존 자바 엔터프라이즈 기술의 불필요한 복잡함에 반대되는 개념에서 시작되었다.
  • 주류 기술이었던 EJB는 고가의 무거운 자바 서버(WAS)가 필요했고, 다루기 힘든 설정파일 구조, 패키징, 불편한 배포 등이 단점이었다.
  • 반면, 스프링은 톰캣과 같은 단순한 서버환경에서도 동작하며, 단순한 개발환경으로도 엔터프라이즈 애플리케이션 개발하는데 충분하다.
  • 또 EJB 등의 기존 프레임워크에서 만들어진 코드에 비해 코드량이 적고 단순하기도 하다.
  • 즉, 기존에 비해 빠르고 간편하게 애플리케이션을 개발할 수 있어 생산성이 뛰어난 프레임워크다.

스프링 기능

  • 경량 컨테이너로서 자바 객체를 직접 관리
    • 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  • POJO(Plain Old Java Object) 방식의 프레임워크
    • 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
  • 제어 반전(또는 제어의 역전)(IoC: Inversion of Control)을 지원
    • 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 의존성 주입(DI: Dependency Injection)을 지원
    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  • 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming)을 지원
    • 트랙잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
  • 확장성이 높음
    • 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하다.
    • 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
  • 다른 프레임워크들의 통합

스프링의 구성

  • Spring Core
    • Core 컨테이너 기능
    • Spring 프레임워크의 근간이 되는 IoC (또는 DI) 기능을 지원하는 영역
    • BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원한다.
  • Spring Context
    • Spring Core에서 지원하는 기능외에 추가적인 기능들과 좀 더 쉬운 개발이 가능하도록 지원한다.
    • 또, JNDI, EJB 등을 위한 Adaptor들을 포함하고 있다.
  • AOP
    • Spring 프레임워크에 AOP를 지원하는 기능이다.
  • DAO
    • JDBC 기반하의 DAO 개발을 좀 더 쉽고, 일관된 방법으로 개발하는 것이 가능하도록 지원한다.
  • ORM
    • Object-Relational Mapping 프레임워크인 Hibernate, MyBatis, JDO와의 결합을 지원하기 위한 기능이다.
  • Spring Web
    • Web Application 개발에 필요한 Web Application Context와 MultipartRequest 등의 기능을 지원한다.
  • Portlet
    • 포탈 서버에서 돌아가는 독립된 웹 애플리케이션 원격 지원 기능

스프링 창시자

  • 스프링의 창시자인 로드 존슨(Rod Johnson)
    • 2003년 『Expert One-on-One J2EE Design and Development』책을 출간하여 JE22 애플리케이션 설계와 독창적인 개발 전략을 다루었다.
    • “항상 프레임워크 기반으로 접근하라”를 강조하였다.

오픈소스

  • 스프링은 아파치 라이선스 2.0(Apache License Ver 2.0)을 따른다.
    • 영리 목적 및 비공개 프로젝트에 자유롭게 이용가능하다.
    • 스프링을 사용하고 원 저작자를 밝히고 라이선스 정보를 포함시키는 등의 의무사항을 지켜야 한다.
  • 오픈소스는 무료로 이용할 수 있고 소스코드가 모두 공개되어 수많은 다양한 환경의 개발자들이 사용하므로 테스트에 용이하고, 빠른 피드백을 받을 수 있는 장점이 있다.
  • 반면, 오픈소스 프로젝트 팀의 사정 상 개발이 여의치 않을 경우 프로젝트가 중단에 드랍되거나 버그 수정에 많은 시간이 소요될 수도 있다.
  • 특히 스프링은 애플리케이션 프레임워크로 그 규모가 일반 오픈 소스 프로젝트에 비해 크고 엔터프라이즈 개발자들에게는 중요한 프레임워크이므로 오픈 소스의 문제점을 안고 가기에는 부정적이었다.
  • 그래서 로드 존슨과 스프링 오픈소스화의 대표적 공로자인 유겐 흴러(Juergen Hoeller)와 자바 엔터프라이즈에서 최상급 개발자들이 스프링 소스(SpringSource)를 만들어 스프링 프레임워크의 실질적인 개발을 책임지고 있다.
  • 스프링 소스는 2009년 세계적인 IT업체인 VMware가 인수하여 더욱 안정적인 환경에서 개발되고 있다.


Application Context

  • 전체 계층구조에서 최상단에 위치한 컨텍스트
  • 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean들을 등록해놓고 사용할 수 있다.
  • 웹 애플리케이션 전체에 적용 가능한 프로퍼티, DB 연결, 로깅 기능 등에 이용한다.
  • Servlet Context에 등록된 Bean은 이용할 수 없다.
  • Servlet Context에 동일한 Bean이 있을 경우 Servlet Context Bean이 우선된다.
  • 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다.
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:egovframework/spring/com/applicationContext-*.xml</param-value>
  </context-param>

Servlet Context

  • 서블릿에서만 이용되는 컨텍스트
  • 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다.
  • DispatcherServlet은 자신만의 컨텍스트를 생성, 초기화하고 동시에 Application Context를 찾아서 자신의 부모 컨텍스트로 사용한다.
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/egovframework/springmvc/*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

IoC 컨테이너 구성방법

  1. Application Context만 이용
  2. Servlet Context만 이용
  3. Application ContextServlet Context 하나씩 이용
  4. Application ContextServlet Context여러 개 이용
  5. 여러 Application ContextServlet Context 하나 이용
    • Application Context 설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)

Component Scan 사용시 컨텍스트 설정 방법

  • Application Context에 Service, Repository, Servlet Context에 Controller만 등록해야한다.
  • Application Context 설정

    • Service와 Repository는 Include 하고 Controller는 Exclude 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      </context:component-scan>
  • Servlet Context 설정

    • Service와 Repository는 Exclude 하고 Controller는 Include 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
      </context:component-scan>
  • 이렇게 설정하는 이유는 스프링이 Transaction을 적용하기 위해서이다.
  • 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래 @Service(또는 @Transactional) 어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service가 붙은 bean으로 대치된다.
  • 만약 Application ContextServlet Context가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context에만 적용되어 있기 때문에 Application Context의 @Service는 트랜잭션이 적용이 되지만 Servlet Context의 @Service는 트랜잭션이 적용이 안된다.
  • Bean 객체는 Servlet Context가 우선되므로 @Controller가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.

DROP문

  • 테이블을 삭제하는 명령어
  • 테이블의 구조와 데이터를 모두 삭제하므로 사용에 주의해야 한다.
  • 삭제하려는 테이블의 기본키를 다른 테이블에서 참조하고 있다면 삭제가 거절된다.(제약조건 위배)
  • 참조하는 테이블부터 삭제하거나 CASCADE CONSTRAINTS 옵션을 사용하여 무결성 제약조건을 동시에 삭제하면 된다.
  • 테이블을 삭제하면 테이블의 컬럼에 대해 생성된 인덱스도 함께 삭제된다.
  • 삭제된 테이블과 관련된 뷰와 시노님은 invalid 상태가 된다.
  • 형식
    DROP TABLE 테이블이름 [CASCADE CONSTRATINS] [PURGE]

ALTER문

  • 객체에 대한 모든 변경을 위해 사용
  • 생성된 테이블의 속성과 속성에 관한 제약, 그리고 기본키 및 외래키를 변경한다
형식
ALTER TABLE 테이블이름
    [ADD 속성이름 데이터타입] -- 컬럼 추가
    [DROP COLUMN 속성이름] -- 컬럼 삭제
    [MODIFY 속성이름 데이터타입] -- 컬럼 수정
    [MODIFY 속성이름 데이터타입 [NULL | NOT NULL]] -- 컬럼 수정 (널 허용/비허용)
    [ADD PRIMARY KEY(속성이름)] -- 기본키 추가
    [[ADD | DROP] 제약이름] -- 제약조건 추가 또는 삭제

ALTER TABLE

  • 새로운 컬럼을 추가, 삭제 변경할 수 있다.
  • 새로운 컬럼을 추가하면 기존의 테이블의 마지막 컬럼이 된다.

 

추가 

수정 

삭제 

 column

가능

가능

가능 

constraint 

가능 

불가능 

가능 



ALTER TABLE ADD

  • 테이블에 컬럼 추가 또는 컬러멩 constraint(제약조건)이 없을 경우 constraint를 추가하는데 사용한다.
  • 컬럼 추가시 테이블의 행이 존재한다면, 새로 추가되는 컬럼은 이미 존재하는 모든 행의 값을 NULL로 초기화한다.
  • 컬럼추가 형식
ALTER TABLE 테이블명
    ADD (컬럼명 데이터타입 [DEFAULT 값] [, 컬럼명 데이터타입] .... );
  • 제약조건(Constraint) 추가 형식
ALTER TABLE 테이블명
    ADD (컬럼명 데이터타입 CONSTRAINT constraint명 constraint실제값
    [, 컬럼명 데이터타입]...);
  • 한 번의 ADD 명령으로 여러 개의 컬럼 추가 가능하고, 하나의 컬럼만 추가하는 경우에는 괄호를 생각해도 된다.
  • CONSTRAINT 변경 여부 확인은 USER_CONSTRAINTS 뷰를 사용하여 확인할 수 있다.
  • CREATE TABLE AS….와 같은 서브쿼리를 사용하여 만든 테이블은 NOT NULL만 복사되며, PRIMARY KEY와 같은 제약조건은 복사되지 않는다.
  • 그러므로 서브쿼리로 만든 테이블에 CONSTRAINT를 추가해 주어야 한다.
  • 추가된 컬럼은 테이블의 마지막 부분에 생성되며 사용자가 컬럼의 위치를 지정할 수 없다.
  • 추가된 컬럼에도 기본 값을 지정할 수 있다.
  • 기존 데이터가 존재하면 추가된 컬럼 값은 NULL로 입력 되고, 새로 입력되는 데이터에 대해서만 기본 값이 적용된다.

ALTER TABLE MODIFY

  • 테이블의 컬럼을 변경하고자 할 때 사용
  • 형식
ALTER TABLE 테이블명
    MODIFY (컬럼명 데이터타입 [DEFAULT 값] [, 컬럼명 데이터타입] ... );
  • 데이터의 타입, 크기, 기본값을 변경할 수 있다.
  • 변경 대상 컬럼에 데이터가 없거나 NULL 값만 존재할 경우에만 SIZE를 줄일 수 있다.
  • 데이터 타입의 변경은 CHAR와 VARCHAR2 상호간의 변경만 가능하다.
  • 컬럼 크기의 변경은 지정된 데이터의 크기보다 같거나 클 경우에만 가능하다.
  • NOT NULL 컬럼인 경우에는 크기의 확대만 가능하다.
  • 컬럼의 기본값 변경은 그 이후에 삽입되는 행부터 영향을 준다.
  • ALTER TABLE … MODIFY를 이용하여 CONSTRAINTS를 수정할 수 없다.

 구분

데이터 타입 변경 가능사항 

크기

 NULL 컬럼

문자 숫자 날짜

확대, 축소 가능 

NOT NULL 컬럼 

CHAR VARCHAR2

확대만 가능

ALTER RENAME COLUMN

  • 컬럼명 변경
  • 형식
ALTER TABLE 테이블명
    RENAME COLUMN 기존컬럼명 TO 변경할컬럼명;

ALTER TABLE DROP COLUMN 컬럼명

  • 특정 테이블의 컬럼을 삭제
  • 형식
ALTER TABLE 테이블명
    DROP COLUMN 컬럼명;
  • 컬럼을 삭제하면 해당 컬럼에 저장된 데이터도 함께 삭제된다.
  • 한번에 하나의 컬럼만 삭제할 수 있다.
  • 삭제 후 테이블에는 적어도 하나의 컬럼은 존재해야 한다.
  • DDL문으로 삭제된 컬럼은 복구할 수 없다.



DDL 문

  • Data Definition Language
  • 데이터 구조의 생성(CREATE), 변경(ALTER), 제거(DROP) 명령 언어

CREATE 문

  • 테이블을 구성하고, 속성과 속성에 관한 제약 그리고 기본키(PK) 및 외래키(FK)를 정의하는 명령어

형식


CREATE TABLE [테이블이름] (
 [속성이름] [데이터타입] (NULL | NOT NULL | UNIQUE | DEFAULT 기본값 | CHECK 체크조건)
(PRIMARY KEY 속성이름(들))
(FOREIGN KEY 속성이름 REFERENCES 참조테이블이름(참조속성이름))
(ON DELETE (CASCADE | SET NULL))
)

예제


CREATE TABLE EMPLOYEE (
    E_ID VARCHAR2(30 Byte) PRIMARY KEY, -- 기본키(PK) 설정한다.
    E_NAME VARCHAR2(20 Byte) NOT NULL, -- NULL을 허용하지 않는다.
    E_DEPT_CODE NUMBER,
    DEL_YN CHAR(1 Byte) NOT NULL DEFAULT 'N', -- NULL을 허용하지 않으며 기본값을 'N'으로 한다.
    REG_TS DATE NOT NULL DEFAULT SYSDATE -- NULL을 허용하지 않으며 기본값을 시스템시간으로 한다.
    FOREIGN KEY E_DEPT_CODE REFERENCES DEPT_INFO(DEPT_CODE)
    -- 외래키 설정 E_DEPT_CODE 컬럼이 DEPT_INFO 테이블의 DEPT_CODE 컬럼 참조한다.
)

열거 타입(Enumeration Type)

  • 한정된 값만을 갖는 데이터 타입이다.

열거 타입 선언

  • 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)을 생성해야 한다.
  • 열거 타입 이름은 관례적으로 첫 문자를 대문자로하고 나머지는 소문자로 구성한다.
  • 만약 여러 단어로 구성된 이름일 경우 각 단어의 첫 문자는 대문자로 작성하는 것이 관례이다.
  • 예) Week.java, MemberLevel.java
  • 형식
  • 
    public enum 열거타입이름 {
    	(열거 상수 선언)
    }
    
    
    
  • 열거 상수는 열거 타임의 값으로 사용되며 관례적으로 모두 대문자로 작성한다.
  • 만약 열거 상수가 여러 단어로 구성될 경우 단어 사이를 밑줄(_)로 연결한다.
  • 
    public enum Month {
    	JANUARY,
    	FEBRUARY,
    	MARCH,
    	APRIL,
    	MAY,
    	JUNE,
    	JULY,
    	.
    	.
    }
    
    
    
  • 열거 상수는 열거 객체로 생성된다. 해당 열거 타입의 열거 상수 개수만큼 객체가 열거 타입 객체가 생성된다.
  • 열거 타입 Month의 경우 JANUARY부터 DECEMBER까지 12개의 열거 상수는 힙 영역에 Month 객체로 생성된다.
  • 그리고 메소드 영역에 생성된 열거 상수가 해당 해당 Month 객체를 각각 참조한다.


열거 타입 변수

  • 열거 타입을 선언했다면 열거 타입은 하나의 데이터 타입이므로 변수를 선언하고 사용한다.
  • 형식
  • 열거타입 변수;
  • 
    Month thisMonth;
    Month birthMonth;
    
    
  • 열거 타입 변수를 선언 후 열거 상수를 저장할 수 있다. 이 때, 열거 상수는 반드시 열거타입.열거상수로 사용된다.
  • 열거 타입 변수는 null 값도 저장할 수 있다.
  • 형식
  • 열거타입 변수 = 열거타입.열거상수;
  • 
    Month thisMonth = Month.JUNE;
    
    
  • 열거 타입 변수 thisMonth는 스택 영역에 생성된다.
  • thisMonth에 저장되는 값은 Month.JUNE 열거 상수가 참조하는 객체의 번지이다.
  • 즉, 열거 상수 Month.JUNE와 thisMonth 변수는 서로 같은 Month 객체를 참조하게 된다.
  • 그러므로 thisMonth == Month.JUNE 상수의 비교 결과는 true가 된다.

열거 객체의 메소드

  • 열거 객체는 열거 상수의 문자열을 내부 데이터로 가지고 있다.
  • 열거 객체의 메소드들은 java.lang.Enum 클래스에 선언된 메소드인데, 모든 열거 타입은 컴파일 시에 Enum 클래스를 상속하게 되어 있어 열거 객체에서 해당 메소드들을 사용할 수 있다.


리턴 타입

메소드(매개 변수)

설명

String

name()

열거 객체의 문자열을 리턴

int

ordinal()

열거 객체의 순번(0부터 시작) 리턴

int

compareTo()

열거 객체를 비교해서 순번 차이를 리턴

열거 타입

valueOf(String name)

주어진 문자열의 열거 객체를 리턴

열거 배열

values()

모든 열거 객체들을 배열로 리턴


  • name()
    • 열거 객체가 가지고 있는 문자열을 리턴한다.
    • 리턴되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일하다.
    • 예)
    • 
      Month thisMonth = Month.JUNE;
      String month = thisMonth.name(); // month = "JUNE"
      
      
  • ordinal()
    • ordinal() 메소드는 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다.
    • 열거 객체의 순번은 열거 객체 타입을 정의할 때 주어진 순번이며 0번부터 시작한다.
    • 예)
    • 
      Month thisMonth = Month.JUNE;
      int ordinal = thisMonth.ordinal(); // ordinal = 5
      
      
  • compareTo()
    • 매개값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는지를 비교한다.
    • 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수, 순번이 늦다면 양수가 리턴된다.
    • 예)
    • 
      Month month1 = Month.JUNE;
      Month month2 = Month.MARCH;
      int result1 = month2.compareTo(month1); // -3
      int result2 = month1.compareTo(month2); // 3
      
      
  • valueOf()
    • 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.
    • 이 메소드는 외부로부터 문자열을 입력 받아 열거 객체로 변환할 때 유용하게 사용할 수 있다.
    • 예)
    • 
      Month thisMonth = Month.valueOf("JUNE");
      
      
  • values()
    • 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴한다.
    • 예)
    • 
      Month[] months = Month.values();
      for(Month month : months) {
      	System.out.println(month); // JANUARY, FEBRUARY, … DECEMBER
      }
      
      


웹 애플리케이션

  • 웹을 기반으로 실행되는 프로그램을 말한다.
  • 웹 프로그래밍을 한다는 것은 웹 애플리케이션을 구현한다는 것을 의미한다.

웹 애플리케이션 동작 원리

  • 클라이언트(사용자, 웹 브라우저)가 서버에 요청을 보내고 서버가 해당 요청에 대해 응답하는 것이 기본 동작이다.
  • 보통 클라이언트는 크롬, 익스플로러 등의 웹 브라우저를 지칭한다.
  • 사용자는 자신이 사용하는 웹 브라우저를 이용하여 인터넷 서핑 등을 할 때, 실제로는 웹 브라우저가 지속적으로 해당 웹 페이지의 서버에 요청을 보내고 응답을 받는 과정이 일어난다.
  • 즉, 사용자와 웹 브라우저는 클라이언트가 되어 서버에 서비스를 요청하고, 서버는 해당 요청에 대해 응답하여 서비스를 제공해주고 웹 브라우저 화면에 결과를 출력하는 것이 웹 애플리케이션 동작 원리이다.
  • 서버 측에서는 웹 서버가 최초의 요청과 최종적인 응답을 담당한다.
  • 먼저 웹 서버가 요청을 받으면 WAS서버(웹 애플리케이션 서버, Web Application Server)에서 다양한 로직이나 데이터베이스와의 연동을 통해서 완성된 결과물만 응답한다.
  • WAS 서버는 데이터베이스 연동이 필요할 경우 데이터베이스 서버와 연동하여 데이터를 가져와 처리한다.



웹 애플리케이션 구성 요소

구성 요소 설명

웹 브라우저

  • 사용자(클라이언트)가 요청한 웹 서버의 결과를 화면에 출력해 보여주는 애플리케이션이다.

웹 서버

  • 웹 브라우저의 요청을 받아 들여서 이에 알맞은 결과를 웹 브라우저에 응답해 주는 역할을 한다.
  • 정적인 페이지를 처리를 담당한다.
  • 요청에 필요한 페이지의 로직이나 데이터베이스와의 연동을 위해서 애플리케이션 서버에 이들의 처리를 요청한다
  • 대표적인 웹 서버의 종류로는 아파치(Apache)와 IIS(Internet Information Server)가 있다.

웹 애플리케이션 서버
(WAS, Web Application Server)

  • 요청한 페이지의 로직이나 데이터베이스와의 연동을 처리하는 부분이다.
  • 동적인 페이지 처리를 담당한다.
  • 대표적인 WAS로는 아파치 톰캣(Tomcat), BEA사의 웹로직(WebLogic), IBM의 웹스파이어(WebSphere), SUN사의 iPlanet, Oracle 9iAS, 국산으로는 제우스(jeus) 등이 있다.

데이터베이스

  • 데이터 정보를 저장하는 곳이다.
  • 웹 서버는 동적인 컨텐츠 생성, 서버 상에 데이터 저장을 하지 못한다.
  • 이러한 기능을 수행하기 위해 도우미 애플리케이션이 필요하다.


'프로그래밍' 카테고리의 다른 글

프로그래머 10계명  (0) 2015.06.09

본 내용은 2가지 책의 내용을 요약한 것입니다. 참고하세요





  


"특히 프로젝트가 서쪽으로 간 까닭은" 은 꼭한번 읽어보시라고 권해드립니다.


  • 리더가 당신에게 무엇을 하고 있는지 묻기 전에 어떤 일을 하고 있는지 먼저 말해 주는 것에 주저하면 안됩니다. 자주 피드백 합시다.
  • 모형, 프로토타입, 스토리보드를 고객에게 미리 제공하여 고객이 원하는 바를 조기에 파악해야 합니다. - 밀짚 인형 기법
  • 업무에 우선 순위를 매긴 후 최고 속력으로 처리가 가능한 만큼만 진행 합니다.
  • 특정 분야에 전문가가 되기 위해서 10년 법칙 1만 시간의 노력이 필요 합니다.
  • 기술적 숙련도에 도움이 되는 수요조사
    • 직원 공모 또는 취업 사이트를 분석하면 유망한 기술을 분석할 수 있습니다.
    • 해외 외주 사이트를 분석하면 유망 기술 동향을 분석할 수 있습니다. - oDesk
  • 업무와 관련된 잡지를 정기 구독 합니다. - 마이크로소프트웨어
    • 과 월호를 찾아봅니다. 정독합시다.
    • 뉴스, 특집기사 등을 주의해서 봅니다.
  • 자신의 업무에 익숙해지기 위한 반복 학습을 실행 합니다.
  • 정상을 바라보고 프로젝트 목표를 설정합니다.
  • 적정한 기간 내에 출시 할 결과물을 계획합니다.
  • 모니터를 여러 대 추가하고, 모니터의 적당한 높이 조절을 통하여 생산성을 향상시켜보도록 합니다.
  • 인체 공학적인 마우스를 이용합니다.
  • 다육이 화분을 책상 주변에 배치 합니다. - 공기 정화
  • 좋아하는 글귀와 명언을 출력하여 붙여 놓습니다.
  • 감탄을 잘합시다. - 리 액션
  • 단위 시간당 더 많은 깨달음의 순간을 경험하도록 통찰력을 키우도록 합니다.
  • 내가 할 일에 대한 목록을 정리 합니다.
    • 우선순위를 수시로 변경하도록 합니다.
    • 중요도 순으로 정리합니다.
  • 자신이 사랑하는 일을 합니다
    • 행복을 찾아라
    • 배울 수 있는 건 뭐든 배워라
    • 새로운 것을 시도하고 옛 것을 지켜라
    • 최고의 사람과 함께
    • 조언자를 찾아라
    • 자기 팀, 회사, 분야에 보답하라
    • 글쓰기, 코딩을 꾸준히 연습하라, 동료의 일 조언
    • 좋은 책을 많이 읽어라
  • 개발자로서의 첫 5년이 가장 큰 가르침을 얻는 시기입니다.
    • 한 팀의 일원으로 일하고, 동료와 정보 기술, 자산(문서, 코드, 프레젠테이션)의 공유 방법을 익힙니다.
  • 중요한 스킬을 익힙니다.
    • 4가지 이상의 언어 및 방법론
    • 람다식, 클로저등 함수형 언어 익히기
    • Jpeg. Xml, Text, Json
    • 동시에 천 명 이상 접속 가능한 서버 기술
    • 여러 명의 개발자와의 팀워크 경험
    • 다른 사람의 소스코드 분석 노하우
    • 다국어 지원 방법
  • 도메인 특성에 집중 합니다.
    • 트랜드 기술 보다 통신, 이미지 처리, 데이터베이스, 그래픽스, 알고리즘 등 기본적인 기술 원칙에 치중
  • 메이븐이 됩시다.
    • 특정 분야에 대해 방대한 지식을 갖추고 있으면서, 그 정보를 널리 공유하는 사람
  • 온라인 멘토가 됩시다.
    • 메신저, 화상 회의 등의 방법으로 정보 공유
    • 지속적인 노하우의 제공
    • 블로그, SNS의 적절한 활용
  • 비밀실험, 전혀 다른 프로젝트를 경험해봅니다.
  • 스스로 특허를 발굴 해보기
  • 전문지에 기고할 글, 백서, 기술 문서 쓰기
  • 논문 쓰기
  • 부하직원의 양성, 차세대 리더의 양성
  • 자신이 개발한 기술에 대한 유튜브 동영상을 제작하여 쇼 케이스 만들기
  • 다양한 업무 역량 배우기
    • 계획
    • 설계 기법
    • 프로그래밍
    • 디버깅
    • 테스팅
    • 공학
  • 업무 외 역량 익히기
    • 강연 능력
    • 조직 예절
    • 협상력
    • 멘토링
    • 팀워크
    • 의사 소통
    • 관리 방법
    • 리더쉽
  • Assertion의 활용
    •  논리 흐름상 반드시 만족해야 하는 과정을 코드에 넣는 것
  • 사분면 기법을 통한 업무의 관리
    • 한 축 : 급한 일 / 급하지 않은 일
    • 한 축 : 중요한 일 / 중요하지 않은 일
    • 중요성 축, 긴급성 축으로 구성
  • 감성지능의 키우기
    • 미소, 인간미, 지지 기반
    • 화를 내는 빈도를 줄입시다.
    • 객관적인 시선
    • 팀의 최선, 온화, 자기 계발
    • 긍정적인 정서
  • 소통 하기
    • 모임, 학회 참석
    • 커뮤니티 활동
  • 다른 사람들에게 대가를 바라지 않는 호의를 베풀기
  • 때론 업무 시간의 빈둥거림도 필요합니다.
    • 뉴스, 웹 서핑, 재테크
    • 게임, 안부 묻기
    • 휴식, 산책
  • IT 관련 동향 따라가기
    • Techmeme
    • Hacker News
    • Reddit Programming
    • 블로터
  • 다른 사람과 협업 하는 것은 그 노력에 숨어있는 집단지성을 증가시킵니다.
  • 팀의 상호작용과 협업을 위한 요소
    • 겸손 : 열려 있어야 한다.
    • 존중 : 능력과 업적에 감사
    • 신뢰 : 믿음
  • 실패의 경험이 없다면 충분히 혁신적인 사람이 되지 못하거나 위험을 감수하려고 하지 않게 됩니다.
  • 나의 실패를 문서로 만들자
    • 포스트모텀(Postmortem)
    • 회고록 작성
      • 요약
      • 현상의 발견
      • 원인
      • 평가
      • 문제의 해결을 위한 활동
      • 재발방지 기법
      • 배운 점
  • 당신의 약점을 드러내면 드러낼수록 당신은 더 강해집니다.
  • 당신의 팀이 가치 있고 지켜야 하는 문화를 가지는 것이 중요합니다.
  • 업무 외의 자신을 힐링하기 위한 악기를 하나 배워보도록 합시다.

출처: 개발자 자기계발 및 실력향상 노하우, http://futurewavedev.tistory.com/7


'프로그래밍 > 이야기' 카테고리의 다른 글

OAuth 2.0 정리  (0) 2021.04.28
[macOS, 맥OS] jEnv로 자바 환경 세팅  (0) 2020.06.27
글을 안 올리는 이유(변명!?)  (0) 2017.06.14

+ Recent posts