가끔 생각은 났지만 바쁘다는 핑계로 들어와보진 못했다


작년 이맘때쯤부터 네*버에서 입사시험을 치루고 있었는데.


무사히 잘 통과했으며 감사히 서로를 존중하고, 

코딩을 좋아하는 사람들과 함께할 수 있어서 행복한 것 같다.


오늘 블로그 와서 확인해보니,

예전에 공부하면서 포스팅 했던 내용에 질문글도 많이 올라오고, 비밀댓글도 많이 달렸다.


지금 보니 날짜도 많이 지났고, 답변을 달기에는 많이 늦었다고 생각한다.


되도록 빠른 날짜에 질문 해주신 모든 문제를 취합하여 하나의 포스트로 만들면 어떨까? 라는 생각도 해본다.


지금 하고 있는것들만 끝나면 해야지 키키


나는 요즘 두개의 사이드 프로젝트를 진행하고 있다.

첫번째로,

서로의 고민을 들어주고, 피드백해줄 수 있는 서비스이다.

코딩이 재미있어질 때 부터 만들고 싶었던 서비스라 재미있게 만들고 있으며 막바지를 향해 달려가고 있다.


두번째로,

대학생인 개발자와 디자이너들이 협업하여 서비스를 만드는

넥스터즈

라는 곳의 홈페이지를 열심히 만들고 있다. 

같이 8기 운영진을 맡았던 대장님과 같이 만들고 있으며,

이제 시작이라 설레는 마음으로 프로젝트 깃을 새로 만들었다.


이제는 스프링 개념도 조금 익숙해진 것 같고,

개발과 관련된 글을 좀 올려볼까 생각도 한다.



안녕하세요~ 정말 오랜만에 블로그에 로그인하네요.

그동안 많은분들이 질문을 남겨주시고, 그 질문에 서로 대답해주는 모습을 보니 마음이 뿌듯하네요 ㅎㅎ


스타트업에 합류하고 나서, 주구장창 안드로이드만 해왔는데, 이번주부터 API서버를 만들게 되었습니다.

그 중 가장 재미있었던 파트는 API서버에서 AWS의 S3(Simple Storage Service)로 파일을 업로드하는 부분입니다.

기존의 JavaScript, JQuery 등으로 업로드 하는 부분은 많이 나와있는데, Front-end framework(or library)를 이용해서 업로드 하는 부분에 대해서 설명이 잘 되어있는 부분이 없어 포스팅을 마음먹게 했네요.


Spec

Back-end : Spring-boot

Build tool : Maven.

Front-end : Vue.js 2.0


업로드 하는 부분만 보자면 이 스펙만 따라하시면 될 것 같습니다.



Front-end.


테스트 하기 위해서 순수 JavaScript , HTML5 , CSS3로만 작성했습니다.


이렇게 작성해주면 정상적으로 작동하는데, 이번에 회사에서 Front-end 로, React or Vue를 자유롭게 선택해서 사용하라고 하셨는데,

React+Spring조합은 뭔가 세팅해줘야할게 너무 많더라구요.

그래서 Vue.js를 선택했습니다. ( 페이스북 페이지 Vue.js Kroea에 많은 정보를 항상 받아왔었거든요! )


그래서 Vue.js를 선택해 다음과 같이 코드를 작성했습니다.

이렇게 작성하니

Uncaught TypeError: Cannot set property 'ondragenter' of null

    at window.onload (updates.html:120)


이런 에러를 내뱉더라구요 이런 나쁜쉐키 -_-;

확인해보니 다음코드랑 충돌이 발생했습니다.

별에 별 짓을 다해봤습니다

onDragEnter로도 바꿔보고, addEventListener로도 바꿔보고 사용하지 말라고 했지만 혹시 몰라서 JQuery로도 작업을 해봤는데 계속 작동하지 않더라구요.

키워드로 "Vue.js 2.0 drag and drop when file upload"로 검색하니

npm을 이용해서 업로드하는 예제, 오픈소스만 주구장창 나왔습니다.

npm을 이용해서 했으면 React썻지 이사람아..


그러다 이렇게 설정해주니 되더라구요.


일단 작동하지 않는 Javascript 코드를 일부 삭제했습니다.


그리고 Vue.js에 한개의 메소드를 추가했고, 기존의 div코드에도 코드를 일부 수정해줬습니다.



이렇게해서 Front-end부분은 마무리지었습니다.


이제 남은건 Back-end인데,


Maven에 다음 코드를 넣어줍니다.


그리고 사용하시는 Controller에 @RestController 어노테이션을 적용해주시고,

s3Wrapper는 .. 알아서 만드시고..

upload메소드는 다음과 같습니다.


코드를 자세히 보신분은 이해가실테지만, 호출하는 메소드는 Multipart[]를 전달인자로 보내주는데, 받는곳은 Multipart 하나의 인스턴스로만 받습니다.


upload(Multipart[] multiparts) 메소드를 하나 만드시고, 위의 메소드를 length만큼 호출하는 메소드를 만들어주시면 됩니다! :)

코드 보시면 아시겠지만, 쓸때없는 코드라고 생각되는 부분이 조금 있습니다.

지우시고 사용하셔도 됩니다.



이렇게 작성하면 정상작동합니다.


보안상 문제로 많은 코드를 보여드릴 순 없었지만 핵심적으로 제가 맞이했던 에러들과, 작동에 필요한 코드를 모두 포함해드렸습니다.


ㄷㅐ학교 다닐때는 시간이 널널해서 포스팅 하나하나에 많은 정성을 기울여 포스팅 하고 그랬는데..


이제는 시간도 없고 코딩할 시간도, 잠 잘 시간도, 모두 부족하니 대충대충 핵심만 적게 되네요 ㅋㅋㅋㅋㅋㅋㅋ

제가 좀 더 개발을 잘하게되서 시간이 넉넉해지면 선생님의 마음으로 한땀한땀 알려드릴게요!


궁금한 점 있으시면 댓글 주세요!(언제 볼 진 잘 모르겠습니다.)


즐거운 주말 보내세요~ :')

'Web' 카테고리의 다른 글

HTTP 스펙  (2) 2016.03.29

이전 포스팅에서 스캐닝 파라미터에 대해서 알아봤습니다.

스캐닝의 종류에는 능동스캐닝과 수동스캐닝이 있다고 말씀드렸습니다.

이 아이디어는 어디에나 있는 아이디어입니다. 우리가 옷가게에 갔을경우, 박물관에 갔을경우 요즘엔 자동차들끼리 정보를 교환 한다거나 이런경우에 사용할 수 있습니다. 즉 나와 이웃해있는 노드들을 발견하는 아이디어에 사용되는 것이죠.


1) 수동 스캐닝.

수동스캐닝은 처음 채널에 접속했을 때 패킷을 전송하지 않기 때문에 배터리 전력 소모를 절감할 수 있습니다.

패킷을 전송하지 않는다는 것은 각 채널을 옮기면서 비콘 프레임(광고 메시지)을 기다린다는 말이죠.

광고 수신하면 해당하는 패킷에는 BSS에 대한 정보가 포함되어 있습니다.

그러면 스테이션은 BSS의대한 정보(파라미터)를 추출하여 통신가능한 상태가 됩니다.

즉 수동스캐닝은 특정한 광고 메시지가 들린다면 어느 AP(ㄴㅔ트워크)에 포함되어 있다는것을 알게 되는겁니다.

위의 그림을 보면 클라이언트가 와이파이를 활성화하면 스테이션은 프로브 지연을하게되고, 최소 채널 시간동안 수동 스캐닝을 하게됩니다.

수동 스캐닝동안 AP1 , AP2 , AP3의 비콘메시지를 듣게되는데요. 이 클라이언트는 AP4번의 비콘은 듣지 못합니다. 그렇다는건 4번의 BSS영역에는 포함되어있지 않다는것을 의미합니다.

즉 위의 클라이언트는 AP1,2,3의 영역에 있기 때문에 자신의 위치를 좀 더 정확히 알 수 있게됩니다. 

이건 즉, 어느 특정한 장소에서 와이파이를 켜시면 좀 더 정확한 위치를 측정할 수 있습니다! 라고 종종 보는것과 같은 의미입니다.

GPS는 오차범위가 50미터 이상이지만 AP는 수신 도달거리가 50미터 이하입니다. 또한 각각 AP에 겹치는것은 그만큼 좀 더 정확한 위치를 알 수 있다는것을 의미합니다. 또한 이 정보는, 해당의 클라이언트가 몇층에 있다는것을 알 수도 있는 정보가 되는것이죠!

그래서 우리가 코딩할때도 누가 누구를 찾을지 정하는것이 제일 중요한 문제입니다.


하지만 수동 스캐닝을 하다가 기다려도 AP가 없다면!? 아니면 너무나도 급한 상황이면?!

능동 스캐닝을 이용해야 합니다.(핸드폰에서 블루투스를 키면 바로 능동스캐닝을 시작합니다.)

2) 능동 스캐닝

스테이션(클라이언트)이 스캐닝을 위한 프레임을 전송 하는 것 입니다.

예를들면 각 채널에서 특정 이더넷 네트워크 (iptime , olleh-5G와 같은 SSID)에게 응답을 얻기 위하여 프로브 요청 프레임을 전송합니다. - 이것은 이전에 공부한 간청메시지와 같습니다.

네트워크가 전송하는 것을 듣기 위하여 기다리지 않고, 스테이션이 직접 네트워크를 찾아 내는 형태의 스캐닝입니다.

그럼 능동스캐닝의 절차를 알아보죠!

1. 특정 채널로 옮겨서 다음의 조건을 확인합니다.

 1.1 채널의 프레임이 전송중인지 확인합니다. - > 채널에 프레임이 전송중이라는것은 이 채널에는 나 말고도 다른놈이 존재한다! 라고 인식하면 됩니다. ( AP든 스테이션이든! )

 1.2 채널이 프로브 지연 시간동안 비어있는지 확인해야합니다 -> AP가 있는지 없는지 모르기때문에 바로 프로브 지연 시간동안 대기한 후, 요청을 보내고 바로 다음 네트워크로 이동합니다.


2.능동스캐닝은 기본적인 DCF접근 절차를 이용하여 매체에 접근하여 프로브 요청 메시지를 전송합니다

3.최소 채널 시간동안 대기합니다.

 3.1 프로브요청을 보내고 최소 채널 시간동안 매체가 사용중이지 않ㄷㅏ면 매체가 사용중이지 아니라는것입니다.

 3.2 만약 매체가 최소 채널시간동안 사용중이라면, 최대 채널시간동안 기다리며 모든 프로브 요청 프레임을 처리합니다.

-> 이 경우에서는 능동 스캐닝을 이용하여 "이 주변에 누구 있습니까! "라고 메시지를 보냈는데, 매체는 해당 메시지를 수신했고 답장을 보내고 싶지만 DCF시간동안 기다렸지만, 계속 경쟁에서 진다면 AP가 보내는 응답을 스테이션은 수신하지 못하게 되는거죠. 이 경우에 최대 채널시간동안 기다리게 됩니다.


이 이야기에서 간청 메시지와 광고 메시지와의 차이가 있다면 ㅇㅓ떤것일까요?

스테이션은 간청메시지를 보내게 된다면 광고메시지를 응답으로 보내줍니다.

스캐닝에서는 채널에 접속하면 비콘메세지를 수신하게 되고, 만약 스테이션이 비콘메시지를 수신하지 못한다면 스테이션은 프로브요청을 보내게됩니다. 여기에서 AP는 응답으로 비콘메시지를 보내는것이 아니라 프로브응답을 보내게됩니다.


정리해봅시다.

무선으로 주변에 있는 누군가를 발견한다는것은

1. 스테이션이 채널에 접속할때 프로브 지연시간동안 기다리며, AP는 비콘을 발송해야 합니다.

2. 스테이션은 그 비콘을 듣고 주변에 누가 있는지 알아냅니다.

3. 이걸 기다리지 못한다면 프로브요청(간청 메시지)를 보냅니다.


두 개의 BSS에 의한 다중 프로브 응답 전송 예.

이동 스테이션은 AP1,AP2를 찾기 위하여 프로브요청을 보내게됩니다. 여기에서 응답은 DIFS동안 기다리고 프로브 응답이 날라옵니다. 

->여기에서 프로브 응답은 Atomic(동기)될 수 없습니다. 그 이유는 해당 스테이션이 존재의 유무를 모르기 때문이죠.

프로브 응답이 오기 전에, 최소 채널 시간동안 스테이션은 대기합니다. 최소 채널 시간동안 스테이션은 기다립니다. 이 최소 채널시간동안 기다렸는데 아무런 대답이 없다면 이 채널에는 아무도 존재하지 않는것입니다.

하지만 이 채널시간에 누군가 떠든다면 일반 데이터일 수도 있고 프로브 응답일 수 있습니다. 즉 누군가 떠들었다는것은 해당 채널에 AP든 스테이션이든 누군가 존재한다는 말이 되는거죠. 그럼 누군가 떠들었던 데이터에 대해서 ACK를 전송합니다.

18:32





 


안녕하세요~ 포스팅을 정말 오랜만에 하네요. 

그동안 돈에 눈이 멀어 외주도 정말 많이하고. 넥스터즈 활동도 하고~ 그동안 개발하던 앱도 업데이트하고~ 하나는 마무리하여 런칭을 앞두고 있어서 여유가 생겼네요ㅎㅎ

아! 런칭한 앱은 Gola~ 라는 먹거리 월드컵 앱입니다. 디자이너가 직접 디자인하여 깔끔한 UI를 갖고있는데요 . iOS, Android 둘 다 제공하고 있으니 한번 사용해보세요 ㅎㅎ

내일 새로운 외주 미팅이 있는데 외주가 성사되면 다시 얼마동안 안보일터이고~ 성사되지 않는다면 자주 찾아뵐 수 있겠네요 ㅋㅋㅋ

블로그는 항상 머리속에 "이번주엔 포스팅을 시작해야지!!! " 하고 있었지만 많은 정보를 한번에 포스팅하려니 겁을먹고 미루고 미루다 한가지 결심을 했습니다.

그 결심은 , 이제는 한 주제에 대해서 짧고 짧고 짧고!! 간략하게!(중요하죠.) 자세하도록 하나씩 포스팅하는게 좋겠다!! 라는거죠ㅋㅋㅋㅋㅋㅋ 

오늘은 스캐닝을 공부하면서 인터넷에 수 많은 키워드로 검색을 해봤는데, 아! 여기다! 싶을정도로 자세하게 적어놓은 글이 없더라구요.

답답한 나머지 스캐닝부분은 완벽하게 정리해서 올리겠다! 라는 마음을 갖게 되었습니다! 포스팅 시작하죠.


우리가 인터넷을 사용할 때 유선을 사용한다고 하면 먼저 랜선을 벽에 있는 포트에 잭을 꽂는게 우선이죠? 무선에서는 접속 가능한 네트워크를 찾습니다.

이런 특정 영역에 존재하는 네트워크를 식별하는 과정을 스캐닝이라고 합니다.


스캐닝은 검색하다,찾는다 라는 의미입니다.


스캐닝을 하기 위해선 무엇을 찾아라~~ 라고 명령할 수 있는 파라미터가 필요합니다.

조건에 맞는 네트워크를 찾기 위하여 파라미터가 필요한것이죠. 파라미터는 다음과 같습니다~!


1. BSSType 

인프라스트럭쳐 BSS를 찾아라, IBSS를 찾아라. 둘 다 찾아라.

이와 같이 BSSType는 기존에 여러분들이 생각했던거와 같이 2가지가 아니라 세가지입니다.

2. BSSID 

BSSID의 값을 대표적으로 AP의 물리주소를 사용합니다..
그렇기때문에, 특정 AP만 찾아라, 혹은 모든 AP만 찾아라 라고 명령할 수 있습니다.

이 값을 특정한 AP의 물리주소로 사용할 수 있다고 했는데요. 이 뜻은 집에 왔을땐 내가 등록한 물리주소, 즉 집에 있는 AP의 물리주소만 등록하여 집에있는 AP들만 잡아라~~ 라고 할 수 있습니다. 즉 나쁜마음을 갖고있는 이웃집에서 전송하는 AP는 잡지 말라고도 설정할 수 있죠. (반대로 물리주소를 사용하기 때문에 브로드캐스트 주소로 사용할 수 있죠.)

3. SSID 

BSSID는 맥 주소로 6바이트입니다. 이 값을 외우고 다니는사람은 없겠죠??ㅋㅋ 그렇기 때문에 나온것이 SSID입니다. 이 값은 인간을 위해서 나온값입니다. iptime / Olleh-5G와 같이 특정한 장소에 물어봤을 때, 친구보고 "야! 여기 와이파이 이름 뭐야!?"할 때 알려주는 이름이 SSID입니다.



스캔유형에는 능동스캐닝/수동스캐닝 두 종류가 있습니다.

능동스캐닝  - 스테이션(장치,기기,핸드폰(모바일))에서 AP에게 정기적으로 프로브 프레임 요청을 보내는것입니다. (보통 각 회사(휴대폰 기술)마다 다른데 비콘프레임이라고 부르는 회사도 많습니다.) 이건 이전에 공부한 ICMP 간청메시지와 비슷하죠. 

수동스캐닝 - 스테이션이 AP에게 프레임 요청을 보내지 않고 데이터를 수신하기만 하는것을 수동스캐닝이라 부릅니다. 이건 ICMP 라우터 광고메시지와 비슷하죠. 

스캐닝을 통하여 내가 어떤 AP 혹은 기지국에 포함되어있는지를 알아낼 수 있습니다.


옛날 나온 영화중  마이너리그 리포트라는 영화가 있었죠. 이 영화를 보면 톰 크로즈가 악당에게서 도망가던 중 어느 쇼핑몰에 들어간 장면이 나옵니다. 그 쇼핑몰에서는 톰 크루즈가 보는곳마다 "~~ 님 이 제품 사세요!" 라는식의 광고를 계속해서 보여주죠. 이 장면은 지금 이 시점에서 모두 구현이 되어있습니다.  요즘 백화점에 들어가면 핸드폰에 "~~제품 **%할인중입니다!" 라고 푸쉬가 날라오기도 하며 시럽어플을 사용하면 근처의 음식점을 지나갈때도 푸쉬를 날려줄때도 있습니다. 이런 푸쉬 알람들은 비콘에서 사용자의 디바이스에게 할인정보를 전송해주는것인데요. 이 개념은 수동스캐닝에서 발생된 개념을 활용한 실생활의 예입니다.

4. 채널목록.

이 파라미터를 보는순간 네트워크에는 특정한 채널 목록이 있구나~~ 라고 생각이 바로 듭니다. 아! 혹시 여러분은 집에서 사용하는 공유기의 채널을 설정해본적이 있으신가요? 

보통 모든 집에서 iptime을 많이 사용하죠. 저희 집에서도 iptime을 사용하는데요. iptime은 특별하게 가상 IP주소에서 채널을 설정할 수 있게끔 제공해줍니다. 

소비자가 채널을 설정하지 않는다면 공장에서 기본적으로 제공해주는 채널을 사용하게됩니다. 보통 1번대 채널을 많이 사용하죠. (실제로 채널 설정페이지로 들어가면 1번채널을 사용하고 있는 AP의 숫자가 굉장히 많습니다 )

AP가 제공하는 2.4Ghz에서는 1번부터 13번까지의 채널을 사용할 수 있습니다.(겹치지 않는 채널은 3개이며, KT에서는 4개를 제공해준다고 합니다!)

채널목록이 있다는 것은 1번채널을 뒤져라, 2번채널을 뒤져라 혹은 모든채널을 뒤져라 ! 라고 명령을 줄 수도 있는것이죠.
802.11ac를 지원한다면 5Ghz를 사용할 수 있는데요. 이 5Ghz가 제공하는 채널 갯수는 24개입니다. 

이와같이 채널들이 13개, 24개 이렇게 존재하니 사용자는 사용하기를 원하는 특정 채널목록 파라미터값을 주고, 원하는 채널만 스캔할 수도 있으며, 모든 채널을 찾을수 있습니다. 이런 채널목록을 알고있으면 원하는 채널에만 붙도록 하게끔 할 수 있다는 사실을 꼭 명심하세요!

-> 기본값은 모든 채널을 찾는것입니다. 그렇기 때문에 종종 wifi구역에 들어가도 wifi가 조금 늦게뜨는 경우는 채널을 탐색하기 때문에 늦게 출력되는겁니다.


5. 프로브 지연.

프로브는 탐사,탐침라는 뜻을 갖고있습니다. 스테이션은 해당 채널에 들어와서, 일정 시간동안 남의 소리가 안 들리면 프로브요청을 보냅니다. ( 광고가 안들리면 간청을 보내죠.) 이 말은 수동스캐닝을 하다가 아무 말도 안들린다면 능동스캐닝을 한다는 뜻이죠.

여기에서 일정 시간동안 남의 소리가 안들린다는것은 최소 채널 시간동안 다른 무선매체가 떠드는지 검사한다는 것인데요.  프로브 요청을 보내기 위해서 기다리는 시간을 프로브 지연이라고 합니다.

즉. 스테이션은 특정한 채널에 접속하자마자 능동 스캐닝을 발생시키지 않습니다. (프로브 요청을 보내지 않습니다.) 잠시 기다렸다가 광고가 없으면 프로브 요청을 보냅니다.

여기에서 사용하는 파라미터가 최소 채널 시간과 최대 채널 시간입니다. 스테이션은 최소 채널 시간 지연 및 최대 채널 시간을 지정해야합니다.

스테이션이 새로운 채널에 접속했을 때 처음은 프로브지연을 합니다. 즉 프로브 지연을 할 때 수동 스캐닝을 하는것이죠. 수동 스캐닝을 할 때, AP가 존재한다는 뜻은 내 주변에 하나 이상의 무선장치가 있다는 뜻입니다.

이 이야기는 현재 스테이션의 상태가 IBSS를 스캐닝하는것인지, 아니면 인프라스트럭쳐 BSS를 스캐닝하는것인지 모르기 때문에 하나 이상의 무선장치가 있어야 하는것이죠.

내 주변의 하나 이상의 무선장치가 있다면 광고/간청메시지를 보내거나 다른 메시지를 보내겠죠. 즉 적어도 하나 이상의 무선장치가 존재한다면 최소 시간만 기다리면 그 무선장치가 특정한 신호를 발생시킬것이다. 라고 인식할 수 있습니다. 이 이야기는 내 주변에 무선기기가 있다면 최소 시간동안 어떤 무선장치가 반드시 떠들것이다 라는 이야기가 되는것인데요. 만약 무선장치가 떠든다면 그때부터 광고메시지가 전송될때까지 기다리면 됩니다.

그럼 최소 채널 시간동안에만 기다리면 되는데, 최대 채널 시간은 왜 필요할까요?

최대 채널 시간은, 광고메시지나 데이터 프레임이 우선순위에 계속해서 밀릴 경우, 광고메시지를 받지 못할 만한 경우가 발행할 수 있기 때문입니다.(경쟁에서 계속 질 경우.)

자. 요약해보죠

스테이션은 AP만(인프라스트럭쳐 BSS만) 찾고있다고 가정하고, 스테이션은 새로운 채널에 접속해서 최소 채널 시간동안 기다렸습니다. 그러다가 다른 무선매체가 떠드는것은 들립니다. 하지만 광고메시지는 들어오지 않죠.(패킷이 최대 채널 시간동안 경쟁에서 계속 지기때문에) 그럴 경우 스테이션은 여기 근처에 AP가 있느냐! 라는 간청메시지를 보낼 수 있습니다.


다음 포스팅은 수동스캐닝/능동스캐닝에 대해서 좀 더 자세하게 알아보겠습니다.






NEXTERS 3주차 

HttpRequest 사용하기.

8기 개발자 권기호. 

  


서론 

Android 환경에서 서버와 통신을 해야 하는 경우가 종종 있습니다.  여러분들은 어떤 모듈을 사용하여 서버와 통신하시나요? 

제가 처음 맞이했던 API는 Apache의 HttpClient였어요! 그래서 이번 3주차 활동에서는 Apache의 HttpClient를 이용한 서버와 통신하는 원리, 사용 방법 등을 알려드리고 싶었는 데... 오랜만에 보니…  


* deprecated…. 가슴이 아프네요… 

그러므로 이번 주는 HttpClient에서 HttpRequest로 주제가 변경되었습니다.  

*** 

그래도 혹시 사용해보고 싶으신 분들이 있을 것 같아 몇몇 자료를 첨부합니다! HttpClient를 사용하기 위해선 먼저 API를 설치해야 합니다. 아래 링크로 이동하여 소스를 다운로드 합시다. (전 4.5.2버전 사용합니다.)  아! 혼자 공부하시는 분들을 위하여 API 문서 링크를 따로 첨부했습니다.  

 다운로드 링크

 http://hc.apache.org/downloads.cgi

 API문서 링크

 https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ 

 튜토리얼 링크

 %다운로드경로%\httpcomponents-client-4.5.2\tutorial\pdf

 Gradle

  android { useLibrary ‘org.apache.http.legaccy’ } 추가 dependencies { compile group: ‘org.apache.httpcomponents’ , name: ‘httpclient-android’, version: ‘4.3.5.1’ } 추가



HttpRequest 시작하기 

처음부터 코드를 보기보단 조금 이론적인 부분을 보고 가는 것이 좋겠죠?  

Hyper-Text Transfer Protocol(HTTP)은 오늘날 인터넷에서 사용되는 가장 중요한 프로토 콜입니다. (다 아는 사실이죠) HTTP에 사용하는 여러 가지 메소드가 있습니다. HTTP/1.0 스 펙에 기재되어 있는 요청 방법에는 GET, HEAD, POST 방ㅇ식이 있으며 1.1 스펙에서 추가 된 PUT, DELETE, TRACE 방식이 있습니다. (다음 링크에 HTTP/1.1 스펙이 잘 설명되어 있네 요. – mindseye.tistory.com/145 ) 

우리는 서버의 자원을 어떻게 사용하는지에 따라 GET, POST 방식를 많이 사용합니다. GET 방식은 “서버의 자원을 가져올 때 사용”합니다. 더 정확히는 한 트랜잭션이 진행되면 서 동기화 이슈를 불러 일으키지 않는 선에서만 사용됩니다. GET 방식의 사용법을 정확히 알게 되는 오늘은 서버의 자원을 가져올 때만 사용하는 것이 아니라 ‘한 트랜잭션에 대해 서 동기화 이슈에 위반되지 않을 경우’에 사용하면 됩니다. (GET 방식을 쓸 때 다양한 이 슈들이 존재합니다. 쿼리 스트링에 제한이 있기도 하죠!! 보안적인 문제도 있고~ㅋ 하지 만 웹 브라우저가 쿠키를 거부한다면…? 즉 스크릿 모드라면..? 등등? 이에 대해 고민하는 것은 여러분의 몫! ) 

POST는 1.1스펙에 멱등 방식이 아닌, 즉 정확한 트래잭션을 가지고 있는 방식입니다. 그래서 GET방식과 다르게 POST는 동기화 이슈에서 안전합니다(Thread safe). 그렇기 때문 에 서버에 데이터를 insert, update, delete의 요청을 할 때에 POST 방식을 이용합니다.  

 이와 같이 HttpRequest는 이 요청 방식들과 관련된 get, post, head, put 등 모든 메소드 들을 정적(static)으로 제공합니다! HttpRequest를 new 하지 않고도 사용할 수 있는 것이 죠~! 멋있어… 더 자세한 내용은 다음 페이지에서 설명하겠습니다. 

HttpRequest는 모두들 “단 하나만의 클래스이며, 무척 가볍다”라고 이야기를 합니다. 저 는 “무척 가볍다”라는 말에는 동의하지만 단 하나의 클래스라는 말에는 동의하지 않습니 다. 외부에서 보기엔 단 하나의 클래스인건 맞지만 단 하나의 클래스 속에 여러 개의 정 적 네스티드 클래스(nested class)와 인터페이스(interface)가 정의되어 있기 때문이죠. 

참고로 소스를 확인해보시면 아시겠지만, HttpRequest는 java.net 패키지의 HttpURLConnection을 기반으로 하여 작동합니다. 이를 개발한 팀 역시 HttpURLConnection을 사용하는 Android 개발자들을 위하여 혹은 가벼운 성능의 HTTP 요청을 전송하는 개발자들을 위해 개발했습니다.  

 

HttpRequest를 이용한 코드 작성 

HttpRequest는 여러 개의 네스티드 클래스와 인터페이스를 가지고 있습니다. 여러 개의 네스티드 클래스 중 제가 관심 있게 보고 있는 인터페이스가 있습니다. 바로 ConnectionFactory라는 인터페이스인데요~!! 이 인터페이스는 HttpRequest가 내부적으로 빌더(Builder) 디자인 패턴을 적용시키기 위하여 설계되어 있습니다. 또한 내부적으로 URL 클래스의 openConnection메소드를 호출하는 등 여러 모로 관심 덩어리입니다. 

ConnectionFactory interface는 2개의 추상 메소드를 가지고 있고, 자기 자신을 구현한 멤버필드를 가지고 있습니다. (인터페이스에 싱글톤을 적용시켰네요!) HttpRequest 서버로 요청을 보낼 때 마다 새로운 HttpURLConnection을 생성합니다~!  이런 특별한 구조로 HttpRequest는 HTTP의 다양한 요청 방식을 구현해냅니다. HttpRequest를 파헤쳐 보는 것은 또한 여러분의 몫입니다. 다음 링크에서 소스를 확인해 보세요!(링크) 

이제 그 요청 방식들 중 HttpRequest를 이용하여 어떻게 GET 방식의 요청을 하는지 알 아봅시다.  

GET  

다음과 같이 URL을 설정해준 뒤, HttpRequest에 사용할 요청방식 GET을 나타내는 get 메소드를 호출합니다. HttpRequest에 포함되어 있는 HTTP 요청 방식 메소드들은 모두 static 메소드이므로, 따로 HttpRequest 인스턴스를 생성할 필요가 없습니다.   


get 메소드 내부에선 HttpRequest 객체를 생성해서 리턴해줍니다.   


HttpRequest 생성자에는 인자가 두 개 있습니다. 첫 번째 인자는 요청을 보낼 URL, 두 번째 인자는 요청에 사용할 메소드입니다. (여기에서 java.net 패키지의 URL클래스를 사용합니다.)   

HttpRequest 객체 생성이 완료되었습니다. 이렇게 생성된 HttpRequest 객체는 서버로 요청을 보낼 모든 준비가 완료된 ‘준비된 객체’입니다.   

이제 이 준비된 객체를 서버로 요청을 보내기 위해선 응답(response)을 받을 수 있는 메 소드를 호출하면 됩니다.  

위 그림에선 code()메소드를 호출했습니다. code()내부에선 getConnection()메소드를 호출 합니다.  


getConnection()메소드는 createConnection()메소드를 호출하네요? 이 메소드는 무엇인지 따라가보면~!  


내부적으로 HttpURLConnection 객체를 생성하는 것을 볼 수 있습니다.  


CONNECTION_FACTORY는 ConnectionFactory객체입니다. 

이와 같이 응답의 정보에 따라 다양한 메소드를 이용할 수 있습니다. 서버가 보내주는 응답의 Header 정보를 확인하면 됩니다. Response Code를 확인해보는 code() 메소드, 응 답 메시지를 확인하는 body() 메소드, 통신이 성공했는지 확인하는 ok() 메소드가 있습니 다~!! 이렇게 서버의 응답을 확인하는 첫 메소드를 호출하는 순간 서버와 통신이 시작됩 니다. (두 번째부터 호출되는 메소드는 서버와 재 통신하지 않습니다.)  이제 위의 GET 방식과 더불어 POST 방식으로 요청을 전송하는 코드를 확인하겠습니다. 

  


최종코드   


주의 사항 

· 해당하는 메소드들을 첫 번째로 호출할 당시 호출한 위치가 Android의 UI Thread or runOnUiThread()일 경우 NetworkOnMainThreadException이 발생합니다. 

10  

· code(), ok()와 같은 메소드들은 첫 요청 이후 여러 번 재 호출해도 되지만 body() 메 소드는 한 번 호출 이후 재호출을 할 경우 IOException이 발생합니다. 

· 재 호출이 아니더라도 body() 메소드를 UIThread에서 호출할 경우 IOException이 발생합니다. 

HttpRequest 객체를 이용해서 UIComponent에 직접 데이터를 갱신해 주면 좋지만 모 든 작업은 Worker Thread에서 처리 후, 최종 결과만 UIThread에 전달하시길 권고합니다. 

마치며… POST 방식은 다음 장의 세션 유지하기에서 form data 전송과 함께 다시 한 번 더 보겠습니다. 

HttpRequest의 UML  


아! Multipart 종류들의 메소드들은 HttpRequest.part() 메소드를 사용하시면 됩니다! 

 Maven Central 

</dependency>

     <groupId>com.github.kevinsawicki</groupId>

      <artifactId>http-request</artifactId>

      <version>6.0</version>

</dependency>

 Not Maven environment

 https://raw.githubusercontent.com/kevinsawicki/http-request/master/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java

 HttpRequest API

 HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html

사용된 코드 & 도움된 사이트

HttpRequest - https://github.com/kevinsawicki/http-request

HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html

HttpRequestProject(Android) – https://github.com/KwonGiho/HttpRequestProject

HttpRequestServer(J2EE) - https://github.com/KwonGiho/HttpRequestServer

HTTP1.1스펙 한글판 - mindseye.tistory.com/145

HTTP1.1 스펙 - https://tools.ietf.org/html/rfc2616#section-2.2

 

 

 

 

 

NEXTERS 9기 활동 1주차.

Git 사용법.

활동 1주차.

8기 개발자 권기호.


 

Git의 기초.

회사나 특정 돈이 걸려있는 프로젝트에서의 필요한 개발자의 역량은 이론보단 당장 사용 가능한 프로그래밍 언어 그리고 학습스피드 등등 있겠지만 NEXTERS는 그런 관계로 묶여 있는 것이 아니니까 이론도 함께 보고 가겠습니다.

Git의 핵심은 생각보다 별게 없습니다. Git Subversion이나 Perforce와 같은 VCS를 사용하시던 분들이 아니면 쉽게 익힐 것 이라 생각합니다. 다른 VCS는 인터넷이 가능한 환경에서만 커밋을 할 수 있지만, Git은 인터넷이 연결되어 있지 않은 지하 혹은 비행기 안에서도 커밋이 가능합니다. 이건 오로지 Git형님만 구사할 수 있는 능력이죠.

Git은 모든 데이터를 저장하기 전의 체크섬(해시)를 구하고 그 체크섬으로 데이터를 관리합니다. 체크섬(해시)가 없이 어떠한 파일이나 디렉토리도 변경할 수 없습니다. 체크섬은 Git에서 사용하는 가장 기본인(Atomic)데이터 단위이자 Git의 기본 철학입니다.

GitSHA-1해시를 사용하여 체크섬을 만듭니다. 처음 들어본 것 같지 않은 것 처럼 익숙한 SHA-1. Google에서 API키를 발급받기 위하여 SHA-1키를 콘솔에서 확인한 경험이 있는 개발자들은 익숙하겠죠~.

Git의 상태.

1.     Committed(git directory)

è  Committed란 데이터가 로컬 데이터베이스에 안전하게 저장되었다는 것을 의미합니다.

2.     Modified(checkout 하고 파일들을 수정했지만 staging area에 추가하지 않은 상태)

è  Modified란 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말합니다.

3.     Staged(파일을 수정하고 Staging area에 추가(add)한 상태. )

è Staged란 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미합니다.


git directorygit이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말합니다. git의 핵심이라고 할 수 있죠. 이건 다른 컴퓨터에 있는 저장소를 clone할 때 git 디렉토리가 만들어집니다.

working directory는 프로젝트의 특정 버전을 checkout한 것입니다. git디렉토리는 지금 작업하는 디스크에 있고 그 디렉토리에 압축된 데이터베이스를 파일을 가져와서 워킹 디렉토리를 만듭니다.

staging areagit디렉토리에 있습니다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장합니다. 종종 인덱스라 부르기도 하지만 Staging Area라는 명칭이 표준이 되고 있습니다

방금 말한 것 처럼 Git이 하는 일을 간단하게 말하자면 이렇습니다.

1.     working directory에서 파일을 수정한다

2.     staging area에 파일을 stage해서 커밋할 스냅샷을 만든다.

3.     staging area에 있는 파일들을 커밋해서 git디렉토리에 영구적인 스냅샷으로 저장한다

Git 설치

백날 공부해봤자 사용하지 못하면 소용이 없죠. 그렇기 때문에 지금부턴 설치 한 뒤 진행하도록 하겠습니다.

리눅스에 설치하기

개발자로써의 개인 철학은 터미널 환경이 제공되는 프로그램이라면, UI는 되도록 사용하지 말자라는 것이 개인 철학입니다. 그 이유는 , 어떤 이슈가 발생하고 그 이슈에 접근하기 위해선 가장 기본이 되는 것 들을 정확하게 알고 있어야 한다고 생각하기 때문입니다.

1.     Fedora

è yum install git-core

2.     Ubuntu – 데비안류 배포판은 apt-get을 사용하면 됩니다.

è apt-get install git

3.     Mac

è http://sourceforge.net/projects/git-osx-installer/

è sudo port install git-core +svn +doc +bash_completion +gitweb

4.     Window

è http://msysgit.github.com/

Git 초기 설정

, 게임과 같은 특정 서비스를 이용하기 위해선 사용자의 초기 정보가 필요하고, 초기 정보를 이용하여 회원가입을 진행합니다. Git도 이와 같은 초기 회원가입(config설정)을 해줘야 하죠. 초기 설정은 이름과 같이 한번만 해주면 되고 사용하면서 바꿀 수 있는 명령어가 존재합니다.

1.    사용자 정보.

è Git을 설치하고 나서 가장 먼저 해야하는 일은 사용자의 이름과 이메일 주소를 설정하는 것입니다. Git은 커밋할 때마다 이 정보를 사용하죠. 한번 커밋한 후에는 정보를 변경할 수 없습니다.

git config --global user.name “kwongiho”

git config --global user.email “shng10503@naver.com

--global로 설정해준 정보는 모든 프로젝트가 커밋할 때 사용하게 됩니다. ( 말 그대로 전역변수에요~ ) 만약 프로젝트마다 다른 이름과 다른 이메일 주소를 사용하고 싶으면  --global속성을 빼고 실행시키면 됩니다.

2. 편집기 설정

Git의 기본 편집기는 Vi,Vim입니다. 하지만 gEdit , Nano , gVim , emacs 등등 다른 편집기를 사용하고 싶은 분들도 계시겠죠. 그럴땐 다음 명령어와 같이 입력하시면 됩니다.

git config --global core.editor [편집기이름]

2.    설정확인

이렇게 설정한 모든 정보들을 아래의 명령어로 확인할 수 있습니다.

git cnofig --list

 

 


 

 

 

 

 


 

본격적인 Git 시작하기.

Git의 명령어에 익숙해 지는 것이 가장 중요하겠죠.

Git에서 사용 가능한 명령어와 설명을 볼 수 있는 명령어가 있습니다.

git help config

Git 저장소 만들기.

Git 저장소를 처음 만드시는 분은 다음과 같은 상황일 것입니다.

상황 1. 기존의 NEXTERS가 아닌, 다른 그룹에서 진행하던 프로젝트가 있다. 그런데 이번에 Git에 대해서 공부했고, 로컬에 있는 소스코드들을 Git으로 옮기기를 원한다.

상황 2. 형상 관리가 필요할 만큼 일정 수준의 사람들과 협업을 해본적이 없다. 하지만 이제부터라도 형상 관리툴을 이용하여 프로젝트를 진행해 보고 싶다.

! 이런 모든분들! 다같이 저장소를 만들어 봅시다.

1.     git init

2.     git touch readMe.txt

3.     vi readMe.txt

A.     vi readMe.txt - vi에디터로 readMe.txt파일을 열어라 라는 뜻입니다. 만약에 readMe.txt파일이 없으면 새로 생성하고 파일을 엽니다.

B.     i(insert)를 입력하고 프로젝트에 대한 설명을 간단하게 작성합니다.

C.     Esc-> : -> wq키를 입력하여 vi 에디터에서 탈출합니다.

4.     git add --all

5.     git commit –m “initial project version. first commit”

이와 같이 매우 짧은 명령어들을 통하여 Git 저장소를 만들 수 있습니다.

è 다음 명령어들은 상황2에 맞춘 명령어 입니다. 상황 1의 경우라면, readMe.txt파일이 아니라 어느정도 코딩을 한 후에 커밋을 하셔도 됩니다. ( 하지만 이 상황은 초기 설정이므로 readMe.txt파일을 만드시는 것을 권장합니다.)

원격 저장소에 프로젝트를 연결하기.

깃을 사용하게 되면 또 다시 두 가지의 상황을 맞이하게 됩니다.

상황 1. 다른 프로젝트에 참여(Contribute)하거나 다른 컴퓨터에서 push한 내용을 다른 컴퓨터에서 이어서 하고싶다. à git clone [URL]

상황 2. 깃을 완전 처음 사용해봐서, 환경설정 및 저장소는 만들었지만 원격 저장소엔 연결을 하지 못했다. -> git remote add origin [URL]

è Git은 여러 프로토콜은 제공합니다. 지금까진 git://프로토콜을 사용했지만, http(s)://을 사용할 수 있고 user@server:/path.git처럼 SSH의 프로토콜을 사용할 수 있습니다.(각 프로토콜의 장단점은 가장 마지막인 번외에 작성하도록 하겠습니다.)

수정하고 저장소에 저장하기

Git 저장소를 만들고 초기설정을 진행했습니다. 원격 저장소에 로컬 저장소를 연결도 했습니다. 이제는 파일을 수정하고 파일을 커밋해 보도록 하겠습니다.

워킹 디렉토리의 모든 파일은 크게 TrackedUntracked로 나뉩니다 (단어의 말 그대로 관리하는 대상과 관리하지 않는 대상이란 뜻이죠~). Tracked(관리 대상)Staged(커밋 직전의 상태) Modified(수정 되고 있는중)상태 중 하나입니다. 그리고 나머지 파일들은 Untracked파일입니다. Untracked파일들은 워킹 디렉토리에 있는 모든 파일이 포함되어 있는 것은 아니고, Staging Area에 있는 것도 아닙니다. 처음 저장소를 Clone하면 모든 파일들은 Tracked이면서 Unmodified상태가 됩니다.(파일을 checkout하고 아무것도 수정하지 않았기 때문이죠.)

마지막 커밋 이후 어떤 파일이 수정이 이루어지면, Git은 그 즉시 파일을 Modified상태로 인식합니다. 그리고 수정한 파일을 Stage하고, Staged상태인 파일을 커밋합니다. 이 라이프 사이클은 다음 그림처럼 반복합니다.


 

파일의 상태를 확인하려면 보통 git status 명령을 사용합니다.  보통 clone을 한 직후의 프로젝트의 상태는 Tracked이나 Modified상태의 파일이 하나도 없다는 의미 입니다. Untracked파일은 아직 존재하지 않아 목록에 보여지지 않습니다. 그리고 현재 작업중인 브랜치를 보여주며, 기본 브랜치가 master이기 때문에 master로 나옵니다.


 

 

 

 

 

 

프로젝트에 readMe.txt파일을 새로 만들어보겠습니다. readMe.txt파일은 새로 만들어진 파일이기 때문에 git status를 실행하면 Untracked files에 포함되어 있습니다. ( deleted는 기존 리모트 서버에 readMe.txt파일이 존재했고, 이 파일을 삭제한 다음 진행했기 때문에 저희에게 보여집니다. )


이렇게 만들어진 readme 파일은 untracked라는 것은, 파일이 Tracked상태가 되기 전까지는 Git은 절 때 그 파일을 커밋하지 않는다. ( git이 바이너리까지 커밋하는 행위를 막아주는 것이죠~)

그럼 README파일을 추가해서 Tracked상태로 만들어 봅시다.

git add reame 명령어로 readme 파일만 Tracked 상태로 변환합니다. ( add 명령어로 Staged 상태로 변하는 것을 확인할 수 있습니다.) 


그렇다면 기존에 Tracked 상태인 파일을 수정하는 방법을 보겠습니다.

readme파일을 수정하고 나서 git status명령을 수행하면 다음 결과처럼 나옵니다.


이렇게 수정 된 파일들을 commit하면 체크섬[master 534a8d3]이 저장되고, staged 상태로 전환된다.



 

Git 커밋 수정하기.

종종 너무 일찍 커밋 하거나 커밋 메시지를 잘못 적었을 때 커밋을 수정하고 싶은 경우가 종종 있습니다. 이럴 때 다시 커밋하기 위해서 --amend옵션을 사용합니다.

git commit --amend

파일 상태를 Unstage로 변경하기.

두 개 이상의 파일을 수정하고 따로따로 커밋하려고 했지만, 실수로 git add --all / git add * 이라는 명령어를 실행시켜 버렸다. 두 파일은 모두 Staging Area(modified)에 들어가 있습니다.

그럴 경우 reset 명령어로 Unstage상태로 변경할 수 있습니다.

git reset HEAD [file name]


다음 그림에선 git add * 이 아닌 특정 파일만 해줬지만 add *이라 생각하시고 테스트 해보셔도 됩니다.

reset 명령어는 rollback과 같은 개념이라 생각하시면 됩니다. 특정 파일만을 reset할 수도 있고, 전체적으로 commit한 내용들을 몇 단계든지 reset할 수 있습니다.

git reset HEAD~[단계수]

Modified 파일 되돌리기

에고.. 큰일 났습니다. Clone하고 나서 수정하지 말아야 할 파일을 수정했거든요. Clone 받아놓으라고 한 사수는 1분뒤에 들어옵니다. 어떻게 해야할까요?

git checkout -- [파일명]


수정 되어있던 파일이 수정 되기 전으로 되돌와 있네요?


 

리모트 저장소

리모트 저장소에 대하여 정확히 알아야지 다른 사람들과 일할 수 있습니다. 리모트 저장소는 인터넷이나 네트워크가 어딘가에 존재하는 저장소를 말합니다. 저장소가 여러 개 있을 수 있는데, 어떤 저장소는 읽기 쓰기 모두 가능하고 어떤 저장소는 읽기 권한만 있을 수 있습니다.

간단히 말하면 협업 한다는 것은 리모트 저장소를 관리하면서 데이터를 리모트에 Push 하고 Pull 하는 것 입니다.

개발자는 리모트 저장소를 어떻게 추가,삭제 하는 방법을 알 뿐만 아니라 브랜치를 관리하고 어떻게 트래킹할지 매우 중요합니다.

리모트 저장소 확인하기

git remote 명령어로 프로젝트에 등록된 모든 리모트 저장소를 확인할 수 있습니다. 이 명령은 리모트 저장소의 이름을 보여줍니다. 앞에서 봤던 것 처럼 Clone명령어를 사용하면 자동적으로 remote와 연결이 되기 때문에 초기에 origin이라는 이름을 볼 수 있습니다.

원격 리모트도 한 개 이상을 등록 할 수 있습니다.

리모트 저장소 추가

git remote add [별칭] [url]

이렇게 remote를 추가해 주면, 한 프로젝트가 두 개 이상의 remote를 가지게 되는데, 그럼 fetch를 받을 땐 앞에서 설정한 별칭으로 받아오면 된다

이렇게 추가한 remote의 별칭은 다음의 명령어로 변경이 가능하다.

git remote rename [원래이름] [바꿀이름]

리모트 저장소를 Pull하거나 Fetch하기..

만약 git remote add otherRemote http://github.com/Kwongiho/otherremmote 이렇게  등록했다면 다음과 같이 실행시키면 된다.

git fetch otherRemote .

이 명령은 http://github.com/Kwongiho/otherremote에 있는 저장소를 로컬 저장소로 가져오는 역할을 한다.

git pull 명령어로 리모트 저장소의 데이터를 로컬 저장소로 가져오면 자동적으로 merge까지 해준다.

리모트에 Push 하기

어느 기능을 완성하면 야 푸쉬좀 해줘!! “ 라는 이야기를 많이 하게 될겁니다.

git push [리모트 저장소 이름] [브랜치 이름] 으로 쉽게 할 수 있습니다.

master 브랜치를 origin 서버에 푸쉬 하려면 다음과 같이 push 합니다.

git push origin master.


 

Git 브랜치

Git의 브랜치 직접 브랜치를 만들어보고, Merge하면서 학습하시길 권장합니다.

브랜치 부분부턴 잘 정리되어 있는 사이트가 있어 첨부합니다.

유형

링크

이론

https://git-scm.com/book/ko/v1/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%3F

 

테스트

learnbranch.urigit.com

전반적으로 이 문서는 유형-이론을 바탕으로 쓰여졌습니다.

브랜치 부분을 꼭 두 번 이상 읽어보시길 권장합니다.

브랜치 부분을 다 읽어보신 후에 유형-테스트 부분을 두번이상 클리어 해보시길 권장합니다.



참고 사이트 - https://git-scm.com/book/ko/v1/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%3F // learnbranch.urigit.com

안녕하세요~ 넥스터즈에서 CTO를 맡으면서, 정작 운영하고 있는 블로그에는 홍보를 한번도 못했네요 ㅋㅋ



뒤늦게나마 여러분들에게 알려드리고자 홍보글을 작성합니다.


마감 12시간 전입니다.


[ NEXTERS : 9기 서류 마감 12시간 전 ]

 

“개발자 · 디자이너를 위한 최고의 연합 IT 개발동아리 NEXTERS!”

 

NEXTERS 9기 모집 서류 마감이 이제 딱 12시간 정도 남았습니다!


정말 얼마 남지 않은 시간, 여러분들의 지원 부탁드립니다~!! 그런 의미에서 다시 한번 공지 드립니다. 

 

애플리케이션, 웹서비스, 모바일 게임 등 플랫폼과 장르의 구분 없이, IT에 관심이 있는 열정과 재능이 넘치는 9기 멤버들을 기다리고 있습니다

 

NEXTERS는 전문가를 위한 네트워크를 지향하는 연합 IT동아리로써, 학생 ‧ 직장인 구분 없이 다양한 사람들이 모여서 협업을 통해 서비스를 개발 및 출시하며 친목을 다지는 곳입니다. 2012년부터 30여개의 수도권 대학과 스타트업 ‧ 대기업 소속 멤버들이 활동하고 있습니다.

 

‧ 지원 자격

- 애플리케이션 ‧ 웹서비스 ‧ 모바일 게임 프로젝트 진행 경험이 있고 열정이 넘치시는 분

-  실무자/대학생 구분 없이 함께 창작하는 즐거운 경험을 원하시는 분

- 디자이너 ‧ 개발자간의 폭 넓고 깊이있는 네트워킹을 원하시는 분

   

‧ 모집 일정

- 5. 15(일) ~ 6. 17(금) : 서류 접수

- 6. 21(화) : 서류 합격자 발표

- 6. 25(토) ~ 26(일) : 면접

- 6. 28(화) : 최종 합격자 발표, OT 및 추후 일정 안내

  

‧ 지원 방법

- NEXTERS 리쿠르팅 페이지 : www.teamnexters.com 

- 홈페이지에 접속하여 직군에 맞는 지원서를 작성해 주세요.

 

* 지원시 유의사항

- 디자이너로 지원하시는 경우, 포트폴리오를 제출 해 주셔야 합니다.

- 개발자로 지원하시는 경우, 프로젝트 및 스터디 등의 개발 경험을 양식에 맞추어 작성 해 주셔야 합니다.

- 포트폴리오, 개발 경력기술서 등의 제출 자료는 모집 기간에만 사용되며, 외부로 유출되지 않습니다.

※ 넥스터즈의 정규활동은 방학동안 진행되며, 2회의 정규활동을 이수하셔야 수료로 인정이됩니다.

 

‧ 기타 문의 방법

- 페이스북 메시지를 남겨주시면 빠르게 답변드리겠습니다.

- 메일로 문의하기 | teamnexters@gmail.com

- 홈페이지 참고하기 | www.teamnexters.com



요즘 넥스터즈 형님들과 타이젠/안드로이드/아두이노 개발을 하고 있다....

아.......타이젠..............


진짜 암덩어리다 ㅋㅋㅋㅋㅋㅋㅋㅋ


개발 자료가 나와 있는게 너무 없어서 찾아보기도 힘들고 예제코드도 찾아보기가 너무 힘들었다.


내가 부딪힌 문제는 "액티비티 이동"인데


자료가 없다................


아마 갤럭시 기어 처음 만드는 사람들은 다 이 글을 읽으면서 나랑 똑같은 생각을 하고 있겠지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


내가 처음 접근한 방법은 

javascript의 window.location을 이용한 접근이였다.


하지만 window.location은 진짜로 인터넷으로 연결이 되어버리고, 404에러가 떠버린다 ㅋㅋㅋㅋㅋㅋ


window.location.replace()도 마찬가지.


그래서 차선으로 선택한 방법이 모든 HTML의 visible을 hide로 설정 해놓고, 버튼이 눌리는 화면만 visible하게 변경해주는 방법을 선택했는데~


점점 코드가 스파게티가 되어간다.


가독성도 매우 떨어지고, 넥스터즈 행님들에게 이걸 보여주면... 속으로 욕하겠지 생각이 들었다


그래서 액티비티 이동에 대해서 겁나 찾았지



생각보다 겁나 쉬웠다.


바로 <a>태그를 이용하는건데, 나는 애시당초 View코드와 Controller 코드를 나눠야 한다고 생각했기 때문에 아예 생각도 하지 못했던 것이다.


음..뭐


<a href="otherPage.html" data-role="button">다른 페이지로 이동</a>


이런식으로 설정하면 된다.


data-role에 button을 부여해주면 버튼과 동일한 UI로 표현된다.


근데 <a>태그에 속성으로 저렇게 정해주는걸 알아도 나는 안쓸꺼야..


<a>태그를 알아내고 나서도 겁나 찾아 헤매고 비로서 포스팅 하기 10분전에 해답을 찾았지.


자바 스크립트 내에서 페이지 이동을 지원하는 TAU라이브러리를 지원한다.


사용 방법은



tau.changePage("경로") 혹은, 파일이나 특정 엘리먼트를 지정해 주고 싶을땐 tau.changePage(엘리먼트) 이렇게 지정해 주면 된다.


타이젠에서 html을 나누지 않고, html 페이지 하나에서 화면을 두개를 보고 싶을땐 <div data-role="page"> 이렇게 했던걸 이제 변경해주면 될듯?



화면 이동시에도 여러가지 애니메이션을 설정할 수 있다


1. slide - 화면을 위 아래로 이동하면서

2. flip - 화면을 회전 하듯이

3. pop - 새로운창 확대하듯이 ( 제일 안쓸거 같음ㅋ)

4. fade - 화면이 사라지듯이

5. slidedown - 화면을 아래로( ppt의 화면전환처럼)

6. slideup - 화면을 위로 (이것도 ppt의 화면 전환처럼)


이건 tau에 적용시켜주면 된다.


tau.changePage("경로", { transition:"slide"});   이런식으로 ㅎㅎ


모두 잘 가져다 썻으면 좋겠다.


그래도 삽질은 나쁜것이 아니니까, 모두 삽질 엄청 해보다가 이 글 발견했으면 좋겠다..

+ Recent posts