묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨카카오 면접관과 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법
Temporal에 대해서 더 알고 싶어요.
교육을 듣다보니 Temporal에 대해서 더 알고 싶은데Temporal 공식 사이트는 너무 방대하고, 사용법 위주로 설명되어 있어서, 혹시 내부 아키텍처 같은 내용을 참고할 수 있는 자료가 있을까요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문
안녕하세요. 좋은 강의를 제공해주셔서 감사합니다. 현재 코틀린과 자바를 함께 사용하는 프로젝트를 준비 중입니다.그 과정에서 DTO를 구현할 때, 코틀린에서는 data class라는 매우 편리한 기능이 있다는 것을 알게 되었고, 이와 관련해서 질문이 있습니다.궁금한 점은,실무(특히 스프링 기반 개발)에서는 DTO를 작성할 때 자바의 Lombok을 주로 사용하는지, 아니면 코틀린의 data class를 더 많이 사용하는지입니다.또한, 두 방식의 차이점과 선택 기준에 대해서도 알고 싶습니다.감사합니다!
-
미해결코틀린 함수형 프로그래밍 - 입문편
git 업로드 가능한가요?
강의 들으며 학습하는 내용(강의 관련 코드)를 개인 git에 업로드 하여도 되나요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
코틀린에서 value class 적용 시 문제
안녕하세요 코틀린으로 현재 강의를 수강하고 있는 수강생입니다. 현재 자바로 작성된 코드를 보고 설명과 함께 어떤 이유로 이런 코드를 작성한 것인지 생각하며, 코틀린으로 이 개념을 적용하면 어떻게 작성할 수 있을지 DDD와 클린 아키텍처를 코틀린 문법 활용하여 구상하는 연습 중입니다. 현재 Member 도메인 코드 개선 강의에서 value class 적용하여 필드의 값이 바뀌는 문제(email자리에 nickname이 오더라도 같은 String이라 컴파일 에러가 안 남)를 해결하려 시도했습니다 package org.example.splearn.domain @JvmInline value class Email( val value: String, ) @JvmInline value class Nickname( val value: String, ) @JvmInline value class PasswordHash( val value: String, ) class Member private constructor( val email: Email, var nickname: Nickname, var passwordHash: PasswordHash, var status: MemberStatus, ) { fun activate() { check(status == MemberStatus.PENDING) { "회원이 PENDING 상태가 아닙니다" } this.status = MemberStatus.ACTIVATE } fun deactivate() { check(status == MemberStatus.ACTIVATE) { "회원이 ACTIVE 상태가 아닙니다" } this.status = MemberStatus.DEACTIVATED } fun verifyPassword( password: String, passwordEncoder: PasswordEncoder, ): Boolean = passwordEncoder.matches(password, this.passwordHash.value) fun changeNickname(nickname: String) { this.nickname = Nickname(nickname) } fun changePassword( password: String, passwordEncoder: PasswordEncoder, ) { this.passwordHash = PasswordHash(passwordEncoder.encode(password)) } fun isActive(): Boolean = this.status == MemberStatus.ACTIVATE companion object { fun create( memberCreateRequest: MemberCreateRequest, passwordEncoder: PasswordEncoder, ): Member = Member( email = memberCreateRequest.email, nickname = memberCreateRequest.nickname, passwordHash = PasswordHash( passwordEncoder.encode(memberCreateRequest.password.value), ), status = MemberStatus.PENDING, ) } } 강의대에서는 static 메소드인 of에서 MemberCreateRequest를 파라미터로 사옹하고 있습니다. 코틀린이라 companion object를 사용했구요 그러던 중 "헥사고날 아키텍처의 특성을 고려하면 의존성 외부 로직인 dto가 내부로 향해야 하고 따라서 도메인이 dto에 의존하는 것이 괜찮을까" 하는 의문이 들었습니다. companion object { fun create( email: Email, nickname: Nickname, password: String, passwordEncoder: PasswordEncoder, ): Member = Member( email = email, nickname = nickname, passwordHash = PasswordHash( passwordEncoder.encode(password), ), status = MemberStatus.PENDING, ) }그래서 코드를 수정해 보면 이런 식으로 수정해 볼 수 있을 것 같습니다. 이에 대해서 토비님 의견이 어떠신지 여쭙고 싶습니다
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
안녕하세요 코틀린으로 강의 수강 시 도메인 코드 질문드립니다
좋은 추석 보내고 계신가요?현재 코틀린으로 강의를 따라해 보고 있습니다. class Member private constructor( val email: String, var nickname: String, var passwordHash: String, var status: MemberStatus, ) { fun activate() { check(status == MemberStatus.PENDING) { "회원이 PENDING 상태가 아닙니다" } this.status = MemberStatus.ACTIVATE } fun deactivate() { check(status == MemberStatus.ACTIVATE) { "회원이 ACTIVE 상태가 아닙니다" } this.status = MemberStatus.DEACTIVATED } fun verifyPassword( password: String, passwordEncoder: PasswordEncoder, ): Boolean = passwordEncoder.matches(password, this.passwordHash) fun changeNickname(nickname: String) { this.nickname = nickname } fun changePassword(password: String) { this.passwordHash = password } companion object { fun create( email: String, nickname: String, password: String, passwordEncoder: PasswordEncoder, ): Member = Member( email, nickname, passwordEncoder.encode(password), MemberStatus.PENDING, ) } }이러한 식으로 작성하였는데 자바에서는 const로 선언한 객체나 변수가 아닌 이상 기본적으로 가변입니다. 그런데 코틀린에서는 val, var 키워드에 따라서 var로 선언해야 가변 타입이 됩니다. Member 도메인 모델 확장 챕터 수강하고 있는데 이 경우는 도메인에서 가변 속성을 미리 정의하고 해당 속성들을 var로 선언하는 것이 맞을지, 혹은 val을 통해 불변성을 확보하고 새 객체를 생성하여 변경을 처리하는 것이 적합할지 궁금합니다.코틀린에서 도메인 코드를 작성할 때 자바와 다른 문법&개념과 도메인 중심 설계가 종종 난해할 때가 있네요.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
코틀린에서 상속 시, 주의점에 대한 질문
태현님, 안녕하세요. 뭔가 하나 더 궁금해져서 질문을 드리게 되었습니다!아래의 두 클래스가 있다고 가정해보겠습니다.package me.sungbin.lec10 open class Base( open number: String = "100", ) { init { println("Base Class") println(number) } }package me.sungbin.lec10 class Derived( override val number: String, ) : Base() { init { println("Derived Class") } }그리고 실제로 아래와 같이 Derived 클래스의 생성자를 호출하면 number값으로는 null이 출력됩니다. 여기서 궁금한 것은 number는 non-nullable한 타입인데 null이 왜 출력이 될까? 라는 궁금증이 생겼는데요..그래서 GPT한테 물어보니 아래와 같은 답변을 얻을 수 있었습니다.레퍼런스 타입(예: String) → JVM 기본값 null이 출력됩니다. (Kotlin의 Non-null 보장도 생성 중(super 생성자 실행 중)에는 예외적으로 깨질 수 있습니다.)이렇게 들으니 뭔가 이해가 된 듯 보이는데 이게 GPT 피셜이다보니 태현님의 의견이 듣고 싶어져서 질문을 남깁니다!
-
미해결스프링은 어려워! 코틀린과 Ktor로 백엔드/서버개발 기초정복 (커피주문시스템 개발)
34:22분 처럼 런타임 의존성 예외파악
스프링같은경우, 빈 형태로 객체가 컨테이너에 의해서 관리가 되어서 시작시 circular나 주입되지 않은 객체들을 파악할 수 있는데...영상끝부분에 BCrypt나 Service에 대한 의존성을 koin에 추가하지 않았다면 런타임에서야 발견할 수 있는데.. 엔터프라이즈 혹은 기업에서 쓰기에 위험한 부분이 아닌가싶은데..이런경우는 어떻게 방지해야 할지에 대해서 질문드려봅니다!
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
내용 이해 질문
태현님 안녕하세요, 간만에 강의를 듣던 중 해당 개념에 대해 제가 잘 이해하고 있는지에 대해 여쭤보고자 질문을 드립니다.제가 헷갈리는 부분은 open 에 대한 것과 상속에 대한 주의점인데요.package me.sungbin.lec10 open class Base( open val number: Int = 100, ) { init { println("Base Class") println(number) } }package me.sungbin.lec10 class Derived( override val number: Int, ) : Base() { init { println("Derived Class") } }open 키워드는 기본적으로 상속을 받을 클래스에 붙여주며, abstract 과 같이 반드시 구현해야 하는 클래스에는 따로 명시적으로 붙여주지 않는 것으로 이해가 되었습니다.예시의 Base 클래스와 Derived 클래스에서 getMember() 호출 시, 초기 값이 나온 부분은 실제 Derived 클래스에서 생성자를 호출하고 그 생성자가 상위 클래스 생성자를 호출하고 그 생성자에서 number를 출력하려고 하는데 해당 number는 오버라이딩 되었으니, 하위 클래스의 number를 출력해야 하나, 해당 하위 클래스 생성자 호출 전이므로 초기 값 0이 나온다?라고 이해하면 좋을까요?제가 이해한게 잘 맞는지 혹은 잘못되게 생각한 부분이 있는지 확인해주시면 감사드리겠습니다! 🙂실무에서 이런 케이스를 겪어본 적이 없어서 헷갈리는 것 같아서 이번 기회에 제대로 알아가보려구요!
-
미해결[입문편] 안드로이드를 위한 코틀린(Kotlin) 문법
코트린 심화 학습
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 코틀린으로 앱 개발을 진행하기 위해서 현재 심화 학습을 따로 진행하고 있는데 적응하는 데 너무 어려움을 겪고 있습니다 ㅠㅠ.혹시 코틀린 앱 소스 코드를 보면서 따로 공부할 수 있는 방법이나 실무에서 어떤 코드를 쓰는지 예시 코드를 볼 수 있는 방법이 있을까요? 맥락은 어느 정도 이해가 되는데 아직 너무 미숙해서 어떻게 해야할지 모르겠습니다.
-
해결됨카카오 면접관과 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법
'서비스 개발자를 위한 Kafka 쉽고 깊게 알기' 학습자료 오류
자료를 다운로드 하면, 윈도우에서는 대부분의 압축파일 내에 파일이 없다고 나옵니다. Mac에서 작업하셔서 그런 것 같은데 확인 부탁드립니다.
-
미해결스프링은 어려워! 코틀린과 Ktor로 백엔드/서버개발 기초정복 (커피주문시스템 개발)
Repository의 추상화
CrudRepository, ExposedCrudRepository로 제네릭 인터페이스 추상화를 한것까진 좋습니다!근데 스프링에서는 @Repository라는 애너테이션을 붙여줌으로써 AOP 포인트컷이랑 어드바이저에서 한번 더 예외를 래핑해서 오라클, MySQL, PostgreSQL 등 여러 벤더사들의 각각 다른 예외를 하나로 몰아서 DataAccessException으로 들어갈 수 있도록 해주는데, ktor도 그런 비슷한 기능이 있나요?코드는 그대로 두고 연결 DB만 바꿔도FK 오류인지, duplicated key 오류인지, lock time out 오류인지 그런것들도 다 추상화가 되는걸까요?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
JDK 선택할 때 궁금점!!
음 강의 내용은 Oracle OpenJDK 17 버전을 사용하셨는데 특별한 이유가 있으신건지 아니면 다른 회사의 동일한 버전 SDK를 사용해도 되는건지 예를 들면 Azul zulu 에서 나온 sdk 라던가.. 자바 계열 언어를 다룰 때 어떤 회사(?)의 sdk를 선택해야하는건지 항상 막막하네요.. 혹시 이런 부분에 대해 공부하셨던게 있으실지 궁금합니다. 아니면 선택할 때 어떤 부분들을 고려해서 하는지?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
혹시 어플리케이션을 실행할 수 있게 readme 같은건 따로 없나요?
음.. 어플리케이션을 실행해보고 코드들을 뜯어보고 싶은데 실행 방법에 대한 readme 같은 건 안보여서요! 혹시 docker-compose 실행 후에 앱 키면 될까요?
-
해결됨멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]
패키지, 디렉터리 구조 질문 (강의 내용 관련X)
일단 질문에 앞서 코틀린에 대한 개념이 하나도 없다라는 점 이해해주시길 바라면서강의 내용을 보다가 패키지나 클래스 파일 생성하는 방식이 너무 독특해서 질문을 하지 않을수가 없더라구요클래스파일을 생성하면 패키지 경로가 생성되고 디렉터리 구조를 패키지 경로에 맞춰서 생성하는걸 당연하게 생각해왔었는데, View.kt를 예로 View와 관련된 클래스들을 내부에 생성하시는걸 보고 독특하다는 생각이 들었습니다. 예제를 기반으로 한 강의다보니 변수들의 개수가 적은것도있고, 강의 내용에 별로 중요한 부분이 아니라서 이런 방식을 채택하시는건지 아니면 실무에서도 이런 방식으로 개발을 하시는건지, 실무에서 사용하신다면 팀원들과의 협업에 문제가 없었는지 궁금합니다!순수하게 궁금해서 질문드려욥ㅠ
-
해결됨카카오 면접관과 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법
코틀린
안녕하세요이번에 수강하려고 하는데 코틀린 한 번도 안 해봤는데 이 수업은 무리일까요?계속 자바만 사용했던 상태이고 아직 코틀린 배울 생각은 없는데 이 수업은 듣고 싶어서 여쭤봅니다 ㅠㅠ감사합니다.
-
해결됨멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]
Circuit Breaker 질문
안녕하세요. circuit breaker 코드를 봤을 때 간략하게 circuit breaker가 이런거다 라고 설명해주셨지만, 추가로 궁금한 점이 있어 질문 드립니다.만약 인스턴스가 여러개인 상황에서는 로컬 상황만 보는게 아니라 전체 인스턴스 상황을 봐야할 것 같은데 이럴 떄는 circuit breaker를 어떻게 사용해야 하는지 궁금합니다. 감사합니다.
-
해결됨멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]
jpa entity 질문
안녕하세요. Entity 선언 시 data class vs class 질문드리려고 합니다.아래 질문은 data class를 기반으로 했지만 사실 궁금증 시작은 "class가 엔티티에 더 맞지 않나?" 라는 생각에 질문드립니다. 질문 1. data class 선언시 프록시 질문제가 알기로 ManyToOne lazy loading할 때 프록시 기능을 사용한다고 알고 있습니다.data class가 자바 record와 마찬가지 final인 것으로 아는데 그렇다면 지연 로딩이 정상적으로 동작하지 않다고 생각됩니다.혹시 여기서는 지연 로딩을 사용하지 않아서 data class를 사용하신 것인지 궁금합니다. 질문 2. data class 사용이 맞다면 equals & hashCode 질문결궁 두 값 동일성을 비교할 때 id를 기반으로 하는 것이 성능에 좋을 것 같다고 생각됩니다.혹시 실무에서 data class 나 class 사용하실 때 id기반으로 equals와 hashCode를 오버라이딩 하지 않고 전체 필드로 하시는지 궁금합니다. 질문 3. data class 목적제가 알기로는 data class는 response와 같이 불변 데이터에 많이 쓰이는걸로 알고 있습니다.그래서 copy와 같은 메서드를 제공하는 것으로 알고 있습니다.data class를 사용할 때 물론 copy를 사용하시진 않겠지만 영속성 컨텍스트 같은 기능을 쓰려면 직접 변경해야 합니다.불변 클래스 목적과 jpa entity와 잘 맞지 않는 것 같아서 질문드립니다. 질문 4. equlas 질문만약 양방향 참조가 있는 entity라면 무한 루프에 빠질 가능성이 없는지 궁금합니다.이와 같은 이유로 2번을 질문 드렸는데 질문 2번에서 내용이 빠진 것 같아서 따로 한 번 더 질문 드립니다. 제가 실무에서 써보지 않았고 코틀린 관련해서는 경험이 부족해서 잘못된 질문이 있다면 알려주시면 다시 질문 남기겠습니다. 좋은 강의 감사합니다.감사합니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
해결완료
호환성 문제였습니다! [해결방법]libs.versions.toml에서 kotlin = "2.2.0"으로 수정했더니 해결됩니다
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
databinding 설정후 run하면 에러(해결)
해결방법libs.versions.toml에서 kotlin = "2.2.0"으로 수정했더니 해결됩니다
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
databinding 설정 이후 실행시 에러
databinding 관련 세팅 이후 실행시 매번 같은 에러가 발생하고 있습니다.gradle, xml을 조금씩 바꿔보아도 직전까진 잘 되는데 데이터바인딩 관련 코드가 들어가면 아래와 같은 에러가 발생하네요..ㅠㅠ왜 이런걸까요Github Link : https://github.com/Hwangseok-Paris/Kotlin_Study_1/tree/databinding#------ 추가 ------이것저것 테스트 많이 해 봤는데 build.gradle.kts 에서dataBinding { enable = true} 또는 buildFeatures { dataBinding = true }을 넣고 sync 이후에 run 시 문제가 발생하고 있습니다.(다른 파일은 초기 상태 그대로인 상태)저걸 지우고 다시 싱크를 한 다음 실행시키면 아무 일 없었다는 듯 정상 실행이 되네요.. 도움이 될까 싶어 build.gradle.kts 파일 내용 첨부드립니다.plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) } android { namespace = "com.example.test" compileSdk = 36 defaultConfig { applicationId = "com.example.test" minSdk = 24 targetSdk = 36 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) }