10여년간 오라클만 쓰다가 오랜만에 MySQL 사용할려니 넘어야 할 산이 계속 생기네.


아래 주소 참고해서 해결함


http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22396&cat1=753&cat2=802&cat3=938&lang=k


http://egloos.zum.com/ndba/v/3437272



아래와 같은 SQL을 실행할 때

INSERT INTO T_NAME (

    ID,        NAME, ORDER_NO

)

VALUES (

    #{id},      #{name},

    (

    SELECT IFNULL(MAX(ORDER_NO), 0) + 1

      FROM T_NAME

     WHERE ID = #{id}

    )

)


SQL 오류 (1093): Table 'T_NAME' is specified twice, both as a target for 'INSERT' and as a separate source for data 와 같은 오류가 발생한다면 ....


INSERT INTO T_NAME (

    ID,        NAME, ORDER_NO

)

VALUES (

    #{id},      #{name},

    (

    SELECT IFNULL(MAX(ORDER_NO), 0) + 1

      FROM T_NAME ALIAS_FOR_SUBQUERY

     WHERE ID = #{id}

    )

)

위와 같이 서브쿼리 대상 테이블에 별명(alias)을 주면 해결된다.


오라클에서는 동일 테이블 내에서의 서브쿼리 조합이 가능하지만 MariaDB(or MySQL)는 기본적으로 지원하지 않는 것 같다.

MyBatis + MariaDB(or MySQL) 사용 시 select 결과가 resultType으로 지정한 Class에 바인딩(맵핑)이 안된다.


<mapper namespace="_mgr">

    .... 생략 ....

    <select id="view" resultType="mgrBean" parameterType="string">

        SELECT MGR_ID AS mgrId,

                  MGR_NM AS mgrNm

                  .... 생략 ....

          FROM CO_MGR

        WHERE MGR_ID = #{mgrId}

    </select>

    

    ....


위에서 'view' id를 갖는 쿼리문의 실행결과는 resultType으로 지정한 mgrBean이라는 alias로 지정된 클래스의 멤버변수에 자동으로 바인딩(맵핑) 되어야 하는데 일부 칼럼은 되고, 일부 칼럼은 안되는 경우가 발생했다.


구글신에게 물어봐도 답을 못찾아서 이것 저것 설정 파일을 건드리다가 아래와 같이 해결했다.

(구글이 못찾을 경우의 대부분은 내가 만난 문제가 매우 지엽적인 경우이다. 따라서 내 환경에 문제가 있을 가능성이 높다)


[myBatis 설정파일]


<configuration>

    .... 생략 ....

    <setting name="useColumnLabel" value="true" />


    ....


DB 칼럼명 대신에 칼럼라벨을 대신 사용하겠다는 설정이며 디폴트 값은 true이다.


이전에 오라클을 사용하면서 저 값을 fasle로 설정한 후 문제가 없었기에 다른 DB에서도 당연히 정상 동작하는 줄 알았는데 MariaDB를 사용하니 문제가 발생했다.


JDBC 드라이버 바꿔가면서 1시간 정도 삽질한 기념으로, 본 시행착오를 글로 남겨본다.




MySQL이 같은 네트워크 내의 다른 machine에서 설치되어 있다면 아래와 같이 설정을 해주어야 한다.
동일 machine이라면 설정할 필요가 없다. (보안상 안하는것이 더 유리하기 때문)

$sudo vi /etc/mysql/my.conf

bind-address = 127.0.0.1 또는 localhost로 되어있는 부분에 내부아이피를 적어준다.
bind-address = 192.168.1.20

만약 위의 설정을 안하고 접근을 하면 "Can not connect to mysql error 10061"에러가 발생하게 된다.

+ Recent posts