framework : 개발에 있어 기본이 되는 뼈대나 구조 환경을 제공하는 개발 tool
eclipse → Help → eclipse Marketplace → spring tools 3 add-on for spring tools 4 3.9.22.release 검색 → install
전체 선택 후 finish → accept
어떤frame을 구성하고 있는 자바EE 기반의 오픈 소스 Framework
개발적인 측면 외에도 모든 자바 애플리케이션에서 단순성, 테스트 용이성, 느슨한 결합성의 측면에서 Spring의 이점을 얻을 수 있음
스프링 프레임워크 특징
크기와 부하의 측명에서 경량임
제어의 역행(IoC : Inversion of Control)이라는 기술을 통해 객체와 객체간의 결합도를 느슨하게 만들어 유지 보수의 효율성을 극대화 (spring DI: 의존성 삽입)
관점지향(AOP : Aspect Oriented Programming) : 핵심관점(비즈니스 로직)과 횡단관점(트랜잭션, 로그, 권한 체크, 인증, 예외 처리 등 공통모듈)으로 관심의 분리를 실현하여 필요할 때 필요한 기능을 삽입하여 처리 (프로그래밍을 위한 풍부한 지원을 함) ex. 트랜잭션, 로그, 권한 체크, 인증, 예외 처리 등
애플리케이션 객체의 생명주기와 설정을 포함하고 관리한다는 정에서 일종의 Container라고 할 수 있음
간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음
spring tool 설치 안될 경우 eclipse.exe, eclipse.ini 를 백업 → 스프링 설치 후 창 닫기 → 백업한 내용 붙여넣기 후 eclipse 다시 실행
JRE System Library 버전이 1.6으로 되어있는 경우 프로젝트 마우스 오른쪽 버튼 → Properties → Project Facets → Java : 11로 변경, Dynamic Web Module : 5.0으로 변경 후 Apply and Close
Maven(빌드 툴) : 프로젝트의 라이브러리를 관리하는 프로그램
pom.xml : Maven 빌드 툴을 이용하여 프로젝트에 라이브러리를 빌드하기 위한 정보를 제공하는 환경설정 파일
로컬 저장소(Local Repository) : 프로젝트에 빌드될 라이브러리 파일을 저장하기 위한 폴더
메이븐 저장소(Maven Repository) : 라이브러리 파일이 저장된 인터넷상의 저장소
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xyz.itwill</groupId>
<artifactId>controller</artifactId>
<name>spring</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<!-- properties : pom.xml 파일에서 자주 사용하는 값을 이름(식별자)을 이용하여 등록하기 위한 엘리먼트 -->
<!-- => 하위 엘리먼트 이름의 값을 구분하기 위한 식별자로 사용하며 엘리먼트 내용이 제공되는 값을 표현 -->
<!-- => pom.xml 파일에서 ${이름} 형식으로 값을 제공받아 사용 가능 -->
<!-- => 라이브러리의 버전을 효율적으로 관리하기 위해 properties 엘리먼트 사용 -->
<properties>
<org.springframework-version>5.3.25</org.springframework-version>
<org.aspectj-version>1.9.19</org.aspectj-version>
<org.slf4j-version>2.0.6</org.slf4j-version>
</properties>
<!-- dependencies : dependency 엘리먼트 목록을 설정하기 위한 엘리먼트 -->
<dependencies>
<!-- Spring -->
<!-- dependency : 라이브러리 파일을 프로젝트 빌드 처리하기 위한 엘리먼트 -->
<!-- => 의존관계로 설정된 라이브러리 파일도 자동으로 빌드 처리 -->
<dependency>
<!-- groupId : 라이브러리 파일을 제공하는 그룹의 식별자(도메인)를 설정하기 위한 엘리먼트 -->
<groupId>org.springframework</groupId>
<!-- artifactId : 라이브러리의 이름(식별자)을 설정하기 위한 엘리먼트 -->
<artifactId>spring-context</artifactId>
<!-- version : 라이브러리 버전을 설정하기 위한 엘리먼트 -->
<version>${org.springframework-version}</version>
<!-- exclusions : exclusion 목록을 설정하기 위한 엘리먼트 -->
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<!-- exclusion : 의존관계의 라이브러리 중 제외 라이브러리를 설정하기 위한 엘리먼트 -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<!-- scope : 라이브러리 파일이 빌드되어지는 범위를 설정하기 위한 엘리먼트 -->
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/xerces/xercesImpl -->
<!-- => 로그 구현체를 이용한 로깅 정보 처리시 경로에 문제가 있는 경우(경로에 한글이 있을 경우)
해결방법을 제공하는 라이브러리 -->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-resources-plugin -->
<!-- => Maven Plugin 문제의 pom.xml 파일에서 에러가 발생된 경우 빌리 처리에 대한
해결방법을 제공하는 라이브러리 -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
항목 별 version 변경 후 저장하면 자동으로 Maven Dependencies version 변경 확인 가능
어두운 jar파일은 실행 or test 시 활성화 될 예정인 파일 (scope 태그)
string에서 제공하는 로깅 파일 (검정색)
압축푼후 STS.exe 실행 (sts.ini : 11version)
이클립스와 동일하게 환경설정
log4.xml : 로그 구현체에 대한 환경설정 파일
pom.xml (환경설정) 에서 SCOPE를 runtime으로 설정시 실행되지 않을 경우에는 lib를 빌드 처리 하지 않음
"log4j.dtd"
: 빌드처리 되지 않았기 때문에 에러해결 방법
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"
로 수정하면 에러 발생하지 않음appender : 로그 구현체를 구성하는 클래스를 설정하기 위한 엘리먼트
<appender name="console" class="org.apache.log4j.ConsoleAppender">
param : Appender 클래스에 필요한 값을 제공하기 위한 엘리먼트
<param name="Target" value="System.out" />
layout : 로깅정보를 제공받아 로그 형식을 설정하기 위한 엘리먼트
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
logger : 특정 패키지의 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트
<logger name="xyz.itwill00.log" additivity="false">
<level value="info" />
: info 이상의 이벤트가 발생하면 기록해주세요root : 모든 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트
<priority value="warn" />
: 모든 클래스에서 경고 이상의 이벤트가 발생하면 콘솔 어펜더로 기록해라변환문자(Conversion Character) : 일반문자와 구분하기 위해 % 기호로 시작
%c : 패키지가 포함된 클래스의 이름을 기록
%d : 날짜와 시간을 기록
%m : 로그 이벤트에 의해 생성된 로그 메세지를 기록
%n : 엔터(Enter)를 기록 (로그 줄바꿈)
%M : 로그 이벤트가 발생된 메소드의 이름을 기록
%p : 로그 메세지가 발생된 로그 이벤트를 기록 (로그 이벤트의 길이만큼 자릿수를 제공받아 기록)
<?xml version="1.0" encoding="UTF-8"?>
<!-- log4.xml : 로그 구현체에 대한 환경설정 파일 -->
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<!-- appender : 로그 구현체를 구성하는 클래스를 설정하기 위한 엘리먼트 -->
<!-- name 속성 : appender 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- class 속성 : 로그 구현체로 사용하기 위한 클래스를 속성값으로 설정 -->
<!-- => class 속성값으로 설정된 클래스는 반드시 Appender 인터페이스를 상속받아 작성 -->
<!-- => class 속성값으로 설정된 클래스에 따라 로깅정보를 기록하는 방식이 다르게 설정 -->
<!-- => ConsoleAppender 클래스 : 로깅정보를 서버 콘솔에 기록하기 위한 클래스 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- param : Appender 클래스에 필요한 값을 제공하기 위한 엘리먼트 -->
<param name="Target" value="System.out" />
<!-- layout : 로깅정보를 제공받아 로그 형식을 설정하기 위한 엘리먼트 -->
<!-- class 속성 : 로그 형식 관련 정보를 제공하기 위한 클래스를 속성값으로 설정 -->
<!-- => PatternLayout 클래스 : 로그 형식을 작성하기 위한 변환 문자를 제공하는 클래스 -->
<!-- # 변환문자(Conversion Character) - 변환문자는 일반문자와 구분하기 위해 % 기호로 시작 -->
<!-- %c : 패키지가 포함된 클래스의 이름을 기록 - {정수값}을 이용하여 원하는 형식으로 기록 가능 -->
<!-- => %c{1} : 패키지를 제외한 클래스의 이름만 기록 -->
<!-- %d : 날짜와 시간을 기록 - {SimpleDateFormat}을 이용하여 원하는 형식으로 기록 -->
<!-- => %d{yyyy-MM-dd} : [년-월-일] 형식으로 로그시간 기록 -->
<!-- %m : 로그 이벤트에 의해 생성된 로그 메세지를 기록 -->
<!-- %n : 엔터(Enter)를 기록 - 로그 줄바꿈 -->
<!-- %M : 로그 이벤트가 발생된 메소드의 이름을 기록 -->
<!-- %p : 로그 메세지가 발생된 로그 이벤트를 기록 -->
<!-- => 로그 이벤트 : TRACE > DEBUG > INFO > WARN > ERROR > FATAL -->
<!-- # 변환문자 자릿수 설정 - %p 변환문자를 이용하여 예제 설정 -->
<!-- %p : 로그 이벤트의 길이만큼 자릿수를 제공받아 기록 -->
<!-- %5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 오른쪽 정렬 -->
<!-- => 자릿수가 부족하면 기록이 잘리고 남으면 공백으로 처리되어 기록 -->
<!-- %-5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 왼쪽 정렬 -->
<!-- %.5p : 로그 이벤트를 5자리(최소 자릿수)를 제공받아 기록 - 오른쪽 정렬 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<appender name="sample" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c{1} 클래스의 %M 메소드 - %m%n" />
</layout>
</appender>
<appender name="dailyLogFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="dailyLog"/>
<param name="DatePattern" value=".yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss}]%-5p : %c - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<!-- logger : 특정 패키지의 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- name 속성 : 패키지 경로를 속성값으로 설정 -->
<logger name="xyz.itwill.controller">
<!-- level : 패키지에 작성된 클래스에서 발생되는 로그 이벤트를 설정하기 위한 엘리먼트 -->
<level value="info" />
</logger>
<!-- additivity 속성 : false 또는 true(기본) 중 하나를 속성값으로 설정 -->
<!-- => 속성값이 [false]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함하지 않도록
동작되고 [true]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함되도록 동작 -->
<logger name="xyz.itwill00.log" additivity="false">
<level value="info"/>
<appender-ref ref="sample" />
<appender-ref ref="dailyLogFile" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<!-- root : 모든 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- => 모든 logger 엘리먼트는 root 엘리먼트의 정보를 상속받아 사용 -->
<root>
<!-- priority : 모든 클래스에서 발생되는 기본 로그 이벤트를 설정하기 위한 엘리먼트 -->
<!-- value 속성 : 로그 이벤트를 속성값으로 설정 -->
<!-- => 속성값으로 설정된 로그 이벤트보다 상위의 이벤트가 발생된 경우 로그 구현체로 기록 -->
<priority value="warn" />
<!-- appender-ref : 로그 구현체를 참조하기 위한 엘리먼트 -->
<!-- ref 속성 : appender 엘리먼트의 식별자를 속성값으로 설정 -->
<appender-ref ref="console" />
</root>
</log4j:configuration>
서버 더블 클릭
Modules → 변경할 경로 선택 후 Edit... click
Path에 변경될 이름 작성(프로젝트 이름과 동일하게 작성할 것을 권장)
context 경로(최상위 directory) 변경된 것을 확인 가능
Logger 객체 : 로그 이벤트를 발생하기 위한 객체
LoggerFactory 클래스 : Logger 객체를 생성하여 제공하기 위한 클래스
LoggerFactory.getLogger(Class<T> clazz) : 메모리에 저장된 클래스(Class 객체 - Clazz)를 전달 받아 해당 클래스에서 로그 이벤트를 발생할 수 있는 Logger 객체를 생성하여 반환하는 메소드
Logger.info(String message) : Logger 객체로 INFO 레벨의 로그 이벤트를 발생하는 메소드
additivity 속성이 true 인 경우 (root 엘리먼트의 로그 구현체 포함)
additivity 속성이 false 인 경우 (root 엘리먼트의 로그 구현체 미포함)
package xyz.itwill00.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogHelloWorldApp {
private static final Logger logger=LoggerFactory.getLogger(LogHelloWorldApp.class);
public static void main(String[] args) {
//Logger.info(String message) : Logger 객체로 INFO 레벨의 로그 이벤트를 발생하는 메소드
// => 매개변수에 로그 구현체로 기록될 로그 메세지 전달
logger.info("시작");
LogHelloWorld hw=new LogHelloWorld();
String message=hw.hello("홍길동");
System.out.println("message = "+message);
logger.info("종료");
}
}
package xyz.itwill00.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogHelloWorld {
private static final Logger logger=LoggerFactory.getLogger(LogHelloWorld.class);
public String hello(String name) {
logger.info("시작");
String message=name+"님, 안녕하세요";
logger.info("종료");
return message;
}
}
http://logging.apache.org/log4j/1.2/apidocs : Apache Log4j API 문서 참고
DatePattern 형태로 날짜 생성됨
project를 누른 상태에서 f5 누르면 dailylog 생성됨
<appender name="dailyLogFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="dailyLog"/>
<param name="DatePattern" value=".yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss}]%-5p : %c - %m%n" />
</layout>
</appender>