서버를 만들다보면 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에서 다운로드 가능한 것 같습니다. (저는 직접 구글링해서 다운 받았었는데 ㅠㅠ.. 첨부로 파일들 올리고 싶지만, 올려도 되는지 몰라서 그냥 안 올렸습니다.)
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);
'게임을 만들자 > 게임 서버(C#)' 카테고리의 다른 글
파이썬으로 구글 스프레드시트 다운받고, Json으로 변경하기 (0) | 2019.12.28 |
---|---|
c# 실시간 게임 서버 만들기 3 - 서버 (1) | 2019.12.22 |
c# 실시간 게임 서버 만들기 2 - 클라이언트 (2) | 2019.12.19 |
c# 실시간 게임 서버 만들기 1 - 패킷 (1) | 2019.12.17 |
c# 서버 로그 log4net 사용방법 (1) | 2019.12.13 |