개발자

해당 스프링부트 코드 해석 좀 부탁드립니다..

2023년 06월 21일조회 181

안드로이드에쓸 스프링부트 코드를 따왔는데 제가 잘이해사 안되서 상세히 알려주실 선배님조언 구합니다 package com.example.teamproject import MyAdapter import android.content.Context import android.content.Intent import android.icu.lang.UCharacter.GraphemeClusterBreak.L import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.example.teamproject.databinding.ActivitySearchBinding import com.example.teamproject.login.LoginActivity import com.example.teamproject.model.RstrModel import com.example.teamproject.review.ReviewActivity import com.google.android.material.bottomnavigation.BottomNavigationView import retrofit2.Call import retrofit2.Callback import retrofit2.Response class SearchActivity : AppCompatActivity() { lateinit var binding: ActivitySearchBinding private lateinit var adapter: MyAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySearchBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar) supportActionBar?.setDisplayShowTitleEnabled(false) binding.toolbar.title = "검색" val loginSharedPref = applicationContext.getSharedPreferences("login_prof", Context.MODE_PRIVATE) val userId = loginSharedPref.getString("m_id", null) val userService = (applicationContext as MyApplication).userService // 하단바 초기값 설정 val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottommenu) bottomNavigationView.selectedItemId = R.id.second_tab // 하단바 선택시 이벤티 binding.bottommenu.setOnItemSelectedListener {item -> when(item.itemId) { R.id.first_tab -> { val intent = Intent(this@SearchActivity, MainActivity::class.java) startActivity(intent) } R.id.third_tab -> { val intent = Intent(this@SearchActivity, ReviewActivity::class.java) startActivity(intent) } R.id.fourth_tab -> { if ( userId == null){ val intent = Intent(this@SearchActivity, LoginActivity::class.java) startActivity(intent) } else { val intent = Intent(this@SearchActivity, MyDining::class.java) startActivity(intent) } } R.id.fifth_tab -> { if ( userId == null){ val intent = Intent(this@SearchActivity, LoginActivity::class.java) startActivity(intent) } else { val intent = Intent(this@SearchActivity, MyProfilePage::class.java) startActivity(intent) } } } true } binding.searchBtn.setOnClickListener { var rstr_nm = binding.searchText.text.toString() val getnamecount = userService.getNamecount(rstr_nm) getnamecount.enqueue(object: Callback<Int>{ override fun onResponse(call: Call<Int>, response: Response<Int>) { if ( response.isSuccessful ){ val ncount = response.body() if (ncount != null) { if ( ncount >= 1){ val getname = userService.getName(rstr_nm) getname.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val rstrlist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, rstrlist) binding.recyclerView.addItemDecoration( DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL) ) } } override fun onFailure( call: Call<List<RstrModel>>, t: Throwable ) { call.cancel() } }) } else { Toast.makeText(this@SearchActivity, "검색 결과가 없습니다!", Toast.LENGTH_SHORT).show() } } } } override fun onFailure(call: Call<Int>, t: Throwable) { call.cancel() } }) } binding.area1.setOnClickListener { val rstr_addr = binding.area1.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area2.setOnClickListener { val rstr_addr = binding.area2.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area3.setOnClickListener { val rstr_addr = binding.area3.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area4.setOnClickListener { val rstr_addr = binding.area4.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area5.setOnClickListener { val rstr_addr = binding.area5.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area6.setOnClickListener { val rstr_addr = binding.area6.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.area7.setOnClickListener { val rstr_addr = binding.area7.text.toString() val getarea = userService.getArea(rstr_addr) getarea.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type1.setOnClickListener { val rstr_list = binding.type1.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type2.setOnClickListener { val rstr_list = binding.type2.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type3.setOnClickListener { val rstr_list = binding.type3.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type4.setOnClickListener { val rstr_list = binding.type4.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type5.setOnClickListener { val rstr_list = binding.type5.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } binding.type6.setOnClickListener { val rstr_list = binding.type6.text.toString() val gettype = userService.getType(rstr_list) gettype.enqueue(object: Callback<List<RstrModel>>{ override fun onResponse( call: Call<List<RstrModel>>, response: Response<List<RstrModel>> ) { if ( response.isSuccessful ){ val arealist = response.body() binding.recyclerView.adapter = MyAdapter(this@SearchActivity, arealist) binding.recyclerView.addItemDecoration(DividerItemDecoration(this@SearchActivity, LinearLayoutManager.VERTICAL)) } } override fun onFailure(call: Call<List<RstrModel>>, t: Throwable) { call.cancel() } }) } } }

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

인기 답변

profile picture

익명

작성자

2023년 06월 21일

맨 윗부분 search activity부터 분석을 시작해보겠습니다. ​ 이 코드는 안드로이드 앱에서 사용되는 Kotlin 언어로 작성된 `SearchActivity`라는 액티비티 클래스입니다. 이 액티비티는 아마도 사용자가 검색을 수행하는 화면을 나타내는 역할을 합니다. 코드를 하나하나 분석해 보겠습니다. ​ 1. **패키지와 임포트**: 코드는 `com.example.teamproject`라는 패키지에 있고, 여러 안드로이드 프레임워크와 사용자 정의 클래스를 임포트합니다. ​ 2. **변수 선언**: `ActivitySearchBinding`과 `MyAdapter`라는 두 개의 멤버 변수를 늦은 초기화(lateinit)로 선언합니다. ​ 3. **onCreate 함수**: 이 함수는 액티비티가 생성될 때 호출되는 생명주기 콜백입니다. - 먼저, 레이아웃 인플레이터를 이용하여 `ActivitySearchBinding`을 초기화하고, 그 결과를 액티비티의 콘텐트 뷰로 설정합니다. - 그런 다음 `setSupportActionBar`를 사용해 툴바를 액션바로 설정하고, 액션바의 제목을 보이지 않게 설정합니다. 그리고 툴바의 제목을 "검색"으로 설정합니다. - 로그인 정보를 가져오기 위해 `SharedPreferences`를 사용합니다. 여기서는 "login_prof"라는 이름의 `SharedPreferences`에서 "m_id"라는 키로 저장된 사용자 ID를 가져옵니다. - 하단 탭을 초기화합니다. `findViewById`를 이용해 `BottomNavigationView`를 가져오고, 선택된 아이템을 "second_tab"으로 설정합니다. - 그리고 `setOnItemSelectedListener`를 이용해 각 탭 클릭 시 어떤 동작을 할지 정의합니다. 여기서는 각 탭에 대해 적절한 액티비티로 이동하는 인텐트를 생성하고 액티비티를 시작합니다. "fourth_tab"과 "fifth_tab"는 로그인 상태를 확인하고, 로그인되지 않은 경우 로그인 액티비티로 이동하게 합니다. ​ 이 코드를 통해 사용자는 검색 화면에서 다른 화면으로 쉽게 이동할 수 있게 됩니다. ​ ​ 그다음 binding area1~ area7 까지의 관련 코드 분석입니다. ​ 이 코드는 `SearchActivity`의 기능을 확장하는 데 사용됩니다. 여기에는 `setOnClickListener` 이벤트와 네트워킹 호출을 통한 데이터를 가져와서 UI를 업데이트하는 것들이 포함됩니다. 세부적으로 분석해보겠습니다: ​ 1. **검색 버튼 클릭 이벤트**: `binding.searchBtn.setOnClickListener`로 검색 버튼에 클릭 이벤트를 설정합니다. 클릭하면 사용자가 입력한 텍스트를 검색어로 사용하여 서버에 요청을 보냅니다. 해당 요청은 검색어에 일치하는 이름의 수를 반환하며, 만약 결과가 1개 이상이면 해당 이름을 가진 결과를 모두 가져옵니다. 그 결과를 `RecyclerView`에 보여주기 위해 `MyAdapter`를 사용합니다. 만약 결과가 없으면 토스트 메시지를 통해 사용자에게 알립니다. ​ 2. **지역별 클릭 이벤트**: `binding.area1`부터 `binding.area7`까지의 클릭 이벤트를 각각 설정합니다. 각 이벤트는 특정 지역을 나타내는 텍스트를 사용하여 해당 지역에 대한 정보를 서버에 요청합니다. 그 후, 가져온 정보를 `RecyclerView`에 표시합니다. 각각의 이벤트는 특정 지역에 대한 검색을 수행하므로, 이를 통해 사용자는 특정 지역에 위치한 식당 정보를 가져올 수 있게 됩니다. ​ 모든 네트워크 호출은 비동기적으로 처리되며, `enqueue` 메서드를 통해 콜백을 제공합니다. `onResponse` 메서드는 요청이 성공적으로 완료되면 호출되며, `onFailure` 메서드는 요청이 실패하거나 통신 오류가 발생한 경우 호출됩니다. ​ 이러한 모든 요청은 Retrofit 라이브러리를 사용해 수행됩니다. Retrofit은 타입-안전한 HTTP 클라이언트로, 네트워크 요청을 쉽고 효율적으로 만들 수 있게 해줍니다. 이 코드에서는 `userService` 인스턴스를 통해 각 요청을 생성하고 수행합니다. ​ ​ 그다음 마지막 부분 관련 코드 분석입니다. ​ ​ 이 코드는 `SearchActivity`의 추가적인 기능을 구현하는 것으로 보입니다. 이전의 분석과 같은 맥락으로, 여기에서는 레스토랑의 유형별(`type1`부터 `type6`까지)로 검색하는 기능을 제공하고 있습니다. 각각의 유형별 버튼을 클릭하면 해당 유형에 해당하는 레스토랑 목록을 서버에서 요청하고, 그 결과를 `RecyclerView`에 표시합니다. ​ 1. **레스토랑 유형별 클릭 이벤트**: `binding.type1`부터 `binding.type6`까지의 클릭 이벤트를 설정합니다. 이때, 각 이벤트는 버튼에 표시된 텍스트를 사용하여 해당 유형의 레스토랑 목록을 서버에 요청합니다. 서버로부터 받은 데이터는 `MyAdapter`를 통해 `RecyclerView`에 표시합니다. ​ 마찬가지로, 모든 네트워크 호출은 비동기적으로 처리되며, `enqueue` 메서드를 통해 콜백을 제공합니다. `onResponse` 메서드는 요청이 성공적으로 완료되면 호출되며, `onFailure` 메서드는 요청이 실패하거나 통신 오류가 발생한 경우 호출됩니다. ​ 이 부분도 이전 분석과 마찬가지로 Retrofit 라이브러리를 사용해 네트워크 요청을 수행하고 있습니다. 각 요청은 `userService` 인스턴스를 통해 생성되고 수행됩니다. ​ 본 코드에서는 `RstrModel`이라는 이름의 클래스가 데이터 모델로 사용되고 있습니다. 이는 서버로부터 받아온 데이터를 저장하고 처리하는 데 사용되는 클래스로 추정됩니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!