'일상' 카테고리의 다른 글

Left, Right : 좌파, 우파  (0) 2011.12.22
봉투겉면이름형식  (0) 2011.11.16
매니페스토  (0) 2010.04.24
Posted by 병아리

// 선 reference : https://docs.djangoproject.com/en/dev/topics/serialization/


장고에서 기본 json serializer를 이용하면 내가 원치 않는 형식으로 나오게 된다.


pk가 노출되거나, model명이 나오거나, fields 밑에 필드가 나오거나...


물론 이걸 장고 내에서 그대로 deserialize 하는 경우에는 별 문제 없이 작동하겠지만, 다른 플랫폼과 통신하는 용도로 쓰기에는 조금 무리가 있다.


이전 프로젝트에서는 클라이언트에서 거의 무조건적으로 서버의 형식에 맞춰줬는데, 조금 비효율이었다.


그 당시 조사를 할 때는 해결 방안이 잘 보이지 않았는데 나중에 시간이 지나 비슷한 문제로 다시 검색을 하니 해결책이 보였다.





또는 더 응용하면 다른 원하는 형식으로 출력할 수 있겠더라.


장고 상에서 deserialize는

이런 식으로 하는데 앞의 serializers를 override하여 입맛에 맞게 바꿔주면 된다.


그냥 json serializer로 가면 어디를 손대야 할지 잘 보이지 않는다.


여기보다는 json serializer가 상속한 python serializer의 get_dump_object를 조금 수정하면 된다.



여기에서 models와 fields 필드를 붙이는 걸로 보인다.


그러니 serializer를 상속하고 get_dump_object를 override 해서 원하는 형식으로 object를 dump하도록 하면 된다.



// 출처 : http://stackoverflow.com/questions/15453072/django-serializers-to-json-custom-json-output-format

'Projects > django' 카테고리의 다른 글

django에서 BigIntegerField로 pk나 fk 쓰기  (0) 2015.02.12
Posted by 병아리

Dalvik/1.6.0 (Linux; U; Android 4.4.4; SHV-E210S Build/KTU84P)

Posted by 병아리

1. 원래 카카오 sdk는 쓰기 어렵거나

2. 쓰기는 쉬운데, 설명을 이해하기 참~ 쉽게 잘 해놨거나

3. 설명이 진정 쉬운데 내가 멍청해서(국어든 코딩이든) 이해를 못하거나


이 셋 중에 무엇이 참인 명제인지 엄청 고민을 하다가 검색을 하고 문제를 해결하게 되었다.


// 선 레퍼런스 : https://developers.kakao.com/docs/android


이 글을 찾아온 사람이라면 위 문서로는 구현은커녕 임포트조차 어떻게 하는지 잘 모르겠는 경우일 것이다. 나 또한 그랬으니까...


이전 이클립스에서는 어떻게 했는지 모르겠지만 (이 경우는 이미 인터넷에 많은 자료가 있다), 스튜디오로 바뀌면서 약간씩 바뀐 것 같다.


그래서 나 같이 스튜디오로 안드 개발을 시작한 사람은 환경이 달라 어떻게 적용해야 할지 잘 모를 수도 있다.


그런 사람들과 미래의 다른 프로젝트를 시작하는 나를 위해 적어놓는다.




우선, 카카오의 개발 커뮤니티에 벌써 나와 비슷한 어려움을 겪고 그 해결책을 공유해주신 고마운 분들이 계시다.


이 글 또한 그 분들의 노고를 참고하고 적용하여 내 나름대로 다시 정리한 것이다.


원 글 출처는 하단에 첨부해두었다. 레퍼런스보다는 설명이 잘 되어 있어서 출처로 바로 가서 그걸 보고 적용하여도 큰 문제는 없을 것이다.



1. 모듈이 아닌 프로젝트의 /build.gradle을 열어 allprojects에 다음을 추가한다.
mavenCentral()
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }

2. 다른 gradle에서 가져다 쓰기 위해 다음을 /gradle.properties 에 정의한다.

원문의 경우 버전이 1.0.40이었지만 현재 최신 버전은 50이다. 각자 현재의 최신 버전을 적어주도록 하자.

KAKAO_SDK_GROUP=com.kakao.sdk

KAKAO_SDK_VERSION=1.0.50


3. 모듈(app)의 /app/build.gradle 의 dependencies에 다음을 추가한다.

compile group: project.KAKAO_SDK_GROUP, name: '__모듈명__', version: project.KAKAO_SDK_VERSION

원문은 카카오링크 사용을 위해 kakaolink로 예시를 보여줬는데, 나는 사용자 로그인을 구현하기 위함이니 usermgmt로 추가하였다. 각자 필요로 하는 모듈명으로 추가해주면 될 것이다.

나머지 모듈명은 sdk의 sample 안의 각 모듈의 build.gradle을 보면 나와있다. (폴더명과 동일)


4. /app/AndroidManifest.xml에서 카카오 앱 키를 추가한다.

카카오 api 키를 받는 방법은 레퍼런스에도 나와있고 그다지 어렵지 않다.

4개가 있는데 가장 위의 네이티브 앱 키를 복사해서 붙여넣는다.

<meta-data android:name="com.kakao.sdk.AppKey"

              android:value="__카카오 api key__" />

위치는 application element의 자식에 (즉, activity와 같은 depth) 추가한다.


5. /app/build.gradle에 packagingOptions 를 추가한다.

packagingOptions {

    exclude 'META-INF/LICENSE'

    exclude 'META-INF/NOTICE'

}

4번까지 하면 다 된 것 같은데 실제 디버그를 돌려보면 패키징 중에 무슨 jackson-*.jar 가 duplicate되었다고 오류를 내뱉으며 안될 것이다.

이럴 경우 위의 구문을 /app/build.gradle에서 android element의 자식에 (즉, defaultConfig와 buildTypes와 같은 depth) 추가한다.



import는 여기까지면 충분하다. 이제 good to go!

여기서부터 밑의 내용은 나 혼자서 이해한 내용을 적은거라 틀릴 수도 있으니 적당히 잘 걸러 듣기를 바란다.




6. 실제 activity에 구현

카카오 링크를 쓰는 방법은 원 글에 잘 나와있고, 나는 카카오 계정을 이용한 로그인 기능을 쓸 것이다.

나도 아직은 로그인까지밖에 학습하지 않았기에 로그인만 적도록 하겠다. 이 정도까지 왔으면 아마 카카오의 레퍼런스가 이해되고 어떻게 사용하는건지 눈에 들어오기 시작할 것이다.


초기에 sdk를 이해하는데 있어서 나를 더 어렵게 만들었던 것이 sample과 template 이었다. 카카오 문서를 위에서 문서 잘 읽다보면 이런 문구를 만나게 되는데...

3. 로그인 Activity의 예제 코드로 loginbase-template에 포함된 com.kakao.template.loginbase.SampleLoginActivity입니다.

로그인기반으로 한 샘플 usermgmt-sample, kakaostory-sample, kakaotalk-sample, push-sample의 로그인 Activity는 이를 상속하여 구현하고 있습니다.

이해한 뒤에 다시 보면 괜찮은데 처음 봤었을 때에는 loginbase는 뭐고 template은 뭐지? *-sample과는 어떤 관계지? 또, SampleLoginActiviy는 뭐야? 뭐가 진짜 샘플이고 무엇을 보고 익혀야 하는거지? 난 그냥 로그인만 하고 싶은거면 뭘 봐야 하는거지????


가뜩이나 문서도 이해하기 어렵고 샘플을 봐도 구조조차 이해가 되지 않아 다시 문서를 차근히 보는데 이 문구를 보고 미치는 줄 알았다...


그러다가 샘플에 내 앱 키를 넣고 실행시켜 이것저것 써보면서 코드를 조금씩 이해했다.


잡설이 길었고 정리...



우선, 나와 같은 로그인 기능을 쓰는 사람은 SampleLoginActivity와 SampleSignupActivity를 이해하고 그 예시를 중점적으로 보면 될 것이다.

샘플로긴액티비티는 실제 카톡 로긴 창을 띄우고, 사인업은 사용자가 우리 앱에 가입할 것인지를 물어오는 창 인 것 같다.


따라서, *-sample 앱들과 같이 위의 액티비티를 상속해서 써도 되고(그대로 호출하거나 override), 아니면 실제 저 두 액티비티 속에 구현된 메소드를 긁어와서 내 액티비티에서 그대로 사용해도 된다. 뭐가 더 나은지 dry에 대한 것은 각자 개인의 판단에 맡기도록 하겠다.


방금 두 문단이 이해가 된다면, 저 위의 카카오 문서 인용문도 이해가 될 것이다.

SampleLoginActivity에서 카카오의 로그인 api를 진짜로 사용하는 로직을 구현해놓고, 각 *-sample에서 입맛에 맞게 override해서 사용하는걸 볼 수 있다.

그러니 템플릿이라고 이름을 붙여놓은 거겠지...? 갖다 쓰라고...?


이걸 미리 알았으면 더 쉽게 이해했을텐데... 내가 멍청한 셈 치자...



그리고 잊지 말아야 할 점이 한가지 더 있는데, 다른 모듈은 모르겠지만 usermgmt를 통한 카카오 계정 로그인을 쓸 예정이라면 무조건!

는 가장 처음에 실행시켜줘야 한다.

이 연유로 템플릿의 클래스를 바로 갖다쓰면 안된다고 나올 것이다. 왜냐하면 GlobalApplication 이라는 곳에서 Session.initialize(this); 해주고 있으니까... 다른 곳에 숨어있었을 줄이야... 물론 문서에도 나오기는 하니까 할 말은 없다. 대충 읽은 내 잘못이지.

주로 카톡로긴을 쓰는 activity의 onCreate의 시작부분에 넣으면 큰 문제가 없을 것이다.


즉, 내 액티비티에서 세션 초기화를 해주고, SampleLogin의 로직을 복붙해서 쓰거나,

아니면, SampleLogin을 상속하는 액티비티를 써도 될 것이다. (후자는 위에서 초기화 필요)


결론 : 실제 가져다 쓸 모듈은 Sample*Activity... *-sample 앱들은 앞의 템플릿(Sample*Activity)을 어떻게 갖다 쓰는지 예시를 보여주는 것이다.



// 출처 : [환경] 안드로이드 스튜디오(Android Studio)에서 Gradle로 카카오톡 SDK 사용

// 참고 : [가이드] AndroidStudio를 이용한 카카오SDK import 시키기

'Projects > android' 카테고리의 다른 글

안드로이드 httpurlconnection의 user-agent  (0) 2015.05.11
Posted by 병아리

블로그를 해킹당한 이후로는 관리하기 귀찮아서 쳐다보지도 않았는데, 오늘 코딩하다가 무언가 기록해야할 필요성이 있다고 생각되는 것을 알게 되었는데 이것을 기록할 곳이 없어서 잠시 고민하다가 결국 여기로 다시 돌아왔다.


자주 적지는 못하(않?)겠지만 그래도 오늘처럼 알아내는데 시간이 제법 걸리거나, 다음에 또 쓸 가능성이 있는 것들은 같은 사항으로 고민하는 다른 코더들을 위해, 그리고 바보같이 또 인터넷을 헤매며 삽질하고 있을 미래의 나를 위해 적어두어야겠다.



아, 참고로 이 방법은 1.7.3의 장고와 파이선 3.x 에서 이용가능하다.

issue가 올라와 있으니까 언젠가는 built-in으로 사용가능하겠지만, 그 전까지는 현재 버전의 상황에 맞게 살짝 바꿔서 사용해야 할 것이다.



그럼 배경설명부터...


django에서 모델을 정의할 때, 일반적으로는 pk를 서술하지 않는다.

왜냐하면 아무 필드에 primary_key=True를 먹이지 않는한, 장고에서 알아서 만들어서 추가해준다.

https://docs.djangoproject.com/en/1.7/topics/db/models/#automatic-primary-key-fields

https://docs.djangoproject.com/en/1.7/ref/models/fields/#autofield


일반적인 작은 웹 프로젝트의 경우에는 별 문제없이 사용할 수 있지만, 상황에 따라 pk가 일정 범위를 넘는 경우가 생길 수 있는데, 이때는 int만으로는 버거울 수도 있다.



그래서 아무 생각없이 BigIntegerField를 id로 정의하고 primary_key를 주고나서 새로생긴 migrate 기능을 이용해서 alter를 시도하니 안되더라... (내가 잘못한걸 수도 있음...)


인터넷을 찾아보니 구글에서도 비슷한 질문을 올린 사람들이 꽤나 있었다.

위에 issue도 올라온지 4년이 넘었는데 아직까지 기능추가가 되지 않았더라.

하긴, 1씩 커져서 저 큰 숫자를 넘긴다는게 정말 쉽지는 않겠지...


첫번째 댓글에 있는

이것도 시도해봤는데, 단순히 id로만 쓰는 경우에는 이걸로 해결될 수도 있겠지만, 나의 경우와 같이 다른 테이블에 foreign key로 묶여서 연결되어 있는 경우라면 아마 안될거다...


그래서 stackoverflow에서도 이것저것 찾아서 시도해보다가 이런걸 발견했다.

https://gist.github.com/thomasyip/3158388

설마 될까? 싶어서 가져와서 indentation만 조금 고쳐서 써봤는데 db 엔진을 매칭하는 부분이 현재 버전과 조금 달라 안되더라.

파이썬이나 장고를 잘 아는 사람은 여기까지만 읽어도 쉽게 해결하겠지만, 아닌 사람들(+미래의 나)을 위해 내가 실제 쓴 stub을 밑에 적어두도록 하겠다.

그리고 이전 버전에서 쓰였던 long()이 있기때문에 이것도 int()로 바꿔주었다

저작권은 github 링크의 저자에게 있는거겠지...?

그러니 이거 안된다, 저거 안된다 저에게는 묻지 말아주세요... 저도 아직 장고 초보랍니다 ㅜ_ㅜ

아, db는 mysql을 쓰고 있는 중이다. 당연히, 다른 db엔진에서는 전혀 테스트 된 바 없음...


// 추가

다른 db엔진에서 테스트 해볼 기회는 없었지만, sqlite3의 경우에는 "BIGINT"로 해야하는 것 같다...




이거 넣으려고 syntaxhighlighter까지 깔았다... 진작 써볼껄... 이거 좋네.



'Projects > django' 카테고리의 다른 글

custom json serializer in django  (0) 2015.05.14
Posted by 병아리

디데이 카운터

Projects 2012. 8. 16. 06:12


dday_counter_csv.py


dday.csv


디데이 카운터

Posted by 병아리

http://www.niharsworld.com/2010/09/29/download-microsoft-office-2010-language-packs-free-official-direct-download-links/

Posted by 병아리

Left, Right : 좌파, 우파

일상 2011. 12. 22. 23:47


'일상' 카테고리의 다른 글

Definition of Political Ideologies  (1) 2015.05.24
봉투겉면이름형식  (0) 2011.11.16
매니페스토  (0) 2010.04.24
Posted by 병아리

기타 조율 시 사용 가능한 미디 파일 ㅇㅇ

// 출처 : http://www.marooguitar.com/classic/3.htm

'음악' 카테고리의 다른 글

Winabx  (0) 2010.12.01
Posted by 병아리

봉투겉면이름형식

일상 2011. 11. 16. 19:32
이름란에 자신의 이름을 한자나 한글로 쓰고 편지봉투에 인쇄하면 꽤 보기좋게 나옴

'일상' 카테고리의 다른 글

Left, Right : 좌파, 우파  (0) 2011.12.22
매니페스토  (0) 2010.04.24
[위기의 주택시장]악순환고리 되풀이…업계 줄도산 '공포'  (0) 2010.03.03
Posted by 병아리

사이드바 열기