Spring Framework (환경설정)

woom·2023년 2월 8일
0

Framework

목록 보기
6/20
post-thumbnail

🌼 Framework

  • framework : 개발에 있어 기본이 되는 뼈대나 구조 환경을 제공하는 개발 tool

    • framework에 기반해 애플리케이션을 개발하면 여러 애플리케이션이 비슷한 구조를 가지게 되므로 생산성이 향상될 뿐만 아니라 관리하기도 쉬워짐
    • framework 자체는 완전한 애플리케이션 소프트웨어가 아님


📌 개발환경설정

  1. eclipse → Help → eclipse Marketplace → spring tools 3 add-on for spring tools 4 3.9.22.release 검색 → install

  2. 전체 선택 후 finish → accept

  1. type all check 후 Truset selected → restart


🌼 Spring Framework

  • 어떤frame을 구성하고 있는 자바EE 기반의 오픈 소스 Framework

  • 개발적인 측면 외에도 모든 자바 애플리케이션에서 단순성, 테스트 용이성, 느슨한 결합성의 측면에서 Spring의 이점을 얻을 수 있음

  • 스프링 프레임워크 특징

    • 크기와 부하의 측명에서 경량임

    • 제어의 역행(IoC : Inversion of Control)이라는 기술을 통해 객체와 객체간의 결합도를 느슨하게 만들어 유지 보수의 효율성을 극대화 (spring DI: 의존성 삽입)

    • 관점지향(AOP : Aspect Oriented Programming) : 핵심관점(비즈니스 로직)과 횡단관점(트랜잭션, 로그, 권한 체크, 인증, 예외 처리 등 공통모듈)으로 관심의 분리를 실현하여 필요할 때 필요한 기능을 삽입하여 처리 (프로그래밍을 위한 풍부한 지원을 함) ex. 트랜잭션, 로그, 권한 체크, 인증, 예외 처리 등

      • AOP : 객체 지향 프로그램에서 모듈화의 단점(코드의 중복)을 보완, 확장하여 OOP를 OOP답게 사용할 수 있도록 도와주는 개념
    • 애플리케이션 객체의 생명주기와 설정을 포함하고 관리한다는 정에서 일종의 Container라고 할 수 있음

    • 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음

  • Spring Core : spring 핵심 관리 (중요)
  • Spring AOP : 필요한 코드가 삽입되서 실행될 수 있도록 처리
  • Spring Context : application context를 이용

  • Spring Library : 프로그램 생성시 자동 빌드 처리됨
  • myBatis Library : 자동화 빌드 도구인 maven 이용해서 빌드 처리

📕 spring 프로젝트 생성

  1. 통합개발환경 eclipse 우측 상단 Open Perspective 클릭하여 Spring으로 변경
    • perspective 변경 시 view 변경되고 view에 따라 메뉴 변경됨 (javaEE : web프로젝트를 만들 수 있는 perspective)

  1. Package Explorer 창 마우스 오른쪽 버튼 클릭 → New → Spring Legacy Project 클릭 (spring framework 위한 프로젝트)
    • spring starter project : spring boot를 위한 프로젝트

  1. Project name 설정 → Templates : Spring MVC(Model-View-Controller를 이용한 설계 방식) Project로 설정(Spring MVC Project를 실행하기 위해 필요한 라이브러리 설명) → Next

  1. Yes click (MVC Project에 필요한 용량 확인 후 진행)

  1. 프로젝트 생성을 위한 최상단 패키지 이름 작성 후 Finish

  1. 필요한 라이브러리 자동 빌드 처리 후 프로젝트 생성 완료 (빌드 처리 미완료 시 에러 발생)

  • main(main program)
    • java : main program이 사용할 수 있는 클래스 생성 (dao, dto, service 등)
    • resources : spring에 필요한 값(정보)을 제공 (xml, properties)
    • webapp : 웹에서 사용할 수 있는 자원, 저장 (javascript, jsp, css 등)
  • test(test program) : 배포 안됨
    • java : test program이 사용할 수 있는 클래스 생성 (dao, dto, service)
    • resources : spring에 필요한 값(정보)을 제공 (xml, properties)
    • 작성한 코드가 제대로 동작하는지 확인 가능 module test라고도 함
  • JRE System Library : java가 제공해주는 lib
  • Maven Dependencies : maven이라는 build tool이 자동으로 라이브러리 빌드 처리

📌 오류 발생 유형

  • classnotfoundexception
  1. 프로젝트 마우스 오른쪽 버튼 → properties → deployment assembply에서 Maven Dependencies 연결 되었는지 확인 → 없을 경우 Add 클릭하여 Java Build Path Entries 선택하여 빌드 처리

  1. 라이브러리 저장 폴더에서 불필요한 파일 삭제 후 다시 시작
  • 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


📌 spring 프로젝트 확인

  • HomeController 실행

  • url주소 최상위 디렉토리로 변경하여 Hello world! 출력 확인


💡 Spring의 MVC 구조


📙 pom.xml (환경설정)

  • Maven(빌드 툴) : 프로젝트의 라이브러리를 관리하는 프로그램

  • pom.xml : Maven 빌드 툴을 이용하여 프로젝트에 라이브러리를 빌드하기 위한 정보를 제공하는 환경설정 파일

    • 로컬 저장소의 라이브러리 파일을 프로젝트에 빌드되도록 처리
    • 로컬 저장소에 라이브러리 파일이 없는 경우 메이븐 저장소에서 다운로드 받아 로컬 저장소에 저장
  • 로컬 저장소(Local Repository) : 프로젝트에 빌드될 라이브러리 파일을 저장하기 위한 폴더

    • 사용자 폴더의 .m2 폴더를 로컬 저장소로 사용
    • 라이브러리 파일에 문제가 있는 경우 이클립스 종료 후 .m2 폴더의 라이브러리 파일을 삭제하고 이클립스 재실행
  • 메이븐 저장소(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에서 제공하는 로깅 파일 (검정색)


📌 실행 안될 경우 (last)

  1. spring.io site 접속 → Projects → Spring Tool 4 click

  1. 하단 Looking for Spring Tool Suite 3? 에서 Spring Tool Suite 3 wiki 클릭

  1. Latest STS3 Downloads 에서 Spring Tool Suite 3.9.18 version 운영체제에 맞게 다운로드

  1. 압축푼후 STS.exe 실행 (sts.ini : 11version)

  2. 이클립스와 동일하게 환경설정


📙 log4j.xml (로그 구현체)

  • log4.xml : 로그 구현체에 대한 환경설정 파일

  • pom.xml (환경설정) 에서 SCOPE를 runtime으로 설정시 실행되지 않을 경우에는 lib를 빌드 처리 하지 않음

    • 실행되지 않을 경우 빌드되지 않은 파일 오류
    • "log4j.dtd" : 빌드처리 되지 않았기 때문에 에러
  • 해결 방법

      1. SCOPE 삭제 (너무 많은 라이브러리 존재시 실행 속도가 느려지기 때문에 권장하지 않음)
      1. 인터넷 상의 dtd파일(규칙이 정해진 파일) 사용
    • "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"로 수정하면 에러 발생하지 않음
  • appender : 로그 구현체를 구성하는 클래스를 설정하기 위한 엘리먼트

    • name 속성 : appender 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
    • class 속성 : 로그 구현체로 사용하기 위한 클래스를 속성값으로 설정
    • class 속성값으로 설정된 클래스에 따라 로깅정보를 기록하는 방식이 다르게 설정
    • class 속성값으로 설정된 클래스는 반드시 Appender 인터페이스를 상속받아 작성
    • ConsoleAppender 클래스 : 로깅정보를 서버 콘솔에 기록하기 위한 클래스(를 이용해서 기록)
      (파일 어펜더 : 파일이 제거되기 전까지 존재 (반영구적))
    • <appender name="console" class="org.apache.log4j.ConsoleAppender">
  • param : Appender 클래스에 필요한 값을 제공하기 위한 엘리먼트

    • <param name="Target" value="System.out" />
    • system.out 객체를 전달 받아서 출력스트림을 이용해 기록
  • layout : 로깅정보를 제공받아 로그 형식을 설정하기 위한 엘리먼트

    • class 속성 : 로그 형식 관련 정보를 제공하기 위한 클래스를 속성값으로 설정
    • PatternLayout 클래스 : 로그 형식을 작성하기 위한 변환 문자를 제공하는 클래스
    • <layout class="org.apache.log4j.PatternLayout">
    • <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    • 로그 이벤트를 5자리를 제공받아 왼쪽 정렬하여 기록 : 패키지 포함 클래스 이름 - 로그 메시지 엔터
  • logger : 특정 패키지의 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트

    • name 속성 : 패키지 경로를 속성값으로 설정
    • additivity 속성 : false 또는 true(기본) 중 하나를 속성값으로 설정
    • 속성값이 [false]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함하지 않도록 동작되고 [true]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함되도록 동작
    • <logger name="xyz.itwill00.log" additivity="false">
    • level : 패키지에 작성된 클래스에서 발생되는 로그 이벤트를 설정하기 위한 엘리먼트
    • <level value="info" /> : info 이상의 이벤트가 발생하면 기록해주세요
  • root : 모든 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트

    • 모든 logger 엘리먼트는 root 엘리먼트의 정보를 상속받아 사용
    • priority : 모든 클래스에서 발생되는 기본 로그 이벤트를 설정하기 위한 엘리먼트
    • value 속성 : 로그 이벤트를 속성값으로 설정
    • 속성값으로 설정된 로그 이벤트보다 상위의 이벤트가 발생된 경우 로그 구현체로 기록
    • <priority value="warn" /> : 모든 클래스에서 경고 이상의 이벤트가 발생하면 콘솔 어펜더로 기록해라
    • appender-ref : 로그 구현체를 참조하기 위한 엘리먼트
    • ref 속성 : appender 엘리먼트의 식별자를 속성값으로 설정

📌 변환문자

  • 변환문자(Conversion Character) : 일반문자와 구분하기 위해 % 기호로 시작

  • %c : 패키지가 포함된 클래스의 이름을 기록

    • {정수값}을 이용하여 원하는 형식으로 기록 가능
    • %c{1} : 패키지를 제외한 클래스의 이름만 기록 (ex. 경로가 xyz.itwill.dao 라면 dao 만 기록)
  • %d : 날짜와 시간을 기록

    • {SimpleDateFormat}을 이용하여 원하는 형식으로 기록
    • %d{yyyy-MM-dd} : [년-월-일] 형식으로 로그시간 기록
  • %m : 로그 이벤트에 의해 생성된 로그 메세지를 기록

  • %n : 엔터(Enter)를 기록 (로그 줄바꿈)

  • %M : 로그 이벤트가 발생된 메소드의 이름을 기록

  • %p : 로그 메세지가 발생된 로그 이벤트를 기록 (로그 이벤트의 길이만큼 자릿수를 제공받아 기록)

    • 로그 이벤트 : TRACE > DEBUG > INFO > WARN > ERROR > FATAL
    • # 변환문자 자릿수 설정 → %p 변환문자를 이용하여 예제 설정
    • %5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 (오른쪽 정렬)
    • 자릿수가 부족하면 기록이 잘리고 남으면 공백으로 처리되어 기록
    • %-5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 (왼쪽 정렬)
    • %.5p : 로그 이벤트를 5자리(최소 자릿수)를 제공받아 기록 (오른쪽 정렬)

🐣 예제



<?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>





📌 context 경로 변경

  1. 서버 더블 클릭

  2. Modules → 변경할 경로 선택 후 Edit... click

  3. Path에 변경될 이름 작성(프로젝트 이름과 동일하게 작성할 것을 권장)

  4. context 경로(최상위 directory) 변경된 것을 확인 가능


📒 로그 이벤트 실행

  • Logger 객체 : 로그 이벤트를 발생하기 위한 객체

    • 어떤 메소드에서든지 사용할 수 있도록 static으로 작성, 로거객체를 변경하지 못하도록 final로 작성
  • 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("종료");
	}
}





🐤 LogHelloWorld의 hello메소드

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;
	}

}






📌 DailyRollingFileAppender

  • http://logging.apache.org/log4j/1.2/apidocs : Apache Log4j API 문서 참고

  • DatePattern 형태로 날짜 생성됨

  • project를 누른 상태에서 f5 누르면 dailylog 생성됨

    • 당일 생성된 파일은 날짜 표시 X, 다음날 실행하면 생성된 날짜 표시



	<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>
    
    
    
    
    

profile
Study Log 📂

0개의 댓글