• SEARCH

    통합검색
  • GAMEZONE
    • 커뮤니티
      • 공지사항
      • 유저게시판
        • 등업게시판
        • 출석체크
        • 정회원 무료자료실
      • 스크린샷
      • 인증자료실
    • 리니지
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 메이플스토리
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 바람의나라
      • 자유게시판
      • 홍보게시판
      • 자료게시판
        • 유틸자료실
        • 소스자료실
        • 클라이언트
        • 팩 자료실
      • 연구게시판
        • 개발내역
        • 질문과답변
        • 기타
      • 강의게시판
        • DR
        • CR
        • 구버전
        • 클라이언트 개조
        • 노하우 게시판
        • 게임공략 & 팁
    • 다크에덴
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 믹스마스터
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 라그나로크
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 기타게임
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 게임강의
    • 비베&포토샵
      • 자유게시판
      • 자료실
        • 일반자료실
        • 포인트 자료실
      • 노하우게시판
      • 포토샵게시판
    • 모바일
      • 게임공략
      • 포인트 자료실
      • 유틸자료실
      • 자유게시판
  • 메이플스토리 소스자료실
    • 메이플스토리 소스자료실 ()
    • [03] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자! [출처] [03] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자!|작성자 enoch_rvn

      • 원나소년
      • 2016.06.06 - 11:44 148

    안녕하세염! 에노기에염.

    이번에 들고온건 뭐 다름아닌 데이터베이스 + 소스와 스크립트를 연동하여

    특별한 이벤트(아이템스크립트, 혹은 엔피시 스크립트 등) 으로 캐릭터잠금을 해제하는

    그런 시스템을 개발하며 배워볼까합니다.

     

    자 그럼 바로 강의 들어가도록하겠습니다.

     

    일단 데이터베이스를 열어주시고(브라우져)

     

     

    accounts 오른쪽클릭, Edit Table 에 들어가줍니다. (artlexonline 은 데이터베이스의 이름입니다)

     

    ​

    이렇게 설정창이뜨는데, 여기서 추가해주셔야할것은 테이블 이름입니다!

    Column Name 부분에 xxx이름 을 작성해주세요.

     

    앞부분은 왜 같게하느냐 하면, 소스부분에서 코딩할때에 사용 자원을 줄이기 위함입니다.

    이 부분은 나중에 보기로하고, 이제 DataType, notnull, autoinc, flags, default value, comment 의 역할을 설명해드리도록 할게요!

     

     

    DataType = 말그대로 데이타의 형식입니다. 형식은 엄청 많이 존재합니다.

    아는대로(쓰이는대로) 말씀해드리자면

     

    INTEGER(길이) = 숫자형 테이블. 보통 INTEGER 을 선언하면 -21억4천만... ~ 21억4천만.. 까지의 숫자를 저장할 수 있다. (총 대략 43억)

     

    VARCHAR(길이) = String 형이라고 볼 수 있다. 문자를 집어넣으며, 인코딩을 바르게 설정해주어야 한글이 제대로 들어간다. 스크린샷 하단에보면, Column Details 에서, Column CharSet 이란 메뉴가 있는데, 그 부분에서 euc-kr 을 선택해주어야하며, Default Value에 null을 작성해주어야한다.

    (default value 가 없으면 오류남)

     

    TEXT = 길이가 무제한급인 엄청난 용량의 컬럼. 보통 채팅로그나, 임의로 길게 변경될 수 있는 컬럼에 해당한다. (게시판작성 등) VARCHAR 과 속성이 비슷하다.

     

    TINYINT = 정말 작은 값을 사용할때 데이터베이스의 구조를 최소화시키기위해 사용되는 타입.

    TINYINT(1) 로 선언해주면, 0과 1 즉 TRUE/FALSE 만 설정하기에 가장 적합한 구조가된다.

    하지만 에러로인하여 2자리수가 들어간다고 가정하면 데이터베이스에서 나는 오류인지 몰라

    디버깅이 힘들게 될 상황을 우려해서 TINYINT 는 (2) 로 잡아주는게 좋다.

     

    TIMESTAMP = 날짜 계산 함수들이 상용화되며 사라져가고있는 추세다. 날짜를 담아주는 데이터 타입이며, 요즘은 그냥 VARCHAR로 자유성있게 사용한다.

    -----------------------------------------------------------------------------------------

    NOT NULL = 즉 무조건 값이 있어야한다는 뜻입니다. NOT NULL 을 선택해주면, Default Value 에 값을 넣어주시는걸 추천해드립니다.

    -----------------------------------------------------------------------------------------

    AUTOINC = 무조건 값이 증가하는 옵션입니다. INTEGER 에서만 사용되며(다른곳에서 사용하긴 하지만 뭐..) 보통 index 를 설정할때 편리하게 사용합니다. (중간에 값이 지워졌을경우 중간의 값을 채워넣지 않고, 계속 값을 증가시킵니다)

    -----------------------------------------------------------------------------------------

    Flags : UNSIGNED = 앞서 말씀드렸는데 INTEGER 혹은 TINYINT 같은 경우 -부터 값이 시작됩니다.

    하지만 -를 삭제(?) 하며 그 값만큼 넓이를 증가시킵니다.

    ex) INTEGER : -21억4천만... ~ 21억4천만... 을 0~43억

    ex) TINYINT : -255 ~ 255 를 510

    이런식으로 어.. 뭐랄까 -값을 안쓰는경우 체크해주시는게 좋아요.

     

    BINARY = 몰랑..

     

    ZEROFILL = 일단, INT(3) 이 컬럼을 보도록합시다.

    이것은 0~3 을 표현하는 식이 아니라, 0~999까지를 표현하는겁니당.

    즉 3자리 수까지를 표현하라~ 뜻이에요.

    INT(5) 면, 당연히 99,999 까지 들어간다는것이죵.

     

    자 그러면 ZEROFILL 은 어떤 설정이냐 하면

    INT(3) 으로 설정하고 값에 6이 들어갔어요. 그러면 출력되는 값이

    006 이 됩니다. 12가 들어가면 012가 되구요.

     

    이해하셨나용? 다시 INT(5) 로 설정하시고 3을넣으면

    00003 이 들어갑니다.

     

    길이의 나머지에 0을 채운다는 뜻이지요.

    -----------------------------------------------------------------------------------------

    Default Value = 값이 아무것도 들어가지 않았을때 출력되는 초기값.

    -----------------------------------------------------------------------------------------

    Comment = 아무 역할도 안해요. 이 컬럼이 무엇을 하는지 작성해놓습니당.

     

     

    아이고 힘들당.

     

     

     

    자 앞서 설명때문에 accounts 테이블에 컬럼 만들어주시는거 잊지마세요!

    데이터타입은 TINYINT(2), NOT NULL 체크해주시고, Default Value : 0 으로 해주시면되겠스민당.

    컬럼명은 예를 한번 들어보겠습니다.

     

    templeKazior

    templeEvan

    templeAran

     

    알아볼수있지만, 어느 특정 길이까지는 중복있게 해주셔야합니당.

     

    여튼 테이블 수정이 완료되었으면, 이제 소스코드를 짜볼 시간입니다! 짞짞

     

     

    ​자 메이플클라이언트.java 부분입니다!

     

    뭐 메서드명은 알아서 해주시고, int 형 메서드를 만들어보겠습니당.

     

    public int canCreateTempler(int Type) {
            // 0 = 아란
            // 1 = 에반
            // 2 = 은월
            // 3 = 카이저
            // 4 = 엔젤릭
            String temple = "";
            int result = 0;
            
            switch (Type) {
                case 0:
                    temple = "templerWarrior";
                    break;
                case 1:
                    temple = "templerDragon";
                    break;
                case 2:
                    temple = "templerWolf";
                    break;
                case 3:
                    temple = "templerKaizer";
                    break;
                case 4:
                    temple = "templerAngel";
                    break;
                default:
                    System.out.println("[디버깅] 인자값이 잘못됨 canCreateTempler()");
                    break;
            }
            
            try {
         Connection con = MYSQL.getConnection();
         PreparedStatement ps = con.prepareStatement("SELECT a." + temple + " FROM accounts a INNER JOIN characters c ON a.id = c.accountid WHERE a.id = ?");
         ps.setInt(1, accId);

         ResultSet rs = ps.executeQuery();
         while (rs.next()) {
      result = rs.getInt(temple);
         }
                
         rs.close();
         ps.close();
     } catch (SQLException e) {
         System.err.println("error loading characters internal" + e);
     }
            
            return result;
        }

     

    대충 이해가 가시나요?

    이번 소스코드는 두 구역을 나누어서 강좌하도록 하겠습니다.

     

     String temple = "";
            int result = 0;
            
            switch (Type) {
                case 0:
                    temple = "templerWarrior";
                    break;
                case 1:
                    temple = "templerDragon";
                    break;
                case 2:
                    temple = "templerWolf";
                    break;
                case 3:
                    temple = "templerKaizer";
                    break;
                case 4:
                    temple = "templerAngel";
                    break;
                default:
                    System.out.println("[디버깅] 인자값이 잘못됨 canCreateTempler()");
                    break;
            }

     

    첫번째는 이구역인데요, 바로 Switch Case 문이 나옵니다!

    이 부분은 뭐냐, Switch 인자값으로 들어간 변수에 특정한 값이 있으면 이벤트 처리, 혹은 설정된 특정한 값 이외의 값이 있으면 이외의 값대로 묶어서 처리하는 개 꿀 함수임니덩.

     

    오 이것만 들으셔도 이해하셨을 머리라고 생각합니다. Type 는 인자값이였고,

    Case 0 이면 인자값에 0이들어오면 Temple 이란 String 형 변수에 값을 넣네.

     

    응? 근데 저 temple 변수에 들어가는 값 이름이 어디서 많이 본것같은데.. 하시면 잘 생각하셨습니다. 저 변수에 들어가는것은 방금 저희가 테이블에 추가시킨 컬럼 이름입니다.

     

    왜 굳이 저런짓을하느냐 하면, 데이터베이스는 굉장히 예민한부분이기때문에 한번에 많은 명령문을 호출하게되면 자원 소모량이 엄청나게됩니다. 따라서 자신의 상황이 어떤 상황인지 먼저 판단하여 쿼리문을 최소화시켜 전송하는게 가장 중요한것이라고 생각하시면됩니다.

     

    자 뭐 default 는 딱 봐도 아시겠지만 0~4 이외의 값이 들어오면 잘못됬다고 에러띄워주는거구용!!!

    ----------------------------------------------------------------------------------------

    이제 그분이 오셨습니다.

     

            try {
         Connection con = MYSQL.getConnection();
         PreparedStatement ps = con.prepareStatement("SELECT a." + temple + " FROM accounts a INNER JOIN characters c ON a.id = c.accountid WHERE a.id = ?");
         ps.setInt(1, accId);

         ResultSet rs = ps.executeQuery();
         while (rs.next()) {
      result = rs.getInt(temple);
         }
                
         rs.close();
         ps.close();
     } catch (SQLException e) {
         System.err.println("error loading characters internal" + e);
     }
            
            return result;
        }

    ​

    여기서 잠깐, try { } catch () { 가 뭘까요?

    바로, 예외가 발생하여도~ 라는 뜻입니다.

    데이터베이스 작업할때에는 많은 예외상황들이 존재합니다.

    그렇기때문에 데이터베이스 작업에는 무조건적인 try catch 문법으로 묶어줘야합니다(?)

    ​

    try {  소스   } 부분에는, 그냥 평소대로 진행합니다. 소스코드를.

    하지만 catch 부분에서는 , try 안에 묶여있는 소스에 예외적인 오류가 발생했을때 에러를 띄워주고 함수를 중지시킵니다. 그냥 그렇게 알구이써염 ㅋ

    ​

    이제 Connection con = MYSQL.getConnection(); 부분을 보실까요.

    볼 필요 없습니다. 그냥 con 이란 변수는 마이쿼리의 연결자라고 보시면되요.

    ​

    PreparedStatement os = con.pre... 볼 필요 없습니다.

    어차피 복붙하실거잖아요. (찡긋)​ 당신들으 봐야할것은 여기에 나오는 쿼리 문법입니다.

    ​

    ("SELECT a." + temple + " FROM accounts a INNER JOIN characters c ON a.id = c.accountid WHERE a.id = ?");

    ​

    왜이렇게 복잡하게 해두셨지? 뭐지 저건? 이러시는분들 많을것같은데.. 음 예외상황이 발생할것같아서 캐릭터 테이블이랑 연결시켜놨었습니다.

    ​

    아래로 수정해주세요.

    ​

    ​("SELECT " + temple + " FROM accounts WHERE id = ?");

    ​

    오 졸라간단하죠?

    SELECT 는 참고하다, 보다 이런겁니다. 어디서? FROM accounts 즉 어카운트 테이블에서 본데요. 어떤 컬럼을? temple 변수에 저장되있는 컬럼을 본답니다.

    어 그럼 누구껄?​ id가 ?인것.

    응 ?가 뭔데요?

    ​

    ps.setInt(1, accId);

    ​

    네 ?는 계정아이디입니다.​

     

    ("SELECT ? FROM accounts WHERE id = ?");​

    ​ps.setInt(1, temple);

    ps.setInt(2, accId);​

    ​

    이렇게 하셔도 무방합니다. '?' 의 뜻을 아시겠나요?

    ​

    ​     ResultSet rs = ps.executeQuery();
         while (rs.next()) {
      result = rs.getInt(temple);
         }
                
         rs.close();
         ps.close();

     

    rs 는 ps의 담겨있는 쿼리문을 실행하고 값을 받아오는 역할을합니다.

     

    while (rs.next()) { 는 rs에 받아온값이 더이상 없을때까지 반복

    result = rs.getInt(temple); 는 result 에다가 temple 변수에 담겨있는 컬럼명의 값을 INT 형으로 받아온 값을 담는 부분임다.

     

         rs.close();
         ps.close();

         con.close();

     

    rs와 ps, 그리고 커넥션이 열려있으니 닫아주셔야죠!

    이 부분을 닫아주지않아, (닫히지않아) 투매니 커넥션이 발생하던 점이 있었습니다. (65 팩들 기준)

     

    꼭 닫으세요.

     

     

    허허 이제 canCreateTempler() 란 메서드를 MapleClient.java 에 만들어두었군요!

    음, 이제 다음편에서 계속됩니다!

    [출처] [03] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자!|작성자enoch_rvn

    Attached file
    01.png 14.8KB 602.png 109.4KB 503.png 73.0KB 5
    이 게시물을..
    N
    0
    0
    • 1.2.65 아트 소스오빠는요
    • 8
      원나소년

    원나소년 님의 최근 글

    메이플스토리 캐릭터카드! 80 5 2016 06.07 메이플 링크스킬 정리 및 추천도!! [출처] 메이플 링크스킬 정리 및 추천도!!|작성자 세이 66 1 2016 06.07 [05] - 데이터베이스 연동 개발 심화 마지막 [출처] [05] - 데이터베이스 연동 개발 심화 마지막|작성자 enoch_rvn 99 2016 06.06 [04] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자 2편 [출처] [04] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자 2편|작성자 enoch_rvn 139 2016 06.06 [03] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자! [출처] [03] - 데이터베이스 연동, 캐릭터 생성을 특별한 이벤트로만 가능하게 해보자!|작성자 enoch_rvn 148 2016 06.06

    원나소년 님의 최근 댓글

    초보 개발자도 가능합니까? 아직   개발의 ㄱ자도 모르긴하는데.. 2016 06.07 구축하기 쉬운가용? 2016 06.02 흑 ㅜㅜ 팩을 구하고싶은데 ㅠㅠ 구글링하면 나오려나요?... 2016 06.02 라피스 해보고싶네요 정말 어떻게못하나요... 2016 05.31 하핳... 그런게임들은 프리서버 못하는건가요? 2016 05.31
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • 1.2.65 아트 소스
    • 목록
      view_headline
    × CLOSE
    기본 (942) 제목 날짜 수정 조회 댓글 추천 비추
    분류 정렬 검색
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:13 927
    942
    v391 pack
    더기덕이 2025.10.04 - 00:33 205
    941
    127 써니 소스
    전창덕 2025.09.23 - 14:30 43
    940
    1.2.65 서버 ct및 우외 엔진
    마눙 2025.09.08 - 14:47 120
    939
    1.2.362 서버 src 입니
    GV솔그린 2024.03.21 - 20:54 313
    938
    1.2.316 초원팩 jdbc ssl 에러 수정 src
    GV솔그린 2024.03.21 - 19:31 115
    937
    1.2.329 로컬리디 언팩해서 만든 리디렉터
    GV솔그린 2024.03.21 - 19:24 92
    936
    1.2.329 로컬리디
    GV솔그린 2024.03.21 - 19:20 70
    935
    373 멀티로컬
    dreamin공유 2024.02.22 - 05:29 356
    934
    331팩 소스
    스마 2024.02.12 - 20:53 123
    933
    1.2.373 새벽소스
    스마 2024.02.12 - 20:47 243
    932
    373 솟
    garegdas 2024.02.06 - 09:24 121
    931
    스트레딧.
    하리86 2024.01.13 - 03:34 151
    930
    1.2.65 아르카나팩 스킬 변경 src
    김김김스 2023.12.26 - 04:49 948
    929
    316초원팩 src파일입니다
    동동쓰 2023.11.15 - 21:29 294
    928
    gms v111 접속rn
    하리86 2023.10.23 - 18:28 230
    927
    65버전 아르카나 , 죽둥젠 늘린거입니다
    gkxo9570 2023.09.22 - 12:38 542
    926
    65버전에서도 쓴 스크립트 강의모음
    gkxo9570 2023.09.22 - 07:42 460
    925
    1.2.65 화이트스타 src
    kingye 2023.07.04 - 10:56 1146
    924
    1.2.65 아르카나 src
    kingye 2023.07.04 - 07:28 535
    923
    ngs 우회
    우2우2 2023.06.08 - 04:55 277
    922
    몬스터 코드
    VanBan 2022.12.10 - 23:38 552
    921
    직업 코드
    VanBan 2022.12.10 - 23:30 306
    920
    362 자석펫 지급 NPC 스크립트
    나르나르 2022.11.10 - 08:55 854
    919
    0.83 src
    qweqwedq1 2022.07.13 - 15:30 144
    918
    리플렉스95 src
    qweqwedq1 2022.07.13 - 15:08 327
    917
    1.2.65 바콘팩
    dullggae 2021.07.30 - 18:04 730
    916
    316src입니다
    BJK 2021.02.10 - 05:37 218
    915
    331 소스
    라비앙로즈 2021.02.07 - 08:43 441
    914
    슈퍼엔진
    돼지우리 2021.01.14 - 02:20 445
    913
    kms 1.2.1104 ct입니다
    돼지우리 2021.01.12 - 12:07 448
    912
    어빌리티인포테이블.sql
    하리86 2020.12.16 - 00:23 180
    911
    잠재능력 관련 오류 수정 및 본섭화 옵션
    하리86 2020.12.16 - 00:16 358
    910
    sql 수정
    재희0414 2020.11.24 - 03:23 274
    909
    65 천외천 소스
    lIllIlllIllll 2020.10.16 - 06:05 412
    908
    로컬 소스
    피아쨩 2020.09.22 - 13:01 520
    907
    331 노엘팩 소스
    풍선씨 2020.09.09 - 03:33 1228
    906
    1.2.65 화이트스타 소스
    JYH93 2020.08.15 - 00:44 2343
    905
    1.2.65 순클 idb
    nhsnhsn 2020.07.24 - 00:19 875
    904
    331 GM명령어
    흐밍 2020.07.09 - 14:14 1837
    903
    레벨별 메소지급 소스
    능이 2020.07.05 - 21:44 690
    902
    1.2.284 그랜드 접속문제 해결파일
    wls 2020.06.28 - 07:30 240
    901
    대만 메이플스토리 113 아이템코드
    해우김123 2020.06.19 - 07:47 304
    900
    Java SE Development Kit 6 Update 10 - jdk-6u10
    수박씨 2020.05.12 - 21:52 203
    899
    Java SE Development Kit 6 Update 6 - jdk-6u6
    수박씨 2020.05.12 - 21:51 124
    898
    316 추옵 쿼리에서 수정하기
    DanielJSKim 2020.03.08 - 05:03 1440
    897
    316 추가옵션 구현 소스
    DanielJSKim 2020.03.08 - 05:00 1181
    896
    알면 유용한 위젯
    오빠는요 2020.02.25 - 21:06 754
    895
    1.2.65dk
    오빠는요 2020.02.25 - 21:04 481
    894
    1.2.65 아트 소스
    오빠는요 2020.02.25 - 21:02 459
    893
    316 이너 어빌리티 미개방 캐릭터에 강제로 부여하기
    DanielJSKim 2020.02.23 - 02:44 499
    • 1 2 3 4 5 6 7 8 9 10 .. 19
    • / 19 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay