묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
PDF 문서에 오타가 있어서 알려드립니다.
PDF 문서에 오타가 있어 알려드립니다. divideTest()인데 minus(3)으로 되어 있습니다.
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
enum질문
안녕하세요 선생님enum에 관해서 질문이 있는데 enum을 Intger로 바꿔서 저정하는 경우도 현업에서 많이 봤는데혹시 선생님은 어느쪽을 선호하시나요??각자 장단점이 있는건 인지하고 있고 선생님의 선호하는 방향이 궁금합니다!감사합니다
-
미해결실전! FastAPI 입문
왜 return타입이 ToDo라는 스트링인가요?
안녕하세요.항상 좋은 강의 감사드립니다.수업을 듣던중 2:31경에 나오는 리턴타입을 왜 스트링으로 설정하는지 궁금해서 질문드립니다.이상입니다. 감사합니다.
-
해결됨실전! FastAPI 입문
ORM 연관관계
안녕하세요!Nest에서 Fast API로 컨버젼중입니다. Nest는 Many to Many, Many to One 등등이러한 연관관계를 설정해서 테이블을 생성합니다.Fast API에서는 아래 코드처럼 단순히 join만 걸어두고 사용하면 되는 걸까요?? class User(Base): __tablename__ = "user" id = Column(Integer, primary_key=True, index=True) username = Column(String(256), nullable=False) password = Column(String(256), nullable=False) todos = relationship("ToDo", lazy="joined")
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
중복된 메서드 줄이는 방법
안녕하세요 선생님 강의 잘 들었습니다!강의를 통해 배운 내용을 개인 프로젝트에 적용 하던 중 궁금한점이 생겨 질문 드립니다.private List<Long> getEventIdList(List<EventSimpleInfo> events) { return events.stream() .map(EventSimpleInfo::getId) .toList(); } private List<Long> getEventIds(List<BookmarkedEventSimpleInfoQuery> events) { return events.stream() .map(BookmarkedEventSimpleInfoQuery::getId) .toList(); } Dto 조회한 두개의 List 입니다.두 List에서 id 값을 뽑는 같은 행위를 하고 있는데 어떻게 하면 중복을 줄일수 있을지 모르겠습니다.Dto에 일급 컬렉션을 적용하자니 너무 클래스가 많아 질것 같고,Dto에 인터페이스를 적용 하자니 Dto에 역할을 부여 하는 것이 맞나? 라는 생각이 듭니다.다른 방법은 Dto 내부에 로직을 두는 방법도 생각해 보았는데 어떤게 좋을까요?..쿼리를 줄이기 위해 Dto 조회를 하고 부족한 상태를 조회 하여 값을 채우고 있는데 너무 중복된 행위가많아서 고민 입니다. 어떻게 해야 할까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
MarketPlace에서 Sonarlint 검색이 안됩니다.
intelliJ Ultimate 2024.3 버전 사용 중입니다. 마켓플레이스에서 sonarlint를 검색했는데 받을 수 있는 플러그인이 뜨지가 않습니다ㅠㅠ 웹 검색을 해봐도 저 같은 이슈는 찾을 수 없어서 질문 글 올립니다확인해봐야할 설정값이나 옵션이 있을까요??
-
해결됨실전! FastAPI 입문
Oracle DB 연결과 관련해 질문이 있습니다..
Sqlalchemy 라이브러리와 Python-oracledb 드라이버를 이용해 DB 연결을 하려고 하는데 쉽지 않습니다..저는 service name 정보만 있고 SID 정보는 없는 상태인데, 공식문서를 참고해 아래와 같이 접속을 시도해도 에러가 발생합니다..ㅠ 에러 내용 )File "src/oracledb/impl/thin/transport.pyx", line 289, in oracledb.thin_impl.Transport.send_oob_breakOSError: [Errno 22] Invalid argumentDB 접속 코드 )import sqlalchemy engine = sqlalchemy.create_engine("oracle+oracledb://MY_USERNAME:MY_PASSWORD@MY_DB_HOST:MY_DB_PORT/?service_name=MY_DB_SERVIC_NAME")disable_oob=True로 하면 될 것 같은데, sqlalchemy에서 어떻게 해당 값을 세팅해야 하는지 모르겠습니다...ㅠ따로 설정파일을 만들어야 하나요?ㅠㅠ
-
미해결실전! FastAPI 입문
섹션 2, 3의 PATCH API의 차이점
안녕하세요 강의를 듣던 도중 궁금한 것이 생겨 질문드립니다섹션 2에서의 PATCH API는 else문으로 is_done=True를 is_done=False로 바꾸는 처리를 따로 하지않아 True 상태를 False로 못바꾸는 반면에섹션 3에서의 PATCH API는 Ture를 False로 바꿀수 있다고 이해했는데 혹시 맞을까요??웹 개발을 처음 공부하다 보니 이해를 잘 못했나 해서 질문드렸습니다
-
해결됨실전! FastAPI 입문
ORM 테이블 생성
안녕하세요nest로 개발을 진행하다가 fast API로 전향하려는 개발자 입니다.저와 같은 경우는, TypeORM을 사용하고 있었습니다.TypeORM은 아래 코드와 같이 DB와 연결해 놓고 @Entity 어노테이션을 사용하면 테이블이 자동 생성됩니다.강의를 보면 테이블을 생성하는 쿼리를 console로 만들어서 DB SQL에 직접 작성하는 것으로 확인됩니다.FAST API는 NEST처럼 테이블이 자동 생성되는 기능이 없는 걸까요??또한 @ManyToMany @ManyToOne과 같은 어노테이션을 사용하면 연관관계가 쉽게 맵핑되어별도의 join 쿼리 없이도 조회,수정,삭제가 가능합니다.이러한 부분 또한 FAST API는 지원하는 기능이 없는 걸까요?? import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class PostsModel { @PrimaryGeneratedColumn() //알아서 값을 1씩 증가하는 것을 만들어 준다. id: number; @Column() author: string; @Column() title: string; @Column() content: string; @Column() likeCount: number; @Column() commentCount: number; } import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { PostsModule } from './posts/posts.module'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ PostsModule, TypeOrmModule.forRoot({ //forRoot -> typeOrm과 nestJs을 연결할 수 있는 연결고리를 만드는 것 type: 'postgres', host: '127.0.0.1', port: 5432, username: 'postgres', password: 'postgres', database: 'postgres', entities: [], //데이터베이스와 연동될 모델들 synchronize: true, //nestJS에서 작성하는 typeOrm 코드와 데이터베이스싱크를 자동으로 맞출 것이냐(개발에서는 true, 프로덕션에서는 false) }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
isLandMineCell() 메서드 질문
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 리팩토링한 MinesweeperGame.open() 메서드에 대해서 질문있습니다! private static void open(int row, int col) { if (row < 0 || row >= BOARD_ROW_SIZE || col < 0 || col >= BOARD_COL_SIZE) { return; } if (BOARD[row][col].isOpened()) { return; } if (isLandMineCell(row, col)) { return; } BOARD[row][col].open(); if (BOARD[row][col].hasLandMineCount()) { return; }수업을 따라오면서 isLandMineCell()은 Cell이 지뢰인지 확인하는 메서드이기 때문에 MineSweeperGame 클래스의 메서드가 아닌, Cell 클래스의 메서드가 되어야 open 메서드가 동일한 추상화 레벨을 갖는게 아닌가 하는 의문이 들었습니다. if (BOARD[row][col].isOpened()) ... if (isLandMineCell(row, col)) ...위 두 조건문의 추상화레벨이 통일되지 않다는 생각도 들었구요. isLandMineCell이 Cell 클래스의 메서드로 작성하지 않은 이유가 뭔지 궁금하고, 제가 가지고 있는 생각(추상화레벨 관련)이 잘못된 이유도 궁금합니다. 항상 친절한 설명 감사합니다 많이 배우고 있습니다:)
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
Cell[][]BOARD 매개변수받기
강의 질문 있습니다![섹션4.객체지향패러다임] - SRP: Single Responsibility Principle 강의 - 14분38초경 코드28번줄 cosoleOutputHandler.showBoard(BOARD); 이 부분에서 해당 Cell[][]BOARD를 매개변수로 받고 showBoard(Cell[][] board) 사용되는 부분이 이해가 잘 안갑니다..! 흐름이 어떤식으로 진행되며, 어떤 과정으로 코드가 진행되는지 궁금합니다!
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
ConsoleInputHandler에서 왜 final붙여야 하는지
18줄 코드인 final을 붙여야하는 이유가 있을까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
정적 생성자 메서드 of, from
정적 생성자 메서드의 메서드 명을 정하실 때 of 혹은 from 그 외 추가로 create 등등... 몇 가지 더 있는걸로 아는데, 그 차이가 제 입장에서는 되게 미세하기도 하고 잘 와닿지 않는데 강사님은 어떤 기준을 두고 메서드 명을 정하시나요??
-
해결됨실전! 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()
주간 인기글
순위 정보를
불러오고 있어요