묻고 답해요
137만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[2023 코틀린 강의 무료제공] 기초에서 수익 창출까지, 안드로이드 프로그래밍 A-Z
교안은 어디서 볼 수 있나요?
이미지 리소스를 다운받으려고 하는데 어디 있는지 모르겠습니다.
-
해결됨스프링 핵심 원리 - 고급편
[전략 패턴 - 예제 2] 코틀린으로 연습하는 중에 변환이 되지 않아 문의 드립니다.
// ContextV1Test.java @Test void strategyV3() { ContextV1 context1 = new ContextV1(new Strategy() { @Override public void call() { log.info("비즈니스 로직1 실행"); } }); context1.execute(); ContextV1 context2 = new ContextV1(new Strategy() { @Override public void call() { log.info("비즈니스 로직2 실행"); } }); context2.execute(); } @Test void strategyV4() { ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행")); context1.execute(); ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행")); context2.execute(); }// ContextV1Test @Test fun strategyV3() { val context1 = ContextV1(object : Strategy { override fun call() { log.info("비즈니스 로직1 실행") } }) context1.execute() val context2 = ContextV1(object : Strategy { override fun call() { log.info("비즈니스 로직2 실행") } }) context2.execute() } @Test fun strategyV4() { val context1 = ContextV1({ log.info("비즈니스 로직1 실행") }) context1.execute() val context2 = ContextV1({ log.info("비즈니스 로직2 실행") }) context2.execute() }interface 에 메서드가 하나만 있는 경우 람다를 활용할 수 있다. java 코드를 코틀린으로 변환하면서 v3 는 정상적으로 변환에 성공했습니다.하지만 v4 는 정상적으로 되지 않습니다.코틀린에 아직 익숙하지 않다보니 생긴 문제인거 같기도 한데..혹시 강의 범위를 벗어나긴 하지만 도움을 주실 수 있을까요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Book.java Kotlin으로 변경 후 오류 문의
안녕하세요. 12강 에서 처럼 Book.java를 Book.kt kotlin 코드로 변경하고 나서 테스트코드 수행하면 아래와 같은 오류가 발생합니다. 확인해야 될 사항이 뭐가 있을까요. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookRepository' defined in com.group.libraryapp.domain.book.BookRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.group.librayapp.domain.book.Book
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
코틀린으로 한번 래핑 (수정)
코틀린에서 자바코드를 사용할 때 플랫폼 타입 사용에 유의하여야한다고 하셨습니다.팁으로 자바 코드를 널 가능성을 확인하는 코드를 삽입하던지 아니면 코틀린으로 한번 래핑하라고 하셨는데 여기서 코틀린으로 한번 래핑하라는게 무슨 의미인지 잘 모르겠습니다4강입니다
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
파이어베이스 리얼타임 데이터베이스 불러오기 - 질문
질문 : 파이어베이스 리얼타임 데이터베이스에 날짜와 메모가 입력이 잘되었는데 어플 창에는 날짜가 뜨지 않습니다.-adapter_list.notifyDataSetChanged()하기 전까지는 날짜가 잘 떳는데 그 다음부턴 날짜가 파이어베이스에만 입력되고 어플 창에는 뜨지 않습니다 ㅜㅜ 왜이런걸까요? -파이어베이스 리얼타임 데이터베이스에 입력이 잘됨문제 화면: 어플 화면에 날짜가 안뜸-MainActivity.kt 코드입니다 package com.ipari.diet_memo import android.app.DatePickerDialog import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.widget.* import androidx.appcompat.app.AlertDialog import com.google.firebase.auth.ktx.auth import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.ValueEventListener import com.google.firebase.database.ktx.database import com.google.firebase.ktx.Firebase import java.util.* class MainActivity : AppCompatActivity() { val dataModelList = mutableListOf<DataModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val database = Firebase.database val myRef = database.getReference("myMemo") val listView = findViewById<ListView>(R.id.mainLV) val adapter_list = ListViewAdapter(dataModelList) listView.adapter= adapter_list Log.d("DataModel------", dataModelList.toString()) myRef.child(Firebase.auth.currentUser!!.uid).addValueEventListener(object : ValueEventListener{ override fun onDataChange(snapshot: DataSnapshot) { dataModelList.clear() for (dataModel in snapshot.children) { Log.d("Data", dataModel.toString()) dataModelList.add(dataModel.getValue(DataModel::class.java)!!) } adapter_list.notifyDataSetChanged() Log.d("DataModel", dataModelList.toString()) } override fun onCancelled(error: DatabaseError) { } }) val writeButton = findViewById<ImageView>(R.id.writeBtn) writeButton.setOnClickListener { val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null) val mBuilder = AlertDialog.Builder(this) .setView(mDialogView) .setTitle("운동 메모 다이얼로그") val mAlertDialog = mBuilder.show() val DateSelectBtn = mAlertDialog.findViewById<Button>(R.id.dataSelectBtn) var dateText="" DateSelectBtn?.setOnClickListener { val today = GregorianCalendar() val year : Int = today.get(Calendar.YEAR) val month : Int = today.get(Calendar.MONTH) val date : Int = today.get(Calendar.DATE) val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener{ override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int ) { Log.d("MAIN", "${year}, ${month +1}, ${dayOfMonth}") DateSelectBtn.setText("${year}, ${month +1}, ${dayOfMonth}") dateText = "${year}, ${month +1}, ${dayOfMonth}" } }, year, month, date) dlg.show() } val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn) saveBtn?.setOnClickListener { val healthMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString() val database = Firebase.database val myRef = database.getReference("myMemo").child(Firebase.auth.currentUser!!.uid) val model = DataModel(dateText, healthMemo) myRef .push() .setValue(model) mAlertDialog.dismiss() } } } }
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 픽스쳐 관련
안녕하세요 강사님~!! 항상 감사한 마음으로 수업 잘 듣고 있습니다 ㅎㅎ테스트 픽스쳐 관련해서 궁금한 점이 있어 질문 드립니다. 엔티티에 fixture 함수를 정의하게 되면 테스트에 필요한 내용이 실제 운영 코드로 전파되거나, 반대로 (운영 코드인) 엔티티의 정적함수가 테스트 환경에만 종속되는 문제가 있을 것 같은데 어떻게 생각하시는지 궁금합니다!!
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글 여러개 작성시 댓글이 안보임
선생님 저 질문이있어서 이렇게 문의드립니다.댓글 불러오기강의에서 댓글을 여러개 작성을 하게 되면 사진에 보이는 것처럼 댓글을 새로 작성해도 화면에 보이지 않고있습니다.infinite/endless scroll(무한 스크롤)기능을 추가해야하는지 싶어서 이렇게 문의드립니다.activity_board_inside.xml<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".board.BoardInsideActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/titleArea" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:gravity="center" android:text="title" android:textColor="@color/black" android:textSize="20sp" android:textStyle="bold" /> <ImageView android:id="@+id/boardSettingIcon" android:layout_width="20dp" android:layout_height="40dp" android:layout_margin="10dp" android:src="@drawable/main_menu" android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/black"> </LinearLayout> <TextView android:id="@+id/timeArea" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="right" android:text="time" /> <TextView android:id="@+id/textArea" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="20dp" android:background="@drawable/background_radius" android:padding="10dp" android:text="여기는 내용 영역" android:textColor="@color/black" /> <ImageView android:id="@+id/getImageArea" android:layout_width="match_parent" android:layout_height="300dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" /> <ListView android:id="@+id/commentLV" android:layout_width="match_parent" android:layout_height="600dp" /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="match_parent" android:layout_alignParentBottom="true" android:background="@color/white" android:layout_height="60dp"> <EditText android:id="@+id/commentArea" android:hint="댓글을 입력해주세요" android:layout_marginLeft="10dp" android:layout_width="320dp" android:layout_height="match_parent" android:background="@android:color/transparent"/> <ImageView android:id="@+id/commentBtn" android:src="@drawable/btnwrite" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </RelativeLayout> </layout>BoardInsideActivity.ktpackage com.example.mysolelife.board import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import com.bumptech.glide.Glide import com.example.mysolelife.R import com.example.mysolelife.comment.CommentLVAdapter import com.example.mysolelife.comment.CommentModel import com.example.mysolelife.databinding.ActivityBoardInsideBinding import com.example.mysolelife.utils.FBAuth import com.example.mysolelife.utils.FBRef import com.google.android.gms.tasks.OnCompleteListener import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.ValueEventListener import com.google.firebase.ktx.Firebase import com.google.firebase.storage.ktx.storage import java.lang.Exception class BoardInsideActivity : AppCompatActivity() { private val TAG = BoardInsideActivity::class.java.simpleName private lateinit var binding : ActivityBoardInsideBinding private lateinit var key : String private val commentDataList = mutableListOf<CommentModel>() private lateinit var commentAdapter : CommentLVAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_board_inside) binding.boardSettingIcon.setOnClickListener { showDialog() } // 첫 번째 방법 /* val title = intent.getStringExtra("title").toString() val content = intent.getStringExtra("content").toString() val time = intent.getStringExtra("time").toString() binding.titleArea.text = title binding.textArea.text = content binding.timeArea.text = time*/ // 두 번째 방법 key = intent.getStringExtra("key").toString() getBoardData(key) getImageData(key) binding.commentBtn.setOnClickListener { insertComment(key) } commentAdapter = CommentLVAdapter(commentDataList) binding.commentLV.adapter = commentAdapter getCommentData(key) } private fun getBoardData(key : String) { val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { try { val dataModel = dataSnapshot.getValue(BoardModel::class.java) Log.d(TAG, dataModel!!.title) binding.titleArea.text = dataModel!!.title binding.textArea.text = dataModel!!.content binding.timeArea.text = dataModel!!.time val myUid = FBAuth.getUid() val writerUid = dataModel.uid if(myUid.equals(writerUid)) { binding.boardSettingIcon.isVisible = true } else { } } catch (e : Exception) { Log.d(TAG, "삭제완료") } } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w("ContentListActivity", "loadPost:onCancelled", databaseError.toException()) } } FBRef.boardRef.child(key).addValueEventListener(postListener) } private fun getImageData(key : String) { // Reference to an image file in Cloud Storage val storageReference = Firebase.storage.reference.child(key + ".png") // ImageView in your Activity val imageViewFromFB = binding.getImageArea storageReference.downloadUrl.addOnCompleteListener(OnCompleteListener { task -> if (task.isSuccessful) { Glide.with(this) .load(task.result) .into(imageViewFromFB) } else { binding.getImageArea.isVisible = false // 이미지 사진이 없을 때 } }) } private fun showDialog() { val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null) val mBuilder = AlertDialog.Builder(this) .setView(mDialogView) .setTitle("게시글 수정/삭제") val alertDialog = mBuilder.show() alertDialog.findViewById<Button>(R.id.editBtn)?.setOnClickListener { Toast.makeText(this, "수정 버튼을 눌렀습니다", Toast.LENGTH_LONG).show() val intent = Intent(this, BoardEditActivity::class.java) intent.putExtra("key", key) startActivity(intent) } alertDialog.findViewById<Button>(R.id.removeBtn)?.setOnClickListener { FBRef.boardRef.child(key).removeValue() Toast.makeText(this, "삭제완료", Toast.LENGTH_LONG).show() finish() } } fun insertComment(key : String){ // 파이어베이스 구조 // comment // - BoardKey // - CommentKey // - CommentData // - CommentData // - CommentData FBRef.commentRef .child(key) .push() .setValue( CommentModel( binding.commentArea.text.toString(), FBAuth.getTime() ) ) Toast.makeText(this, "댓글 입력 완료", Toast.LENGTH_SHORT).show() binding.commentArea.setText("") } fun getCommentData(key: String){ val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { commentDataList.clear() for (dataModel in dataSnapshot.children) { val item = dataModel.getValue(CommentModel::class.java) commentDataList.add(item!!) } commentAdapter.notifyDataSetChanged() } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()) } } FBRef.commentRef.child(key).addValueEventListener(postListener) } }
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
array,plus(...) 에 대한 질문입니다 ㅎ
안녕하세요 좋은강의 감사합니다.제가 잘못한건지, array.plus(300)후 foreach 를 활용해 프린트를하여도 300이라는 값은 안나오더라구요..plus 확장함수를 살펴보니 새로운 객체를 copy 하여 return 해주던데,새로운 객체로 return 받아서 활용해야하지 않나요?예를 들어 val newArray = array.plus(300) 이런식으로요제가 잘못 생각한 것인지..ㅜㅜ별거아닌거 같긴한데 확인가능하실까요 ㅎ
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
enum, sealed과 when
안녕하세요! 강의 잘 보고 있습니다!enum과 sealed를 when과 함께 쓰는 부분을 보고 궁금증이 생겨 질문드립니다!제가 느끼기에 when 문은 자바의 switch문과 유사하다고 생각이 들어요. switch문이나 if-else 같은 경우 많이 사용하면 유지보수 측면에서도 힘들고 안 좋다는 의견을 많이 들었어요. 그래서 enum 각 내부 필드가 로직을 가지게 하여 if-else를 없애거나, 팩토리를 만들어 switch문을 최소화하거나 하는식으로 구현한다고 알고 있습니다. 이런 측면에서 if-else나 switch는 많이 쓰지 않는게 좋은 것 같은데 when은 조금 다르게 봐야하는건지 궁금합니다. 실제로도 when을 많이 사용하나요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
User Entity 생성 관련 질문입니다.
안녕하세요.강의 덕분에 코틀린을 잘 배우고 있는 수강생 입니다.다름이 아니라, 예저 소스에서 User Entity로 DB에 테이블을 생성하고 있는데,제가 별도로 만든 프로젝트에서는 동일하게 User로 Entity 어노테이션을 붙이고 애플리케이션을 시작하면 에러가 발생하길래 에러 내용으로 찾아봤더니, User Entity를 user라는 이름으로 테이블을 생성하려고 하는데, user는 사용할 수 없는 이름이라는 것 같습니다(예약어)예제 소스와 동일하게 설정을 했는데 제가 놓치고 있는 부분이 있는 걸까요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
멀티 모듈에 대한 질문이 있습니다!!
안녕하세요 !! 자바 개발자가 되기 위해 학습하다가 코틀린을 새로 배우는 과정에서 이 강의를 듣게 된 학생입니다!!먼저 좋은 강의 제공해주셔서 정말 감사합니다!!멀티 모듈에서 Repository를 각각 api 모듈에 맞게 구현하고, Spring Data JPA Repository를 코어 모듈에 둔다고 하셨는데. 이런 경우에는 api 모듈에서 core와 관련된 그래들 설정(Querydsl or db 등)이 들어가겠구나 라는 생각이 들었습니다. 멀티 모듈의 장점 중 하나가 모듈의 역할에 맞게 의존성을 관리하는 것도 있다고 생각하는데, 이런 경우 이 장점을 잃지는 않을까 우려됩니다.그래서 저는 멀티모듈을 사용할 때, core 모듈에 Repository와 관련한 코드를 놓고, 사용하는 모듈에서 인터페이스, 혹은 Repository를 참조하는 구현체를 만들어 해당 클래스만 사용하게끔 유지하는 게 좋지 않을까 생각하는 편인데요. 혹시 강사님의 의견은 어떠신지 궁금합니다!!(적고 보니 강의 내용과는 조금 다른 질문인 것 같아 조금 죄송스럽네요 ㅠㅠ)
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 컨텍스트에 대한 질문입니다.
안녕하세요. 강의를 듣던중 테스트와 관련해서 한가지 궁금한 점이 있어서 질문 남깁니다.일단 저는 현업에서 @SpringBootTest 를 사용하지 않고 서비스 계층은 목킹을 해서 별도의 스프링 컨텍스트를 사용하지 않고 테스트를 하고 있습니다. 문제는 컨트롤러 계층을 테스트 할 때인데요. @WebMvcTest 로 테스트를 할 때 하나의 컨트롤러를 테스트 할때는 상관이 없지만 통합테스트 형태로 모든 테스트를 실행시에는 @WebMvcTest 가 각각 달린 컨트롤러 테스트마다 별도의 스프링 컨텍스트가 뜨기 때문에 테스트가 느려지는데요. (모든 컨트롤러 테스트가 같은 빈 조합을 사용한다면 같은 컨텍스트를 사용하겠지만 그런 경우는 거의 없기 때문에 각각의 테스트 클래스마다 대부분 스프링 컨텍스트가 새로 뜨는거 같습니다.)그래서 하나의 추상 컨트롤러 테스트에만 @WebMvcTest 를 달고 여기에 모든 테스트 대상 컨트롤러를 다 추가하고 이 추상 클래스를 상속받아 각각의 테스트 클래스를 사용하고 있습니다. 그래서 전체 테스트 시에는 테스트 속도가 빠라졌지만, 이렇게 하다보니 하나의 컨트롤러 테스트를 할 때도 상속받은 추상클래스에 있는 모든 테스트 컨트롤러가 다 임포트 되어 하나의 컨트롤러 테스트가 너무 느려졌고, 단위 테스트의 의미가 사라지는거 같습니다. 혹시 이와 관련해서 좋은 방법이 없을까 해서 질문을 남깁니다. 그리고 @SpringBootTest 시에는 각각의 테스트 말고 전체를 테스트 할 때 @WebMvcTest 를 할 때처럼 스프링 컨텍스트가 여러개 떠서 테스트 속도가 느려지는 문제가 없을까요? 항상 @SpringBootTest 는 무겁다는 생각 때문에 잘 사용을 안해서 궁금하네요. 그리고 현업에서 @SpringBootTest 를 자주 사용하는지도 궁금합니다. 저는 주로 @WebMvcTest, @DataJpaTest 이정도를 사용하고 도메인 계층은 일반 클래스 처럼, 서비스 계층은 모킹만 해서 스프링 도움없이 테스트를 하고 있습니다.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
리턴 값 생략에 대하여
안녕하세요 자바에서 코틀린으로 넘어가고 싶어 강의를 들으며 차근차근 공부중입니다.인텔리제이에서 option + command + v 단축키를 사용하면 바로 리턴 타입을 알 수 있어서 자바 개발을 할 때 자주 사용 했습니다. 하지만 코틀린은 기본적으로 타입의 명시가 생략되어 있어서 그런지 같은 단축키로 리턴타입이 나오지 않더라구요기존 자바의 경우"ABC".startsWith("A"); 에 option + command + v 를 사용하면boolean a = "ABC".startsWith("A"); 이렇게 startsWith()의 리턴 값이 boolean이라는 것을 알 수 있는데코틀린의 경우val startsWith = "ABC".startsWith("A") 이렇게 나옵니다.제 생각에는val startsWith: Boolean = "ABC".startsWith("A")이런식으로 나와야 할 것 같은데 말이죠물론 메서드에 마우스를 올리면 리턴 타입을 알 수 있지만자바 개발하면서 익숙해진 단축키라 코틀린에서도 유용하게 활용할 수 있는지 궁금합니다.그리고 실무에서 개발 할 때에도 리턴타입이 없다면 많이 불편할 것 같은데 아직 자바에서 벗어나지 못해하는 걱정인걸까요...?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 realtime datatbase 데이터에 안뜹니다.
안녕하세요. firebase 데이터 추가 강의 듣고 있습니다. 실행에 오류는 없는데 눌러도 데이터에 변화가 없습니다. class ContentListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_content_list) // Write a message to the database val database = Firebase.database val myRef = database.getReference("contents") myRef.push().setValue( ContentModel("title1", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYPPY%2Fbtq66v0S4wu%2FRmuhpkXUO4FOcrlOmVG4G1%2Fimg.png", "https://philosopher-chan.tistory.com/1235?category=941578") ) myRef.push().setValue( ContentModel("title2", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznKK4%2Fbtq665AUWem%2FRUawPn5Wwb4cQ8BetEwN40%2Fimg.png", "https://philosopher-chan.tistory.com/1236?category=941578") ) myRef.push().setValue( ContentModel("title3", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtig9C%2Fbtq65UGxyWI%2FPRBIGUKJ4rjMkI7KTGrxtK%2Fimg.png", "https://philosopher-chan.tistory.com/1237?category=941578") ) val rv : RecyclerView = findViewById(R.id.rv) //리사이클 뷰 생성 // 데이터 삽입 val items = ArrayList<ContentModel>() items.add(ContentModel("title1", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYPPY%2Fbtq66v0S4wu%2FRmuhpkXUO4FOcrlOmVG4G1%2Fimg.png", "https://philosopher-chan.tistory.com/1235?category=941578")) items.add(ContentModel("title2", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznKK4%2Fbtq665AUWem%2FRUawPn5Wwb4cQ8BetEwN40%2Fimg.png", "https://philosopher-chan.tistory.com/1236?category=941578")) items.add(ContentModel("title3", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtig9C%2Fbtq65UGxyWI%2FPRBIGUKJ4rjMkI7KTGrxtK%2Fimg.png", "https://philosopher-chan.tistory.com/1237?category=941578")) val rvAdapter = ContentRVAdapter(baseContext, items) //어뎁터 생성 rv.adapter = rvAdapter rv.layoutManager = GridLayoutManager(this, 2) rvAdapter.itemClick = object : ContentRVAdapter.ItemClick{ override fun onClick(view: View, position: Int) { Toast.makeText(baseContext, items[position].title, Toast.LENGTH_LONG).show() val intent = Intent(this@ContentListActivity, ContentShowActivity::class.java) //url 넘겨주기 intent.putExtra("url", items[position].webUrl) startActivity(intent) } } } }
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Unresolved reference: item
안녕하세요. 컨텐츠 리스트 만들기 - RecyclerView 2 강의의 7:17를 듣고 있습니다. 강의 똑같이 따라 치고 있는데 Unresolved reference: item 라고 오류가 나는데 왜 그러는 걸까요? package com.example.mysololife.contentsList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.mysololife.R class ContentRVAdapter (val items : ArrayList<ContentModel>) : RecyclerView.Adapter<ContentRVAdapter.Viewholder>() { //아이템 하나 하나 가져와 하나의 레이아웃 만들기 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentRVAdapter.Viewholder { val v = LayoutInflater.from(parent.context).inflate(R.layout.content_rv_item, parent, false) return Viewholder(v) } override fun onBindViewHolder(holder: Viewholder, position: Int) { holder.bindItems(items[position]) } //전체 아이템의 갯수가 몇 개 override fun getItemCount(): Int { return items.size } // 아이템의 내용물을 넣을 수 있도록 연결 inner class Viewholder(itemView: View): RecyclerView.ViewHolder(itemView){ fun bindItems(items : ContentModel){ val contetTitle = itemView.findViewById<TextView>(R.id.textArea) contetTitle.text = item.title } } }
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
repository mocking 문의
안녕하세요~ 최태현님 테스트 코드 작성에 있어서 고민이 있어 문의남깁니다. 이전까지 다른 강의 영상에서는 repository를 mocking해서 서비스를 테스트하는 영상을 많이 봤습니다. 그래서 서비스 테스트시에는 repository 를 mocking 하는것이 실무에서 흔한 방식이고 best practice라고 생각했습니다 그런데 실무에서 적용해보니 mocking을 하게되면 테스트 코드가 서비스 메소드의 내부 구현에 대해 너무 잘 알게되더라구요, 그러다보니 실제 코드의 내부 구현이 바뀌면 테스트 코드도 바뀌게 될 여지가 많더라구요.. 반면 스프링부트 테스트로 h2에 연결해서 하는 테스트는 상대적으로 느려 피드백이 늦는것이 단점일것같습니다. 개인적으로는 강의에 나온것처럼 스프링 부트 테스트로 h2에 연결해서 테스트하는 후자가 더 마음에 드는데요. 실제로 현업에서는 서비스 테스트시 둘중 어떤걸로 사용하시나요? 실제 강의하신것처럼 후자로 테스트를 많이 하시나요? 좋은 강의 감사합니다~
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
강의 질문이요
이 앱을 만들고 본인이 그 앱에 게시물을 올리면 자기만 볼 수 있게 할 수 있나요?? 몇 개를 올리고 자기가 올린 게시물만 모아볼 수 있게요..
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
코틀린으로 엔티티 작성
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의의 내용과 질문이 관계 없을수도 있지만 정답이 있는 부분이 아닌 것 같아 너무 궁금해서 남겨봅니다.. ㅠ 강의중에 코틀린을 사용할 때 되도록 불변으로 만드는 것이 좋다고 하셔서 User 엔티티를 이런식으로 작성했습니다. 이렇게 되면 유저의 필드를 변경하고 싶을 때 새로운 User 객체를 만들어야 합니다. 그래서 User 엔티티 안에 이런 메서드를 작성했습니다. 두 번째 방법으로 private set을 사용해서 setter만 막고 updateName 함수를 만들어줬습니다. 세 번째로 프로퍼티를 아예 private으로 설정하고 getter와 updateName 함수를 만들어줬습니다. 네 번째는 그냥 var로 만들어 기본 생성되는 getter와 setter를 사용한다 입니다. 정답이 있는 문제는 아니지만 저는 2, 3번이 좋은 방법이라는 생각이 듭니다. 그런데 자바의 저런 보일러 플레이트 코드들을 줄일 수 있는 것이 코틀린의 장점중 하나인데, 저렇게 사용하면 무슨 소용이 있나 싶기도 합니다. 그러다보니 코틀린은 getter, setter를 사용하는 것을 권장하게 설계되어있나? 라는 생각이 듭니다. 1번이나 4번 처럼 사용하는 것이 좀 더 코틀린스러운 개발 방법일까요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
프래그먼트 바인딩
똑같이 따라했는데 이런 오류가 생겼어요,, 검색해도 잘 안 나오고 뭐가 문제인지 모르겠습니다ㅠㅠ
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
함수 null 질문드립니다.
@nullable public String getName() { return name; } - 위 함수는 리턴타입이 reference 타입이니 어노테이션을 지우면 참조형식이 될거 같은데 플랫폼 타입이 되는데 함수만 그런 규칙이 적용이 되는건가요?