월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
강사님 수업자료 정리된 pdf는 어디서 받을 수 있나요?
강의자료 두개있는거 받았는데 하나는완성전코드이고 하나는 완성된 코드더라고요 수업자료 정리된 pdf는 어디서 받을 수 있나요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
생성자 init
강사님 안녕하세요 질문있습니다!빨간 블록의 자바코드랑 코틀린코드완전히 같은건 아닌건가요?자바는 생성자 파라니터가 name일때고오른쪽 코틀린은 기본생성자 파라미터가 id와 name이라서요!..++ 추가로 게터가 자동으로 붙는다고 했는데요 data클래스가 아닌데 어째서 붙는건가요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
val 은 불변값인데 id는 값이 넣어지지 않나요?
안녕하세요 강사님 이게 val의개념을 잘 이해하지 못해서 생기는 문제같기도한데 id를 val이라고 하고 null로 넣어줬는데 아이디는 생성되면서 값이 넣어지지않나요?? 아.. 값이 넣어지는게 아니라 디비에만 넣어지고 읽기만해서 val인가요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
companion object사용에 관하여 + entity class의 올바른 메서드 사용
안녕하세요. 우선 양질의 kotlin과 jpa관련 강의제공해주셔서 감사합니다.덕분에 어느정도 갈피를 잡을 수있었어요.어설픈 질문이지 않을까 걱정도 되지만, 조심스레 여쭤봅니다.[21강에 사용되는 companion object 의 fun fixture]해당 메소드는 객체가 생성될때 기본값을 가지도록 되어있는데 해당방식은 실제 프러덕션코드 에서도 적용할 수 있는 방식일까요?만약 그렇다면 다음과같이 직접적으로 field의 초기값을 설정하는것과 어떻게다른지 궁금합니다.@Entity class Book( val name: String = "", @Enumerated(EnumType.STRING) val type: BookType = BookType.COMPUTER, @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, ) { init { if (name.isBlank()) { throw IllegalArgumentException("이름은 비어 있을 수 없습니다") } } fun generateIntegrateName(): String { return type.toString() + name } companion object { fun fixture( name: String = "책 이름", type: BookType = BookType.COMPUTER, id: Long? = null, ): Book { return Book( name = name, type = type, id = id, ) } } } 만약 test를 위해서만 존재하는 코드라면, entity class안에 test만을 위한코드가 존재하는게 자연스러운 구조인가요?[entity와 관련된 값 구성 강제하기]entity filed에는 정의되지 않아 Database에 column으로존재하진않지만, dto로 반환하는 integrateName의 생성을 강제하고 싶을때는 위코드의 fun generateIntegrateName 을 entity에 구성하여 dto에서 사용되는것이 올바른 방법인지 궁금합니다.data class BookInfoResponse( val integrateName: String, ) { companion object { fun of(entity: Book): BookInfoResponse { return BookInfoResponse( integrateName = entity.generateIntegrateName() ) } } }val book = bookRepository.findByName("이상한 나라의 엘리스") ?: throw IllegalArgumentException("잘못된 요청값입니다.") val result = BookInfoResponse.of(entity = book).integrateName강의내용과 검색등의내용을 짜집기해서 사용해보고있는데 막상 구현을하고 보니 적절한 방법인지 알길이 없어서 고민하다 질문드립니다.시간 내어주셔서 감사드립니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
querydsl을 사용할 때 java의 Q클래스와 kotlin의 Q클래스 함께사용 가능한가요??
기존에 진행 중이던 프로젝트에서 신규로 개발할 기능들은 kotlin으로 개발하려합니다. 강사님 강의에서 나온 프로젝트의 build.gradle 파일을 참고해서 설정을 하니 java의 Q클래스와 kotlin의 Q클래스가 둘다 생겨버려서 중복이라는 에러가 발생하더군요.... 혹시 java,kotlin 2개를 동시에 Q클래스를 사용할 수 있는 방법은 없을까요??아니면 java의 Q클래스만 생성해서 kotlin에서 java에서 생성한 Q클래스를 사용하면 될까요??그런데 이 방법으로 시도해보려니 설정이 꼬여서 그런지 자꾸 Q클래스는 생성읻되었는데 경로를 못찾는다고 에러가 발생하더라고요ㅠㅠ 좋은 방법있으면 알려주시면 감사하겠습니다. plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' id 'org.jetbrains.kotlin.jvm' version '1.6.21' id 'org.jetbrains.kotlin.plugin.jpa' version '1.6.21' id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21' id 'org.jetbrains.kotlin.kapt' version '1.6.21' } group = 'com.maturi' version = '0.0.1-SNAPSHOT' sourceCompatibility = '8' configurations { compileOnly { extendsFrom annotationProcessor } developmentOnly runtimeClasspath { extendsFrom developmentOnly } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' developmentOnly("org.springframework.boot:spring-boot-devtools") compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:2.7.0' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.modelmapper:modelmapper:2.4.2' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'com.querydsl:querydsl-jpa' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } implementation group: 'org.javassist', name: 'javassist', version: '3.15.0-GA' implementation group: 'com.google.firebase', name: 'firebase-admin', version: '8.1.0' implementation 'org.springframework.social:spring-social-facebook:2.0.3.RELEASE' implementation 'org.apache.httpcomponents:httpclient:4.5.2' implementation 'com.googlecode.json-simple:json-simple:1.1.1' kapt("com.querydsl:querydsl-apt:5.0.0:jpa") kapt("org.springframework.boot:spring-boot-configuration-processor") } test { exclude { '/**/*' } useJUnitPlatform() } compileKotlin { kotlinOptions { jvmTarget = "8" } } compileTestKotlin { kotlinOptions { jvmTarget = "8" } } def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } clean { delete file('src/main/generated') }
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
방법2. custom setter 사용하기에 대해 질문
안녕하세요!오랜만에 재수강 중인데 다시보다가 질문이 있어서 남깁니다! 2분41초에서 setter를 private으로 두고 싶은 경우 private set을 이용하기라고 되어 있는데요.JPA와 함께 사용하게 된다면 저는 엔티티 클래스의 경우 gradle 설정에서 OPEN설정을 해주는데, open으로 두게 되면 private set 기능은 사용이 불가능 하더라고요. 이 부분에서 jpa의 프록시 기능 사용이 안 되는 것으로 알고 있는데 TRADE-OFF의 영역인지 아니면 제가 모르는 다른 설정으로 프록시 기능을 사용하면서 private set을 사용할 수 있는지 궁금합니다!.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Book.kt 추가후 에러
태현님 안녕하세요!저도 같은 에러가 발생했는데 (질문 게시판에 같은 질문이 있는데... 링크를 얻기가 어렵네요)build.gradle 에implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.41'을 추가하니까 해결 되었습니다..! 혹시 원인을 알 수 있을까요?현재까지 공부한 프로젝트를 보내고 싶은데... 메일로 보낼수 있을까요? 파일 첨부가 안되네용
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
코틀린에서 builder 패턴은 사용하지 않나요?
강사 님께서는 객체를 인스턴스화 하실 때, 생성자를 사용하거나, 정적 팩토리 메서드를 사용하는 방식 2가지를 이용하셨는데 혹시 코틀린에서 builder 패턴을 사용하는건 어떻게 생각하시나요??defalut 파라미터를 이용하고 naming을 통해 builder패턴 처럼 사용할 수 는 있겠지만 java에서 builder패턴을 통해 객체를 만들었던 것에 비하면 불편하다는 생각이듭니다.조언 해주시면 감사하겠습니다.
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Spring Validation 의 @field:NotBlank 등으로 Request DTO 필드 검증 시, 필드타입 선언방식( non-null or nullable )
안녕하세요 강사님. 참 좋은 강의 감사드립니다.예제 고도화 과정에 Request DTO nullable 필드 처리에 어떤 방식이 적절할 지 알수 없어 남기게 되었습니다.Kotlin 객체 필드타입을 크게 두 방식으로 선언 할 수 있습니다.nullablenon-null코프링 기반에서 Request DTO 의 경우,객체필드를non-null 타입으로 선언하면 WebMvc 와 spring-validation 을 함께 사용하면, 발생 가능한 가설을 세워보았습니다.문제:서버 요청에 '비 유효값'`[공백문자["", ' '], null 필드값, 공백 JSON( {} )]`이 넘어올 때, Kotlin 언어의 non-null 타입 속성은, sprint-validation 절차를 거치지 못함. 원인:1. 속성 타입을 non-null 타입 선언 후 컴파일 시 Intrinsics.checkNotNullParameter(field, "field"); 함수가 non-null 검증코드로 DTO 생성자 함수 본체에 추가.2. 앞선 checkNotNullParameter 함수는 DTO 생성을 원천 차단.3. 때문에 Kotlin non-null 검증이 spring-validation 검증 이전에 수행됨을 뜻함. 즉, 검증 대상이 생성이 되어야 spring-validation 절차를 거칠텐데, 검증 대상이 없는 상황이 된다.(이 부분은 저의 뇌피셜이 포함되었으므로 검증되지 못한 분석결과 입니다) 이 문제에 대해 다음의 해결 방법을 생각할 수 있습니다.field 타입을 nullable 하게 선언, 기본값 null 설정data class UserCreateRequest( @param:JsonProperty("email") @field:NotBlank @field:Email val email: String? = null, ⬅️`?`및 기본값 설정 ) { fun toCommand() = UserCreate( /* String ❌ String? 미스매치 */ email = email!!, ✅단언 해결 ) }이 방법은 단언 !! 을 사용하여 전적으로 spring-validation 의 검증에 전적으로 의지하는 코드입니다.의문점은 개인적으로 우아하지 못한 단언 !! 을 꼭 사용해야 할까? 인데요, 다른 방법으로는,Backing 필드 생성자 선언 ➡️ 커스텀 getter 로 Backing 필드값 반환이 떠오르는데요, 이것 또한 보일러-플레이트 코드량이 늘어나서 우아하지 않아 보입니다^^;강사님의 경우에는 어떠한 해결방법을 사용하지는지 궁금해서 질문 남겨보았습니다.읽어 주셔서 감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
N + 1 문제 해결 fetch join 관련해서 질문드릴 것이 있습니다!
안녕하세요. 38강의 N + 1 문제를 해결하기 위한 fetch join 문제 해결과 관련해서 제가 발견(?)한 것을 질문드리고자 합니다!수업 내용 중 N + 1 문제를 querydsl을 사용해서 해결하는 것을 보여주셨는데요. 코드가 다음과 같았습니다.class UserRepositoryCustomImpl( private val queryFactory: JPAQueryFactory ) : UserRepositoryCustom { override fun findAllWithHistories(): List<User> { return queryFactory .select(user) .distinct() .from(user) .leftJoin(userLoanHistory).on(userLoanHistory.user.id.eq(user.id)).fetchJoin() .fetch() } }그러고 테스트를 돌렸을 때 쿼리가 찍히는 걸 보면 다음과 같습니다.N + 1 문제가 아직 발생하고 있는 것 같습니다.조금 이상해서 구글링을 해보니 querydsl에서 on 절을 사용하면 두 엔티티가 연관관계라는 것을 인식하지 못 한다고 하네요! 그래서 코드를 다음과 같이 좀 바꿔봤습니다.class UserRepositoryCustomImpl( private val queryFactory: JPAQueryFactory ) : UserRepositoryCustom { override fun findAllWithHistories(): List<User> { return queryFactory .select(user) .distinct() .from(user) .leftJoin(user.userLoanHistories, userLoanHistory).fetchJoin() .fetch() } }이렇게 바꾸고 쿼리를 찍히는 것을 확인하니까한 번에 fetch join 되면서 가져오는 것 같습니다! 한 번 확인해주시면 감사하겠습니다!
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Class나 Entity 만들 때 접근제어자 관련해서 질문이 있습니다!
자바에서는 Entity나 클래스를 만들 때 접근 제어자로 private을 붙이는게 일반적이었는데요. 코틀린에서는 그렇게 하면 객체를 생성하고도 밖에서 바로 접근이 안 되는 거 같네요ㅠprivate을 붙여주고 custom getter 같은걸로 객체 생성 후 호출하게 해주는 것이 좋은가요? 아니면 접근 제어자를 안 붙이고 그냥 쓰는게 좋은가요..?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
선생님 19강 UI 테스트 하시는 부분에서 질문이 있습니다.
19강 9분30초 지점에서 책 등록할 때는 400에러가 나면서 책 등록이 안 되는데 왜 그 전에 유저는 바로 정상적으로 등록이 되는걸까요?build.gradle에 implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3' 이 디펜던시를 추가해주기 전에도 유저 등록은 정상적으로 되는 이유가 궁금합니다!제가 자바로 개발을 할 때도 웹 계층 DTO에 필드가 한 개만 있을 때는 잭슨이 정상적으로 작동 안 해서 @NoArgConstructor 어노테이션이나 @Setter 등을 꼭 붙여줘야 이게 정상 작동했던 경험이 있습니다. (구글링을 해보니 잭슨 라이브러리 쪽 이슈인데 아직도 open 상태라는 글을 본 거 같기도 합니다..)혹시 UserCreateRequest에는 프로퍼티가 2개 있고, BookRequest에는 프로퍼티가 1개 뿐이라 이런 일이 생긴 것인지도 좀 궁금하네요..
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
app 실행 시 종료된 프로세스 에러가 발생합니다.
어떻게 해결할 수 있을까요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요! @Nullable 관련해서 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.이번 강의에서 플랫폼 타입으로 인해 Java 와 Kotlin 간에 발생할 수 있는 문제점을 설명해주셨는데요.특히, 아래의 코드를 테스트할 때 null 때문에 발생할 수 있는 문제점과 해결할 수 있는 방법을 설명해주셨습니다.assertThat(results[0].age).isNull()Java 클래스의 getter에 @Nullable을 붙여줌으로써 해결할 수 있었는데요.제가 궁금한 것은 롬복의 @Getter가 클래스 레벨에서 적용된 경우에는 어떻게 @Nullable을 붙여줄 수 있느냐가 궁금했습니다.코틀린으로 변환 과정에서 롬복의 @Getter가 만들어주는 게터들을 모두 하드 코딩으로 작성하고 나서 @Nullable 어노테이션을 해당하는 게터에 달아줘야하는건지, 아니면 더 좋은 방법이 있는지 궁금합니다!모든 클래스가 그렇지는 않겠지만 아무래도 기존에 사용하고 있던 자바 클래스 코드들에 @Getter 어노테이션이 달려 있을 것이라고 예상이 되고 이 경우에는 어떻게 테스트 해당 문제를 해결해야하는지 궁금하네요더불어 좋은 강의 감사합니다!
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 강사님 도메인 생성 시 주 생성자에 관한 질문드립니다.
안녕하세요 강사님~ 강의 너무 재밌게 잘 보고 있습니다.강의중에 User 리팩토링 과정에서 userLoanHistories를 주생성자에 선언하셨는데@Entity class User( @Column(nullable = false) var name: String, val age: Int?, @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, ) { // 클래스 바디로 내려도 되나요? @OneToMany(mappedBy = "user", cascade = [CascadeType.ALL], orphanRemoval = true) val userLoanHistories: MutableList<UserLoanHistory> = mutableListOf() (...) }기존 자바코드에서는 이 컬랙션은 내부적으로 사용될뿐 getter로 접근하는 부분이 없기에 굳이 주생성자에 선언하는 것보다 클래스 바디로 내리는게 뭔가 더 자연스럽지 않나 하여 질문드렸습니다..!
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
.
.
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
재활용 극대화를 위한 상속구조 + Mixin(!?) 구성에 대한 질문입니다.
한 3일동안 산넘고 물건너 아직 끝이 어딘지도 모르고 해매고 있습니다 ㅎㅎ 안녕하세요 강사님.상황:제목에서도 알 수 있듯, Kotlin Jpa Mixin 을 소개하는 글로 부터 힌트를 얻고, 소스코드:BitBucket 자료를 참고삼아 강의 16강 정도의 예제를 업그레이드 하고 강의를 계속 이어가려다, 돌부리에 걸려 자빠져 입원한듯, 강의를 이어갈수 없게 지체되어서 몇일째 끙끙 앓고있답니다. 제가 참고한 자료 자체가 너무 오래된 5년전 자료라, 최신자료를 찾아봐도 찾아지지 않아서 이 예제를 참고했는데, 이것조차 유효한 자료인지 가늠이 안되었지만 이걸 변형해서라도 조립형태로 가야겠다는 목표가 생겨서 이 가이드를 응용하기로 했습니다..Kotlin 에서 지원하는 Mixin 기법(맞는지 모르겠습니다)을 도전하게 되었어요. 엔티티, 테이블 모두 생성은 되는데, Mixin 속성은 적용이 안되어서, 테이블을 보면 덩그러니 ID 만 보입니다. 원인과 관련 자료가 너무 없어서 관둬야 하나... 하다가 핼프요청 하게 되었어요.제가 16강 예제와 와 위에 Mixin 예제로 재구성한 제 Gist(entities.kt) 를 보시면 아시겠지만 구조를 보여드리면 이렇습니다.entities.kt다이어그램:아래는..조립의 끝단에 있는 @Entity AuditableTestEntity 코드입니다./* Implementation */ @Entity class AuditableTestEntity constructor( name: String, age: Int?, ) : Identifier<Long>(), AccessTimeAuditable by AccessTimeAudit(), AccessorAuditable by AccessorAudit(), Nameable by Named(name), Ageable by Aged(age) 코드를 보면 위의 부품(인터페이스 by 구현체)들이 조립된 형태로 되어있습니다. 컴파일에도 문제가 없어 잘 되는가 싶었지만, [컴파일> 서버 기동] 이후 결과는 다음과 같습니다.DB 테이블 상황ID를 제외한 나머지(name, age, created..., 등) 속성이 전혀 반영이 안되었지요. 아래는 서버 구동시 테이블 생성 쿼리 로그입니다.Hibernate: create table auditable_test_entity ( id bigint generated by default as identity, primary key (id) )질문:@MappedSuperclass 를 @Entity 를 제외한 모든 클래스에 붙여도 보고, 필드용 에노테이션 역시 Interface 로 옮겨도 보고, Use-site (@get, @filed 등)를 붙여옮봐도, 인식이 안되는건 여전하더라구요. 그래서 혹시 이방식이 동작하지 않는 원인이라던지, Kotlin 설정이나 플러긴 버전의 차이 같은 누락 요인이라던지, 더 나은 방식이 있다면 조언을 얻고자 질문하게 되었습니다. 읽어주셔서 감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
코틀린 JPA 질문이 있습니다
안녕하세요.Sto라는 부모 엔티티가 있습니다.자식으로는 Realestate 라는 엔티티가 있습니다.해당 엔티티의 관계는 Sto + Realestate 이렇게 1개의 쌍을 이루어 생성이 됩니다.저는 @OneToOne 양뱡향 관계를 사용하고 있습니다.cascade 속성을 이용하여, Sto를 save 했을 때 하위 엔티티까지 함께 저장하려고 하고 있습니다.이때, 모든 엔티티를 val를 사용하려고 했는데 Sto 생성자 호출 시 하위 엔티티에서 Sto 엔티티의 값을 알 수가 없어서 생성이 불가한 상태입니다.물리적으로 Sto + Realestate는 한쌍인데 방법이 없을까 싶어 문의드립니다.var + null을 사용하면, 어떻게든 할 수 있을 것 같은데 양방향 설정을 위해 이렇게 풀어서 사용해야 하나 궁금하네요..@Entity @Table(name = "sto") class Sto( @Id @Column(name = "sto_id", nullable = false) private val id: String, @OneToOne( mappedBy = "sto", cascade = [CascadeType.PERSIST] ) val realestate: Realestate, @OneToOne( mappedBy = "sto", cascade = [CascadeType.PERSIST] ) val youtube: Youtube, ) @Entity class Realestate( @Id @Column(name = "realestate_id", nullable = false) private val id: String, @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "sto_id", nullable = false) val sto: Sto, ) fun main() { Sto( id = "sto_id", realestate = Realestate( id = "realestate_id", sto = 여기가 문제네요.. ) ) }
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 강사님
개인적으로 공부를 하던 중 잘 풀리지 않아 문의드리게 되었습니다.java.kt다름이 아니라 실행시점에 샘플 데이터를 미리 저장시켜두고 싶어서 자바로 작성했던 위의 코드를 아래와 같이 코틀린으로 변경 후에 실행을 시켜보았습니다.그런데 실행을 시키면CGLIB, subclass 등 오류가 발생해서 구글 검색을 통해 최대한 해결해보려 하였으나, allOpen 설정도 해보고 이것저것 해보았음에도 해결하지 못해서 이렇게 염치불구하고 문의드리게 되었습니다 ㅜ 혹시 어떤 문제인지 아실까요??
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
build.gradle 파일 설정 질문
그래이들 설정 파일에 코틀린 라이브러리를 추가하는과정에 있어서 질의응답의 답글에 있는 레퍼런스를 참고하는 과정에 있어 특정 문단을 이해하기가 어려워 질문드립니다. 다음 레퍼런스를 참고 하였으며https://docs.spring.io/spring-boot/docs/3.1.1/reference/pdf/spring-boot-reference.pdf 7.11.1. Requirements 해당 세션에 있는 내용입니다.Since Kotlin classes are final by default, you are likely to want to configure kotlin-spring plugin inorder to automatically open Spring-annotated classes so that they can be proxied. 해당 부분입니다. 추가적으로 레퍼런스에서는 org.jetbrains.kotlin:kotlin-stdlib 및 org.jetbranins.kotlin:kotlin-reflect 가 클래스 패스에 존재햐아 한다는데, stdlib만 설정하신 이유도 궁금합니다.