mybatis를 통한 Select, Insert, Delete

과거에 mybatis 라이브러리 사용하기라는 제목으로 mybatis를 이용하기 위한 프로젝트 설정과 간단한 SELECT 문을 호출해 그 결과를 살펴보았습니다. 이번에 실제 프로젝트에 mybatis를 사용하기로 결정하여 좀더 구체적인 SQL 문을 호출하는 API를 파악하여 정리해 봅니다.

먼저 사용하는 테이블의 구조는 다음과 같습니다. (헐! 그림 대따 크게 표시되네.. -_-;)

앞서 언급해 드린 mybatis 라이브러리 사용하기를 통해 프로젝트를 구성하고, SQL 문을 정의하는 sql.xml 파일을 아래처럼 구성합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="test">
    <select id="getFirstPlayerName" resultType="string">
        SELECT name FROM players LIMIT 1
    </select>
    
    <select id="getFirstPlayer" resultType="map">
        SELECT name, age FROM players LIMIT 1
    </select>
    
    <select id="getPlayers" resultType="map">
        SELECT name, age FROM players
    </select>
    
    <select id="getPlayersWhere" resultType="map">
        SELECT name, age FROM players WHERE age > #{age}
    </select>
    
    <select id="getPlayersWhere2" resultType="map">
        SELECT name, age FROM players WHERE age > #{age} AND name LIKE #{name}
    </select>
    
    <insert id="insertPlayer"> 
    	INSERT INTO players (name, age) VALUES (#{name}, #{age}) 
    </insert>
    
    <delete id="deletePlayerWhere"> 
    	DELETE FROM players WHERE name = #{name} 
    </insert>    
</mapper>

보시는 것처럼 SELECT 문에 대한 getFirstPlayerName, getFirstPlayer, getPlayers, getPlayersWhere, getPlayersWhere2과 INSERT 문에 대한 insertPlayer, DELETE 문에 대한 deletePlayerWhere가 정의되어 있습니다. 이 7개에 대한 SQL문을 실행하는 API의 설명을 통해 mybatis에서 SELECT, INSERT, DELETE 문의 호출을 정리해 보겠습니다.

먼저 getFirstPlayerName은 테이블의 첫번째 Row에 대한 name 필드값을 가져오는 것인데, 관련된 API는 다음과 같습니다. 반환값이 string이고 반환결과는 1건 이하이므로 String과 SqlSession 객체의 selectOne 함수를 사용합니다.

String result = session.selectOne("test.getFirstPlayerName");
// 홍길동

다음은 getFirstPlayer인데, 반환결과는 역시 1건 이하인데 반환 필드가 name과 age로 2개입니다. API는 다음과 같습니다.

Map result = session.selectOne("test.getFirstPlayer");
 // {name=홍길동, age=18}

다음은 getPlayers로 반환 결과는 0건 이상이며 API는 다음과 같습니다.

List<Map<String, Object>> result = session.selectList("test.getPlayers");
// [{name=홍길동, age=18}, {name=임꺽정, age=32}, {name=일지매, age=21}]

getPlayersWhere는 조건 결과가 지정된 것으로 사용하는 API는 다음과 같습니다.

List<Map<String, Object>> result = session.selectList("test.getPlayersWhere", 20);
// [{name=임꺽정, age=32}, {name=일지매, age=21}]

getPlayersWhere2는 getPlayersWhere처럼 조건이 지정되어 있지만 비교 조건으로 사용되는 변수가 2개입니다. 사용하는 API는 다음과 같습니다.

Map param = new HashMap<>(); 
param.put("age", 20); 
param.put("name", "일%");

List<Map<String, Object>> result = session.selectList("test.getPlayersWhere2", param);
// [{name=일지매, age=21}]

insertPlayer는 데이터를 추가하는 것으로 API는 다음과 같습니다.

Map<String, Object> param = new HashMap<>(); 
param.put("age", 41); 
param.put("name", "황장군");

int result = session.insert("test.insertPlayer", param); // 1
session.commit();

deletePlayerWhere는 지정된 조건과 매칭되는 데이터를 삭제하는 것으로 사용하는 API는 다음과 같습니다.

Map<String, Object> param = new HashMap<>(); 
param.put("name", "황장군");

int result = session.delete("test.deletePlayerWhere", param);  // 1
session.commit();

mybatis는 별도의 xml 파일을 통해 SQL 문의 정의 부분을 독립적으로 유지할 수 있으며, SQL문을 보다 유연하게 처리할 수 있다는 문법 구문을 제공합니다. 또한 mybatis는 데이터베이스 연결시 발생하는 부하를 줄이기 위한 Connection Pool을 자체적으로 제공하고 있습니다. 이외에 JDBC를 직접 사용함에 따라 발생하는 복잡한 try .. catch .. finally 코드 부분이 제거되어 코드의 가독성이 향상됩니다.

SmartPoint-Xr에서 대용량 데이터에 대한 자르기와 병합하기 기능

지난 글(http://www.gisdeveloper.co.kr/?p=6071)에서 폴리곤 데이터에 대한 자르기와 병합하기 기능에 대한 소개를 올렸습니다. 이에 대해 실제 업무에서 의미가 있는 용량의 데이터를 대상으로 하는 편집 기능에 대한 테스트가 필요하여 2019년 2월에 제공되는 경상남도 진주시의 전체 지적도를 단말기에 올리고 테스트를 해보았습니다. 지적도의 필지 개수는 363,961개이며, 테스트 단말기는 2015년에 출시된 삼성전자 SM-T715N0입니다.

SmartPoint-Xr에서 처리할 수 있는 벡터 데이터는 편집용과 뷰전용으로 구분됩니다. 뷰전용은 지도를 빠르게 조회하고 화면상에 표시하는데 효율적이며 편집용은 뷰전용에 비해 화면상에 표시되는 속도가 다소 느리지만 공간 데이터를 단말기에서 바로 편집할 수 있다는 장점이 있습니다. 편집용 포맷에 대한 실제 지도 표시 속도는 위의 동영상에서 보여지는 정도입니다.

Google에서 발견한 열가지 진실 중 하나

하나, “사용자에게 초점을 맞추면 나머지는 저절로 따라 옵니다.”

Google은 처음부터 사용이 가장 편리한 서비스를 제공하는 데 초점을 맞췄습니다. 고객을 우선적으로 생각하다고 주장하는 기업은 많지만 주주의 이익을 위해 고객의 작은 희생을 요구하는 경우가 많습니다. Google은 사이트 방문자에게 도움이 되지 않는 변화를 거부하고 다음 원칙을 고수해 왔습니다.

  • 인터페이스는 명료하고 간단해야 한다.
  • 페이지는 즉각 로딩 되어야 한다.
  • 검색결과의 게재 순위는 절대로 판매하지 않는다.
  • 사이트의 광고는 관련성 있는 콘텐츠를 제공해야 하며, 사용자에게 혼란을 주어서는 안된다.

사용자의 이익을 항상 먼저 생각함으로써 Google은 충실한 웹 고객을 확보했습니다. 두터운 고객층은 TV 광고가 아니라 서비스에 만족한 사용자들의 입소문을 통해 형성되었습니다.

출처는 어떤 분께서 업무 협의를 위해 준 메일 중의 내용인데, 여러모로 생각되는 부분이 있어 글로 납겨 봅니다. 처음 지오서비스라는 이름으로 GIS 개발을 해보겠다는 그때의 초심을 다시 생각해 봅니다.

모바일 GIS 엔진, SmartPoint-Xr에서 폴리곤 자르기와 병합하기 기능

SmartPoint-Xr은 안드로이드 기반의 GIS 엔진으로 기존의 BlackPoint-Xr과 동일한 API를 유지하면서 보다 강력한 공간 정보 데이터를 처리할 수 있는 기능을 제공합니다. SmartPoint-Xr에서 폴리곤을 자르고 병합하는 기능에 대해 데모 형태로 소개합니다.

아래의 동영상을 보면, 지적 필지를 선택하고.. 선택한 필지 폴리곤을 선으로 자르거나 또 다른 인접한 필지와 병합하는 기능을 살펴볼 수 있습니다. 공간 데이터의 빠르고 효율적인 편집을 위해 별도의 공간 데이터 포맷을 사용합니다. 이러한 편집 용 공간 데이터는 SHP 파일로 변환할 수 있어 다양한 GIS 툴에서 활용할 수 있습니다.

SmartPoint-Xr은 모바일 환경에서 빠르고 견고한 GIS 앱을 개발하기 위한 제품입니다.