Spirng 3.1.1 + MyBatis + jQuery 사이트를 구현하고 있다.


그런데 현재 시스템에서 서로 다른 2개의 DB 사용을 하고 있는 상태이다

물론 한쪽 DB 접속해서 소유권을 명시적으로 기술해서 DB 테이블에 대한 작업을 진행할 있지만 

일단 datasource 2개를 별도로 만들기로 했다. 다만 Spring 설정은 pure java 설정으로 진행했다.


방법을 찾기 위해 구글과 네이버를 통해 검색을 해보았지만 springboot 대해서는 pure 자바 설정에 대한 자료가 많은 반면 

Spring 대해서는 아직까지도 대부분의 설정이 xml 파일을 이용해서 이루어지고 있었다

게다가 springboot JPA + Hibernate밖에 보이질 않아서 MyBatis 설정은 찾기가 힘들었다.


물론 내가 Spring 원리에 통달해있다면 xml 설정으로부터 java 설정을 이끌어낼 잇었겠지만.


결국 springboot 설정을 설명해놓은 블로그를 참조로하여 설정을 마칠 있었다.



Spring + MyBatis 사용 java 설정을 이용하여 datasource 2 사용하기


1. 먼저 config.java 어떻게 구성하느냐는 개인의 취향일 있을 같다

    나는 각각의 datasource 해당하는 설정 java 별도로 만들었다. 편의성 DSConfigFirst.java DSConfigSecond.java라 하자.


2. 각각의 설정 java 파일에 필요한 annotation @Bean 구현한다다음 3가지 메소드를 구현했다.

   dataSource() : DataSource 리턴

   transactionManager : DataSourceTransactionManager 리턴

   sqlSessionFactory() : SqlSessionFactory 리턴


여기까지 했을 빌드 다음  오류가 발생하였다.

No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined:…


No unique bean of type [org.springframework.transaction.PlatformTransactionManager] is defined:…


각각 SqlSessionFactory PlatformTransactionManager 2 이상 존재한다는 의미였고 것은 2개의 설정이 존재하다보니 설정들을 가져다 사용하는 mapper service에서 어떤 것을 사용할지 몰라 발생하는 오류였던 것이다.


그렇다면 해결책은 mapper service에서 각각 자신이 가져다 사용할 설정을 구분할 있도록 해주면 되는 것이다.


1. SqlSessionDactory 구분

  각각의 설정 java 파일의 @MapperScan annotation sqlSessionFactoryRef 속성을 주고 값으로 각각 다른 이름을 지정해준다.


...

@Configuration

@MapperScan(basePackages = "com.dbfirst.mapper", sqlSessionFactoryRef = "dbFirstSqlSessionFactory")

class DSConfigFirst {

...

}


...

@Configuration

@MapperScan(basePackages = "com.dbsecond.mapper"sqlSessionFactoryRef = "dbSecondSqlSessionFactory")

class DSConfigSecond {

...

}


2. PlatformTransactionManager 구분

  transactionManager() 메소드의 @Bean annotation name 속성을 통해 각각 별도의 이름을 설정해 주고 Service(ServiceImpl) 

  @Transactional   annotation value 속성으로 @Bean name 설정한 이름을 지정해준다.


...

@Configuration

@MapperScan(basePackages = "com.dbfirst.mapper"sqlSessionFactoryRef = "dbFirstSqlSessionFactory")

class DSConfigFirst {

    ...

    @Bean(name="dbFirstTX")
    public PlatformTransactionManager transactionManager() {
        ...
    }
    ... 
}

@Service
@Transactional(value="dbFirstTX")
class DbFirstServiceImpl implements DbFirstService {
    ...
}



...

@Configuration

@MapperScan(basePackages = "com.dbsecond.mapper"sqlSessionFactoryRef = "dbSecondSqlSessionFactory")

class DSConfigSecond {

    ...

    @Bean(name="dbSecondTX")
    public PlatformTransactionManager transactionManager() {
        ...
    }
    ... 
}

@Service
@Transactional(value="dbSecondTX")
class DbSecondServiceImpl implements DbSecondService {
    ...
}


일단 여기까지 하니 정상적으로 2개의 datasource 이용할 있게 되었다.

저작자 표시
신고

일단 controller는 상속이 되고 controller에 사용되는 $scope 역시 상속이 된다는 점을 알고 있었다.

하지만 그 구체적인 동작 방식을 모르다보니 상당한 삽질을 하게 되었다.


일단 오늘 정리할 것은 ng-model을 이용하여 양방향 바인딩을 할 때 $scope 상속이 어떻게 동작하는지이다.


컨트롤러 구성


app.controller("controller1", function ($scope) {

  $scope.parentdata = "parent scope";

});


app.controller("controller2", function ($scope) {

  $scope.childdata = "child scope";

});


html 코드


<div ng-controller="controller1">

  {{parentdata}} ------------------------------------> 1 : parent scope 출력

  <div ng-controller="controller2">

    {{parentdata}} ----------------------------------> 2 : parent scope 출력

    {{childdata}} -----------------------------------> 3 : child scope 출력

    <input type="text" ng-model="parentdata"> --------> 4 : 아무것도 출력되지 않음 ???

  </div>

</div>


위의 예에서 밖의 div태그에는 controller1이 사용되고 있고 내부 div에는 controller2가 사용되고 있는데 이럴 경우

controller2는 controller1을 상속하게 되고 당연히 사용하는 $scope도 상속을 하게 된다.


그래서 controller2에는 parentdata라는 변수가 선언되어있지 않지만 2번에서도 "parent scope"라는 값이 출력된다.

1,2,3 모두 예측한 결과가 출력되는 것이다.


문제는 4번...입력 폼에 초기값으로 "parent data"가 출력될 것으로 기대했으나 그렇지 않았고 역으로 새로 값을

입력하는 경우에도 controller1의 parentdata에는 입력된 값이 들어가지 않았다.


이렇게 ng-model을 통해 양방향 바인딩을 할 경우 자식 컨트롤러에서 부모 컨트롤러와 같은 이름의 변수를 

사용하는 경우 부모의 변수를 사용하는 것이 아니라 자식 $scope에 동일한 이름으로 변수를 생성하고 이것을

사용하게 되는 것이다. 


이 경우 만일 부모의 변수를 사용하고 싶다면 4의 코드를 다음과 같이 바꾸어야 한다.


<input type="text" ng-model="$parent.parentdata"> --------> 4 : parent scope 출력


오늘은 이 것 때문에 한 2시간 헤맸다...ㅠ.ㅠ

저작자 표시
신고

새로 만드는 앱에 바이오리듬을 좀 출력해보고자 자바스크립트로 된 바이오리듬 소스를 구했다.

HTML5의  canvas element에 바이오리듬을 출력하는 소스였다.


모두 정상적으로 작동을 했는데...기준선과 각각의 바이오리듬 곡선이 별도의 색상으로 지정되어있는데도

불구하고 가장 마지막에 지정한 색상으로 모든 라인들이 표시되는 것이다.


한참을 찾다가 대체로 예제들에 보니 선이나 도형을 그릴 때 context.beginPath()로 시작하고

context.closePath()로 끝내는 것이 보이길래 앞 뒤로 이 함수들을 호출했더니 그제야 각각의

색상이 정상적으로 표시 되었다.


앞으로 도형을 그릴 때는 꼭 context.beginPath()로 시작하고 context.closePath()로 끝내자...


예제


for(k = 0; k < MAX_TYPE; k++)

    {

        var data = getBioData(k);

        context.strokeStyle = bio_info[k][1];

        context.beginPath();

        for(i = 0; i <= 30; i++)

        {

            context.moveTo(i * 6, (100 - data[i])/2 + 10);

            context.lineTo((i + 1) * 6, (100 - data[i+1])/2 + 10);

        

            context.stroke();


        }

        context.closePath();

    }

저작자 표시
신고

최초 작성일 : 2011/05/18 11:17 


한 일년 아이폰 앱 개발한다고 설레발 치는 동안
웹의 판도가 많이도 바뀐 것 같다.

여전히 대다수의 SI 프로젝트는 이전과 큰 변화 없이 다만 각각의
구성 요소들에 대한 버전 업 정도의 수준에 머물고 있는 듯하지만
하부 구조의 패러다임이 바뀌게 되면 전체적인 변화는 불가피한 것...

사실상 자바스크립트는 브라우저단에서 보조적인 역할을 하는 가벼운 스크립트 언어
정도로 생각을 했는데 이제는 그 위상이 여느 메이저급 language들을 위협할
정도가 되어버린 것 같다.

 UI면 UI, 비지니스 로직이면 비지니스 로직
웹이면 웹, 모바일이면 모바일
이미 전천후 팔방미인 언어가 되어버린지 오래인 것 같다.

내가 기술을 설명할 능력은 안되니 링크로 대신...^^;;;

http://dev.paran.com/2011/05/17/nowjs-nodejs/

저작자 표시
신고

최초 작성일 : 2010/03/17 14:45 


1. 기능 목록 / 요구사항 정의서
2. 시스템 환경 기술
3. 시스템 개요 및 구성도 

저작자 표시
신고

+ Recent posts

티스토리 툴바