묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
섹션2 인트로 페이지 꾸미기 질문 드립니다.
해당 강의에서 introActivity layout을 작성하실 때왜 RelativeLayout을 사용하신건지 궁금합니다 또한, 큰 틀은 ConstraintLayout을 유지한 채로 RelativeLayout을 만드셨는데 그 이유도 궁금합니다
-
해결됨코틀린 코루틴 완전 정복
코루틴 이름 출력관련해서 질문이 있습니다!
println("[${Thread.currentThread().name}] 코루틴 실행2") 위 코드 실행할 때 실행결과가 아래와 같이 나오는데 @coroutine#1 어떻게 이렇게 코루틴 이름까지 같이 나오게 할 수 있나요?! [출력 결과] [MyThread1 @coroutine#1] 코루틴 실행 2
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!
안녕하세요, 오랜만에 흥미로운 강의를 알게되어 주말동안 강의를 몰아보다보니 9강까지 듣게 되었네요. 23분 59초 정도에 setter를 지양하기 떄문에 custom setter를 잘 사용하지 않고, update함수를 만들어 사용한다 라는 내용에 예시가 있다면 알 수 있을까요? java 프로젝트를 활용할 때 setter를 커스텀하게 수정해서 쓰는 경우가 아주 간혹 값이 업데이트 될 때 다른 필드를 함께 업데이트 해야하는 케이스들 때문에 사용했던 기억이 있는데, setter를 사용하지 않고 update를 사용한다는게 어떤 말씀이신지 조금 더 상세히 알려주시면 감사하겠습니다!
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시판 글을 길게 쓸경우
게시판에 글을 길게 쓰고 업로드 할 경우 게시판 글 리스트에서 글의 처음 일부만 보여주고 나머지 글자들은 ... 처리를 하고 싶은데 어떻게 해야 할 지 모르겠습니다. (구분 선 아래로 글을 먹는 오류가 생깁니다.)
-
해결됨코틀린 코루틴 완전 정복
coroutineScope에 대해 질문 있습니다.
suspend fun searchByKeyword(keyword: String): Array<String> = coroutineScope { val dbResultsDeferred = async { searchFromDB(keyword) } val serverResultsDeferred = async { searchFromServer(keyword) } return@coroutineScope arrayOf(*dbResultsDeferred.await(), *serverResultsDeferred.await()) }안녕하세요 "일시 중단 함수의 사용" 학습 중 나온 코드에 대해 질문 드립니다.강의에서는 "coroutineScope을 사용하면, 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있다."라고 하셨는데, 이 부분이 이해가 잘 안갑니다.먼저 coroutineScope {}를 선언하고, async 비동기 작업 -> delay 일시중단 순으로 진행되는데 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있는 것이 이해가 잘 가지 않습니다.제가 정리하기로는, "coroutineScope을 사용하면, 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있다."라기 보다는 위 그림처럼 "하나의 coroutineScope에 2개의 비동기 작업과 각각의 일시중단 함수를 포함하는 것"으로 받아들여지는데 제가 어느 부분을 놓치고 있는건지 잘 모르겠습니다. 감사합니다. ^^
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
13강 User Kotlin 변환중
User.kt , BookService 부분에서 오류가 나는데 원인을 못 찾겠네요
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
리스트 뷰 질문 드립니다.
package com.jinyoung.myapplication import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter class ListViewAdapter(var List : MutableList<String>) : BaseAdapter() { override fun getCount(): Int { return List.size } override fun getItem(p0: Int): Any { return List[p0] } override fun getItemId(p0: Int): Long { TODO("Not yet implemented") } override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { TODO("Not yet implemented") } }이 코드에서 3번째 함수 getItemId 함수의 return 값이 List[p0].toLong()이 되어야하는거 아닌가요????
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
java class의 NotNull 어노테이션 인식
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, 2강 코틀린에서 null을 다루는 방법 수강중 궁금한 지점이 생겨 문의드립니다.name이라는 필드에 NotNull 어노테이션을 달아주어서 인스턴스 초기화시 null값은 받을 수 없게 하고싶었는데이런 경우에는 null을 대입해도 에디터상에서 에러를 짚어주지 못하더라구요.회사 프로젝트를 전환하는 과정중에는 이런 문제가 꽤나 발생할 것 같은데 좋은 해결책이 있을까요? package com.lannstark.lec02; import org.jetbrains.annotations.NotNull; public class Person { @NotNull private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } }package com.lannstark.lec02 fun main() { val person = Person(null) startsWithA(person.name) }
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
DBeaver 연결부터 도커로프로젝트 빌드까지 안됩니다.
https://github.com/WooXher/kotlin-study-portfolio 백엔드 프로젝트 참여중인 인원입니다 오후부터 강의 들으면서 따라하고 있는데 첫 mysql 연결시는 3306포트가 사용중이라고 하여 3307로 변경하고 실행하였는데 테스크 커넥션에서 비밀번호가 거부되어 연결이 안되어서 넘기고 프로젝트 빌드이후로 시작하고 있는데 디비연결이 안되어서 그런지 데이터가 보이지 않았습니다. 이것저것 수정하다보니 이젠 프로젝트 자체도 연결이 안되고 있는데 어떻게 해야하나요?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
뷰 개발 파일 없음
다운받은 파일에서assets/vendor/quill/quill.min.js.quill.min.js가 존재하지않는데 그냥 진행해도 될까요? fragment-foot<script src="assets/vendor/quill/quill.min.js" th:src="@{/assets/vendor/quill/quill.min.js}"></script>페이지 실행은 잘 되는데 파일이 존재하지않아서 에러가 나옵니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
fragment 분리 에러
타임리프 뭐가 문제일까요? 아무리 찾아봐도 모르겠습니다ㅜ https://github.com/lee-soohyun/portfolio-lee/commit/56f4909c2ceb6c6e5ad1b6dbb9603e0c2233a825
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
admin 페이지에서 projectSkill 질문 있습니다
admin 페이지 중 왼쪽에 사이드바에서 projectSkill 클릭할 때 url 이 "/admin/project/skill" 이 아닌, "admin/projectSkill" 로 넘어가져서 오류 페이지로 이동된다면 어디를 고쳐야 할까요? @Controller @RequestMapping("/admin/project/skill") class AdminProjectSkillViewController( private val adminProjectSkillService: AdminProjectSkillService ) { @GetMapping fun projectSkill(model: Model): String { val proejctList = adminProjectSkillService.getProjectList() val skillList = adminProjectSkillService.getSkillList() val formElements = listOf<FormElementDTO>( SelectFormElementDTO("project", 8, proejctList), SelectFormElementDTO("skill", 4, skillList) ) model.addAttribute("formElements", formElements) val table = adminProjectSkillService.getProjectSkillTable() model.addAttribute("table", table) model.addAttribute("detailTable", null) val pageAttributes = mutableMapOf<String, Any>( Pair("menuName", "Projects"), Pair("pageName", table.name), Pair("editable", false), Pair("deletable", true), Pair("hasDetails", false), ) model.addAllAttributes(pageAttributes) return "admin/page-table" } }
-
미해결더 자바, 코드를 조작하는 다양한 방법
코틀린 컴파일에 대해서
자바, jvm, jdk 그리고 jre 강의에서 kotlinc 명령어로 .kt 파일을 컴파일하시는걸 봤는데요, 코틀린 컴파일러는 jdk에 포함되어 있는 것이 아니고 따로 설치해야 하는게 맞을까요? jre는 java의 실행환경을 제공하고, jdk는 개발 도구 키트를 제공해서 java를 컴파일하는 javac 등의 명령어? 툴?은 jdk에 포함되어 있다고 강의 교안에 적혀있는데그럼 코틀린의 컴파일러는 추가적으로 설치가 필요한지, 아니면 뭔가 방법이 있는지 궁금합니다. 우선 컴파일하면 바이트 코드가 되기 때문에 런타임에 필요한 라이브러리만 포함하여 패키징하면 jre에서 실행할 수 있다는 것은 이해했습니다!
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
서버 배포 후 수정하려고 하면
프로젝트 수정새로운 Jar 파일 만들기Dockerfile 실행docker-compose.yml 실행docker 데스크탑에서 이미지 올라갔는지 확인 후 docker hub 에 push만들어둔 vm 인스턴스 ssh 콘솔에 docker-compose.yml 수정 및 up 명령어 사용 이렇게 하면 될까요? 방법을 잘 모르겠습니다...
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
[16강] 확장함수 관련 질문입니다!
안녕하세요 강사님 확장함수 관련하여 질문이 있습니다. 강의 중에 확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다.라고 말씀해주신 부분이 있습니다. 제가 확장함수를 이해하기로는 특정 클래스에 내가 사용할 특정 로직을 심는 함수라고 이해를 했습니다. 이렇게 이해를 하고 나니어짜피 외부에서는 확장함수로 추가할 원본 클래스의 private 혹은 protected 멤버에 접근이 불가능할텐데,확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다. 내용은 어디에 어떻게 적용이 되는 것인지 이해가 잘 가지 않습니다. 혹시 어떠한 경우에 적용이 되는 내용인지 조금 더 구체적인 예시를 들어주실 수 있으실까요 ?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
docker-compose 파일 작성하기 질문 있습니다.
docker-compose 실행을 하면 사진과 같은 오류가 발생하는데 어떻게 해결해야할 지 모르겠습니다. 인터넷에 찾아봐도 자료가 많지 않아 질문 드립니다..
-
미해결2시간으로 끝내는 코루틴
코루틴을 잘 사용하고 있는지 궁금합니다.
강사님 강의를 듣고 배치 단위로 요청을 가져와 Redis 서버에서 작업을 처리하는 부분에 코루틴을 적용하려고 합니다. 강의를 통해 최소한의 스레드로 여러 코루틴을 실행해야 코루틴을 극대화할 수 있다고 이해했습니다. n개의 요청은 모두 독립적이며 배치 단위로 가져온 이유는 1개의 스레드로 여러 코루틴을 실행하기 위함입니다. Redis는 마스터에서만 작업이 가능하므로 요청을 보내고, 응답받아 후속 처리하는 부분을 Redis 서버로 요청 (코루틴1)Redis 서버로부터 응답받아 후속 처리 (코루틴2)로 분리했습니다.1개의 스레드에서 여러 코루틴을 동작시키기 위해 이런 기준으로 코루틴의 중단 지점을 생성하는 것이 적절한지 궁금합니다. 또한 n개의 요청을 모두 Redis 서버로 보낸 후 응답 받는 것이 아니라응답을 받고 후속 처리가 가능한 요청은 ‘모든 요청을 Redis 서버로 전달했다는 여부와 상관없이’ 후속처리를 하기 위해 다음과 같이 코드를 작성했습니다. coroutineScope { val jobs = userIds.map { userId -> async { // main 스레드가 처리 val result = 레디스 접근 메서드 (RedisTemplate) Pair(userId, result) } } jobs.forEach { job -> launch(Dispatchers.IO) { val (userId, status) = job.await() // 응답에 대한 후속 처리 // 결과마다 다른 DefaultDispatcher-worker 가 처리 } } }위와 같이 작성하면 Redis로 요청을 보내는 부분은 1개의 main스레드가 처리하지만, 후속 처리는 결과마다 다른 DefaultDispatcher-workder가 처리합니다. 이는 결과마다 다른 스레드가 처리하는 것이 맞다면 이 코드는 코루틴을 제대로 사용하지 못하고 있다고 생각하는데 제 생각이 맞는지 궁금합니다.coroutineScope { launch { for(userId in userIds) { val result = 레디스 접근 메서드 channel.send(Pair(userId, result)) } channel.close() } launch { for(result in channel) { // 응답에 대한 후속 처리 } } }위와 같이 작성하면 1개의 main 스레드가 모든 작업을 처리합니다. 이렇게 작성해야 코루틴을 제대로 사용하는 것이 맞는지 궁금합니다. 강의 잘 들었고 감사합니다!
-
미해결코틀린 코루틴 완전 정복
공유 스레드풀에 대하여 질문 있습니다
안녕하세요. 1) "미리 정의된 CoroutineDispatcher - 1. Dispatchers.IO, Dispatchers.Default" 강의 중 마지막 부분에서 Dispatchers.IO와 Dispatchers.Default가 사용하는 스레드의 이름이 동일한 이유는 공유 스레드풀 때문이라고 하셨는데, 이 부분이 이해가 잘 가지 않습니다.이것이 중요한 이유가 각각의 Dispatcher가 사용하는 스레드가 실제로는 다름에도 불구하고, 이름은 동일하기 때문에 헷갈리면 안되기 때문인가요? 제가 강조하신 부분을 잘 이해한건지 모르겠습니다.2) LimitedParallelism은 코루틴 사용 시 모든 부분에 적용해야 하는 것인가요? 아니면 특정 경우에만 사용하면 되는 것인가요?3) Code3-1~3-4를 실행할 때 어떤 때는 스레드 이름이 DefaultDispatcher-worker-1,2,3으로 뜨지만 또 어떤 때는 1,2,1 또는 1,2,4 또는 1,2,5 이런식으로 뜨는데 이유가 무엇인가요?감사합니다!
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
앱 테스트 구동이 안돼요
BTS 강의 레이아웃에 사진삽입 6분 4초쯤 보고 있는데요, 알려주신대로 다음과 같이 코드를 입력하고 앱 구동을 눌렀는데<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_1" android:layout_width="120dp" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_2" android:layout_width="120dp" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_3" android:layout_width="120dp" android:layout_height="120dp"> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_4" android:layout_width="120dp" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_5" android:layout_width="120dp" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_6" android:layout_width="120dp" android:layout_height="120dp"> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="120dp"> <ImageView android:src="@drawable/bts_7" android:layout_width="120dp" android:layout_height="120dp"> </LinearLayout> </LinearLayout> 다음 문구와 같이 에러가 떠서 테스트 구동이 안됩니다. Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.res.ParseLibraryResourcesTask$ParseResourcesRunnable 뭐가 잘못된건가요??
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
로그인 로그아웃
강의 잘 보고 있습니다다름이 아니라 로그인 로그아웃 버튼도 만들었고수업에 나온 것처럼 똑같이 코드를 썼는데도막상 작동하면 uid까진 출력되는데문제는1) 로그아웃 버튼을 누르면 null 메세지가 출력이 안 됩니다2) 그렇다고 로그아웃 버튼을 누르고 로그인 되어있던 계정을 누르면 toast로 써둔 "로그인 성공"이라는 메세지가 안 뜸 일단 MainActivity.kt에 쓴 코드와activity_main.xml에 쓴 코드를 올리겠습니다 //MainActivity.kt에 쓴 코드package com.example.mysampleapp import com.example.mysampleapp.databinding.ActivityMainBinding import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.databinding.DataBindingUtil import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase class MainActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { // Initialize Firebase Auth auth = Firebase.auth super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) Toast.makeText(this, auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show() binding = DataBindingUtil.setContentView(this, R.layout.activity_main) val joinBtnClicked = findViewById<Button>(R.id.joinBtn) joinBtnClicked.setOnClickListener { // 첫번째 방법 // val email = findViewById<EditText>(R.id.emailArea) // val pwd = findViewById<EditText>(R.id.pwdArea) //두번째 방법 val email = binding.emailArea val pwd = binding.pwdArea auth.createUserWithEmailAndPassword( email.text.toString(), pwd.text.toString() ) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show() } else { Toast.makeText(this,"no",Toast.LENGTH_SHORT).show() } } binding.logoutBtn.setOnClickListener{ auth.signOut() Toast.makeText(this,auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show() } binding.loginBtn.setOnClickListener{ val email = binding.emailArea val pwd = binding.pwdArea auth.signInWithEmailAndPassword( email.text.toString(), pwd.text.toString() ) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { //성공하면 Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show() //성공하면 UID 값을 띄워보자↓ Toast.makeText(this,auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show() } else { //실패하면 Toast.makeText(this, "로그인 실패", Toast.LENGTH_SHORT).show() } } } } } }//activity_main.xml에 쓴 코드<?xml version="1.0" encoding="utf-8"?> <layout> <LinearLayout 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" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:id="@+id/emailArea" android:hint="email" android:layout_width="match_parent" android:layout_height="wrap_content"/> <EditText android:id="@+id/pwdArea" android:hint="pwd" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/joinBtn" android:text="회원가입" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/logoutBtn" android:text="LOGOUT" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/loginBtn" android:text="LOGIN" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </layout>긴 글 읽어주심에 감사합니다....😥😥