겨울팥죽 여름빙수
article thumbnail

서버를 만들다보면 mysql이나 mariadb를 쓰게 되는 경우가 많습니다.

이때 sql인젝션 방지겸, sql코드를 독립 시킬 겸 해서, ibatis를 쓰고 있습니다.

저는 현재 맥북으로 VisualStudio for Mac을 사용하고 있습니다. 윈도우에서도 해봤는데 잘 돼요.

ibatis 자세한 사용법은 여기 링크를  [ibatis 설명] 보시면 됩니다,

아! db는 그냥 [구글 클라우드 sql]를 사용하고 있습니다. 

 

 

1. 필요 dll 다운로드

필요한 dll목록은 다음과 같습니다.

- IBatisNet.Common.dll

- IBatisNet.DataMapper.dll

- MySql.Data.dll

- MySql.Data.Entity.EF6.dll

- MySql.Fabric.Plugin.dll

- MySql.Web.dll

Nuget Manager

 

현재 위의 목록들은 Nuget Manager에서 다운로드 가능한 것 같습니다. (저는 직접 구글링해서 다운 받았었는데 ㅠㅠ.. 첨부로 파일들 올리고 싶지만, 올려도 되는지 몰라서 그냥 안 올렸습니다.)

 

2.  프로젝트에 [SqlMap.config] 파일 생성

SqlMap.config은 xml양식의 파일로 mysql 계정 정보와 Mapper파일들 위치 등을 설정하는 곳입니다. 해당 파일을 만들어 프로젝트 폴더에 위치시키세요. 아래는 코드 예시입니다.

 

<?xml version="1.0" encoding="utf-8" ?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<settings>
		<setting useStatementNamespaces="false" />
		<setting cacheModelsEnabled="true" />
		<setting validateSqlMap="true" />
	</settings>


	<!-- Connecting to a MySQL database --> 
	<database>
		<provider name="MySql5" />
		<dataSource 
			name="NPetstore" 	   		
			connectionString="host=${35.xxx.xx.xx};Database=${디비이름};user id=${사용자아이디};Password=${비번};Convert Zero Datetime=True;"
		/>
	</database>


	<sqlMaps>	
    	<!-- Mapper 파일들 --> 
		<sqlMap resource="Class/DB/MyBatis/DbMapper/TestMapper.xml"/>
	</sqlMaps> 
</sqlMapConfig>

 

 

3.  Mapper파일 만들기

Mapper파일은 xml양식의 문서로, sql명령어들을 등록하는 곳입니다. 아래 예시코드 참고하세요~

<?xml version="1.0" encoding="utf-8" ?>


<sqlMap namespace="EF4._14" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ibatis.apache.org/mapping">
	<alias>
		<typeAlias alias="UserData" type="UserData"/>	
	</alias>


	<resultMaps>		
		<resultMap id="UserData" class="UserData">
			<result property="m_id" column="id" dbType="BIGINT"/>
			<result property="m_user_k" column="user_k" dbType="VARCHAR"/>
			<result property="m_name" column="nname" dbType="CHAR"/>	
			<result property="m_lv" column="lv" dbType="INT"/>
			<result property="m_last_connect_time" column="connecttime" dbType="DATETIME"/>
			<result property="m_last_exit_time" column="exittime" dbType="DATETIME"/>
		</resultMap>
	</resultMaps>


	<statements>		
        <statement id="selectUserById" parameterClass="System.Int64" resultMap="UserData">
            SELECT  *
            FROM User
            WHERE id = #value#;
        </statement>
        
        <statement id="countUserById" parameterClass="System.Int64" resultClass="int">
            SELECT  COUNT(*)
            FROM User
            WHERE id = #value#;
        </statement>


	</statements>
</sqlMap>

 

간단하게 설명하자면,

<typeAlias alias="UserBaseData" type="UserBaseData"/> 이부분은  c#프로젝트와 myql결과물을 연결시킬 객체를 말하는 것입니다. 실제 프로젝트에 해당 클래스를 만들어 둡니다. 아래와 같이 그냥 Bean 클래스입니다.

public class UserBaseData
{
    public long m_id;
    public string m_user_key;
    public string m_nick_name;
    public int m_level;


	.....


    public UserBaseData()
    {

    }

    public UserBaseData(long id,
                          int level,
                        DateTime last_connection_time,
                        DateTime last_exit_time)
    {
        m_id = id;
        m_level = level;
        m_last_connect_time = last_connection_time;
        m_last_exit_time = last_exit_time;
		....
    }
}

 

<resultMaps> 부분에서 위 클래스와 db 테이블 칼럼 이름, 타입을 매칭 시킵니다. 

<statements>에 사용할 sql문을 적어놓습니다.

 

4. c# 예시 코드

위의 파일들을 미리 만들어 두었다면, 이제 c#에서 직접 사용하기만 하면 됩니다.

public class DbManager : Singleton<DbManager>
{
    List<DbRequestData>     m_db_request_list;
    object                  m_mutext_request_list = new object();

    List<DbRequestData>     m_db_work_list;
    object                  m_mutext_work_list = new object();
    bool                    m_is_lock_work = false;

    Thread                  m_thread;
    bool                    m_is_run_thread;

	public DbManager()
	{}

	override protected void init()
	{
		Mapper.Instance().OpenConnection();

        m_db_work_list          = new List<DbRequestData>();
        m_db_request_list       = new List<DbRequestData>();

        m_thread		= new Thread(new ThreadStart(threadProcess));             
        m_is_run_thread		= true;

        m_thread.Start();
	}
    
    ......
}

저 같은 경우 db를 메인스레드가 아닌 백그라운드 스레드에서 처리하고 있고, 생성자 소비자 패턴을 이용해 구현했습니다. 위 코드에서 다른건 다 필요 없고, Mapper.Instance().OpenConnection(); 것만 보시면 돼요. 

Mapper.Instance().OpenConnection(); 코드로 mysql를 열고, 위에서 만들 파일들을 연결 시켜줍니다.

 

 

select

UserPointData req_data

long count = (Int64)Mapper.Instance().QueryForObject("selectTotalPlayerCount", req_data);
RankManager.Instance.TotalCount = count;

IList<UserPointData> user_point_list = Mapper.Instance().QueryForList<UserPointData>("selectUserPointsDesc", req_data);

 

 

 

insert

MailData user_mail = (MailData)request.m_data;
user_mail.m_id = (long)Mapper.Instance().Insert("insertMailData", (UserMailData)user_mail);

 

 

update

Mapper.Instance().Update("updatePoint", data);

 

 

delete

Mapper.Instance().Delete("deleteMail", data);
profile

겨울팥죽 여름빙수

@여름빙수

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!