알고리즘 문제 중에 외판원 길찾기 문제를 풀려고하다가 비트마스크란 개념이 나오는데 그 개념을 몰라서 헷갈리는 와중에 차라리 비트마스크를 공부해보자 싶었다. 왜 길을 찾는데 비트마스크란 개념을 쓰냐면, 어떤 곳에 방문했는지 탐색할때마다 배열을 만드는건 비효율 적이니까 int값만 넘기는데 자릿수마다 어떤 마을에 방문했는지 정도로 쓸 수 있는것 이다. 대신 넘기는 자료형의 자릿수보다 크게는 안된다.
Retrofit 은 안드로이드와 자바에서 HTTP client 에서 REST API통신을 하기 위한 라이브러리이다. 공식 홈페이지. 이번에는 간단한 node server와 android client 의 HTTP 통신을 하는 간단한 예제를 소개하려고 한다. 소스코드는 link를 첨부한다. server repository에는 node server가 들어있고, client repository에는 android client가 들어있다.
이 글에서는 Server 보다는 Retrofit 에 집중 하므로 서버에 관한 내용은 간단하게만 소개한다.
Server
Server는 nodejs로 작성 할 필요는 없다. 단지 HTTP 통신을 확인하기 위한 소스이다.
POST 명령으로 user/one을 실행하면 name을 인자로 줘서 User class에 맞는 json을 받는다. 주는 형식은 {“name”: name} 으로 전달된다
POST 명령으로 user/list를 실행하면 인자 없이 Users class에 맞는 json을 받는다.
@FormUrlEncoded는 json 인자를 서버에 보내줘야할 때 써준다.
1
2
3
4
5
6
7
8
9
10
11
public interface RetrofitAPI {
@POST("user/one")
@FormUrlEncoded
Call<User> getUser(
@Field("name") String name
);
@POST("user/list")
Call<Users> getUserList();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return ("name : " + name + " age : " + age);
}
}
1
2
3
public class Users {
public List<User> users;
}
정의해둔 HTTP API 통신을 하기 위해서 Retrofit 의 Builder로 서버와 통신한다. 이를 편하게 하기 위해서 RetrofitHelper를 제작한다. 아래 url과 port는 내 로컬 pc의 ip와 node서버를 열어둔 포트이다. getInstance() Method를 통해 어디서나 통신을 할 수 있도록 만들고 retrofit.create에서 위에서 만든 API를 넣어주면 서버와 통신한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class RetrofitHelper {
// server address, port
private final static String url = "http://192.168.0.22";
response.body()는 내부에 json파일이 들어있는지 확인한다 response.body() != null
만약 Model Class 여기서는 User 에 getter를 만들어 두었으면 json형식의 파일을 맞춰서 받으면 자동으로 파싱되서 들어간다. 잘 모르겠으면 소스를 위에 링크한 소스를 참고하면 편할 것이다.
updateUserList에서는 updateUser와 다르게 json이 배열 형식으로 오는데 받는 json 형식이 현재 {users: [{“name”:”name1”,”age”:”age1”},{“name”:”name2”,”age”:”age2”}]} 배열에 담겨서 온다. 이럴 때는 response.body().users로 해주면 json의 users에 담긴 배열을 받아와서 List에 넣을 수 있다.
MVP Pattern 이란 MVC 아키텍처 패턴에서 파생된 것으로 User Interface를 작성하는데 사용된다. MVP는 (Model-View-Presenter)의 약자이다. 기존에 작성했던 소스를 예시로 MVP Pattern의 예시를 들어보려고 한다. 소스코드는 링크를 첨부한다. source
MVP Pattern flow
위의 그림을 토대로 설명을 해보겠다.
View
MVP Pattern에서 View란 activity 혹은 Fragment 에서 사용자가 보고있는 화면을 의미한다. View를 보는 사용자는 굳이 내부에서 실행 될 로직이나, 변수에는 전혀 의존성 없이 할 행동만 있으면 된다.
Presenter
Presenter 란 View와 Model 사이를 연결해주는 곳이다. View에서 User의 Action이 들어오면 데이터에 의존성이 있다면 데이터를 수정하고 없다면 데이터를 수정 하지 않는다. User Action 에 맞는 Method를 실행하고 View에 모든 명령을 다 처리 한 후 사용자에게 보여질 View를 udpate 해준다.
Model
Model 이란 사용자 저장되어 있는 정보가 필요 할 때 사용한다. 예를 들면 사람 정보를 저장한다고 하면, 사람에 관한 데이터를 DB로 저장하던지 Local 변수로 저장 할 것이다.
Simple source
이 소스는 View에서 사용자의 입력을 받아 Model(user) 에 이름을 저장하는 간단한 예제이다.
Presenter
Presenter 부터 살펴보자. Presenter 는 Model과 View 모두 연결 되있다. Presenter에 View라는 interface를 만들어두고 View에서 Presenter.View를 implements 하는 것으로 View에서 rendering 될 View에대한 Method를 override할 의무를 준다. updateName 은 View에서 사용자가 요청할 Method이고 요청이 들어오면 Model에 데이터를 저장하고 View에 update를 요청한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainPresenter {
private User user;
private View view;
public MainPresenter(View view) {
this.view = view;
user = new User();
}
public void updateName(String name) {
user.setName(name);
view.updateUserInfoTextView(user.toString());
}
public interface View {
void updateUserInfoTextView(String info);
}
}
Model
Model 에서는 사용자가 필요한 정보를 저장할 class가 필요하다
1
2
3
4
5
6
7
8
9
10
11
12
13
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Name : " + name;
}
}
View
View 에서는 Presenter의 View를 implements받아 View에서 사용해야 하는 Method를 override 한다. onCreate시 presenter를 등록 해 주고, 사용자의 행동은 Presenter로 보내준다. 여기에서는 text가 변경 될 때 Presenter에 사용자의 행동을 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MainActivity extends AppCompatActivity implements MainPresenter.View{
Data Binding과 ButterKnife, 안드로이드를 처음 접하는 사람에겐 생소한 이름일 것이다. Data Binding과 ButterKnife 안드로이드에서 데이터 바인딩를 도와주는 library이다. 안드로이드에서 데이터 바인딩이란 무엇일까? 바로 UI와 데이터간을 서로 연결하는 프로세스이다. 그렇다면 왜 이러한 라이브러리를 사용하는 것일까? 아래 라이브러리를 사용하지 않았을 때와 그렇지 않을 때의 차이점을 간단하게 살펴보자.
데이터 바인딩을 사용하지 않았을 경우
라이브러리를 사용하지 않았을 때의 코드를 살펴보자. 아래 예시는 안드로이드에 처음 접할 때 만들었던 소스 중 일부를 첨부한다. source
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2. example
아래 소스를 보면 ButterKnife.bind(this);라는 부분에서 지금 사용하는 Activity의 layout(xml)에 해당하는 부분을 바인딩하고 @BindView에서 id를 연결해 주는 모습이다. 이는 class 내부에서 사용할 때 변수 선언을 해주고 안드로이드의 생명 주기상 onCreate할 때 데이터를 바인딩 해줘야하는 두줄의 소스를 한줄로 줄이는 것으로 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
class ExampleActivity extends Activity {
@BindView(R.id.title) TextView title;
@BindView(R.id.subtitle) TextView subtitle;
@BindView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
Data Binding은 AndroidSDK에서 지원하기 때문에 공식 API문서를 참고한다 Data Binding
1. gradle setting
app의 build.gradle에 다음 소스를 추가한다.
1
2
3
4
5
6
7
// app\build.gradle 중 일부
android {
....
dataBinding {
enabled = true
}
}
2. example
아래 xml파일에서 기존 xml과 다른 부분을 찾자면 tag와 tag와 android:text=”@{user.firstName}” 이 될 것이다. Data Binding을 사용하기 위해서는 LinearLayout과 같은 사용자의 View를 으로 감싸고 그 뒤에 data요소와 view요소를 추가한다. 레이아웃 내에서 @{}를 통해서 속성을 불러올 수 있다.
Hexo란 간편하게 만들 수 있는 블로그 프레임 워크다. 더 많은 정보는 공식 홈페이지 Hexo 에서 볼 수 있다. Hexo로 블로그를 만드는 방법을 소개 하려 글을 쓴다. Hexo를 사용해서 깃에 블로그를 만들기 위해서는 github 계정이 있어야 하고, node가 깔려한다. 링크를 타고 가서 nodejs를 다운받을 수 있다.
github Repository 만들기
GitHub 에서는 GitHub Repository에서 웹을 호스팅 할수 있는 기능을 제공 한다. 더 많은 정보는 공식 홈페이지 GitHub Pages 에서 볼 수 있다. 우선 Repository를 만들어야 한다. 이미 주소가 있기 때문에 빨간 경고창이 나오지만 처음이라면 경고창이 나오지 않을테니 [username].github.io 로 Repository로 만들면 된다. Public, Private는 블로그에는 영향을 주지 않는다. 이제 Create repository를 눌러서 Repository를 생성한다.
Hexo 설치
Hexo를 설치하기 위해 윈도우에서는 Git 에서 다운받을 수 있는 GitBash를 사용할 것이다. 링크 한 홈페이지에 들어가서 Download를 하고 끝가지 설치 하면 GitBash가 깔릴 것이다. 아래는 gitbash 화면이다.
이제 hexo를 다음 명령어를 입력해서 설치한다. git bash에서 가만히 멈춰 있는 것 처럼 보여도 다운받는 과정이다.
1
$ npm install -g hexo-cli
아래는 설치가 완료된 모습이다.
이제 다운받은 hexo를 이용해서 블로그의 내용이 담길 폴더를 생성하고 초기화 해준다.
1
$ hexo init (your_blog_name)
아래는 초기화가 완료된 모습이다.
hexo init 까지 마치면 명령을 실행한 폴더 안에 (your_blog_name) 이라는 폴더가 생긴다. 이 폴더에 들어가서 로컬에서 hexo가 어떻게 보여지는지 확인 할 수 있다. hexo server를 실행 후 localhost:4000 으로 들어가서 확인해보자.
1
2
$ cd your_blog_name
$ hexo server
Deploy 설정하기
Deployt란 배포를 뜻하고 방금 로컬에서 테스트한 서버를 github 블로그에 들어갔을 때 보여지게 하는 과정이다. Hexo에서는 Deploy기능을 제공해 주는데 우리는 위에서 만든 github Repository 주소를 지정해주면 Deploy시 자동으로 commit 과 push가 되면서 블로그가 갱신된다. 그래서 개인 설정을 해야하는데 개인 설정은 (your_blog_name)의 _config.yml 을 수정하면 된다.
1
$ vi _config.yml
우리가 수정할 부분은 #Site, #URL, #Deployment 이다.
#Site 에서는 title에 블로그 제목, subtitle에 문구, description에 설명, author에 이름, language에 언어를 적어준다. 이 부분은 홈페이지에 보이는 내용들을 수정 할 수 있다.
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.