□ 우리가 지금까지 사용하는 Tomcat은 Spring Boot 안에서 제공되는 내장 Tomcat 이다.
□ 우리는 이전에 설치 했던 Tomcat 을 사용 할 수도 있다.
□ 이 둘은 물론 각각의 장점이 있다.

□ Tomcat 을 따로 설치 할 필요가 없다.
□ Run AS > Spring Boot App
□ 별도의 설정이 필요 없다.(대신 단순한 형태로 이용)
□ 수정이 거의 일어나지 않는 운영에 유용하다
□ Jar 형태로 빌드 할 때 주로 사용 된다.
□ 더 많은 트래픽 처리를 할 수 있다.
□ Run As > Run On Server
□ Sever.xml 이나 web.xml 로 여러 설정이 가능하다.
□ 수정이 자주 일어나는 운영에 유용 하다.
□ War 형태로 빌드 할 때 주로 사용 된다.

□ server.xml 에서 수정

<!-- 모든 이미지에 대한 if 문을 가져올 수 없으니 type이 무엇인지 찾아서 가져와야된다. 뿌리는 방법을 고민해야된다. -->
<c:if test="${list.size() > 0}">
<c:forEach items="${list}" var="path">
<c:set var="ext" value="${path.substring(path.lastIndexOf('.') + 1)}"/> <!-- 마지막 . 뒤에 있는 확장자 찾기 위해서 / substring() 함수는 문자열에서 지정된 인덱스 범위에 해당하는 부분 문자열을 반환 -->
<c:choose>
<c:when test="${ext eq 'jpg' or ext eq 'jpeg' or ext eq 'png' or ext eq 'gif' or ext eq 'bmp'}">
<img width="250px" src="photo/${path}"/>
</c:when>
<c:otherwise>
<!-- <c:otherwise/> 태그로 특정 조건을 검사하고, 어떤 조건도 만족하지 않을 때 실행될 기본 동작을 정의할 때 -->
<!-- 일반 파일인 경우 -->
<a>${path}</a>
<a href="download/${path}">다운로드</a>
</c:otherwise>
</c:choose>
<a href="delete?file=${path}">삭제</a>
<hr/>
</c:forEach>
</c:if>
<c:if test="${list.size()==0 }">업로드 된 사진이 없습니다.</c:if>
<p><a href="./">돌아가기</a></p>
// 파일 리스트
public List<Map<String, String>> getList() {
List<Map<String, String>> fileList = new ArrayList<Map<String,String>>();
try {
for (String fileName : new File(root).list()) {
Map<String, String> map = new HashMap<String, String>();
String type =Files.probeContentType(Paths.get(root+"/"+fileName));
map.put("name", fileName);
// type 이 null 이 dkslrh image 를 포함하고 있으면 "true"
if(type != null && type.contains("image")) {
map.put("image", "true");
}else {
map.put("image", "false");
}
fileList.add(map);
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info("fileList : {} ",fileList); //image/png
return fileList;
}
<!-- 모든 이미지에 대한 if 문을 가져올 수 없으니 type이 무엇인지 찾아서 가져와야된다. 뿌리는 방법을 고민해야된다. -->
<c:if test="${list.size() > 0}">
<c:forEach items="${list}" var="path">
<c:set var="ext" value="${path.substring(path.lastIndexOf('.') + 1)}"/> <!-- 마지막 . 뒤에 있는 확장자 찾기 위해서 / substring() 함수는 문자열에서 지정된 인덱스 범위에 해당하는 부분 문자열을 반환 -->
<c:choose>
<c:when test="${ext eq 'jpg' or ext eq 'jpeg' or ext eq 'png' or ext eq 'gif' or ext eq 'bmp'}">
<img width="250px" src="photo/${path}"/>
</c:when>
<c:otherwise>
<!-- <c:otherwise/> 태그로 특정 조건을 검사하고, 어떤 조건도 만족하지 않을 때 실행될 기본 동작을 정의할 때 -->
<!-- 일반 파일인 경우 -->
<a>${path}</a>
<a href="download/${path}">다운로드</a>
</c:otherwise>
</c:choose>
<a href="delete?file=${path}">삭제</a>
<hr/>
</c:forEach>
</c:if>
<c:if test="${list.size()==0 }">업로드 된 사진이 없습니다.</c:if>
<p><a href="./">돌아가기</a></p>
□ logback-spring.xml □
<!-- 패턴 등록 -->
<!-- INFO 24-05-27 12:11:42[http-nio-80-exec-1] [BoardController:28] - 게시글 목록 페이지 요청 -->
<!--
%-5 : 좌측 정렬 5자(5자가 안되면 공백 처리)
level : 로그 레벨
%d{yy-MM-dd HH:mm:ss} : 로그의 기록 시간, 출력 형식{년-월-일 시:분:초}
[%thread] : 프로그램을 실행시키고 있는 쓰레드, http-nio-80-exec-1 exec 로 실행시키는거고 -1 은 쓰레드 번호이다
[%logger{0}: : 로거의 소스 단계(수정 가능)
%line] : 로그가 찍힌 소스의 줄 번호
- %msg : 메시지
%n : 줄바꿈
-->
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line] - %msg%n"/>
<!-- Appenders : CONSOLE -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 출력 패턴 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 로그의 파일 저장 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 저장 위치 -->
<file>C:/logs/service.log</file>
<!-- 출력 패턴 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- 롤링 정책(언제 끊어서 말아줄 것인가?) -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 어떤 이름으로 저장할래? -->
<fileNamePattern>C:/service.%d{yy-MM-dd}.log</fileNamePattern>
<!-- 얼마나 저장할래? (일단위)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
□ run as -> maven install -> target / ROOT로 이름 변경


□ java -jar ROOT.war [서버 실행]
□ ctrl + C [서버 종료]
□ Window 에서 개발 하고 Linux 에서 배포할 경우 파일 시스템 등을 신경 써야 한다.
□ 개발 시 사용하는 DB 와 실제 서비스에서 사용하는 DB 가 다를 수 있다.
□ 개발 시 사용하는 포트와 서비스에서 사용하는 포트도 다를 수 있다.
□ 이러한 내용들을 경우에 맞게 활용하기 위해 우리는 profile 이라는 것을 만든다.
□ 우선 사용할 프로필의 properties 파일을 준비 해야 한다.

□ Spring Boot 옵션에서 profile 을 dev 로 선택 후 실행

□ arguments 에서 -Dspring.profiles.active=dev 추가

□ Environment 에서 spring.profiles.active=dev 추가

□ 1. cof/catalina.properties 에 다음 내용을 추가 해 준다.

□ 2. spring.profiles.active=dev

□ 3. meven install -> apache-tomcat-9.0.86 -> webapps -> ROOT 파일 설정 후 추가

□ 4. apache-tomcat-9.0.86 -> bin 파일에서 cmd -> startup 서버 실행 확인

□ java -jar ROOT.war -- spring profiles.active=dev