티스토리 뷰

[ 학교 앱을 제작해 보자 ]


기능하나하나 만들어 가는것도 좋은 경험이 되었지만, 실용할수 있는 어플 제작을 시도해 보는 것으로

한층더 파고들수 있었으면 했습니다.

얼마전까지 배워왔던 기능들을 활용하고, jsoup 을 이용한 html 파싱을 더해서  어플 제작을 시도해 보았습니다.



[ 중도 포기? 불만족? ]


좋은 경험이 되었지만, 아쉽게도 지금의 실력으로는 좋은 앱을 완성할수 없었습니다.

일단 처음으로, '오늘의 급식' 을 만들기 위해서, 학교홈페이지를 파싱하는 과정이 필요했습니다.

그래서 하루종일 jsoup을 이용한 파싱방법에 대해 공부하고, 시도해 보았으나, 그 구문때문인지 어플이 강제종료 되는

현상이 다수 발생하여, 마시멜로에서 경고까지 날아올 지경이였습니다.하하

이전 글까지만 해도, 인터넷에 올라온 구문들, 혹은 정리된 게시글 등을 보면서, 복사 붙여넣기 보다 

보지않고 혼자 쓸수 있도록 노력해 왔으나, 자꾸 어플이 강제종료 되다보니, 멘탈이 부들부들 떨리기 시작했습니다.

결국 다른 티스토리 블로그 게시글 (http://webnautes.tistory.com/784) 에 올라온 구문을 따라 쓰는 것으로

수정하고, (일단 파싱 하는것이 중요하니) 다시 시도해 보았고, 그결과 최종적으로 파싱하는것에 성공하긴 했습니다.



▲ 오늘의 급식 (파란색 TextView)_Main2Activity


성공하기는 했지만,  다른 문제가 많았습니다.

예를들어 제 스마트폰(s7) 이 아닌 다른 기종 ( 화면크기가 다른 기종) 으로 앱을 구동하였을때, 급식을 가져오는 부분에서 앱이 강제종료 되었고, ( 제 폰과 같은 기종인 s7에서는 강제종료 현상이 일어나지 않습니다) 이미지 크기가 이리저리 커져서 

다른 부분을 잡아먹는다거나 하는 문제들이였습니다.


비율로 설정하지 않아 발생한 문제



 강제종료와 같은경우 원인을 찾을수 없었지만, 이미지가 자리를 벗어나는 문제는

비율을 통해 위치를 설정하지 않아서 였다는걸 알아내었고, 아직 이런 앱을 개발하기에는 급했다는 생각이 문득 들었습니다.

얘기가 길어진것 같은데, 글의 끝에서 다시 이야기 하도록 하고, 일단 제작과정에 대해서 부터 써야 겠네요.



[ 레이아웃 만들기 ]



처음으로 한 작업은 메인 액티비티를 디자인 하고, 급식메뉴가 파싱되는 공간인 Main2Activity를 생성한뒤,

Main2Activity로 들어올때 슬라이딩 하며 들어오는 애니메이션을 추가하는 것이였습니다.




▲ MainActivity.xml


 ImageButton ib = (ImageButton)findViewById(R.id.imageButton3);

ib.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
overridePendingTransition(android.R.anim.slide_in_left, R.anim.hold);
}
}); // slind_in_left는 내장 애니메이션, hold는 제작한 애니메이션 입니다.

hold 애니메이션 제작은 다음 블로그를 참고하였습니다.(http://technote.kr/64)

슬라이딩 애니메이션


[ jsoup 을 이용한 html 파싱 ]



아무래도 여태껏 처럼 한가지 기능만을 다루는 것이 아니기 때문에 , 하나하나 올리는건 의미가 없는 것 같고 

바로 파싱부분으로 넘어가겠습니다.


위 구문 주석에 적힌 블로그 글과, 여러곳에서 정보를얻어 구문을 더 줄여서 깔끔하고 쉽게 파싱할수 없을까 하는 생각이 들어

계속 시도해 보았으나, 실패하였습니다. ( 앞에서 설명) 


결국에는 블로그에 올라온 구문을 따라적은뒤 split을 이용하여 쪼개서 원하는 부분만 가져오는것으로 마무리 하였습니다.



// 생략
Button bt = (Button) findViewById(R.id.button8);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Skinsiro skinsiro = new Skinsiro();
skinsiro.execute();
}
});


}

public class Skinsiro extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... params) {
try {
SimpleDateFormat sd = new SimpleDateFormat("yyyy/MM", Locale.KOREA);
Date date = new Date();
String af = sd.format(date);
String pageaddress = "http://iys.icehs.kr/foodList.do?evFlag=prev&strDate="+af+"&m=020601";
Document doc = Jsoup.connect(pageaddress).get();
Elements links = doc.select("html body #sub_wrap #S_contants #right form table tbody tr td ul li textarea");

for (Element link : links) {
fm += link + "\n\n";
}
Date ddate = new Date();
SimpleDateFormat sdd = new SimpleDateFormat("dd", Locale.KOREA);
String fms = sdd.format(ddate);
String[] fmmmm;
String[] strings = fms.split("");
if(strings[1].equals("0")){
fms = strings[2];
}else{
//놔둠
}
String[] fmmm;
String[] fmm = fm.split("\n\n");
for(int i = 0; i < 50 ; i++) {

fmmm = fmm[i].split("\"");
if (fmmm[1].equals("day" + fms)) {
if (fmmm[8].equals("></textarea>")){
fm = " 급식이 없습니다!\n 왜없는거죠?\n 하! 참! 어이가 없네요! ";
}else{
fmmmm = fmmm[8].split("<");
fm = fmmmm[0]+"\n\n 입니다.\n 맛있는 메뉴네요! \n 꼭 드세요!";
}
break;
}
if( fmm[i+1] == null){
break;
}
}





} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
tv1.setText(fm);
} //http://webnautes.tistory.com/784 (티스토리 멈춤보단 천천히라도)
}
}

▲ split을 이용하여 원하는 부분만 가져오기


( 계속된 시도에 지쳐 구문이 이상했던것 같습니다. 이렇게 저렇게 고치면 더 편했을텐데! 하는 생각이 들지만, 또다른 계획?이 생겼으니  이대로 올리겠습니다)


간략히 설명하면 , 학교 홈페이지 (급식 페이지) 의 html 중에서 지정한 경로의 내용을 가져오고,

split을 이용하여 원하는 날짜 ( 실은 저렇게 안해도 됬었습니다) 만을 가져와 알려주는 소스입니다.


 

[ 느낀점 / 앱 개발을 쉬자! ]


이 앱제작을 통해서 느낀점이 하도 많아서, 이 글안에 다 담을수가 없을것 같습니다.

그만큼 많이 얻어간거니, 그걸로 만족합니다 ㅎㅎ

일단 제작하면서 느낀건데, 너무 급하지 않았나 하는 생각이 많이 들었습니다.

애초에 2학년 말쯤에 학교어플을 제작해서 플레이 스토어에 올리자 ! 하는 계획을 가지고 시작한 앱개발인데

시작한지 몇일 지나지않아 시도했으니 당연한 결과라고는 하지만, 

이렇게 공부해서는 안되겠다는 생각이 들었고, 지금 저는 다양한 분야의 지식을 필요로 한다는 점을 깨달았습니다.


하여, 무엇을 말하려 하느냐?

음, 일단 앱개발 공부를 잠시 쉬려고 합니다. 물론 시작한 거니 완전히 끊지는(?) 못하겠지만,

독서와 웹서핑을 일단 많이 하고, 네트워크 관련된 글, 또는 다른 분야와 관련된 글을 많이 올리려 합니다.

그러면서 지식이 어느정도 쌓이고, 자격증을 취득하고, 학기말이 되면, 그때 더 좋은 학교 앱을 만들자!

라는 새로운 목표( 확실히는 원래 목표와 겹치네요) 도 생겼습니다.

그럼 다짐한 김에 빠르게 게시글을 마치고, 책을 읽으러 가겠습니다. (1월 21일)





댓글