개발/개발환경구축

[project config] Spring 유닛 설정

불친절한 토리씨 2022. 12. 23. 18:37

 

본 글은 Spring boot 이 아닌 Spring mvc 를 기준으로 하고 있습니다.

 


 

1.Spring AOP

①pom.xml 에 maven 의존 추가

	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId><!--AOP-->
		<version>1.8.14</version>
	</dependency>

 

 

②configuration 설정 (2중 1택)

 

1)java configuration

@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class MvcConfiguration{

@Bean
public AspectHouse aspectHouse(){
	return new AspectHouse();
}

}

 

2)xml configuration

<beans 
xsi:schemaLocation="... +
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
xmlns:aop="http://www.springframework.org/schema/aop">

...+
<aop:aspectj-autoproxy />
<bean id="aspect" class="com.exjample.AspectHouse"/>
</beans>

 

※컴포넌트 스캔을 통해서 @Component 로 빈을 등록하는 방법도 존재합니다.

 

③pointcut 설정

@Aspect
public class AspectHouse {
	@Pointcut("execution(public void package.class.method(..))")
    public void pointcut(){}
	@Around("Pointcut Method Name()")
    public void around(){}
}

 

 

 


2.Log4j2

①pom.xml 에 maven 의존 추가

	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId><!-- v16미만 에서 심각한 취약점발견 -->
		<version>2.17.0</version>
	</dependency>
	
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-api</artifactId>
		<version>2.17.0</version>
	</dependency>
    
    <dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>2.17.0</version>
	</dependency>

 

※ 취약점이란, 홈페이지에 접속하는 것 만으로 서버 컴퓨터를 조종할 수 있을 정도의

심각한 취약점이니 미만의 버전을 절대로 사용하지 마세요.

 

②classpath 에 log4j2.xml 작성

 

작성예시

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

<Properties>
  <Property name="dbName">database</Property>
  <Property name="usrName">user</Property>
  <Property name="sprName">spring</Property>
  <Property name="path">logs</Property>
  <Property name="pattern">%d [%t] %-5level %c(%M:%L) - %m%n</Property>
</Properties>

<Appenders>
	
	<Console name="console" target="SYSTEM_OUT">
   		<PatternLayout pattern="${pattern}" />
  	</Console>

	<RollingFile name="dbfile" fileName="/${path}/${dbName}.log" 
    	filePattern="/${path}/${dbName}_%d{yyyy-MM-dd}_%i.log">
		<PatternLayout pattern="${pattern}" />
		<Policies>
        		<!-- 일별 로그 파일 생성-->
			<TimeBasedTriggeringPolicy modulate="true" interval="1" />
			<SizeBasedTriggeringPolicy size="10MB" />
		</Policies>
		<DefaultRolloverStrategy max="365" fileIndex="min" />
	</RollingFile>
	
	<RollingFile name="usrfile" fileName="/${path}/${usrName}.log" 
    	filePattern="/${path}/${logName}_%d{yyyy-MM-dd}_%i.log">
		<PatternLayout pattern="${pattern}" />
		<Policies>
			<TimeBasedTriggeringPolicy modulate="true" interval="1" />
			<SizeBasedTriggeringPolicy size="10MB" />
		</Policies>
		<DefaultRolloverStrategy max="365" fileIndex="min" />
	</RollingFile>
	
	<RollingFile name="springfile" fileName="/${path}/${sprName}.log" 
    	filePattern="/${path}/${sprName}_%d{yyyy-MM-dd}_%i.log">
		<PatternLayout pattern="${pattern}" />
		<Policies>
			<TimeBasedTriggeringPolicy modulate="true" interval="1" />
			<SizeBasedTriggeringPolicy size="10MB" />
		</Policies>
		<DefaultRolloverStrategy max="365" fileIndex="min" />
	</RollingFile>

</Appenders>

<Loggers>
	<Root level="DEBUG" additivity="false" >
		<AppenderRef ref="dbfile" />
		<AppenderRef ref="usrfile" />
		<AppenderRef ref="springfile" />
	</Root>
	
	<logger name="org.springframework" level="INFO" additivity="false" >
		<AppenderRef ref="springfile" />
	</logger>
	
	<Logger name="jdbc.sqltiming" level="TRACE" additivity="false">
    	<AppenderRef ref="dbfile" />
	</Logger>
	
	<Logger name="log.UserLog" level="TRACE" additivity="false">
		<AppenderRef ref="usrfile" />
		<AppenderRef ref="console" />
	</Logger>
</Loggers>

</Configuration>
더보기

※classpath 는 .classpath 파일내부에 적혀있는 경로들중 한곳입니다.

예를들어 path="src/main/webapp" 일때 webapp안에 log4j2.xml을 작성합니다.

 

※보통은 resource 나 WEB-INF , webapp 등이 classpath 입니다.

 

※.classpath 내부에 <classpathentry kind="src" path="src/main/webapp"/> 를 추가해서

classpath 경로를 설정할 수 있습니다.

 

 

③logger 예시

public class UserLog {
	
	private static UserLog instance = null;
	final Logger logger = LogManager.getLogger(UserLog.class);
	
	private UserLog() {}
	
	public static UserLog getInstance() {
		if(instance != null)
			return instance;
		instance = new UserLog();
		return instance;
	}
	
	public void log(String massage , Level... level) {
		try {
			logger.log(level[0],massage);
		}catch(NullPointerException e) {
			logger.log(Level.DEBUG,massage);
		}
	}

}

 

log4j2.xml 에 작성한 log.UserLog 클래스 내부에서 log를 찍으면 결과가 파일에 보존됩니다.

다만, 특정 구간을 지정해서 로그를 사용하는 불편함이 문제라면 이와 같이 사용한다는 예시입니다.