Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2017 수원 안드로이드 라이브러리 스터디 - 안드기초 3/4
Search
jwk1014
June 27, 2017
Programming
0
77
2017 수원 안드로이드 라이브러리 스터디 - 안드기초 3/4
시간 : 2017.06.23 (금) 20시 ~ 22시 (2시간)
장소 : 수원역 유앤아이 스터디룸 O룸
참여자 : 7명
jwk1014
June 27, 2017
Tweet
Share
More Decks by jwk1014
See All by jwk1014
2017 iOS 앱 스터디 8주차 - Alamofire Image & Realm
jwk1014
0
240
2017 iOS 앱 스터디 7주차 - Alamofire & Realm
jwk1014
0
110
2017 iOS 앱 스터디 6주차 - ScrollView paging & GCD & 날씨앱준비
jwk1014
0
140
2017 iOS 앱 스터디 5주차 - TableView refresh & ScrollView paging
jwk1014
0
91
2017 iOS 앱 스터디 4주차 - TableView
jwk1014
1
150
2017 iOS 앱스터디 3주차 - CocoaPods & Segue(show) & TableView
jwk1014
0
90
2017 iOS 앱스터디 2주차 - 이미지 & 다이얼로그 & TextField
jwk1014
0
90
2017 iOS 앱 스터디 1주차 - 프로젝트 생성 및 UI
jwk1014
0
150
2017 수원 안드로이드 라이브러리 스터디 - 안드기초 1/4
jwk1014
0
100
Other Decks in Programming
See All in Programming
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
200
dchart: charts from deck markup
ajstarks
3
990
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
610
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
180
AI巻き込み型コードレビューのススメ
nealle
0
130
MUSUBIXとは
nahisaho
0
130
SourceGeneratorのススメ
htkym
0
190
CSC307 Lecture 07
javiergs
PRO
0
550
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
110
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
63
YesSQL, Process and Tooling at Scale
rocio
174
15k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
110
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.9k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
130
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
930
Transcript
03-Library&RecyclerView Android Basic
Library
03 - Library & RecyclerView build.gradle (Project) оؘ ࠁח repositories
উী ਤ৬ э mavenCentral()ਸ ୶оפ.
03 - Library & RecyclerView build.gradle (Module: app) build.gradle(Module:app)ੌ۽ زೞৈ
рী extۄח ਸ ٜ݅Ҋ ਤ৬ э ࢿೞৈ ߡ ंܳ ҙܻೞѷणפ. dependenciesب ਤ৬ э ղਊਵ۽ ٮۄ೧ࣁਃ. ( ী ࠂࢎೡ ࣻ ח ఫझо णפ.)
03 - Library & RecyclerView build.gradle (Module: app) ext {
androidSupport = "25.3.1" gson = "2.8.1" okhttp = "3.8.1" retrofit = "2.3.0" glide = "3.8.0" glideOkhttp = "1.5.0" } compile "com.android.support:appcompat-v7:${androidSupport}" compile "com.android.support.constraint:constraint-layout:1.0.2" compile "com.android.support:recyclerview-v7:${androidSupport}" compile "com.google.code.gson:gson:${gson}" compile "com.squareup.okhttp3:okhttp:${okhttp}" compile "com.squareup.okhttp3:okhttp-urlconnection:${okhttp}" compile "com.squareup.retrofit2:retrofit:${retrofit}" compile "com.squareup.retrofit2:converter-gson:${retrofit}" compile "com.github.bumptech.glide:glide:${glide}" compile "com.github.bumptech.glide:okhttp3-integration:${glideOkhttp}" ${ܴ} ޙߨਸ ࢎਊೞӝ ਤ೧ࢲח Ӓր ٮ১(‘)о ইצ हٮ১(“)উীࢲ оמפ. ৽ଃ ߡ ंٜ 2017-06-22ী ഛੋೠ ୭नߡंੑפ.
Application
03 - Library & RecyclerView Application android.app.Application ېझܳ ࢚ࣘ߉ח MyApplicationېझܳ
ࢤࢿפ.
03 - Library & RecyclerView Application manifestsܳ ৌҊࢲ <application> కӒী
android:name ࣘࢿਸ ਤ৬ э ղਊਵ۽ ୶оפ.
03 - Library & RecyclerView Application Application ېझܳ ࢚ࣘ߉Ҋ, manifests
<application>కӒ android:nameী ୶оػ ېझח জ ԁઉо ெ ٸ о प೯غח ېझੑפ. Glide ݫݽܻ ୭ࢎਊ ࢸਸ ਤ೧ ਤ৬ э ղਊਸ ࢿ೧ࣁਃ.
Glide
03 - Library & RecyclerView Glide NBOJGFTUTܳৌҊੋఠ֔ࢎਊਸਤ೧ਤ৬эಌ࣌ਸ֍যࣁਃ <uses-permission android:name="android.permission.INTERNET"/>
03 - Library & RecyclerView Glide BDUJWJUZ@NBJOYNMীਤ৬э*NBHF7JFXܳ֍যࣁਃ
03 - Library & RecyclerView Glide IUUQTSBXHJUIVCVTFSDPOUFOUDPNCVNQUFDIHMJEFNBTUFSTUBUJDHMJEF@MPHPQOH
03 - Library & RecyclerView Glide
03 - Library & RecyclerView पण Glide
RecyclerView
03 - Library & RecyclerView RecyclerView BDUJWJUZ@NBJOYNM <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
03 - Library & RecyclerView RecyclerView %BUB$MBTT
03 - Library & RecyclerView RecyclerView MJTU@DPOUFOUYNM <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="100dp"> <TextView android:id="@+id/list_content_textview_rank" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_marginStart="5dp" android:text="ࣽਤ"/> <ImageView android:id="@+id/list_content_imageview" android:layout_width="100dp" android:layout_height="100dp" android:layout_toRightOf="@+id/list_content_textview_rank" android:layout_toEndOf="@+id/list_content_textview_rank" android:src="@mipmap/ic_launcher"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toEndOf="@+id/list_content_imageview" android:layout_toRightOf="@+id/list_content_imageview" android:layout_marginRight="10dp" android:layout_marginEnd="10dp" android:layout_marginBottom="5dp" android:orientation="vertical"> <TextView android:id="@+id/list_content_textview_title" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:gravity="center_vertical" android:ellipsize="end" android:textSize="20sp" android:textStyle="bold" android:text="ઁݾ"/> <TextView android:id="@+id/list_content_textview_title_en" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center_vertical" android:text="ޙઁݾ"/> <TextView android:id="@+id/list_content_textview_title_admission" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center_vertical" android:text="ҙۈо"/> <TextView android:id="@+id/list_content_textview_title_releaseDate" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center_vertical" android:text="ѐࠉੌ"/> </LinearLayout> </RelativeLayout>
03 - Library & RecyclerView RecyclerView 7JFX)PMEFS public class ExRecyclerViewHolder
extends RecyclerView.ViewHolder { private TextView tvRank, tvTitle, tvTitleEn, tvAdmission, tvReleaseDate; private ImageView imageView; public ExRecyclerViewHolder(View v){ super(v); tvRank = (TextView)v.findViewById(R.id.list_content_textview_rank); imageView = (ImageView)v.findViewById(R.id.list_content_imageview); tvTitle = (TextView)v.findViewById(R.id.list_content_textview_title); tvTitleEn = (TextView)v.findViewById(R.id.list_content_textview_title_en); tvAdmission = (TextView)v.findViewById(R.id.list_content_textview_title_admission); tvReleaseDate = (TextView)v.findViewById(R.id.list_content_textview_title_releaseDate); } public void setData(MovieData item){ //TODO } }
03 - Library & RecyclerView RecyclerView "EBQUFS public class ExRecyclerViewAdapter
extends RecyclerView.Adapter<ExRecyclerViewHolder> { private List<MovieData> list; //ڸ ղਊٜ ٜযח List public ExRecyclerViewAdapter(List<MovieData> list){ this.list = list; } @Override public ExRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //parent = ೠೠ Viewٜਸ धਵ۽ оח ࠗݽView View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_content,parent,false); //R.layout.list_content ݽনਸ View۽ ࢤࢿ return new ExRecyclerViewHolder(v); //ViewHolder ࢤࢿ റ ܻఢ //ViewHolderۆ ೠী ೠ Viewܳ ҙܻೞח ېझ } @Override public void onBindViewHolder(ExRecyclerViewHolder holder, int position) { //holder = onCreateViewHolderীࢲ ࢤࢿ೧ળ ViewHolder // position = അ ݻߣ૩ ੋ MovieData item = list.get(position); //listীࢲ ೧ ߣ૩ itemਸ оઉয়ӝ holder.setData(item); //ViewHolderীѱ itemਸ Ѥ֎য ೧ ߣ૩ী ݏח ղਊਸ ੜदೞب۾ ೣ } @Override public int getItemCount() { return list.size(); // ୨ ݻѐ ਸ ڸਕঠೞח } }
03 - Library & RecyclerView RecyclerView .BJO"DUJWJUZ public class MainActivity
extends AppCompatActivity{ private LinearLayoutManager linearLayoutManager; private ExRecyclerViewAdapter viewAdapter; private List<MovieData> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview); linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL)); list = new ArrayList<>(); for(int i=0;i<10;i++) list.add(new MovieData()); recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list)); } }
03 - Library & RecyclerView RecyclerView झܽࢫ
03 - Library & RecyclerView पण RecyclerView
03 - Library & RecyclerView public class RetrofitManager { private
static RetrofitManager manager; private RetrofitUrl url; public static RetrofitManager getInstance(){ if(manager == null) manager = new RetrofitManager(); return manager; } public static void clearInstance(){ manager = null; } private RetrofitManager(){ OkHttpClient client = new OkHttpClient.Builder().build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(RetrofitUrl.BASE_URL) .addConverterFactory(GsonConverterFactory.create(new Gson())) .client(client) .build(); url = retrofit.create(RetrofitUrl.class); } public RetrofitUrl getUrls(){ return url; } public interface RetrofitUrl{ String BASE_URL = "http://movie.daum.net"; @GET("/data/movie/movie_info/ticket_rank_no_mid.json") Call<MovieResponse> rankList( @Query("pageNo") int pageNo, @Query("pageSize") int pageSize ); } } RecyclerView 3FUSPGJU.BOBHFS
03 - Library & RecyclerView RecyclerView 7JFX)PMEFS public class ExRecyclerViewHolder
extends RecyclerView.ViewHolder { private TextView tvRank, tvTitle, tvTitleEn, tvAdmission, tvReleaseDate; private ImageView imageView; public ExRecyclerViewHolder(View v){ super(v); tvRank = (TextView)v.findViewById(R.id.list_content_textview_rank); imageView = (ImageView)v.findViewById(R.id.list_content_imageview); tvTitle = (TextView)v.findViewById(R.id.list_content_textview_title); tvTitleEn = (TextView)v.findViewById(R.id.list_content_textview_title_en); tvAdmission = (TextView)v.findViewById(R.id.list_content_textview_title_admission); tvReleaseDate = (TextView)v.findViewById(R.id.list_content_textview_title_releaseDate); } public void setData(MovieData item){ tvRank.setText(""+item.getRank().getRanking()); if(item.getPhoto() != null && item.getPhoto().getFullname() != null) Glide.with(itemView.getContext()).load(item.getPhoto().getFullname()).into(imageView); tvTitle.setText(item.getTitleKo()); if(item.getTitleEn() != null) tvTitleEn.setText(item.getTitleEn()); if(item.getAdmissionDesc() != null) tvAdmission.setText(item.getAdmissionDesc()); if(item.getReleaseDateStr() != null) tvReleaseDate.setText(item.getReleaseDateStr()); } }
03 - Library & RecyclerView public class MainActivity extends AppCompatActivity
implements Callback<MovieResponse>{ private LinearLayoutManager linearLayoutManager; private ExRecyclerViewAdapter viewAdapter; private List<MovieData> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview); linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL)); recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>())); RetrofitManager.getInstance().getUrls().rankList(1,10).enqueue(this); } @Override public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) { MovieResponse movieResponse = response.body(); if(movieResponse != null){ for(MovieData movieData:movieResponse.getData()){ String rd = movieData.getReleaseDate(); if(rd != null) movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ”, rd.substring(0,4),rd.substring(4,6),rd.substring(6,8))); } list.addAll(movieResponse.getData()); viewAdapter.notifyDataSetChanged(); }else Toast.makeText(MainActivity.this,"ؘఠ য়ܨ",Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<MovieResponse> call, Throwable t) { Toast.makeText(MainActivity.this,"֎ਕ য়ܨ",Toast.LENGTH_SHORT).show(); Log.e("Retrofit","rankList",t); } } RecyclerView .BJO"DUJWJUZ
03 - Library & RecyclerView RecyclerView झܽࢫ
SwipeRefreshLayout
03 - Library & RecyclerView SwipeRefreshLayout BDUJWJUZ@NBJOYNM <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent" android:id="@+id/swipeRefreshLayout"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout>
03 - Library & RecyclerView SwipeRefreshLayout .BJO"DUJWJUZ public class MainActivity
extends AppCompatActivity implements Callback<MovieResponse>, SwipeRefreshLayout.OnRefreshListener{ private SwipeRefreshLayout swipeRefreshLayout; private LinearLayoutManager linearLayoutManager; private ExRecyclerViewAdapter viewAdapter; private List<MovieData> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setOnRefreshListener(this); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview); linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL)); recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>())); swipeRefreshLayout.setRefreshing(true); onRefresh(); } @Override public void onRefresh() { list.clear(); viewAdapter.notifyDataSetChanged(); RetrofitManager.getInstance().getUrls().rankList(1,10).enqueue(this); }
03 - Library & RecyclerView SwipeRefreshLayout .BJO"DUJWJUZ @Override public void
onResponse(Call<MovieResponse> call, Response<MovieResponse> response) { MovieResponse movieResponse = response.body(); if(movieResponse != null){ for(MovieData movieData:movieResponse.getData()){ String rd = movieData.getReleaseDate(); if(rd != null) movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ", rd.substring(0,4),rd.substring(4,6),rd.substring(6,8))); } list.addAll(movieResponse.getData()); viewAdapter.notifyDataSetChanged(); }else{ Toast.makeText(MainActivity.this,"ؘఠ য়ܨ",Toast.LENGTH_SHORT).show(); } swipeRefreshLayout.setRefreshing(false); } @Override public void onFailure(Call<MovieResponse> call, Throwable t) { Toast.makeText(MainActivity.this,"֎ਕ য়ܨ",Toast.LENGTH_SHORT).show(); Log.e("Retrofit","rankList",t); swipeRefreshLayout.setRefreshing(false); } }
03 - Library & RecyclerView SwipeRefreshLayout झܽࢫ
03 - Library & RecyclerView पण SwipeRefreshLayout
Last Position Listener
03 - Library & RecyclerView 마지막 칸 도달 여부 Listener
.BJO"DUJWJUZ public class MainActivity extends AppCompatActivity implements Callback<MovieResponse>, SwipeRefreshLayout.OnRefreshListener{ private SwipeRefreshLayout swipeRefreshLayout; private LinearLayoutManager linearLayoutManager; private ExRecyclerViewAdapter viewAdapter; private List<MovieData> list; private int page = 1; private boolean loading = false; private boolean more = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setOnRefreshListener(this); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview); linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL)); recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>())); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(more && !loading) { int visibleItemCount = recyclerView.getChildCount(); int totalItemCount = linearLayoutManager.getItemCount(); int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(); if((totalItemCount - visibleItemCount) <= (firstVisibleItem + 3)) { dataLoad(); } } } }); swipeRefreshLayout.setRefreshing(true); onRefresh();
03 - Library & RecyclerView 마지막 칸 도달 여부 Listener
3FDZDMFS7JFX0O4DSPMM-JTUFOFS recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(more && !loading) { int visibleItemCount = recyclerView.getChildCount(); int totalItemCount = linearLayoutManager.getItemCount(); int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(); if((totalItemCount - visibleItemCount) <= (firstVisibleItem + 3)) { dataLoad(); } } } });
03 - Library & RecyclerView 마지막 칸 도달 여부 Listener
.BJO"DUJWJUZ private void dataLoad(){ loading = true; RetrofitManager.getInstance().getUrls().rankList(page,10).enqueue(this); } @Override public void onRefresh() { list.clear(); viewAdapter.notifyDataSetChanged(); page = 1; more = true; dataLoad(); }
03 - Library & RecyclerView @Override public void onResponse(Call<MovieResponse>
call, Response<MovieResponse> response) { Log.i("MainActivity","onResponse"); MovieResponse movieResponse = response.body(); if(movieResponse != null){ for(MovieData movieData:movieResponse.getData()){ String rd = movieData.getReleaseDate(); if(rd != null) movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ”, rd.substring(0,4),rd.substring(4,6),rd.substring(6,8))); } list.addAll(movieResponse.getData()); viewAdapter.notifyDataSetChanged(); page++; if(list.size() >= movieResponse.getCount()) more = false; }else{ Toast.makeText(MainActivity.this,"ؘఠ য়ܨ",Toast.LENGTH_SHORT).show(); } swipeRefreshLayout.setRefreshing(false); loading = false; } @Override public void onFailure(Call<MovieResponse> call, Throwable t) { Toast.makeText(MainActivity.this,"֎ਕ য়ܨ",Toast.LENGTH_SHORT).show(); Log.e("Retrofit","rankList",t); swipeRefreshLayout.setRefreshing(false); loading = false; } 마지막 칸 도달 여부 Listener .BJO"DUJWJUZ
03 - Library & RecyclerView पण 마지막 칸 도달 여부
Listener
03 - Library & RecyclerView 다음시간에는 *OUFOU TUBSU"DUJWJUZ &YUSB TUBSU"DUJWJUZ'PS3FTVMU
PWFSSJEF1FOEJOH5SBOTJUJPO ܲজৌӝ PWFSSJEF1FOEJOH5SBOTJUJPOࢎਊೞӝਤ೧SFTBOJNীগפݫ࣌YNM୶о )BOEMFS 5ISFBE ٍ۽оӝ־ܰݶজઙܐ TVQQPSUFE"DUJPO#BS UJUMF IPNF"T6Q "MFSU%JBMPH DBODFM QPTJUJWF 42-JUF 42-JUF0QFO)FMQFS 42-ޙߨDSFBUFUBCMF TFMFDU JOTFSU VQEBUF EFMFUFܳݽܰदח࠙झఠ٣өҕࠗ೧ࣁਃ ਘਃੌਸਵ۽উ٘۽٘ӝୡઙܐറ%BHHFSࠗఠۄ࠳۞ܻझఠ٣दפ
궁금한점은지금질문해주세요 ࣻস լणפ