mybatis에서 키와 값이 다른 기본타입 컬렉션 매핑하기 JAVA

같은 값이 포함될 수 있는 컬렉션이 멤버인 클래스가 있다고 치자.


class DataContainer {
    private String name;
    private ArrayList<String> values;
}

이 클래스 정보를 아래와 같은 DB테이블에 저장하려고 한다.
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| NAME    | varchar(16)  | NO   | PRI | NULL    |       |
| SEQ        | int(11)      | NO   | PRI | NULL    |       |
| VALUE    | varchar(256) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

이렇게 하고 name과 values의 배열 인덱스를 PK로 잡아서 저장한 다음 가져올 때 매핑을 하면 될 것처럼 보였는데...
<mapper namespace="DataContainer">
    <resultMap type="confmultiitem" id="DataContainerMap">
        <id column="NAME"/>
        <collection property="values" resultType="string" javaType="java.util.ArrayList" column="VALUE">
        </collection>
    </resultMap>
...

이러면 value가 동일하면 중복된 값이 하나만 들어온다. 미치고 환장한다.
id와 result를 이용해서 나눠보기를 시도했다.
    <resultMap type="confmultiitem" id="DataContainerMap">
        <id column="NAME"/>
        <collection property="values" resultType="string" javaType="java.util.ArrayList" column="VALUE">
            <id column="SEQ" />
            <result column="VALUE" property="value" />
        </collection>
    </resultMap>

근데 이것도 잘 안 된다. SEQ값이 원소에 들어간다.

결국 해결한 방법은 스트링을 위한 별도 매핑을 추가한 것이다.

    <resultMap id="dupStringMap" type="string">
        <constructor>
            <arg column="CONF_VALUE" />
        </constructor>
        <id column="SEQ" />
    </resultMap>
    <resultMap type="confmultiitem" id="DataContainerMap">
        <id column="NAME"/>
        <collection property="values" resultMap="dupStringMap"  javaType="java.util.ArrayList">
        </collection>
    </resultMap>

혹시 더 좋은 방법을 알면 추천바람.

mybatis 설정파일 xml 에서 validation에러 발생

이클립스에서 mybatis설정파일을 저장했더니 아래와 같은 에러가 나오는 일이 있다.

아래 화면처럼 configuration 원소에 에러가 뜬다.


그리고 에러 메세지는 아래와 같다.
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

근데 암만 봐도 에러 원인이 안 나온다. 에러 설명에 나온 것처럼 하위 원소로 environment , typeAliases, mappers 만 썼는데도 이런다.

해결 방법은 참 허무한데 원소 순서를 바꾸는 것이다. settings -> typeAliases -> environments - > mappers 이 순서대로 한다.
(출처 http://mybatis-user.963551.n3.nabble.com/Problem-with-config-XML-file-validation-td4029331.html ) 문서에도 안 나와있는 내용이라 찾기가 더 그지같았다.

Gnome3 eclipse luna에서 팝업 색상 변경 (Quick Type Hierarchy 등) LINUX

젠투에서 GNOME3로 정착을 해서 사용중이던 중 언제부터인가 (아마도 gnome 3.1x 로 업데이트 후인 듯) 이클립스에서 ctrl+T 로 빠른 타입 계층을 보면 그림처럼 클래스 이름이 안 보이는 것이다. 더 찾아보니 텍스트도 흰 색이고 배경도 흰 색이라 안 보이고 마우스가 올라간 곳만 하일라이트로 배경색이 바뀌어서 보이는 것이었다.

한동안 이 문제를 해결해보려도 시도를 했는데 방법을 못 찾아서 그냥 불편한대로 쓰다가 오늘 방법을 알아냈다. 아래 사이트를 참조했다.
http://iwf1.com/how-to-change-gtk-apps-tooltips-text-and-background-color/

방법은 홈 디렉토리에 .gtkrc-2.0 파일에 툴팁 색상을 설정하면 된다. 파일이 없으면 새로 만들어서 넣자.
$ vim ~/.gtkrc-2.0

style "gnome-color-chooser-tooltips"
{
bg[NORMAL] = "#FFFFFF"
fg[NORMAL] = "#444444"
}
widget "gtk-tooltip*" style "gnome-color-chooser-tooltips"

fg[NORMAL] 값에 원하는 색상의 RGB값을 넣으면 된다. 내 경우는 어두운 회색에 해당하는 #444444 를 지정했다.
이렇게 수정하고 나서 이클립스를 다시 실행한 결과는 짜잔!

이 현상에 대한 더 자세한 해설을 하려고 한다.
현재 내가 사용중인 이클립스 버전은 4.4 Luna이다. 이 버전은 그래픽 출력에 GTK+2 버전을 기본으로 사용한다. 그리고 이클립스의 팝업창은 gnome시스템의 tooltip 색상 설정이 반영되는 것으로 보인다. 그 텍스트 색상이 하얀색이다. 근데 원래 이런 것인지 내 시스템 설정이 꼬여서 그런지 텍스트 색상 설정만 반영하고 배경색은 자체적으로 흰색으로 설정해서 뿌려주고 있다. 이 설정값을 gtkrc-2.0 파일에서 강제로 바꾸어서 시스템 색이 아닌 다른 색으로 나오도록 한 것이다.

한가지 덧붙이자면 이클립스 4.5 Mars부터는 기본 설정이 GTK+3 버전으로 바뀐다. 만약 이 쪽에서도 색을 바꾸어야 할 경우라면 위의 링크로 들어가서 따라하면 된다. 다만 아직 안정화가 덜 되었는지 GTK+3에서는 자잘한 UI나 색상 문제가 더 많이 발생한다. 그래서 mars이후도 당분간 GKT+2 위에서 돌아가는 게 더 편할 수도 있다. 이것은 eclipse.ini 파일에서 GTK버전을 지정하는 식으로 해결할 수 있다. eclipse.ini파일에서 --launcher.appendVmargs 항목 바로 앆에 아래 두 줄을 삽입하면 된다. 반드시 바로 앞에 두어야한다.
--launcher.GTK_version
2
값에서 유추할 수 있듯이 3을 넣으면 GTK+3을 사용한다. 참고로 이 설정은 luna에서도 먹힌다. 루나는 기본이 2라서 3을 넣으면 수동으로 GTK+3위에서 실행시키는 것이 가능하다. (내 경우는 잠깐 써보니 영 아니어서 2로 돌아왔다.)

리눅스에서 일부 nvidia VGA 팬 속도 이상 LINUX

올 초였나 한동안 업무가 바뀌어서 방치되고 있던 리눅스를 다시 구동시켜 업데이트를 하고 나니 엄청 시끄러워졌다.
찾아보니 VGA쿨링팬이 미친듯이 돌아가고 있었다. 이게 나름 잘 되던게 최신 nouveau 드라이버 (리눅스에서 사용하는 nvidia 계열용 오픈소스 드라이버)에 버그가 생긴 것인지 쿨링팬 속도 조절이 안 되고 항상 최고속도로 돌아가게 되 버린 것이다.

여러 군데 삽질 끝에 찾아낸 것이 하나 있는데, 일단 임시방편으로 간단히 쓸 수 있는 것은 루트 계정으로 들어가서
# echo 45 > /sys/devices/pci0000\:00/0000\:00\:01.0/0000\:01\:00.0/hwmon/hwmon0/pwm1

식으로 팬 속도를 강제 지정하는 것이었다. (VGA가 설치된 슬롯 위치 같은 것에 따라서 파일명이 약간 다를 수도 있다)
그런데 이게 젠투에서는 되는데, CentOS6에서는 안 되는 것이다. 좀 찾아보니 (100% 장담할 수는 없지만) CentOS가 커널과 드라이버 같은 것의 버전이 낮은 것이라서 지정하는 기능이 없는 것으로 보인다. - 그래서 CentOS는 아직 해결을 못 했다.

Gentoo기준으로 다시 쓰자면 위에 쓴 것은 부팅하고 매번 새로 해 줘야하는 것이라 불편하다. 자동으로 하려면 sys-apps/lm_sensors 패키지를 설치하고, 해당 패키지에 들어있는 프로그램인 pwmconfig로 적절히 설정은 한 다음 (그러면 프로그램인 /etc/fancontrol 파일을 알아서 생성해 줄 것이다. )
fancontrol서비스를 활성화시키는 것이다. 현재 gentoo가 사용하는 systemd 기반으로 쓰자면 아래와 같다. 실제 작업을 하고 나서 한참후에 글을 쓰는 것이라 세부 방법을 까먹었다. ㅜㅜ 어쨌든 결과 파일은 아래와 같다.

/etc/fancontrol
# Configuration file generated by pwmconfig, changes will be lost
INTERVAL=10
DEVPATH=hwmon0=devices/pci0000:00/0000:00:01.0/0000:01:00.0
DEVNAME=hwmon0=nouveau
FCTEMPS=hwmon0/pwm1=hwmon0/temp1_input
FCFANS=hwmon0/pwm1=
MINTEMP=hwmon0/pwm1=30
MAXTEMP=hwmon0/pwm1=90
MINSTART=hwmon0/pwm1=44
MINSTOP=hwmon0/pwm1=30
MINPWM=hwmon0/pwm1=30
MAXPWM=hwmon0/pwm1=53

그리고 systemd에서 fancontrol을 활성화시키는 것은
# systemctl enable fancontrol

참 쉽죠?

JIRA와 Confuence를 systemd 의 서비스로 구동하기 LINUX

Linux가 전통적으로 사용하던 initrc스크립트 시스템에서 systemd로 갈아타기 시작했다.

젠투도 Gnome3로 넘어오는 것과 거의 동시에 systemd를 주력으로 바꾼 것으로 기억한다. 하지만 아직도 많은 서드파티들은 기존 initrc 기반의 스크립트만 제공하고 있어서 이것을 systemd에서 똑똑하게 바꾸어서 실행시켜 줄 수 있으면 좋겠지만 아직 그런 기능은 없는 것 같다.

이 두 가지를 구동하는 systemd용 service파일을 직접 작성하여 systemd에서 구동시킬 수 있다.

최초로 찾은 것은 Brian Parsons라는 사람이 github에 올린 샘플이다.  https://github.com/bparsons/atlassian-systemd 에서 볼 수 있다. 이것을 복사해서 사용하자.

1 2 3 4 5 6 7 8 9 10 다음



메모장

W 위젯