개발/개발환경구축
[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를 찍으면 결과가 파일에 보존됩니다.
다만, 특정 구간을 지정해서 로그를 사용하는 불편함이 문제라면 이와 같이 사용한다는 예시입니다.