ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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를 찍으면 결과가 파일에 보존됩니다.

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

     

     

    댓글

개발에 관심을 가지는 블로그