묻고 답해요
153만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! FastAPI 입문
테스트 코드 오류
안녕하세요 테스트 코드 사용 중 오류가 잡히지 않아서 문의 드립니다. 강의에서 설명해주신 것처럼 아래와 같이 코드를 작성했지만 오류가 발생합니다.어떻게 해야 할까요? from fastapi.testclient import TestClient from main import app # api들이 있는 app을 검증할 클라이언트 생성 client = TestClient(app=app) def test_health_check(): # api 요청 response = client.get("/") # 반환 값 검증 assert response.status_code == 200 assert response.json() == {"ping": "pong"}아래는 오류 내용 입니다.(fastapi_orm) C:\Users\User\Desktop\Fast_API(ORM)\code\src>pytest ============================================================================= test session starts ============================================================================= platform win32 -- Python 3.10.16, pytest-8.3.5, pluggy-1.5.0 rootdir: C:\Users\User\Desktop\Fast_API(ORM)\code\src plugins: anyio-4.8.0 collected 0 items / 1 error =================================================================================== ERRORS ==================================================================================== _____________________________________________________________________ ERROR collecting tests/test_main.py _____________________________________________________________________ tests\test_main.py:5: in <module> client = TestClient(app) ..\..\..\..\anaconda3\envs\fastapi_orm\lib\site-packages\starlette\testclient.py:399: in __init__ super().__init__( E TypeError: Client.__init__() got an unexpected keyword argument 'app' =========================================================================== short test summary info =========================================================================== ERROR tests/test_main.py - TypeError: Client.__init__() got an unexpected keyword argument 'app' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ============================================================================== 1 error in 0.86s ===============
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
Getter관해서
수업을 통해 무분별한 Getter/Setter 사용을 지양해야 한다는 내용을 들었습니다.저는 Entity를 만들 때 @Getter를 자주 사용했는데, 수업에서는 "필요한 경우에만 추가하라"고 설명하더라고요.그런데 여기서 말하는 "필요한 경우"가 어떤 상황을 의미하는지 잘 감이 오지 않습니다.예를 들어, 비밀번호 같은 중요한 정보는 Getter를 사용하기보다는 내부에서 메서드를 통해 사용하는 게 좋다는 건 이해가 됩니다.그렇다면 일반적인 경우에서 Getter는 어떤 상황에서 사용해야 하는 걸까요...?
-
미해결실전! FastAPI 입문
orm relationship 정의 중 해당 에러 발생 시 어떻게 고쳐야 하는걸까요
sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper[ScheduleEntity(schedules)], expression 'CountryEntity' failed to locate a name ('CountryEntity'). If this is a class name, consider adding this relationship() to the <class 'src.models.schedule.ScheduleEntity'> class after both dependent classes have been defined. cities = relationship("src.models.city.CityEntity", back_populates="country", cascade="all, delete-orphan", lazy="joined") schedules = relationship("src.models.schedule.ScheduleEntity", back_populates="country", cascade="all, delete-orphan", lazy="joined")이미 이렇게 다 해놨는데 말이죠...
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
이름 바꾸기
23번째줄에서 for문 i 말고 지뢰라는 이름으로 (예를들어, mines 등 ) 바꿔도 되지 않을까요 ..?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
stack 대신 queue 를 사용해 bfs 로 변경해도 되나요??
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 아래처럼 Stack 대신 Queue 를 사용해 BFS 로 변경해도 문제가 없을까요? private void openSurroundedCellsBFS(CellPosition cellPosition) { Queue<CellPosition> queue = new LinkedList<>(); queue.add(cellPosition); while (!queue.isEmpty()) { openAndEnqueueCell(queue); } } private void openAndEnqueueCell(Queue<CellPosition> queue) { CellPosition currentCellPosition = queue.poll(); // 큐에서 꺼냄 if (isOpenedCell(currentCellPosition)) { return; } if (isLandMineCellAt(currentCellPosition)) { return; } openOneCellAt(currentCellPosition); if (doesCellHaveLandMineCount(currentCellPosition)) { return; } List<CellPosition> surroundedPositions = calculateSurroundedPositions(currentCellPosition, getRowSize(), getColSize()); for (CellPosition surroundedPosition : surroundedPositions) { queue.add(surroundedPosition); } }
-
해결됨실전! FastAPI 입문
FastAPI 폴더 구조에 대해 질문이 있습니다.
안녕하세요. FastAPI 프로젝트의 폴더 구조에 대해서 궁금한 점이 생겨서 질문 드립니다.처음에는 라우터에 모든 로직을 넣어서 라우터와 Repository만 분리해서 개발을 하다가, 3 레이어드 아키텍처로 분리를 좀 해볼까 생각이 들었습니다.controller, service, repository 이렇게 나누어 보려고 하는데요. 예를들어 user, board와 같은 도메인이 있다고 하면, 각 폴더를 도메인별로 나누어서 구조를 잡는게 좋을까요? 아니면, controller 폴더 안에 user_controller.py, board_controller.py 등의 파일들이 모여있는게 좋을까요? 선생님께서는 실무에서 어떻게 폴더 구조를 가져가시는지도 궁금합니다.감사합니다.
-
해결됨실전! FastAPI 입문
질문 있습니다.
안녕하세요. FastAPI로 개발한 어플리케이션을 Rocky 서버에 올려서 실행시키려고 합니다.그런데, Sqlalchemy를 통해 DB와 연결하는 부분에서 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 61: invalid start byte위와 같은 에러가 계속 발생하는데요. env에서 받아오는게 잘못됐나 싶어서 직접 스트링으로 넣어봐도 똑같은 에러가 계속 발생하고 있습니다.서버의 locale도 찍어보면LANG=ko_KR.UTF-8 LC_CTYPE="ko_KR.UTF-8" LC_NUMERIC="ko_KR.UTF-8" LC_TIME="ko_KR.UTF-8" LC_COLLATE="ko_KR.UTF-8" LC_MONETARY="ko_KR.UTF-8" LC_MESSAGES="ko_KR.UTF-8" LC_PAPER="ko_KR.UTF-8" LC_NAME="ko_KR.UTF-8" LC_ADDRESS="ko_KR.UTF-8" LC_TELEPHONE="ko_KR.UTF-8" LC_MEASUREMENT="ko_KR.UTF-8" LC_IDENTIFICATION="ko_KR.UTF-8" LC_ALL=잘 설정되어있는데, 뭐가 문제일까요? 아래는 DB 연결하는 부분 코드입니다.from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from core.settings.settings import settings DATABASE_URL = f"postgresql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_NAME}" print(f"DB: {DATABASE_URL}") engine = create_engine( DATABASE_URL, echo=True, connect_args={"options": "-c search_path=schema"} ) SessionFactory = sessionmaker(autoflush=False, autocommit=False, bind=engine) def get_db(): session = SessionFactory() try: yield session finally: session.close()
-
해결됨실전! FastAPI 입문
mysql root 비밀번호 변경관련
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=todos -e MYSQL_DATABASE=todos -d -v todos:/db --name todos mysql:8.0ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '비밀번호'; 명령어로 root계정의 비밀번호를 바꿨고, 이후에 mysql -u root -p로 root계정에 접속할 때는 변경된 비밀번호로 잘 작동합니다. 그러나,workbench에서 localhost:3306 root계정에 접속하려할 때, 계속해서 강의중 설정한 todos라는 비밀번호를 입력해야 접근이 가능한 상황입니다.왜 cmd에서 변경한 비밀번호가 워크벤치에 적용되지 않는것인지 궁금해서 문의드립니다. 해결방법이 있을까요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 후 AfterEach 함수에서 나오는 쿼리
안녕하세요 fetch join까지 적용한 후에 테스트 코드 자체가 N+1 문제가 제거된 것은 확인했습니다.그런데 AfterEach 함수에서 deleteAll을 하는 과정에 fetch join 이전의 N+1 쿼리랑 유사한 쿼리가 나오는데 이게 delete 쿼리를 날리기 위한 데이터를 가져오려는 목적인것 같은데 질문이 있습니다. 혹시 deleteAll 이전에 나오는 쿼리도 N+1처럼 동작하는지테스트 코드이므로 테스트 객체의 모수가 작아 무시해도 되는지이정도 질문하고 싶습니다
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
현업에서 ISP를 도입하려는데 인터페이스 설계에 있어서 의문이 있습니다.
금융업 it업계에 종사하는 개발자입니다.isp에 대해 어렴풋이 알고 있다가 강사님의 강의를 보면서지난 리팩토링 과정에서 제가 겪었던 문제에 답이 될 수 있을 것 같아서 질문드립니다.인증서라고 하는 비즈니스가 하나의 소스 코드에 if else로 분기처리되어있는 것을 각 인증서라는 인터페이스를 두고, 요청으로 온 구분코드에 따라 서로 다른 구현체를 생성하도록 했습니다.이때 한가지 문제가 인증서 별로 기능이 상이하다는 것이었는데요. 발급, 폐기, 환불 등의 기본적인 기능들은 모두 제공하지만 갱신, 강제폐기/환불 등 특정 인증서에서만 구현되는 기능들이 있을 때 강의에서 말씀하신 isp를 위반하는 상황이 발생할 거라고 생각했습니다. 그렇다면 공통기능에 대한 인터페이스, 특정기능에 대한 인터페이스를 분리하자라는 생각까지 해보았는데,, 이렇게 됐을 때 공통기능을 구현하지않는 또 다른 인증서 상품이 신규 됐을 때 문제가 될거라는 생각이 들었습니다. 다른 방식으로 발급, 폐기, 환불 등 각각의 기능들을 인터페이스화 하자면 각 구현체별로 구현하는 인터페이스가 너무 많아지는게 아닐까 하는 생각도 들었습니다.이럴 경우에는 어떻게 설계에 접근해야할지 고견을 여쭙니다. 혹 이럴 때 용이한 디자인패턴 같은게 있는지요.긴 글 읽어주셔서 감사합니다.
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
null을 가질 수 있는 값을 인자로 넘겨야 하는 경우
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. Optional을 인자로 받는 것이 안티패턴이라고 하셨는데null을 가질 수 있는 값을 인자로 넘겨야하는 경우에는그냥 해당 값을 Optional로 감싸지 않고 그대로 넘기고받는 쪽에서 if문으로 null인 경우를 처리해주는 방법을 사용하나요??
-
해결됨Readable Code: 읽기 좋은 코드를 작성하는 사고법
리팩토링을 하고 난 뒤 다시보면 오히려 더 복잡해 보이는것 같은 느낌입니다..
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 강의에서는 사실 처음에 만들어졌던 로직을 하나하나씩 변경해가면서 그 히스토리를 알고 있는 상태니까.. 리팩토링을 하는 과정이나, 하고 난 뒤에도 어느정도 이해가 가지만 만약 처음 들어온 신입 개발자가 리팩토링이 완료된 코드를 보면 오히려 더 복잡해 보이는 경우도 있지 않을까 하는 생각이 들어서 질문드립니다..가독성을 위해 추상화를하고 메소드를 분리하고 했지만, 상세 구현 로직을 확인하려면 다시 내부로 들어가는 과정을 거치면서 오히려 집중력이 분산되는 느낌인데.. 리팩토링이 추구하는 가치와 약간 모순된다는 느낌을 받았습니다.. 혹시 이렇게 느끼는 이유가 아직 코드 작성 경험이 적어서 그러는걸까요? 굳이 추상화해놓은 메소드 내부까지 들어가서 확인할 필요는 없는건가요?제가 느끼기로는 맨 처음 아무런 정리가 안되었던 코드가 제일 이해가 잘갔던 것 같아서 계속 리팩토링을 하면서도 고민이 되어서 질문드립니다..
-
미해결실전! FastAPI 입문
[질문] patch API
patch부분 웹사이트에 적용이 안되는데 왜 그런지 알수있을까요?
-
해결됨실전! FastAPI 입문
디자인 패턴
덕분에 Fastapi 관련 수강 완료하였습니다. 이제는 디자인 패턴에 대해 설계를 공부해보려는데, Spring의 경우 MVC 패턴을 주로 사용하는데, Fastapi에서는 주로 어떤 디자인패턴으로 설계를 하시는 지 궁금하여 질문드렸습니다. 감사합니다
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
조합 관계에 대해 질문있습니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요.이번 강의에서 상속 구조를 조합으로 풀어내면 유연해진다고 하셨는데Cell의 공통 부분을 뽑아내서 CellState로 만들어서 EmptyCell, LandMineCell, NumberCell에서 사용하게 되는데 이러면 결국 CellState와 결합도가 높아지는 것 아닌가요??EmptyCell, LandMineCell, NumberCell과 CellState사이에 인터페이스를 만들지 않는 이상 Cell을 부모로 사용할 때와 큰 차이가 없는 것 같은데 ( 결국 CellState에서 변경이 일어나면 CellState를 사용하는 곳에서도 변경을 해줘야 하니까 부모인 Cell에서 변경이 일어나면 자식도 변경을 해줘야 한다는 것과 동일하다고 생각했습니다 )잘못 생각하고 있는 부분일까요..?
-
해결됨실전! FastAPI 입문
main.py 리로드문제
WARNING: StatReload detected changes in 'main.py'. Reloading...에러표시와 함께 웹 리로드가 안되는거같아요 delete api 작성한것 또한 스웨거 에서 확인되지않는데 혹시 해당관련 정보 받을수있을까요
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 질문드립니다,
안녕하세요 강사님, 뒷내용을 다 보진 못했지만 여기까지 보고 궁금한게 있어서 질문드려봅니다, 비즈니스로직의 대한 구체화와 추상화에 대한, 숫자를 전부 10으로 맞추는게 좋다고 하셨는데, 여기서 궁금한게 결국 private으로 메소드 이름으로 추상적 내용을 담아 코드의 읽힘 가속성이 좋은 코드가 되는것까지 이해 하였습니다, 여기서 궁금한건,하나의 클래스에 private 메소드 즉, 추상 메소드가 많아지면 관리차원에서 힘들까요? 여기서 강의에서도 말씀하셨지만 궁금하면 메소드를 들어가 보긴 할텐데, 해당 상황이 많을것 같아서 궁금합니다, 아니면, 상황에 따라 클래스를 분리하고 관리 할지, 궁금합니다.결국 핵심 비즈니스 로직은, 추상적으로 메서드 추상화된 네이밍을 읽어 읽기 좋은 코드가 된다고 생각합니다만 맞을까요?
-
해결됨실전! FastAPI 입문
인터프리터 오류
가상환경을 만들고 pycharm 인터프리터에 들어가면 invalud python3.10이라고 뜨는데 어떻게 해결해야할까요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 fixture
안녕하세요 강사님.코틀린을 배우는데 좋은강의 만들어주셔서 감사합니다. 테스트를 위한 fixture 코드 부분에 대해 의견 여쭤보고 싶습니다.강의에선 직접 엔티티 내부에 테스트를 위한 fixture 함수를 만들어 주셨는데, 팀 내부 의사결정에 따라 두어도 괜찮을 수도 있을 것 같지만 만약 테스트용 코드는 분리해야 한다고 하면아래처럼 테스트 코드 패키지쪽에 fixture 생성을 위한 유틸파일을 만들고, 테스트 코드에서만 Book.fixture(...) 같은 형태로 사용할 수 있도록 엔티티에 비어있는 companion object를 만든 뒤 확장함수를 작성하는 형태로 해도 괜찮을지 의견 여쭤보고 싶습니다.!테스트코드용 유틸 생성 User, Book 등의 엔티티에 비어있는 동행객체 선언엔티티별 Companion 확장함수 작성테스트 코드에서 엔티티.fixture() 형태로 사용
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
./gradlew test 실행시 인식할수 없다고 뜹니다.
제목 그대로 ./gradlew test 실행시 인식할수 없다고 뜹니다. 이 경우 gradlew이 설치되지 않아서 발생하는 문제인지 궁금합니다.