package global.configuration;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.ini4j.Ini;
import org.ini4j.InvalidFileFormatException;
public class iniTest {
static final String INI_PATH = "src/main/java/global/configuration/properties.ini";
public static void main(String[] args) throws InvalidFileFormatException, IOException {
/** ini4j 라이브러리 이용 하지 않기 **/
// ini 파일 내용
// mode = external_local
Properties prop = new Properties();
prop.load(new FileInputStream(INI_PATH));
System.out.println(prop.getProperty("mode")); // external_local
/** ini4j 라이브러리 사용 → 대괄호 읽을 수 있음**/
// ini 파일 내용
// [mode]
// mode = external_local
Ini ini = new Ini();
File iniFile = new File(INI_PATH);
ini = new Ini(iniFile);
System.out.println(ini.get("mode", "mode")); // external_local
}
}
Coyote : Tomcat TCP 프로토콜 지원 Catalina : Java Servlet을 호스팅 해준다. Jasper : JSP 페이지 요청 처리 Servlet
📝톰캣 동작 구조
Tomcat Server가 그 밑에 Service 객체를 생성한다 (그 하위에는 Engine, Connector(호출 포트), Host, Context(URI Mapping) 등이 존재)
HTTP 통신 요청 → 호출 포트에 해당하는 Connector 연결 → Service → Engine → Host → Context(기본적으로 webapps에 있는 곳 참조해 프로젝트 URI Mapping → 프로젝트 내 web.xml 읽기 → 프로젝트 내 web.xml 기반으로 프로젝트 URI 매핑
하나의 Server에는 여러개 Service가 존재할 수 있다. 하나의 Service에는 1개의 Engine과 여러개의 Connector로 구성 하나의 Engine에는 여러개 Host 존재할 수 있다. 하나의 Host에는 여러개 Context가 존재할 수 있습니다.
Tomcat Server → Engine(Connector로 통해 전달) → Host → Context
[Tomcat에서는 server.xml에 적혀있는 내용을 가지고 객체를 만드는 거라고 생각하면 된다. 그렇기 때문에 Connector에 포트번호를 적어두면 어떤 Service를 이용할지 방향을 알려준다]
📝Server
port : Shutdown 명령을 보낼 수 있는 TCP/IP 주소
<Server port="8005" shutdown="SHUTDOWN">
📝Service
Serivce의 유일한 이름으로 Log를 남길 때 사용한다 (Catalina.out)
<Service name="Catalina">
📝Connector
특정 TCP port에서 request들을 listen해 engine으로 보내준다.
port
리슨할 포트
protocol
TCP/IP 방식
HTTP/1.1
기본적으로 Connection당 하나의 요청을 처리 하도록 설계 동시 전송이 불가능하고 요청과 응답이 순차적으로 이뤄진다
HTTP/2
HTTP1.1을 완전하게 재작성한 것이 아니라 프로토콜의 성능에 초첨을 맞춰 수정한 버전 기본적으로 connection 한 개로 동시에 여러 개의 메시지를 주고 받을 수 있으며, 응답은 순서에 상관없이 stream으로 주고 받는다
AJP
"Apache JServ Protocol"의 약자로, Tomcat과 웹 서버(주로 Apache) 간의 통신을 위한 프로토콜로 Web서버인 Apache에서 어떤 포트를 들어오면 포트포워딩할 지에 대한 포트 설정을하고 Tomcat도 이에 대한 걸 받기 위한 프로토콜 설정 및 포트 개방을 한다
<!-- Apache 설정 -->
<VirtualHost *:80>
ServerName yourdomain.com
# 기타 설정
ProxyPass / ajp://localhost:8009/ # Tomcat과의 AJP 연결 설정
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
<!-- Tomcat 설정 -->
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" />
위 프로토콜의 동작 방식 설정 - BIO : Tomcat 7 기본 방식 하나의 Thread가 하나의 Connection을 담당 - NIO : Tomcat 8.5 기본 방식 하나의 Thread가 하나 이상의 Connection을 담당 - APR : 10.x 버전 부터 ARP 방식 삭제
maxThreads : Connector가 생성할 수 있는 최대 Thread 수 maxConnections : 동시 처리 가능한 최대 Connection 수 maxSpareThreads : 최소로 실행을 유지할 thread 수 acceptCount : thread가 꽉 찼을 때 queue에 저장 가능한 최대 request 수
Thread Pool
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150", maxConnections >
공유 Thread Poll
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
📝 Engine
name : Engine의 유일한 이름으로 Log를 남길 때 사용한다. defaultHost ?
<Engine name="Catalina" defaultHost="localhost">
📝Host
name : 유일한 가상 Host명 (http://hostname/~) appBase : app 폴더 (default webapps) Host마다 다른 appBase를 지정할 수 있다. (여러개 Domain 효율적 관리가능) autoDeploy : appBase에 변동사항이 있을 때 자동으로 Deploy(배포) 해준다. unpackWARs : war파일 deploy 설정 여부
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
...
-->
...
<Server port="8005" shutdown="SHUTDOWN">
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
....
</Host>
</Engine>
</Service>
</Server>
Connector port="8080" → Connector port="${바꿀 포트번호}" 로 변경