mod_headers 모듈은 HTTP 요청(응답) 헤더를 수정 및 삭제할 수 있는 모듈이다.

서버 설정 지시자의 거의 모든 부분에서 사용할 수 있으며, <Location>, <Directory>, <IfModule>, <VirtualHost>에서 사용하면 해당 범위에서만 기능을 제한할 수도 있다.


RequestHeader, Header

- 문법 : Header [condition] set|append|add|unset|echo header [value] [replacement] [early|env=[!]variable]

 (요청헤더는 RequestHeader 지시자를 사용)


- HTTP 요청 및 응답 헤더의 정보를 수정 및 삭제한다.

- 첫번째 condition은 onsuccess, always 값이 올 수 있으며 생략도 가능하다.

- 두번째 값은 행위를 지정한다.


 옵션

설명

 set

 헤더정보를 설정한다. 이미 헤더에 같은 이름의 정보가 있다면 덮어쓴다. 

append

 기존 헤더에 값을 추가한다.

add

 헤더에 값을 새롭게 추가한다. 중복 헤더값이 발생할 수도 있으므로 주의한다.

unset

 지정된 이름의 헤더정보를 삭제한다.

echo

 HTTP 요청헤더에 지정된 이름의 헤더정보가 있을 경우, HTTP 응답 헤더에도 추가한다.


- 예제)

IE 브라우저 호환성보기 끄기

BrowserMatch MSIE is-msie

Header set X-UA-Compatible IE=edge env=is-msie


특정페이지 캐시하지 않도록 설정

<Location "/admin">

  Header set Cache-Control "no-cache, no-store"

</Location>


특정 Content-Type 처리 (대문자로 치환)

SetEnvIf Content-Type application/json is_json

Header set ContentType APPLICATION/JSON env=is_json



※ 상세한 헤더정보 디버깅을 위해선 curl -I 옵션을 통해 헤더정보를 확인할 수 있다.

curl -I http://alpha.test.example.com/xxx.do



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



Posted by SungHoon, Park
,

찾았던 것은 Windows용 2.2.27 버전이였는데 없는 것 같다. ㅠㅠ


Windows용 아파치 다운로드 경로

https://archive.apache.org/dist/httpd/binaries/win32/




Posted by SungHoon, Park
,

mod_rewrite 모듈은 규칙 기반으로 URL을 동적으로 Redirect 및 Rewrite 처리를 해준다.

특정 URL 패턴에 대한 리다이렉트 처리를 할 때 자주 사용하며, RESTful한 웹서비스도 제공할 수 있다.


기본형식


RewriteEngine On

RewriteCond TestString  CondPattern [Flag]

RewriteRule  Pattern     Substitution [Flag]


먼저 RewriteRule의 Pattern을 체크.

Pattern을 통과하면 RewriteRule 상단의 RewriteCond를 체크.

순차적으로 RewriteCond의 TestString의 CondPattern을 체크.

CondPattern을 통과하면 RewriteRule의 Substitution을 최종적으로 처리한다.


[그림1] Ruleset 흐름도


RewriteEngine On|Off

모듈 사용여부를 설정한다.


RewriteLog

mod_rewrite 모듈에서 처리하는 내용에 대해 로그를 남긴다.


(형식)

RewriteLog logs/rewrite.log


RewriteCond

RewriteRule에 대한 조건문

RewriteRule과 달리 단독으로 사용할 수 없으며, 최상단부터 순차적으로 실행된다.


[그림2] RewriteCond 흐름도


(형식)

RewriteCond TestString CondPattern


1) TestString

- 테스트 대상 텍스트

- 웹서버 변수를 사용할 수 있다. %{변수명} 형식이다.


[그림3] 서버변수


2) CondPattern

- TestString과 일치할 패턴을 지정하며, 정규표현식을 사용할 수 있다.

- 정규표현식 사용 가능

- RewriteCond 앞에 RewriteRule에서 사용한 정규표현식에서 그룹으로 지정된 값을 사용할 수 있다. $0~$9 형식.


3) Flag


 플래그

의미

 설명

 NC

 NoCase

 대소문자 무시한다.

 OR

ORNext

 여러개의 RewriteCond를 사용할 경우 OR 조건으로 사용된다.

 (RewriteCond가 연속으로 있을 경우는 AND 조건이다.)


RewriteRule

조건에 따른 rewrite 규칙을 설정하고 해당 규칙에 따른 동작을 지정한다.


(양식)

RewriteRule Pattern Substitution [Flag, Flag...]


1) Pattern

- 일치시킬 패턴을 지정하며, 정규표현식을 사용할 수 있다. 또한 정규표현식에서 그룹으로 지정한 값을 Substitution에서 사용할 수 있다. $0 ~ $9까지 사용 가능함.


2) Substitution

- Pattern이 일치할 경우 Rewrite 처리할 URL을 지정한다.


3) Flag

- 처리할 동작을 지정한다.

전체 플래그명, 축약어 모두 사용가능하다.


플래그

의미

설명

E

Env

 조건이 일치할 경우 특정 환경변수를 설정하거나 해제한다. 

F

Forbidden

 403 Forbidden으로 응답한다.
 Forbidden은 Last의 의미를 포함한다.
 외부에서 접근하면 안되는 리소스를 차단할 경우 유용하다.

G

Gone

 410 Gone으로 응답한다.

L

Last

 더는 RewriteRule 처리를 하지 않는다는 의미다.

 개발언어에서 break문과 비슷하다고 할 수 있다. 

N

Next

 Rewriting 프로세스를 재시작한다.

R

Redirect

 302 Redirect로 응답한다.

 R=301은 HTTP 301 Moved Permanently 응답으로 Redirect 한다.

NC

NoCase

 대소문자를 무시한다.

PT

Passthru

 타겟URL이 http(s)로 시작하지 않아도 URL 처리를 할 수 있도록 한다.

 ※ 기본적으로 타겟URL에 http(s)를 적지 않으면 디렉토리 경로로 인식하게 된다.

 /로 시작한다면 절대경로, /로 시작하지 않으면 상대경로로 처리한다.

 QSA

qsappend

 qsappend (Query String Apped)

 QUERY_STRING 변수값을 타겟URL에 유지시켜준다.



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

https://httpd.apache.org/docs/2.0/ko/misc/rewriteguide.html

http://soul0.tistory.com/139

http://soul0.tistory.com/270

http://martinmelin.se/rewrite-rule-tester/


'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_headers 모듈  (0) 2016.03.06
[아파치] Windows용 다운로드 경로  (0) 2016.03.06
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
Posted by SungHoon, Park
,

mod_setenvif 모듈을 통해 특정 조건에 만족시 환경변수를 설정할 수 있다. 환경변수 설정을 통해 프로그래밍 조건문과 같은 효과를 낼 수 있다.


BrowserMatch

- 문법 : BrowserMatch regex [!]env-variable[=value][[!]env-variable[=value]]

- 클라이언트가 보낸 헤더정보에서 regex 표현식을 비교하여 환경변수를 설정한다.

- !가 붙으면 해당 환경변수를 삭제한다.


- 예제)

 BrowserMatch MSIE 7.0 ie=yes

 BrowserMatch "^(curl|ELink|Wget)" iframe=yes !javascript


BrowserMatchNoCase

- BrowserMatch와 역할은 같으며, 대소문자를 구분하지 않는다.


SetEnvIf

- 문법 : SetEnvIf attribute regex [!]env-variable[=value][[!]env-variable[=value]]

- HTTP 요청 속성에 따라 환경변수를 설정한다.

- 첫번째는 HTTP 요청 속성, 두번째는 정규표현식이다.

- 마지막은 변수 설정/해제 옵션이며, 공백을 기준으로 여러개의 변수를 설정할 수 있다.


- 예제)

1. static 리소스만 로그에서 제외하기

SetEnvIf REQUEST_URI \.(gif|jpg|png|js|css)$ static_request

CustomLog ... combined env=!static_request


SetEnvIfNoCase

- SenEnvIf와 역할은 같으며, 대소문자를 구분하지 않는다.

 


※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



'서버 > 아파치' 카테고리의 다른 글

[아파치] Windows용 다운로드 경로  (0) 2016.03.06
[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] httpd.conf 전역설정  (0) 2016.02.12
Posted by SungHoon, Park
,

가상 호스트(VirtualHost)는 한 장비에서 여러개의 웹서비스를 구동할 수 있도록 해준다.

보통 httpd-vhosts.conf에 가상 호스트를 설정하고, httpd.conf 파일 마지막에 Include conf/extra/httpd-vhosts.conf를 추가한다.


IP 기반 가상 호스트

- 한 장비에 여러개의 IP를 할당받고 IP별로 가상호스트를 사용하는 방법이다.

- IP추가를 위해 네트워크 카드 추가 및 네트워크 설정 등이 필요하다.


Listen 192.168.111.100:80

Listen 192.168.111.200:80


<VirtualHost 192.168.111.100:80>

  DocumentRoot /var/www/site1

  ServerName site1.example.com

</VirtualHost>


<VirtualHost 192.168.111.200:80>

  DocumentRoot /var/www/site2

  ServerName site2.example.com

</VirtualHost>


포트 기반 가상 호스트

- 포트를 기반으로 가상 호스트를 설정한다. Listen 포트에 사용할 포트를 여러개 설정한 후 VirtualHost를 해당 포트로 설정하면 된다.

- 하지만, 포트를 인식하고 사용자들이 웹서비스에 접근하는 것은 불편하므로 일반적인 방법은 아니다.


- 예제)

Listen 80

Listen 90


<VirtualHost 192.168.111.100:80>

  DocumentRoot /var/www/port_80

</VirtualHost>


<VirtualHost 192.168.111.100:90>

  DocumentRoot /var/www/port_90

</VirtualHost>


이름 기반 가상 호스트

- 한 장비에 여러개의 도메인 이름을 부여하고 도메인 이름별로 가상 호스트를 사용하는 방법이다.

- 이름 기반 가상 호스트는 클라이언트 요청시 전송하는 헤더중 Host 헤더정보를 사용하여 가상 호스트 설정에 따라 웹 서비스를 하게 된다.


- 예제)

NameVirtualHost *:80


<VirtualHost *:80>

  ServerName site1.example.com

  ServerAlias site1.co.kr

  ServerAlias site.kr

  DocumentRoot /var/www/site1

</VirtualHost>



<VirtualHost *:80>

  ServerName site2.example.com

  DocumentRoot /var/www/site2

</VirtualHost>


1) NameVirtualHost 설정

 - 80 포트에서 이름 기반 가상 호스트를 사용하겠다는 의미로 반드시 적어줘야 한다.

 - 만약 설정되지 않는 호스트명을 보냈을 경우 기본 처리할 가상호스트로 지정하려면 <VirtualHost _default_:80>으로 지정하도록 한다. 만약 이 설정이 없다면 첫번째 가상 호스트 설정으로 동작하게 된다.

 - 하지만 아파치 웹서버 2.4 이후부터는 이름 기반 가상 호스트가 Default이므로, 2.4 이후 버전에서는 없어졌다.


2) ServerAlias

 - 웹서비스가 여러개의 도메인을 사용할 경우 지정해준다. 여러개 지정해줘도 무방하다.



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] httpd.conf 전역설정  (0) 2016.02.12
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,

아파치 웹서버 httpds.conf 서버설정에 대해 정리한다.


ServerAdmin

- 관리자 이메일 주소를 설정한다. ServerSignature 값이 Email로 설정되었을 경우, 이메일 주소는 404, 500 에러가 발생했을 경우 에러 화면에 해당 이메일 주소가 표시된다.


DocumentRoot

- 웹 프로젝트가 있는 루트 디렉토리를 지정한다.

- 기본설정은 /var/www/html이다.

- 가상호스트에서도 사용할 수 있으므로 가상 호스트마다 각각 다른 웹 프로젝트 서비스가 가능해진다.


DirectoryIndex

- 웹요청 주소가 디렉토리만 있고 파일명이 없을 때 기본적으로 읽어서 전송할 파일명을 설정한다.

- index.html index.jsp 등


<Directory 디렉토리명></Directory>

- 디렉토리 단위별로 설정하는 지시자다. Location 지시자와 비슷하나 차이점은 Location은 URL을 기반으로 한다는 것이다. Directory 지시자는 로컬 파일의 경로를 대상으로 한다.

- 주로 Options와 접근권한을 설정하는 경우가 많다.


- 예제)

<Directory "/var/www/html">

  Options Indexs FollowSymLinks

  AllowOverride None

  Order allow,deny

  Allow from all

</Directory>


1) Options

- 설정한 디렉토리("/var/www/html") 하위의 모든 디렉토리와 파일에 대한 접근권한을 제어한다.

https://httpd.apache.org/docs/2.2/ko/mod/core.html#directory [Options Directive] 참조


 옵션

설명

 None

 모든 접근을 허용하지 않는다.

 All

 모든 옵션설정을 허용한다. (단, MultiViews는 제외)

 Indexes

 디렉토리 접근시 DirectoryIndex에 설정한 파일이 없을 때 디렉토리내 파일 목록을 보여준다.

 Includes

 Server-side includes provided by mod_include are permitted.

 IncludesNoExec

 Server-side includes are permitted, but the #exec cmd and #exec cgi agr disabled. 

 FollowSymLinks

 심볼릭 링크를 사용할 수 있다. 하지만 보안을 위해 이 옵션은 제거하는 것이 좋다.

 만약 DocumentRoot 하위에 root 권한의 폴더(sbin 등)을 심볼릭 링크로 걸어놨다면 nobody로도 해당 디렉토리에 접근할 수 있게 된다.

 ExecCGI

 CGI 스크립트를 실행할 수 있다.

 MultiViews

 클라이언트가 요청한 media type과 content-encoding을 가지고 적절한 요청을 처리한다.


2) AllowOverride

- 디렉토리에 .htaccess 파일이 있을 경우 기존 설정을 덮어쓸지 여부를 설정한다. 기본설정은 None이다.

※ .htaccess 파일은? 웹서비스 디렉토리별로 설정이 달라져야 할 경우가 있다. 이때 관리자가 모든 설정을 하기는 힘들기 때문에 개별 디렉토리마다 다르게 설정하기 위해 존재하는 파일이다. 예로, 호스팅을 받아 서비스를 할때 .htaccess 파일을 사용한다.


옵션

설명

 None

 디렉토리별 설정을 허가하지 않는다. 즉, htaccess 파일을 Override하지 않는다. 

 All

 .htaccess 파일을 우선 적용하도록 Override를 허용한다.

 Options

 .htaccess에 설정된 Options 지시자(디렉토리 옵션) 사용을 허용한다.

 FileInfo

 .htaccess에 설정된 AddEncoding, AddLanguage, AddType, DefaultType, 

  ErrorDocument, LanguagePriority와 같은 문서유형 지시자 사용을 허용한다.

 AuthConfig

 .htaccess에 설정된 클라이언트 인증 지시자 사용을 허용한다.

 Limit

 .htaccess에 설정된 Order, Allow, Deny와 같은 접근제어 지시자 사용을 허용한다.


3) Order allow, deny

- 순서대로 Allow에 대한 부분을 먼저 확인 후, Deny를 확인한다.


4) Allow

- Allow from all : 모든 클라이언트로부터의 연결을 허용한다.

- Allow from 127.0.0.1 192.168.111.100 : 127.0.0.1과 192.168.111.100 IP 클라이언트만 허용한다.


5) Deny

- Deny from all : 모든 클라인트로부터의 연결을 거부한다.

- 예)

<Location /server-status>

  SetHandler server-status

  Order deny,allow

  Deny from all

  Allow from 127.0.0.1

</Location>


<Files 파일명></Files>

- 파일명에 따라 특별한 처리를 할 때 사용한다.

- 파일명에 포함된 ?는 임의의 한 문자와 일치함을, *는 임의의 한 문자열이 일치함을 나타낸다.

- 파일명 앞에 ~가 붙게 되면 정규표현식을 사용할 수 있다.


- 예제1) 관리페이지는 외부인이 볼 수 없도록 설정

<Files admin.php>

  Order deny,allow

  Deny from all

  Allow From 127.0.0.1

</Files>


- 예제2) htm, html, css, js, php 파일 인코딩 설정

<Files ~ "\.(htm|html|css|js|php)$">

  AddDefaultCharset UTF-8

  DefaultLanguage ko_KR

</Files>


<FilesMatch 정규표현식></FilesMatch>

- <Files>의 정규표현식 사용가 동일하다. 대신 <FilesMatch>는 ~를 붙히지 않아도 정규표현식이 적용된다.


- 예제1) htm, html, css, js, php 파일 인코딩 설정

<FilesMatch "\.(htm|html|css|js|php)$">

  AddDefaultCharset UTF-8

  DefaultLanguage ko_KR

</FilesMatch>


Redirect

- Redirect [HTTP 상태코드] [요청URL] [리다이렉트 URL]

- HTTP 상태코드는 리다이렉트가 되면서 바뀔 상태코드를 지정한다. 기본값은 302.


- 예제1)

Redirect 301 /hello http://www.naver.com

Redirect /world http://www.naver.com


RedirectMatch

- Redirect 지시자와 비슷하며 정규표현식으로 리다이렉트를 처리할 수 있다.


- 예제1) 톰캣의 WEB-INF와 META-INF 폴더를 접근 못하게 설정

RedirectMatch 404 /(?i)(WEB-INF|META-INF)(/|$)


DefaultType

- 모르는 타입이 들어왔을 경우 설정할 기본 MIME 타입을 설정한다.


LogFormat

- 서버의 로그파일 형식을 설정한다. common은 기본설정, combined는 Referer와 User-Agent가 추가되었다.


LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common



옵션

설명

예제

 %h

 요청한 원격 호스트

 192.168.111.100

 %l

 원격 로그인명

 - 

 %u

 원격 사용자명

 - 

 %t

 요청날짜 및 시간 

 [21/Feb/2016:15:28:28 +0900]

 %r

 요청의 첫번째 라인

 GET/HTTP/1.1 

 %s

 HTTP 응답코드

 200

 %b 

 HTTP 헤더를 제외한 응답의 Byte 길이 

 66 

 %{헤더명}i

 HTTP 헤더에서 작성한 헤더명에 대한 값을 출력

 %{Referer}i 

 %{User-Agent}i


ErrorLog

- 에러로그 파일을 설정한다.


- 예제)

ErrorLog "| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/error.log.%Y%m%d 86400" combined


CustomLog

- 클라이언트의 요청이력을 남길 로그파일을 설정한다.


- 예제)

CustomLog "| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/access.log.%Y%m%d 86400" combind


Alias

- 요청 URL을 특정 파일 시스템에 연결시킨다.


- 예제)

Alias /helpFiles /nas/2016/helpFiles


AddDefaultCharset

- 컨텐츠 형식이 text/plain이나 text/html일 경우 HTTP 응답 헤더에 설정된 charset 헤더를 추가한다.

- 가상 호스트마다 다르게 설정할 수 있다.

- HTTP 응답 헤더에 charset이 지정되었을 경우는 HTML <meta>태그로 charset을 지정해도 헤더에 있는 charset이 적용된다. DefaultCharset과 다른 HTML이 있다면 파일의 인코딩을 변경하거나 <meta>태그로 charset을 명시적으로 지정하고 해당 지시자를 Off하여야 한다.


- 예제)

AddDefaultCharset UTF-8


결과 : Content-Type : text/html; charset=UTF-8



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

http://mcpaint.tistory.com/133

http://toy0box.tistory.com/entry/Apache-httpdconf-주소창-디렉토리-직접-접근-설정



'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치] httpd.conf 전역설정  (0) 2016.02.12
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,

NVL2 함수 사용법 맨날 까먹네 -ㅅ-;;

NULL일 경우 2번째로 셋팅되는지 3번째로 셋팅되는지 헷갈려 적어놓음


1. NVL 함수

exp1값이 NULL이면 "관리자"로 대체한다.


SELECT NVL(mgr_emp_id, "관리자")

  FROM employee


2. NVL2 함수  

exp1값이 NULL이면 "관리자", NULL이 아니면 "사원"으로 대체한다.

DECODE라 생각하는 것이 안 헷갈린다.


SELECT NVL2(mgr_emp_id,"관리자", "사원")

  FROM employee



Posted by SungHoon, Park
,

자바 컬렉션 Map

기타 2016. 2. 13. 22:29

맵(Map)이란?

1) 맵(Map)은 key/value 형태를 가지는 자바 컬렉션이다. 컬렉션 프레임워크에 속하지만 List, Set과 다르게 Collection 인터페이스를 구현하지 않는다.


2) key는 고유하여야 한다. 만약 맵에서 같은 key를 사용하게 된다면 그 값은 덮어 씌워진다.

 

3) 대표적인 구현 클래스로는 HashMap, TreeMap 등이 있다.


HashMap

1) key 객체에 대한 hashCode() 메소드로 생성된 해시값을 사용하여 value를 저장하고 조회한다.


2) 순서를 보장하지 않는다. 입력순서를 보장받으려면 LinkedHashMap을 사용하면 된다.


3) HashMap은 멀티 쓰레드 환경에서 Thread Safe하지 않다. 이것이 HashTable과의 차이점이다.Thread Safe하지 않지만 모든면에서 HashTable보다 HashMap이 우위에 있다. HashTable은 1.1 이전의 레거시 코드를 위해서 유지가 될 뿐이지만 HashMap은 자바8에서도 계속 개선되고 있다. 만약 동기화가 필요하다면 synchronizedMap이나 ConcurrentHashMap 클래스를 이용하는 것이 좋다.


4) 저장방식

- HashMap에는 key/value 쌍을 나타내는 Entry<K, V>라는 내부 클래스가 있는데, HashMap 멤버변수로 Entry<K, V> 배열이 선언되어 있다. 이 배열에 key/value를 저장하게 된다.


- HashMap은 내부적으로 bucket을 사용하는데 bucket은 Map에 저장되는 element를 체계적으로 분산시켜 놓는 방법이라 할 수 있다. 해시값을 통해서 bucketIndex를 생성하고 Entry<K, V> 배열에 인덱스로 활용되어 값을 저장한다. bucket의 수는 load factor에 의해 결정된다.



- 다음은 HashMap put() 메소드의 일부이다.



※ 참고자료

https://en.wikipedia.org/wiki/Hash_table

- http://d2.naver.com/helloworld/831311

- http://iilii.egloos.com/4457500



'기타' 카테고리의 다른 글

자바 컬렉션 List  (0) 2016.02.13
버블정렬, 삽입정렬, 퀵정렬, 병합정렬  (0) 2016.02.04
Posted by SungHoon, Park
,

자바 컬렉션 List

기타 2016. 2. 13. 22:06

리스트(List)란?

1) 자바 콜렉션 프레임워크중에서 가장 많이 사용하는 자료구조는 리스트(List)일 것이다. 리스트는 특정 타입 값들이 순차적으로 정렬된 컬렉션이다. 대표적인 구현 클래스로는 ArrayList, LinkedList 등이 있다.


2) 배열 역시 데이터의 집합을 순차적으로 표현하는 용도이나 사이즈에 제한이 있다. 배열은 생성시 선언한 사이즈에 한해서 사용을 해야하는 단점이 있지만, 리스트의 경우는 사이즈에 대한 한계가 없다. 이 점이 배열보다 앞선 장점이 아닐까 한다.



ArrayList

1) 내부적으로 배열을 사용하는 List 인터페이스의 구현체이며, 배열의 특징을 모두 가지고 있다.


2) ArrayList 객체 생성시 배열과 같이 사이즈를 지정할 수 있다. 이 사이즈는 내부 배열의 초기 사이즈이다. 만약 크기를 지정하지 않는다면 기본 배열크기인 10이 설정된다.


3) 배열이 꽉 차게 된다면, ArrayList는 자동적으로 사이즈가 더 큰 배열을 생성하여 원소들을 재할당한다. 하지만 새로운 배열을 생성후 복사를 하는 과정이 있어야 하기 때문에 시간이 소요되고 메모리도 소모하게 된다는 단점이 있다. 따라서 데이터의 크기가 크거나 예측이 되는 사이즈라면 초기 사이즈 설정을 해주는 것이 더 효율적이다.


4) 배열의 시작 위치나 중간 위치에 새로운 원소를 추가하려고 하면 공간을 만들기 위해 새로운 배열 생성 및 복사를 하여 이동시켜 주는 작업이 진행되어야 하므로 효율적이지 못하다. (역시 배열의 특징)


5) 또한 원소를 삭제해도 배열의 크기는 줄어들지 않으므로 메모리 사용 측면에서 효율적이지 못하다.


LinkedList

1) 다음 노드를 가리키는 참조값이 있으며, 다음 노드만 참조하므로 단방향의 특징을 가지는 List 구현체이다.


2) 리스트의 첫번째 위치나 중간 지점에 데이터를 추가/삭제하게 된다면 다음 노드를 가리키는 참조값만 변경하여 주면 되므로 ArrayList보다 추가/삭제에 효율적이다.


3) 데이터 삭제시 앞뒤의 참조값만 변경해주면 되며, 제외된 값은 GC에 의해 소멸되므로 ArrayList와 달리 메모리 사용 측면에서 효율적이다.


4) ArrayList와 같이 인덱스로 바로 검색을 할 수 없으며 앞에서부터 순회하여 검색하여야 한다.



※ 참고자료

- 자바 프로그래밍 면접, 이렇게 준비한다


'기타' 카테고리의 다른 글

자바 컬렉션 Map  (1) 2016.02.13
버블정렬, 삽입정렬, 퀵정렬, 병합정렬  (0) 2016.02.04
Posted by SungHoon, Park
,

아파치 웹서버 httpd.conf 전역설정에 대해 정리한다.


ServerRoot "etc/httpd"

- 아파치 웹서버가 설치되어 있는 곳의 최상위 디렉토리.

- 기본설정은 "/etc/httpd"


ServerTokens Prod

- 웹서버 오류가 발생하였을 경우, 에러페이지와 Http Response 헤더에 보여지는 웹서버 정보의 노출 수준을 설정한다.

- 옵션 종류 : Full | OS | Minor | Minimal | Major | Prod

- 너무 많은 정보가 출력되는 것은 문제가 있으므로, 보통 Prod(Production)으로 설정하는 것이 좋다.


1) 에러페이지

- ServerSignature가 Off이면 웹서버 정보가 노출되지 않는다.


옵션

내용

Full 

 Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips DAV/2 mod_jk/1.2.41 Server at 10.113.232.101 Port 80

OS

 Apache/2.2.31 (Unix) Server at 10.113.232.101 Port 80

Minor

 Apache/2.2 Server at 10.113.232.101 Port 80

Minimal

 Apache/2.2.31 Server at 10.113.232.101 Port 80

Major

 Apache/2 Server at 10.113.232.101 Port 80

Prod

 Apache Server at 10.113.232.101 Port 80


2) Http Response 헤더


옵션

내용

Full 

 Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips DAV/2 mod_jk/1.2.41

OS

 Apache/2.2.31 (Unix)

Minor

 Apache/2.2

Minimal

 Apache/2.2.31

Major

 Apache/2

Prod

 Apache


KeepAlive Off

- KeepAlive는 한 프로세스가 특정 사용자의 요청을 지속적으로 허용하며 처리할지 여부를 설정한다.

- 기본설정은 Off이다. On으로 설정할 경우, 메모리 사용의 부담이 많아지게 되지만 성능은 좋아진다. 단발성 요청이 많은 대민 서비스의 경우 Off가 적절하다. (물론, 상황에 따라 다르다)


KeepAliveTimeout 15

- KeepAlive가 On일 경우에 유효한 값으로, 같은 클라이언트에서 처리할 시간을 지정한다.

- 기본설정은 15초


MaxKeepAliveRequests 100

- KeepAlive가 On일 경우에 유효한 값으로, 한 프로세스에서 특정 사용자의 요청을 설정에 지정된 횟수만큼 처리한다.  횟수를 넘어가게 되면 프로세스는 죽고, 다른 프로세스가 요청을 처리하게 된다.

- 기본설정은 100


Listen 80

- 해당 포트를 리스닝 하도록 설정한다. 여러개의 포트를 사용하려면 Listen 구문을 여러번 사용하면 된다.

- 기본값은 80


LoadModule

- 오브젝트 파일이나 라이브러리를 읽어온 후에 사용가능한 모듈 목록에 추가하는 지시자다.

- DSO(Dynamic Shared Object) 형태의 모듈에 사용한다.


User nobody

Group nobody

- 유닉스 계열 운영체제에서 1024 이하의 포트는 root 사용자만 사용할 수 있다. 하지만 root 권한으로 웹서버가 운영될 경우, 취약점을 이용해 공격자에게 root 권한을 유출할 수 있는 위험이 존재하게 된다. 따라서, 최초 구동은 root로 하고 자식 프로세스는 setuid, setgid 함수로 User, Group 지시자에 설정된 사용자 및 그룹으로 권한이 전환된다.

- ps -ef | grep httpd를 실행해보면 부모 프로세스만 root이고, 나머지는 apache(또는 nobody)로 떠있는 것을 확인할 수 있다.


Include

- 다른 설정파일을 포함시키는 지시자다.

- 하나의 파일에 모든 설정을 담고 있으면 관리 및 수정이 어렵기 때문에, 용도별로 설정파일을 나누고 Include 지시자로 포함을 하는것이 좋다.

- 예로 SSL 설정은 Include conf/extra/httpd-ssl.conf로 설정파일이 나뉘어 있다.


※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,