2013년 9월 11일 수요일

datasource 관련

spring 에서 sql connection 을 위한 db 접속정보를 설정할때 보통 datasource 를 통해서 기본정보들을 넣어주게 된다


            
 
    
 
       
 
 


위에는 datasource 생성은 빠져있다. 만약 xml형태로 설정을 한다면 보안상 문제가 될 소지가 있다.
그래서 source 상에서 암호화를 통해 설정하는 방식도 존재한다.

하지만 db connection 을 위해서는 datasource 를 생성해야 하고 xml 상에서 생성 할 수 없다면
source 내에서 new 로 생성을 할 수 밖에 없다. 하지만 spring framework 특성상 DI 법칙에 따라 
생성을 주도 할 수 있는 entrypoint 가 존재하지 않는다.
따라서 다음과 같은 방법을 사용한다.

package com.jetddo.study.config;

import java.io.IOException;

import javax.sql.DataSource;

import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.jetddo.study.util.Base64Decoder;

@Configuration
public class DataSourceConfig {
 
 @Bean(destroyMethod="close")
 public DataSource dataSource() throws IOException {
  
  BasicDataSource dataSource = new BasicDataSource();
  dataSource.setDriverClassName(Base64Decoder.decode("b3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlcg=="));
  dataSource.setUrl(Base64Decoder.decode("amRiYzpvcmFjbGU6dGhpbjpAMTI3LjAuMC4xOjE1MjE6b3JjbA=="));
  dataSource.setUsername(Base64Decoder.decode("amV0ZGRv"));
  dataSource.setPassword(Base64Decoder.decode("Y2RtYTIwMDQ="));
  dataSource.setDefaultAutoCommit(false);
  
  return dataSource;
  
 }
}

@Configuration, @Bean 의 어노테이션이 보일거다.
@Configuration 이 것은 이 java class 는 spring의 설정 역할이라는 것을 알려준다.
그리고 @Bean 은 이 메소드에서 리턴 되는 객체는 spring의 Bean객체라는 것을 알려준다.
즉 위 클래스는 소스상에서 자동으로 bean객체를 생성한다.

또한 @Configuration 은 @Component 어노테이션을 meta-annotation 으로 가지고 있기 때문에
component-scan 을 통해 자동으로 bean 으로 등록이 된다.

AOP Logging

Interceptor logging 은 url 요청에 한해서만 로깅이 가능한 단점이 있다. 모든 class 에 대해 logging 관심사를 추가하는 aop 사용이 더 효율적이다.
 

 

설정 파일을 만들어 위의 내용을 작성한다. 필요한 lib 는 spring 관련 aop 와 aspectj, cglib2 이다. 자세한 내용은 검색 ㄱㄱ
package com.jetddo.study.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class LoggingAdvice {
 
 @Before("execution(* com.jetddo.study..*.*(..))") 
 public void loggingAdvice(JoinPoint joinPoint){
  
  String pointStr = joinPoint.toShortString();
  
  if(!pointStr.contains("SessionInterceptor")){
   System.out.println(" Method : "+pointStr);
   System.out.println("[ Arguments ]");
   Object[] objArray = joinPoint.getArgs();
   for(int i=0 ; i < objArray.length ; i++){
    System.out.println(i+" : "+objArray[i]);
   }
   System.out.println("--------------------------------------------------------------------");
  }
  
  
 }
}


위 class 를 추가한다.
execution(* com.jetddo.study..*.*(..))
에 대해서는 나중에 정리