본문 바로가기
오늘은 뭘 배울까?/Android

코틀린 viewPager2 : 사용법, 애니메이션 등

by Kim Juhwan 2021. 2. 24.

1. viewPager2
   1-1. viewPager란?
   1-2. viewPager의 활용
2. 사용 방법
   2-1. 기본 사용법
   2-2. 애니메이션 설정
   2-3. 여백 설정

 

 


 

1. viewPager2

1-1. viewPager란?

 

페이지를 넘기듯이 이렇게 슉-슉- 넘기는 것을 viewPager(뷰 페이저)라고 한다.

원래는 사용 방법이 굉장히 복잡했는데 (내 기준에...)

2019년에 구글이 viewPager2를 발표하면서 사용하기 굉장히 쉬워졌다.

그냥 리사이클러뷰 사용하듯이 사용하면 된다.

초기에는 이런 저런 버그가 있어 개발자들이 viewPager2 보다 기존의 viewPager를 선호하는 경향이 있었는데

2년이 지난 지금 viewPager2로 넘어오지 않을 이유가 없을 것 같다.

 

 

ViewPager2  |  Android 개발자  |  Android Developers

스와이프할 수 있는 형식으로 뷰 또는 프래그먼트를 표시합니다. 최근 업데이트 현재 안정화 버전 다음 버전 후보 베타 버전 알파 버전 2020년 4월 1일 1.0.0 - - 1.1.0-alpha01 AndroidX 종속 항목 ViewPager2

developer.android.com

자세한 변동사항은 위 공식문서에서 확인할 수 있다.

 

 

1-2. viewPager의 활용

Play Store

 

뷰페이저는 다방면에서 활용이 되고 있다.

위와 같은 화면을 자주 보았을 것이다.

옆으로 스-윽 스-윽 스와이프를 해서 다음 아이템을 확인하는 기능!

리사이클러뷰를 가로로 쓰면 똑같이 구현할 수 있을 것 같지만

어느 일정 이상 페이지를 넘기면 그다음부터는 손을 떼도 자동으로 페이지가 넘어간다는 점이 다르다.

 

 

배달의 민족

 

배너광고 같은 경우도 뷰페이저를 활용한 대표 예시이다.

 

 

웬지

 

앱 최초실행시 뜨는 소개 페이지도 뷰 페이저를 활용한 예시이다.

 

 

인스타그램

 

마지막으로 이렇게 스와이프를 통해 페이지(메뉴)를 변경하는 것도

뷰 페이저를 활용한 예시이다. 

단, 이 예시는 구글 디자인 정책상 권장되지 않는 방법이다.

 

 

업뎃 카톡 ‘스와이프’ 왜 안 되나… “구글 디자인 정책 영향”

“카카오(035720)톡 스와이프(옆으로 쓸기) 기능 왜 없앴어요? 메뉴 이동하기 편했는데 돌려주세요!(구글 플레이 스토어 의견)”카카오가 지난 6일 카카오톡 8.0 버전을 구글 안드로이드 운영체제(O

www.sedaily.com

예전에는 카카오톡 메뉴 전환이 스와이프로 가능했었다.

어느 날 갑자기 이 기능이 막히면서 불편하다는 의견이 많이 올라오는 일이 있었는데,

자세한 설명은 위 뉴스에서 다루고 있다.

아무튼 결론은 뷰 페이저를 통한 메뉴 전환은 '하지 말아야 할 기능'이라고 구글에서 명시했다는 것!

인스타그램은 아직까지도 사용하고 있는 거 보니 마이웨이인가 보다.

 

 

2. 사용 방법

2-1. 기본 사용법

activity_main.xml
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager_idol"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

사용 방법은 진짜 recyclerView랑 다를 게 없다.

우선 xml 파일에서 ViewPager2를 추가해준다.

주의할 점은 태그가 android가 아닌 androidx로 시작한다는 거!

 

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager_idol.adapter = ViewPagerAdapter(getIdolList()) // 어댑터 생성
        viewPager_idol.orientation = ViewPager2.ORIENTATION_HORIZONTAL // 방향을 가로로
    }

    // 뷰 페이저에 들어갈 아이템
    private fun getIdolList(): ArrayList<Int> {
        return arrayListOf<Int>(R.drawable.idol1, R.drawable.idol2, R.drawable.idol3)
    }
}

어댑터를 생성할 때 아이템을 넘겨주고

방향을 가로로 해주면 메인 액티비티에서 할 일은 끝이다.

만약 방향을 xml 파일에서 설정하고 싶다면 android:orientation="vertical"을 넣어주면 된다.

 

ViewPagerAdapter.kt
class ViewPagerAdapter(idolList: ArrayList<Int>) : RecyclerView.Adapter<ViewPagerAdapter.PagerViewHolder>() {
    var item = idolList

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PagerViewHolder((parent))

    override fun getItemCount(): Int = item.size

    override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
        holder.idol.setImageResource(item[position])
    }

    inner class PagerViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
        (LayoutInflater.from(parent.context).inflate(R.layout.idol_list_item, parent, false)){

        val idol = itemView.imageView_idol!!
    }
}

어댑터도 리사이클러뷰랑 다를 게 없다.

이너 클래스를 쓰든 따로 파일을 만들든 그런 건 취향껏 만들면 된다.

 

idol_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView_idol"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/idol1" />
</androidx.constraintlayout.widget.ConstraintLayout>

페이지에 띄우고 싶은 뷰를 정의하는 xml 파일을 하나 만든다.

이것도 리사이클러뷰랑 똑같다.

나는 일단 이미지 한 개만 보여주도록 만들었다.

 

 

결과물

 

이렇게 뷰페이저가 완성됐다!

 

 

2-2. 애니메이션 설정

 

ViewPager2로 프래그먼트 간 슬라이드  |  Android 개발자  |  Android Developers

화면 슬라이드는 하나의 전체 화면에서 다른 전체 화면으로 전환하는 것으로, 설정 마법사 또는 슬라이드쇼와 같은 UI에서 일반적으로 사용됩니다. 이 주제에서는 ViewPager2 객체로 화면을 슬라이

developer.android.com

공식문서를 읽어보면 페이지를 넘길 때 애니메이션을 주는 방법에 대해 적혀있다.

그래서 한 번 따라 해 보았다.

 

MainActivity.kt
class MainActivity : AppCompatActivity() {

    private val MIN_SCALE = 0.85f // 뷰가 몇퍼센트로 줄어들 것인지
    private val MIN_ALPHA = 0.5f // 어두워지는 정도를 나타낸 듯 하다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager_icon.adapter = ViewPagerAdapter(getIconList())
        viewPager_icon.orientation = ViewPager2.ORIENTATION_HORIZONTAL
        viewPager_icon.setPageTransformer(ZoomOutPageTransformer()) // 애니메이션 적용
    }

    private fun getIconList(): ArrayList<Int> {
        return arrayListOf<Int>(R.drawable.icon1, R.drawable.icon2, R.drawable.icon3, R.drawable.icon4)
    }

    /* 공식문서에 있는 코드 긁어온거임 */
    inner class ZoomOutPageTransformer : ViewPager2.PageTransformer {
        override fun transformPage(view: View, position: Float) {
            view.apply {
                val pageWidth = width
                val pageHeight = height
                when {
                    position < -1 -> { // [-Infinity,-1)
                        // This page is way off-screen to the left.
                        alpha = 0f
                    }
                    position <= 1 -> { // [-1,1]
                        // Modify the default slide transition to shrink the page as well
                        val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position))
                        val vertMargin = pageHeight * (1 - scaleFactor) / 2
                        val horzMargin = pageWidth * (1 - scaleFactor) / 2
                        translationX = if (position < 0) {
                            horzMargin - vertMargin / 2
                        } else {
                            horzMargin + vertMargin / 2
                        }

                        // Scale the page down (between MIN_SCALE and 1)
                        scaleX = scaleFactor
                        scaleY = scaleFactor

                        // Fade the page relative to its size.
                        alpha = (MIN_ALPHA +
                                (((scaleFactor - MIN_SCALE) / (1 - MIN_SCALE)) * (1 - MIN_ALPHA)))
                    }
                    else -> { // (1,+Infinity]
                        // This page is way off-screen to the right.
                        alpha = 0f
                    }
                }
            }
        }
    }
}

기존의 코드에 SCALE, ALPHA 값을 추가하고

setPageTransformer를 뷰페이저에 적용해주고

공식문서에 있는 코드를 가져와서 붙여 넣기 한 게 전부다. 아주 심플

(ZoomOutPageTransformer는 포스팅하기 편해서 이너 클래스로 넣었다. 실제 코드에선 따로 빼는 게 보기 좋을 듯)

 

 

애니메이션 적용 결과

 

다소 심심했던 뷰페이저에 애니메이션 효과가 생겼다.

공식문서에 다른 애니메이션 예시가 하나 더 있고

찾아보면 다른 사람들이 만든 것도 있을 테니 기회가 되면 사용해봐야겠다.

 

 

2-3. 여백 설정

activity_main.xml
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager_icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false" // 이거랑
        android:clipChildren="false" // 이거 추가
        />

[1-2 viewPager의 활용] 목차에서 보여준 예시를 보면

플레이스토어에서 뷰페이저를 사용하고 있는데

다음에 올 아이템 항목이 빼꼼하고 머리를 내밀고 있는 걸 구현해보려고 한다.

 

이 디자인은 특별한 문구나 안내 없이도

사용자가 "확인할 아이템 항목이 더 있구나"라고 생각하게끔 만들어준다.

 

 

[안드로이드] 리사이클러뷰 android:clipToPadding="false"

리사이클러뷰에 패딩을 줄 경우 위아래에 패딩공간이 있을 것이다. 그런데 사람마다 다르겠지만 스크롤을 한 경우 패딩공간을 활용하면 좀더 뷰를 활용할수있고 자연스러운(?) 뷰를 보여줄 수

youngest-programming.tistory.com

 

 

안드로이드 View의 clipChildren에 대하여 - Hansol’s Blog

기본적으로 안드로이드의 모든 view는 자신이 물리적으로 차지하는 영역 만큼만 그릴 수 있다. 즉, 전체 화면을 기준으로 (left=100, top=100, right=200, bottom=200)만한 영역을 차지하는 view가 (left=200, top=2

giantsol.github.io

우선 viewPager에 새로운 옵션을 2개 넣어주었는데

그 이유는 말이 길어질 것 같아 위 링크로 대체한다.

 

 

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        /* 여백, 너비에 대한 정의 */
        val pageMarginPx = resources.getDimensionPixelOffset(R.dimen.pageMargin) // dimen 파일 안에 크기를 정의해두었다.
        val pagerWidth = resources.getDimensionPixelOffset(R.dimen.pageWidth) // dimen 파일이 없으면 생성해야함
        val screenWidth = resources.displayMetrics.widthPixels // 스마트폰의 너비 길이를 가져옴
        val offsetPx = screenWidth - pageMarginPx - pagerWidth

        viewPager_icon.setPageTransformer { page, position ->
            page.translationX = position * -offsetPx
        }

        viewPager_icon.offscreenPageLimit = 1 // 몇 개의 페이지를 미리 로드 해둘것인지
        viewPager_icon.adapter = ViewPagerAdapter()
        viewPager_icon.orientation = ViewPager2.ORIENTATION_HORIZONTAL
    }
}

우선... 여백과 너비를 이용하여 페이지가 어디서 얼마큼 이동할 건지를 계산한다.

이때 R.dimen.pageMargin 이 값은 따로 dimen 폴더에 정의해둔 값이므로

폴더가 없다면 values 폴더 밑에 생성해서 사용해야 한다.

 

이 pageMargin값과 pageWidth값은 아이템의 크기가 어느 정도인지

간격은 얼마큼으로 주고 싶은지 등등에 따라 달라지기 때문에

직접 값을 조정해가며 적당한 값을 사용하면 된다.

 

그리고 setPageTransformer를 이용해 page의 X축 값에 변화를 주면 끝이다.

 

 

결과물

 

이렇게 다음 아이템이 빼꼼 머리를 내밀고 있는

뷰페이저가 완성됐다!

 

 

offsceenPageLimit 값을 설정하지 않았을 때

 

참고로 offscreenPageLimit 값을 설정해두지 않으면 위와 같은 결과물이 나온다.

페이지가 넘겨질 때 그제야 다음 페이지를 로드하기 때문에

빼꼼 하지 않고 갑자기 어디서 툭! 튀어나오는 것처럼 보이는 것이다.

나는 다음 페이지가 미리 보이길 원했으므로 '1'을 넣어주었다.

 

만약 한 화면에 여러 개의 페이지가 보이는 상황이라면 (play store처럼)

그만큼 더 값을 늘려주면 된다.

 

 

 


 

 

분량이 너무 긴 관계로 <활용편>은 아래 게시물로 이어집니다

 

 

[Kotlin] 뷰페이저2 활용 예제 : tabLayout, indicator, fragment, 자동 스크롤, 무한스크롤, 배너 등

0. 시작하기 앞서.. 1. viewPager 활용  1-1. Indicator와 같이 사용  1-2. Fragment와 같이 사용  1-3. tabLayout과 같이 사용 2. 광고 배너 만들기  2-1. 현재 배너 위치 표시하기  2-2. 무한 뷰페이저  ..

todaycode.tistory.com

 

 

▼ 기본편, 활용편 예제 전체 코드는 깃허브에서 확인해주세요 ▼

 

GitHub - juhwankim-dev/SelfStudy: 코틀린으로 공부한 것들을 올리는 공간입니다.

코틀린으로 공부한 것들을 올리는 공간입니다. Contribute to juhwankim-dev/SelfStudy development by creating an account on GitHub.

github.com

 

반응형

댓글47

  • 익명 2021.02.25 02:34

    비밀댓글입니다
    답글

  • sss 2021.05.27 11:11

    dimen에 pageMargin랑 pageWidth를 몇으로 설정하셨나요?!ㅠㅠ
    답글

    • Kim Juhwan 2021.05.27 23:11 신고

      프로젝트가 남아있는지 찾아보려고 했는데 제가 따로 백업을 안 해뒀나 봐요 ㅠㅠ
      값을 이렇게 저렇게 줘보면서 눈으로 확인하시는 게 제일 나을 거예요.
      아마 제가 설정했던 여백 값이랑 똑같이 설정하셔도 이미지의 크기나 이런 거에 따라 또 보이는 게 달라질 거기 때문에...

      도움 못드려 죄송합니다 😭

  • sjyoun 2021.10.08 20:32

    설명을 잘 해주셔서 감사합니다.
    큰 도움이 되었네요.
    근데, MainActivity 파일 에서 viewPager_icon.adapter 의 viewPager는 어디 정의되어 있나요?
    답글

    • Kim Juhwan 2021.10.08 21:41 신고

      말씀하신 viewPager_icon은 제가 xml파일에서 만든 viewPager의 id입니다.

      제가 이 포스팅을 작성했을 때 id를 findViewById나 뷰바인딩 과정없이 바로 변수처럼 사용할 수 있는 Kotlin Synthetic이 있었는데 현재는 deprecated 되어버렸네요...

      https://todaycode.tistory.com/29
      여기 포스팅의 [목차 1-2]에서 Kotlin Synthetic에 대해 정리해두었는데 관심 있으시면 한 번 읽어보시길 추천드립니다!

  • Kim Juhwan 2021.11.06 13:34 신고

    변수 값이나 선언 위치 등을 물어보시는 분들이 계셔서
    프로젝트를 새로 제작해 깃허브에 업로드 해두었습니다.
    시간이 흘렀기에 deprecated된 것도 있고 제 코드 스타일도 달라져 본문과 살짝 코드가 다를 수는 있습니다.
    최대한 베이직한 문법을 쓰려고 했는데 findViewById 대신 뷰 바인딩만 좀 썼습니다!

    질문 있으시면 댓글 남겨주세요. 감사합니다 :)
    답글

  • sherlock 2022.01.05 01:08

    이 글이랑 다음 활용 글이 안드로이드 기본 개발 하는데 도움 많이 되었습니다! 선한 영향력 감사합니다!!
    답글

  • 초보입니다 2022.04.08 03:49

    안드로이드 시작한지 몇달안되는 초보입니다
    글보고 많은 도움되었어요~!
    그런데 혹시 R.dimen 에 같은 이름으로 임의의값(dp)을 주었는데 lang.RuntimeException: Unable to instantiate activity ComponentInfo 에러가 나네요 ui를그릴수 없다는거 같은데 왜그런걸까요?
    답글

    • Kim Juhwan 2022.04.08 11:34 신고

      구글링을 해보니 R.dimen이랑은 크게 관련이 없는 것 같아요!

      https://webit22.tistory.com/75
      이 블로그 참고해서 해결해보시면 좋을 것 같습니다.

      dimens.xml 파일은 res - values에 있으니 경로도 한 번 잘 확인해보세요.

      https://github.com/juhwankim-dev/SelfStudy/blob/master/ViewPager/app/src/main/res/values/dimens.xml
      이 경로입니다!

  • 죄송하지만 조언 좀 구해보려 합니다.
    올리신 글을 참고하여 뷰페이저를 구현했는데
    좌우 미리보는 아이템을 포함 -> 3개의 아이템을 한 화면에 보여줘서인지
    가장 처음 오게되는 아이템이 정중앙에 위치하여 출력되게 되는데
    저는 3개 이상의 아이템을 보여주고 싶고 가장 첫 아이템의 경우 정중앙이 아닌 가장 좌측에 붙어 위치하도록 출력하고 싶은데 이 부분을 구현하지 못해 몇주째 고생중이네요 ㅎㅎ...
    찾아보기도 했지만 잘 되지 않아
    어떻게 처리할수 있는지 아신다면 조언 해주신다면 큰 도움이 될것 같습니다...
    답글

    • Kim Juhwan 2022.09.14 14:41 신고

      안녕하세요!
      아마 질문자님께서 원하신 구현 화면은
      https://github.com/juhwankim-dev/SelfStudy/issues/1
      이걸 말씀하시는 것 같습니다.

      예제를 만들어 깃허브 레포지토리에 추가해두었으니 확인해보시면 될 것 같습니다.
      https://github.com/juhwankim-dev/SelfStudy/blob/master/ViewPager/app/src/main/java/com/ssafy/viewpagerproject/basic/MultipleItemVPActivity.kt

      몇주째 고생하셨다니.. 그 마음 너무나 잘 알고 있습니다 ㅠㅠ 부디 원하시는 화면이 맞아서 도움이 됐으면 좋겠네요.
      추가 질문 있으시면 얼마든지 남겨주세요! 😊

    • Kim Juhwan 2022.09.14 14:43 신고

      깃허브 issue에도 남겨뒀지만 참고 자료링크입니다.

      1. stackoverflow
      https://stackoverflow.com/questions/13194666/how-to-set-viewpager-size

      2. 개발자를 위한 레시피
      https://recipes4dev.tistory.com/148

      3. SHASHIKA'S WEB BLOG
      https://shashikawlp.wordpress.com/2012/12/13/android-viewpager-with-multiple-views/

      참고로 google에 viewpager multiple item를 검색하면 비슷한 사례를 찾으실 수 있습니다.

    • 사무실에서 소리 질렀네요...
      그렇게 찾아도 찾을 수 없더니...
      너무너무 감사합니다.
      염치 불구하고 또 여쭤볼게 있으면 조언 좀 부탁드리겠습니다.
      감사합니다!!

    • Kim Juhwan 2022.09.14 14:53 신고

      이렇게까지 좋아해주시니 블로그 할 맛이나네요 헤헤 🥰
      넵!! 앱 개발 파이팅하세요 💪

    • getPageWidth 로 override해서 사용한다고 했는데
      그럼 기존에 상위 Class에 해당 method가 있어야 하는데...
      알려주신대로 처리해도 적용이 되지 않는듯 합니다... ㅠㅠ

    • Kim Juhwan 2022.09.15 17:30 신고

      음.. 어떤 말씀이신지 잘 이해가 안되네요
      혹시 getPageWidth를 액티비티에서 override 하려고 하시는 거라면 불가능합니다.
      PagerAdapter를 상속 받는 클래스에서 override하고
      그 Adapter를 ViewPager에 넣어주셔야해요.

      https://github.com/juhwankim-dev/SelfStudy/blob/master/ViewPager/app/src/main/java/com/ssafy/viewpagerproject/adapter/MultipleItemAdapter.kt
      이 코드처럼 작성했는데 override가 안된다는 말씀이신가요??

    • 익명 2022.09.15 17:36

      비밀댓글입니다

    • 익명 2022.09.15 17:39

      비밀댓글입니다

    • 아 저 어댑터 자체을 페이저어댑터를 상속받고 내용 모두 수정되어야 한다는 말씀이시죠 그렇게 해보겠습니다.
      매번 감사합니다...

    • 익명 2022.09.15 17:42

      비밀댓글입니다

    • 익명 2022.09.15 17:43

      비밀댓글입니다

    • Kim Juhwan 2022.09.15 17:43 신고

      네넵! 맞습니다.
      작성하신 코드는 RecylerView Adapter를 상속 받았을 때 작성하는 내용이고
      원하시는 기능을 구현하려면 PagerAdapter를 상속 받아서 구현하셔야 합니다.

      https://github.com/juhwankim-dev/SelfStudy/blob/master/ViewPager/app/src/main/java/com/ssafy/viewpagerproject/adapter/MultipleItemAdapter.kt
      내용은 여기서 확인하실 수 있고
      주신 코드를 그에 맞게 수정한 건 위쪽에 올려드렸습니다 ㅎㅎ

    • Kim Juhwan 2022.09.15 17:45 신고

      아닙니다 헤헤 좋아서 하는 일인 걸요
      포스팅에 하트 한 번 눌러주시면 그거로 보답이 될 것 같아요! 😄

    • 또 해보고 안될시에는 아예 코드를 확인할 수 있게 깃헙 주소를 공유드리고 부탁드려도 될까요? 일단은 그렇게 처리해보도록 하겠습니다.
      다시 한번 너무너무 감사합니다.

    • 좋아요라니요... 아예 구독해버렸습니다ㅎㅎ

    • Kim Juhwan 2022.09.15 17:46 신고

      ㅋㅋㅋㅋㅋ 감사합니닷
      넵 최대한 도와드릴게요. 파이팅!!

    • 익명 2022.09.16 00:49

      비밀댓글입니다

    • 익명 2022.09.16 19:41

      비밀댓글입니다

    • Private 풀었는데 다시 한번 확인해보겠습니당

    • 익명 2022.09.16 20:06

      비밀댓글입니다

    • 익명 2022.09.16 23:16

      비밀댓글입니다

    • 업무가 많아 늦게 확인했지만
      이렇게까지 도와주심에 너무너무 감사드립니다.
      앞으로도 Juhwan님의 글 즐겨 보겠습니다. 많은 유익한 글 부탁드립니다.
      또 염치 불구하고 글에 관련된 질문이 있으면 조언 좀 부탁드리겠습니다.

    • Kim Juhwan 2022.09.19 12:02 신고

      ㅎㅎ 그렇다면 더 열심히 포스팅 해야겠군요! 💪💪
      넵 언제든지 도움 필요하시면 말씀해주세요!

  • 익명 2022.09.22 16:46

    비밀댓글입니다
    답글

  • 익명 2022.09.22 23:26

    비밀댓글입니다
    답글

  • 익명 2022.09.23 00:08

    비밀댓글입니다
    답글

  • 지금 로그캣에 찍히는 내용으로는 text 입력하고 버튼 클릭시 DB에 Insert하도록 해놨는데
    클릭하면 강제종료 되면서 DB가 아직 시작되지 않았다는 내용의 에러가 찍히네요
    답글

  • 아 초기화하지 않았다는 로그인데.... 초기화 했는데ㅠㅠ
    계속 찾아보고는 있숩니다.
    답글

  • 익명 2022.09.23 00:35

    비밀댓글입니다
    답글

  • 친절하게 답해주셔서 더 그런거 같지만...
    감사하게도 또 질문 드릴 사항이 있으면 부탁드리겠습니다.
    좋은 밤 되세용!!
    답글