강사님 안녕하세요. 코틀린을 자바처럼 쓴 제 자신을 혼내면서(?) 열심히 청강 중입니다. 강의에서 작성하신 Transactional.kt 코드를 보면 스프링의 TransactionTemplate을 활용한 명시적 트랜잭션 제어 방식과 큰 차이점이 없어 보입니다. 코틀린 래핑방식으로 사용했을때 어떤 장점이 있는걸까요? 제가 생각한 래핑 방식의 장점은 다음과 같습니다. 코드 스타일, 네이밍, optional 옵션 추가 등에서 약간 더 자유로움 예를 들어 여러 종류의 트랜잭션 처리 규칙(특정 로그, 메트릭, 롤백 조건 등)을 한곳 에 구현해서 공용유틸로 쓰기 좋고, 내부 구현을 추후 TransactionTemplate, PlatformTransactionManager 등 다양한 방식으로 손쉽게 변경 가능 트랜잭션 코드에 특별히 넣어야 할 커스텀 공통로직"이 없다면, 웬만하면 @Transactional / TransactionTemplate만으로 충분하다는 생각입니다. 정답은 없고 팀의 규칙마다 다를것 같아요. 강사님 팀에서는 어떤 방식으로 사용중이신가요? 강의 찍어주셔서 감사합니다앗~! (개인적인 사견인데 말씀하시는 중에 '죄송합니다'는 안하셔도 될것 같아요~!)
강사님 안녕하세요. 코틀린을 자바처럼 쓴 제 자신을 혼내면서(?) 열심히 청강 중입니다. 강의에서 작성하신 Transactional.kt 코드를 보면 스프링의 TransactionTemplate을 활용한 명시적 트랜잭션 제어 방식과 큰 차이점이 없어 보입니다. 코틀린 래핑방식으로 사용했을때 어떤 장점이 있는걸까요? 제가 생각한 래핑 방식의 장점은 다음과 같습니다. 코드 스타일, 네이밍, optional 옵션 추가 등에서 약간 더 자유로움 예를 들어 여러 종류의 트랜잭션 처리 규칙(특정 로그, 메트릭, 롤백 조건 등)을 한곳 에 구현해서 공용유틸로 쓰기 좋고, 내부 구현을 추후 TransactionTemplate, PlatformTransactionManager 등 다양한 방식으로 손쉽게 변경 가능 트랜잭션 코드에 특별히 넣어야 할 커스텀 공통로직"이 없다면, 웬만하면 @Transactional / TransactionTemplate만으로 충분하다는 생각입니다. 정답은 없고 팀의 규칙마다 다를것 같아요. 강사님 팀에서는 어떤 방식으로 사용중이신가요? 강의 찍어주셔서 감사합니다앗~! (개인적인 사견인데 말씀하시는 중에 '죄송합니다'는 안하셔도 될것 같아요~!)
안녕하세요 강의를 듣고 있는 수강생 입니다. 다시 강의를 보면서 공부 중인데, 안드로이드 스튜디오가 버전이 업그레이드(미어캣 버전)가 되어서 설치 후 콘솔창에 간단하게 문구 출력을 하려고 해보니 한글이 깨지는 현상이 발생 합니다. 검색을 해서 위와 같은 현상을 해결해보려고 했으나, 안되서 질문 남깁니다. 방법을 알려 주시면 감사드리겠습니다.
안녕하세요 강사님 23강 강의를 보다가 한가지 여쭤보고 싶은 사항이 있어서 질문을 남기게 됐습니다. 11분 46초 부분을 보면 equals 가 제대로 동작하지 않아서 if (javaClass != other?.javaClass) return false 해당 부분을 삭제하는 부분이 나오는데요. 해당 코드를 해석해보면 2개의 javaClass가 다르기 때문에 equals 가 false가 나왔다는 의미 같은데, 혹시 2개의 javaClass가 다른 이유가 무엇인지 알려주실 수 있으실까요? 똑같은 타입의 클래스를 인스턴스화 했기 때문에 동일한 javaClass라고 생각을 했는데 2개가 다르다고 나오니 이해가 잘 되지 않습니다! 감사합니다.
저같은 경우, 7:32 부분에서 List<GoldFish> 를 저장했다가 List<Carp> 타입을 꺼내려고 하면 "class generic.GoldFish cannot be cast to class generic.Carp (generic.GoldFish and generic.Carp are in unnamed module of loader 'app')" 와 같은 오류가 발생하는데, 정상적으로 금붕어 리스트가 반환되는게 맞는지요 ? 제가 뭔가 놓친 부분이 있을까 궁금하여 문의 드립니다. 샘플코드는 다음과 같습니다. package reflection import generic.Carp import generic.GoldFish import kotlin.reflect.KClass import kotlin.reflect.full.cast class TypeSafeCage { val animals: MutableMap<KClass<*>, Any> = mutableMapOf() inline fun <reified T : Any> getOne(): T { return T::class.cast(animals[T::class]) } inline fun <reified T : Any> putOne(animal: T) { animals[T::class] = T::class.cast(animal) } } fun main() { val cage = TypeSafeCage() cage.putOne(listOf(GoldFish("금붕어1"), GoldFish("금붕어2"))) cage.getOne<List<Carp>>().forEach { println(it::class.simpleName) } } // 다른 패키지 파일 package generic open class Animal( val name: String ) open class Fish(name: String) : Animal(name) class GoldFish(name: String) : Fish(name) class Carp(name: String) : Fish(name) 강의 중 영상 캡쳐 화면
강의 듣다 코드 입력 할 때 조금만 실수해도 자꾸 java.lang.NullPointerException이라 뜨고 빌드 에러가 나는데요, 이런 초보적 코드오류에도 이런 일이 자꾸 일어나면 도대체 누가 개발 진행할 수 있나 모르겠네요.혹시 개복치님은 이런 오류 해결방법을 알려 주실 수 있나요? 삭제 재설치도 1시간 이상 씩 걸리는데 미치겠네요. (이번엔 databinding프로젝트에서 오류가...)
flywayClean 실행해보면 다음과 같이 에러가 뜨는데요. 뭐가 문제인걸까요 ㅠㅠ FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flywayClean'. > Error occurred while executing flywayClean No database found to handle jdbc:mysql://localhost:3308/jooq 이전 단계에서 다음과 같이 세팅은 잘 마쳤어요. val jooqVersion: String by extra("3.19.21") val dbUrl = "jdbc:mysql://localhost:3308/jooq" val dbUsername = "root" val dbPassword = "1234" val dbDrive = "com.mysql.cj.jdbc.Driver" ... flyway { driver = dbDrive url = dbUrl user = dbUsername password = dbPassword locations = arrayOf("classpath:db/migration") }
혹시 최신버전인 미어캣으로 수강해도 괜찮을까요? BTS앱 까진 돌핀으로 수강했는데 Twice로 넘어오니 오류가 자꾸 생깁니다. 액티비티를 하나 더 추가하고 - intent문은 복붙도 안했는데 - 화면이 에뮬레이터에서 어떻게 나오나 보려고 빌드하고 앱실행했더니 java.lang.NullpointException Error가 뜨는데, 버전이 안맞아서 그래들과 sdk버전을 올리라는데 초보라 해결방법도 모르겠고요 최신버전이면 이런 오류가 안나지 않을까 해서 그럽니다. (안드로이드 스튜디오를 클린 삭제하고 몇번이나 다시 해봐도 같은 오류가 다시 생기네요.)
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 위 문장을 붙여 넣기 한 직후 안드로이드 스튜디오 미어캣 버전이나 돌핀 버전 모두에서 에러가 나며 실행되지 않습니다. 돌핀에선 "Nullpointer exception error"가 나타나고 미어캣에선 "Element intent-filter is not allowed here: 18"이라고 에러가 뜨며 실행되지 않습니다. 아마도 인텐트 문장을 쓰는게 문제인 듯 한데 강사님의 안드로이드 스튜디오 버전과 설정사항을 알려주시면 해결할 수 있지 않을까 합니다. 답변 부탁드립니다.
안녕하세요! 제네릭 활용 실사례 학습 자료 중 API 응답 처리에 대한 내용이 있어서 질문드립니다. API 응답 처리 시 ApiResponse<out T> 와 같은 sealed class를 만들어 커스터마이징하여 사용하는 것이 이점이 있을지, 아니면 이미 코틀린 내장 클래스로 존재하는 Result 클래스 활용하는 것이 나을지 궁금하여 질문드립니다. sealed class ApiResponse<out T> data class Success<out T> (val data : T, val message : String) : ApiResponse<T>() data class Error(val message : String) : ApiResponse<Nothing>() fun <T> handleResponse(response: ApiResponse<T>) { when (response) { is Success -> println("Success: ${response.message}") is Error -> println("Error: ${response.message}") } } 위처럼 커스텀하면 장점은 클라이언트 측과 통신할 때 서로 합의한 방식과 원하는 데이터를 자유롭게 전달할 수 있다는 장점이 있지만 Result에서 제공하는 함수형 메서드(fold,map등)를 활용하지 못하는 단점이 있다고 생각합니다. 반대로 Result를 사용하면 제공되는 함수형 메서드도 활용할 수 있지만, 응답 json을 커스터마이징 할 수 없다는 단점이 있습니다. 이처럼 각자의 장단점이 있다보니, 장점을 모두 사용할 수 있도록 서비스 계층에서 Result를 반환하고 이를 컨트롤러에서 ApiResponse로 타입 변경하는 것은 어떤가요? 함수형 프로그래밍에 위반하진 않는지 궁금합니다. 둘을 혼합해서 사용하는 것이 최선인지,, 각각 상황에 맞춰 써야하는 것인지 잘 느낌이 오지 않아 질문드립니다!
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요? 강의는 이미 구입하였으나 그동안 다른일로 바빠서 수강을 미루다가 이제서야 들을려고 하는데 공유해주신 샘플 프로젝트를 다운받아서 실행할려고 하니 다음과 같은 에러가 발생해서 문의드립니다. Execution failed for task ': com.group .libraryapp.LibraryAppApplication.main()'. > Process 'command 'C:/Program Files/Amazon Corretto/jdk17.0.14_7/bin/java.exe'' finished with non-zero exit value 1 다른 버전의 JDK나 아마존에서 배포하는 JDK를 다운받아서 실행해보아도 동일한 에러가 계속 반복되어서 문의드립니다. 참고로 사용중인 IDE는 IntelliJ IDEA 2024.3입니다. 감사합니다.
안녕하세요. 문제를 풀다가 애매하다고 생각되는 부분이 있어서 질문드립니다. 퀴즈 4에서 b 를 보면, b. push 메서드는 Any 타입의 값도 받을 수 있다. 라고 적혀있고, Stack 클래스는 런타임 시 T의 타입이 결정되기 때문에 Any가 들어올 수 없다고 설명주셨습니다. 다만 궁금한 부분은 Stack<Any>와 같이 런타임 시 T가 Any 타입으로 설정된다면 push 메서드도 Any 타입 값을 받을 수 있다고 봐야 할 꺼 같은데, 문제 의도가 "push 메서드는 T 타입의 값을 받아야한다" 이기 때문에 b 가 틀린 설명인지 궁금합니다. 결국 런타임 시점에 Stack에 어떤 타입이 적용되냐에 따라 Any 타입의 값을 받을 수도 있고, 안될 수도 있는 것 아닌가 해서요.