묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! FastAPI 입문
Service를 Depends 사용하는 것에 대해 질문이 있습니다.
(실습) 회원가입 API 구현 강의에서 질문이 있습니다.Depends가 Request 할때마다 객체를 생성하는 것으로 이해하고 있습니다.Depends를 테스트를 위해서 활용하는 것으로 이해했었는데, pyTest를 보면 mock.patch라는 기능으로 DI 없이 목킹을 잘 할 수 있는것으로 보았습니다.UserService를 Depends 처리하면, 요청마다 service를 생성할 것 같은데, 이러면 불필요한 생성과 소멸이 반복될 것 같은데, Depends를 쓰는게 좋을까요? 아니면 싱글톤으로 작성하는게 좋을까요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
생성자 init
강사님 안녕하세요 질문있습니다!빨간 블록의 자바코드랑 코틀린코드완전히 같은건 아닌건가요?자바는 생성자 파라니터가 name일때고오른쪽 코틀린은 기본생성자 파라미터가 id와 name이라서요!..++ 추가로 게터가 자동으로 붙는다고 했는데요 data클래스가 아닌데 어째서 붙는건가요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
val 은 불변값인데 id는 값이 넣어지지 않나요?
안녕하세요 강사님 이게 val의개념을 잘 이해하지 못해서 생기는 문제같기도한데 id를 val이라고 하고 null로 넣어줬는데 아이디는 생성되면서 값이 넣어지지않나요?? 아.. 값이 넣어지는게 아니라 디비에만 넣어지고 읽기만해서 val인가요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결당신을 함께 일하고 싶은 개발자로 만들어 줄 클린 코드 작성법
이해가 잘 안됩니다.ㅠ
개행 할 것앞서 스크롤이 적을수록 코드를 이해하기 좋다고 말씀드렸습니다. 코드 길이가 매우 긴 함수나 호출자 함수로부터 너무 멀리 떨어져 있는 내부 함수를 탐험하기 위해 스크롤이 발생하면 확실히 코드 이해가 오래 걸리고 힘들어집니다.같은 이유로 수평 방향 스크롤도 고려해야 합니다. 큰 모니터를 사용하면 수평 방향 스크롤은 문제 되지 않을 것으로 생각하실 수 있지만 그렇지 않습니다. 코드를 파악하려다 보면 IDE 화면을 분할할 필요가 종종 있습니다. 화면 너비가 반으로 줄어드는 것이죠. 이런 경우에는 모니터 크기가 큰 도움이 되지는 않습니다. 또한, 수직 방향 스크롤을 줄이기 위해 세로로 길쭉한 모니터를 쓰시는 분들도 계십니다. 이런 모니터는 수평 방향 스크롤에 더 취약하겠습니다.제가 독해력이 부족할수도 있는데..어떻게 단점이고 장점이고 무엇을 고려하고 의도하신지 좀 이해가 잘안되서.. 조금만 더 친절한 설명 부탁드립니다!도움 많이 되고 있습니다!
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (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을 사용할 수 있는지 궁금합니다!.
-
해결됨실전! FastAPI 입문
안녕하세요. fastapi 강의 수강 중입니다.
안녕하세요. fastapi 강의 수강 중입니다.섹션2에서 데이터베이스 생성과정 중docker exec -it todos bash를 하면Error response from daemon: Container c77ef59c10ff05ebd5ead765aa6f64ac185daa38214ad0fc5195750cace0b167 is not running위와 같은 에로가 나오는데요, 나름대로 구글링을 해보니까 docker start를 사용해 도커 실행을 해주면한다해서 해보면 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: address already in use이러한 에러가 나옵니다.docker와 mysql을 연결하는 명령어에서 다 잘 다운로드되고 마지막에 docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: address already in use.이런 에러가 뜨긴했는데 우선 넘어가보니 docker ps를 해보면 실행중인 컨테이너가 없습니다. 도커를 아예 처음 접하다보니 시작단계에서 어려움이 있는데 도움 부탁드립니다.
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Book.kt 추가후 에러
태현님 안녕하세요!저도 같은 에러가 발생했는데 (질문 게시판에 같은 질문이 있는데... 링크를 얻기가 어렵네요)build.gradle 에implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.41'을 추가하니까 해결 되었습니다..! 혹시 원인을 알 수 있을까요?현재까지 공부한 프로젝트를 보내고 싶은데... 메일로 보낼수 있을까요? 파일 첨부가 안되네용
-
해결됨실전! FastAPI 입문
레포지토리 패턴 강의에 pytest 오류가 뜹니다
pytest 실행하면 FAILED tests/test_main.py::test_get_todos - assert 404 == 200FAILED tests/test_main.py::test_get_todo - assert 404 == 200FAILED tests/test_main.py::test_create_todo - AttributeError: 'NoneType' object has no attribute 'id'FAILED tests/test_main.py::test_update_todo - AssertionError: Expected 'undone' to be called once. Called 0 times.FAILED tests/test_main.py::test_delete_todo - AttributeError: <module 'api.todo' from 'C:\\Users\\user\\Desktop\\project\\todos\\src\\api\\todo.py'> does not have the attribute 'delete_todo'라는 오류가 뜹니다...ㅠㅠ
-
미해결코딩으로 학습하는 리팩토링
홈 디렉토리 .github 파일 생성
소스 코드 영상 설명 중에서깃허브에서 토큰 만드는 부분 까지는 따라 헀는데홈 디렉토리에 .github 파일을 생성하는 부분에서 막혔습니다 혼자 해결해 보려고 열심히 찾아봤는데 방법을 못찾겠네요저는 윈도우 사용자 입니다.github 파일 만드는 방법을 알려주시면 감사하겠습니다
-
해결됨실전! FastAPI 입문
pydantic.error_wrappers.ValidationError 오류가 떠요
지금 orm적용 get단일 조회 api 강의를 보고있는데 코드를 똑같이 쳤는데 마지막에 swagger 에서 입력 하면 pydantic.error_wrappers.ValidationError: 3 validation errors for ToDoSchemaid field required (type=value_error.missing)content field required (type=value_error.missing)is_done field required (type=value_error.missing) 이 오류가 뜹니다..ㅠㅠ 무슨 오류인가요
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (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 필드값 반환이 떠오르는데요, 이것 또한 보일러-플레이트 코드량이 늘어나서 우아하지 않아 보입니다^^;강사님의 경우에는 어떠한 해결방법을 사용하지는지 궁금해서 질문 남겨보았습니다.읽어 주셔서 감사합니다.
-
해결됨실전! FastAPI 입문
ORM JOIN 강의를 따라하는 중 오류가...
파이썬 콘솔에서 아래 오류가 발생했어요...그래서 , pip install cryptography를 했지만 이미 설치되어 있었구요...(todos) C:\projects\todos>pip install cryptographyRequirement already satisfied: cryptography in c:\projects\todos\lib\site-packages (41.0.3)Requirement already satisfied: cffi>=1.12 in c:\projects\todos\lib\site-packages (from cryptography) (1.15.1) Requirement already satisfied: pycparser in c:\projects\todos\lib\site-packages (from cffi>=1.12->cryptography) (2.21)아래는 파이썬 콘솔창user = session.scalar(select(User))Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm Community Edition 2023.2.1\plugins\python-ce\helpers\pydev\pydevconsole.py", line 364, in runcode coro = func() File "<input>", line 1, in <module> File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2312, in scalar return self._execute_internal( File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2134, in executeinternal conn = self._connection_for_bind(bind) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2001, in connectionfor_bind return trans._connection_for_bind(engine, execution_options) File "<string>", line 2, in connectionfor_bind File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\state_changes.py", line 139, in _go ret_value = fn(self, arg, *kw) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 1126, in connectionfor_bind conn = bind.connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 3264, in connect return self._connection_cls(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 145, in init self._dbapi_connection = engine.raw_connection() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 3288, in raw_connection return self.pool.connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 452, in connect return ConnectionFairy.checkout(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 1267, in _checkout fairy = _ConnectionRecord.checkout(pool) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 716, in checkout rec = pool._do_get() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\impl.py", line 169, in doget with util.safe_reraise(): File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 147, in exit raise exc_value.with_traceback(exc_tb) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\impl.py", line 167, in doget return self._create_connection() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 393, in createconnection return _ConnectionRecord(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 678, in init self.__connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 902, in __connect with util.safe_reraise(): File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 147, in exit raise exc_value.with_traceback(exc_tb) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 898, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\create.py", line 637, in connect return dialect.connect(*cargs, **cparams) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\default.py", line 615, in connect return self.loaded_dbapi.connect(*cargs, **cparams) File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 358, in init self.connect() File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 664, in connect self._request_authentication() File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 976, in requestauthentication auth_packet = auth.cachingsha2_password_auth(self, auth_packet) File "C:\projects\todos\venv\lib\site-packages\pymysql\_auth.py", line 266, in caching_sha2_password_auth data = sha2_rsa_encrypt(conn.password, conn.salt, conn.server_public_key) File "C:\projects\todos\venv\lib\site-packages\pymysql\_auth.py", line 143, in sha2_rsa_encrypt raise RuntimeError(RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
-
해결됨실전! FastAPI 입문
강좌의 풀 코드가 github에 공개된게 없나요?
-학습을 하다가 중간 중간 막히는 곳이 있어.. 코드의 뭐가 잘못되었는지 확인하려는데..강의를 뒤로 돌아가서 영상으로 확인하려면 어렵습니다..강좌의 풀 코드가 github에 공개된게 없나요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (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 되면서 가져오는 것 같습니다! 한 번 확인해주시면 감사하겠습니다!
-
해결됨실전! FastAPI 입문
ModuleNotFoundError: No module named 'database'
안녕하세요. 강의 잘 듣고 있습니다.데이터베이스 연결 강의에서 파이썬 콘솔에서 from database.connection import SessionFactory를 실행할 때 자꾸 모듈을 찾을 수 없다고 나옵니다.sys.path.append를 통해 경로를 추가해주었는데도 찾지를 못하고 있습니다. 해결방법을 알 수 있을까요? 감사합니다!
-
해결됨실전! FastAPI 입문
혹시 강의처럼 잘 안되시는분들을 위해 글을 남깁니다(09.완강)
안녕하세요 저는 23년 9월 수강 완료한 수강생인데요windows10 환경에서 pycharm 을 이용해 해당 강의 수강하며혹시 저와 같은 이유로 진행이 어려우신 분들을 위해 글을 씁니다 일단 pycharm 버전을 떠나서강의 초반부 윈도우 환경에서 python -m venv todos 로 폴더를 만들고강의와 같이 todos 폴더 안에 src 폴더를 만들면서 source root 를 설정하고 진행시강의 내용처럼 auto import, import 입력시 IDE 에서 도와주는 코드 어시스트 기능을전혀.. 사용할수가 없었습니다. ㅜ(추측컨데 windows 환경이라서 그런건지는 확실치 않지만, venv(가상환경) 내부에 src 를 만들어서 이용하기 때문에 interpreter 충돌이 일어나는게 아닌지.. 싶습니다제 경험으로는 강의 처럼 todos 라는 venv 로 가상환경을 만들고interpreter 세팅을 todos/Script/python.exe 설정을 했을때 온전히 강의처럼 진행이 안됐었습니다.)그래서 해당 사진처럼 cmd에서 venv 명령이 아닌파이참 초반에 open project 할때 new project 를 선택해서위와 같이 설정하고project tree 구조를 위와같이 잡으니 이후 진행이 강의 내용과 똑같이 진행이 되어완강할수 있었습니다. 아마 위와같은 설정으로 new project 하시면 초반에 todos/venv 폴더만 있으실 겁니다 그러면 venv 폴더는 건들지 마시고 todos/src 폴더만 새로이 생성한 후 이후 진행은강의 처럼 똑같이 진행 하시면 되겠습니다.% 강의 후반부 쯤 Redis 를 사용하게 되는데 pycharm 에서 import 하기 전pip install redis 설치해야 그후 부터 python console 에서 redis import 가능합니다 %
-
해결됨실전! FastAPI 입문
pytest시 import error
안녕하세요 선생님! 강의 잘 듣고 있습니다.pytest진행하는 과정에서 똑같이 directory구조 만들고 pytest를 명령어로 입력했더니 ImportError while importing test module: test_main.py 절대경로Hint: make sure your test modules/packages have valid python names.라는 Error와 함께 pytest가 진행되지 않아서 해결책좀 질문드리고 싶습니다 ㅠ. 참고로 SwaggerUI로 API test를 해보면 잘 작동합니다!