ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB 인터페이스 분리
    개발/java 2024. 10. 28. 17:41

    RDB , SNOWFLAKE , Athena 등 DB를 다양하게 사용하는 경우가 있을 수가 있다. 

    예를 들어 큰 DB를 읽어 오는데 부담 될때 특정 조건에 따라 RDB -> SnowFlake나 S3로 적재된 Athena를 콜 하는 방식말이다 

    이 경우 Mybatis를 사용하는 개발자들은 각각의 DB 정보를 이용해 Config를 등록하며 이를 mybatis sqlSessionFactory에 연결한 후  이를 특정 어노테이션을 붙이면 해당 method를 mapper.xml에 있는 method를 연결하도록 구현을 할 것 이다 

    예를 들어 @Athena , @Snow 라는 애노테이션을 인터페이스에 연결만 한다면 Mybatis로 연동하는 방식이다 

     

    예를 들면 

    @Configuration
    @RequiredArgsConstructor
    @MapperScan(basePackages = "사용할 packages 경로" , annotationClass ="Temp.class"
    ,sqlSessionFactoryRef ="참조할 sql SessionFactory bean"
    )
    public class DBConfig{
    	
        @Bean(name={"property"})
        @ConfigurationProperties(prefix="spring.datasource.info")
        public PoolProperties getPoolProperties(){return new PoolProperties();}
        
        @Bean(name={"dataSource"})
    	public HikariDataSource getDataSource(@Qualifier("property") PoolProperties property){
        	HikariConfig hikariConfig = new HikariConfig();
            hikariConfig.setDriverClassName(property.getDriverClassName());
            hikariConfig.setJdbcUrl(property.getUrl());
            hikariConfig.setUserName(userName);
            hikariConfig.setPassword(password);
            return new HikariDataSource(hikariConfig);
        }
        
        @Bean(name="sqlSessionFactory")
        public SqlSessionFactory DBSqlSessionFactory(@Qualifier("dataSource") HikariDataSource getDataSource){
        	SqlSessionFactory sqlSessionFactory = new SqlSessionFactory();
            sqlSessionFactory.setDataSource(getDataSource);
            sqlSessionFactory.setConfigLocation("mybatis config 경로");
            sqlSessionFactory.setMapperLocations("mybatis mapper 파일 경로");
            
            return sqlSessionFactory;
        }
        
        
    }

     

    이를 사용하는 곳에서는 mapper.xml 을 만들고 특정 method 내 sql을 작성하면 사용할 수 있다 

    @Temp
    public interface TempService{
    
        void getOrderInfoList(OrderInfoRequestModel model);
    }

     

    만약 동일 method를 이용해서 특정 조건에 따라 바꾸고 싶다면 상속 클래스를 두고 특정 조건에 따라 받아오는 서비스를 바꾸면 된다 

    if(RDB 조회하는 규칙){
    	OrderInfo orderInfoDao = applicationContext.getBean(RDBDao.class);
    }else{
    	OrderInfo orderInfoDao = applicationContext.getBean(TempDao.class);
    }

     

    cf) applicationContext의 경우 @Autowired를 이용하여 주입받는다 

    '개발 > java' 카테고리의 다른 글

    jpa 흉내내기  (2) 2024.10.23
    enum 활용기  (2) 2024.09.11
    CompletableFuture  (6) 2024.09.05
    java stream Util 만들기  (2) 2024.09.04
    mybatis로 jpa 흉내내기  (3) 2024.09.03

    댓글

Designed by Tistory.