묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
쿼리 결과 그리드에서 TYPE, POSSIBLE_KEYS 다릅니다
상단의 스크린샷이 저의 로컬에서 확인된 거구요아래는 선생님의 결과 입니다 [실습] 유저 이름이름 특정기간에 작성된 글 검색하는 SQL문 튜닝하기3:30초 구간 입니다 똑같이 했는데 왜 TYPE과 KEY 변경되어 있을까요?제가 잘못하고 있는건가요? 따라 쓴거도 아니고 NOTION에 있는걸 복붙 했습니다 ;;;
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
CouponService에서 이미 다운로드 한 쿠폰 안 내려주기
안녕하세요! 수업 중에 재민 님이 말씀해주신 이미 다운로드 한 쿠폰은 내려주지 않는 것과 관련해서 질문이 있습니다.제 나름대로 생각해 본 코드는 이렇습니다.fun getCouponsForProducts(productIds: Collection<Long>): List<Coupon> { val productTargets = couponTargetRepository.findByTargetTypeAndTargetIdInAndStatus( CouponTargetType.PRODUCT, productIds, EntityStatus.ACTIVE, ) val categoryTargets = couponTargetRepository.findByTargetTypeAndTargetIdInAndStatus( CouponTargetType.PRODUCT_CATEGORY, productCategoryRepository.findByProductIdInAndStatus(productIds, EntityStatus.ACTIVE).map { it.categoryId }, EntityStatus.ACTIVE, ) val applicableCouponIds = (productTargets + categoryTargets).map { it.id }.toSet() val downloadedCouponIds = ownedCouponRepository.findByUserIdAndState(userId, OwnedCouponState.USED) # userId 어디서 받아오지? .map { it.couponId } .toSet() val finalCouponIds = applicableCouponIds - downloadedCouponIds if (finalCouponIds.isEmpty()) { return emptyList() } return couponRepository.findByIdInAndStatus(finalCouponIds, EntityStatus.ACTIVE) .map { Coupon( id = it.id, name = it.name, type = it.type, discount = it.discount, expiredAt = it.expiredAt, ) } }여기서 고민됐던 부분은 findByUserIdAndState 에서 userId 를 어디서, 어떻게 받는 것이 좋을지 입니다. getCouponsForProducts 함수가 호출되는 ProductController의 findProduct 메서드에서는 별도의 User 관련된 정보를 받아오지 않기 때문에 userId 를 받아올 수 없는 상황인 것 같습니다. 그런데 유저가 자신이 이미 다운로드 한 쿠폰을 중복해서 '다운로드 가능 쿠폰' 목록에서 보이지 않게 하는 소위 '개인 맞춤' 작업은 User가 꼭 필요한 정보라고 생각 되는데요.이런 경우에 findProduct에 CouponController에서 처럼 User를 바로 넘겨주면 간단(?)하게 userId를 알 수는 있지만 이게 최선인 것 같진 않습니다. User를 파라미터로 넘겨주는 것을 인증 절차를 거친다고 생각해본다면 상품 상세 정보 보는 것은 꼭 인증을 하지 않더라도 볼 수 있어야 할테니까요. (그런데 User를 파라미터로 넘겨주는 것이 인증이 된 사용자만 이 API를 사용할 수 있다고 이해하는 것이 옳은 이해인지는 제가 잘 모르겠습니다🥹)그래서 또 다른 접근법으로는 재민 님이 ProductController의 findProduct 메서드에서 쿠폰을 불러오는 부분 위에 주석으로 처리해놓으신 것처럼 별도의 API를 만들고 해당 API에서 User를 활용해서 진행하면 어떨까 하는 생각도 해봤습니다. 재민 님은 어떤 식으로 푸실지 궁금합니다! 감사합니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
프로덕트와 카테고리에 대한 질문
안녕하세요!강의 중 잘 이해가 안되는 부분이 있어 질문드립니다.카테고리에 상품이 있는 방향으로 설명을 진행하다가 실제 구현에선 프로덕트의 카테고리이다 라고 정의를 하셨다고 말씀해주셨는데설명과 실제 구현이 다른 이유가 있을까요?
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
주문, 결제 엔티티의 분류
"실전 개념적 모델링 - 시작" 파트를 들으면서 궁금한 점이 있어 질문드립니다. 주문, 결제 엔티티의 경우, 주문은 '결제'까지 포함하는 비즈니스 트랜잭션 단위라 하였는데, 왜 두개의 엔티티로 분류해야하는지 궁금합니다.현재 요구사항에서는 하나로 합쳐도 문제가 없는건가요?
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
섹션1 4강부터 강의 실행 안됨 이슈
섹션1 강의에서 4강 '아나콘다와 주피터 노트북의 이해' 강의부터 강의 실행이 안됩니다.검정색 화면만 나와요... 해결방법 확인 부탁드립니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
강의를 보고 궁금한 것 질문 드립니다!
안녕하세요 🙂 지난번에 이어 질문을 또 남기게 되었습니다 ㅎㅎ 1. Point 라는 개념을 다룰 때 PointService에서 로직을 처리하지 않고 별도의 PointHandler라는 객체를 만들어서 처리하는게 Point 개념 자체가 다른 개념에서도 많이 사용하는 개념이다보니 PointService에서 처리하게 되면 Service 간 참조가 생기는 것을 방지(?) 하고자 이런 전략으로 처리한 것일까요? 이런 식으로 격벽을 넘어서 여러 개념에 걸쳐 있는 개념을 다룰 때는 별도로 분리해놓는 것이 재사용성, 응집 측면에서 좋은 전략인지 궁금합니다! 2. 지금 Point 변화를 주는 것을 PointBalanceEntity 에서 처리하고 있는데 만약 추후에 복잡한 포인트 적립 정책이 생긴다면 별도의 PointPolicy 를 Object 클래스로 만들어 해당 클래스에 포인트 적립 관련 로직을 응집 시키는 식으로 PointPolicy 라는 개념을 추가하는 건 어떻게 생각하시는지 궁금합니다! 감사합니다😀
-
미해결김영한의 실전 데이터베이스 - 기본편
파티셔닝 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요, 강의 잘 듣고있습니다.최근 파티셔닝이란 개념에대해 알게되었는데, 강의 내용엔 파티셔닝이 포함되어있지 않는 것 같아서 실무에서는 파티셔닝은 잘 사용하지 않는지 인덱스와는 어떤 차이가 있는 지, 파티셔닝을 실무에서 사용하지 않는다면 어떤 이유 때문인지 궁금합니다. 제가 검색 등으로 정보를 취득해봤을 땐, 주로 인덱스보다 더 큰 규모의 데이터를 다룰 때 파티셔닝을 쓰고 인덱스+파티셔닝을 함께 쓰면 더 좋은 결과를 얻을 수 있다는 것 같은데 실무에서도 해당 내용이 맞는 지도 궁금합니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
금액 계산은 서버에서하고 클라이언트는 가격 정보를 주지 않았을 때
안녕하세요! 금액 계산은 클라이언트 조작 문제 떄문에 서버에서 담당해야한다고 말씀해주셨는데요, 그렇다면 클라이언트에서는 식별값만을 주고 가격정보는 주지 않았을 때 문제는 없을까요? 예를 들어 클라이언트가 한 화면에서 오래 머무르는 동안 상품 가격이나, 할인 등 총 결제 금액을 계산하는데 있어 변동 사항이 생겼을 때 클라이언트가 보고 있는 가격과 서버에서 요청 시점에서 계산한 가격이 일치하는지까지 봐야하지 않나라는 생각이 들어 질문드립니다..! 서버에서 현재 상태를 기준으로 가격을 계산하고 처리했을 때, 사용자 입장에선 자신이 본 가격과 다른 가격으로 계산될 수도 있지 않을까요??가격을 결정짓는 요소들이 변경되었는지를 서버에서 판단해서 요청 실패처리를 할 수 있겠지만, 요소들이 많다면 각각을 버저닝하고 확인해야 하는 형태가 될 거 같기도 해서.. 클라이언트에서 확인한 가격 정보를 서버에 넘기고, 서버에서 실시간으로 계산한 금액과 일치한다면 성공시키는 구현 형태는 실무에서 잘 쓰지 않는 것인지 궁금합니다!
-
미해결김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
mysql화면 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. mysql을 다운 하라는 곳에 들어가 제대로 다운 했는데 화면이 강의에서 보는 것과 달라 맨붕이 옵니다. 다시 다운을 해도 똑같은 화면입니다 버전도 용량이 큰거도 다운했습니다. 어떻게 해야할까요..
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
어떤 경우 도메인(개념)객체를, 어떤 경우 JPA 엔티티를 활용하나요?
서비스들을 보면 어떤 경우는 finder같은 서비스 하위 계층을 통해 도메인(개념)객체를 활용하기도 하고, 서비스에서 직접 repository를 의존해서 jpa entity를 활용해서 로직을 수행하는 케이스도 있어 보입니다! 혹시 서비스 단에서 도메인 객체를 가져와서 사용하는 것과 jpa entity를 직접 활용하는 것의 판단 기준이 따로 있으실까요?
-
미해결graphRAG - Neo4J로 구현하는 지식 그래프 기반 RAG 시스템 (feat. LangChain)
id(actor) 와 관련한 질문입니다
이 명령은 actor.id 를 생성하는 명령인지. 아니면 gactor.get("id") 인지 궁금합니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
목록 조회에서 개념(도메인)객체를 반환할 때
현재 코드상으로 목록조회에서도 개념객체를 활용하는 것으로 확인했습니다! 하지만 한 개념 객체가 여러 개념 객체를 포함하는 경우가 있는 상태에서 페이지네이션 같이 모든 개념객체의 필드를 채워줄 필요가 없는 경우도 있을 거 같습니다. 이때, 필요한 컬럼만 추출한 데이터를 담는 별도 dto용 객체를 만든다개념 객체의 일부를 채운 값을 Page에 반환한다 실무에선 둘 중 어느 방식을 적용하는지 궁금합니다! 제 생각에는 개념(도메인) 객체는 항상 완전한 상태로 있어야 하므로 별도 프로젝션 dto용 객체를 만들어서 서비스단에서는 도메인 객체가 아닌 해당 dto 객체를 내려주는 것이 낫지 않을까 생각합니다. 또한 사용하지 않는 필드를 완전한 객체 상태로 만들어주기위해 불필요하게 많은 추가 쿼리가 발생할 수 있어서 이런 경우는 별도 값(dto)객체를 쓰는 게 나을 거 같은데 실무에서는 어떻게 하는지 궁금합니다!
-
미해결김영한의 실전 데이터베이스 - 기본편
join 문제 풀이2 문제1(self join) 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용] join 문제와 풀이2에서 문제 1번에 대한 질문입니다.풀이는 아래 쿼리 중 1번의 형태로 해주셨는데 저는 풀이 보기 전 혼자 풀었을 때 2번의 형태로 작성을 했는데...일단 동작은 둘 다 같은데 유지보수적인 면이라던지 의미적인 면이라던지 더 좋은 형태가 있는 지, 둘의 차이가 있는 지 궁금하여 질문 드립니다. 1번 쿼리SELECT m.employee_id, mname, m.manager_id, enameFROM employees eJOIN employees m ON e.employee_id = m.manager_idWHERE m.manager_id = 42번 쿼리SELECT e.employee_id, ename, e.manager_id, mnameFROM employees eJOIN employees m ON e.manager_id = m.employee_idWHERE e.manager_id = 4
-
미해결graphRAG - Neo4J로 구현하는 지식 그래프 기반 RAG 시스템 (feat. LangChain)
쿼리문 질문 드립니다.
"graphRAG 구현 (랭체인 LCEL 활용)" 부분입니다.WHERE ANY(title IN $movie_titles WHERE movie.title CONTAINS title) 부분을 아래와 같이 수정 WHERE movie.title IN $movie_titles수정한 이후에 건수가 제대로 나오질 않았습니다. ( 참고 $movie_titles 는 4건인데최총 추출되는 것은 2건입니다.) 단순히 생각하면 title 이 추출된 title 에 포함되어 있는 movie 만 추출하면 될 거 같은데..제대로 동작하지 않네요...왜 그런지 설명 부탁드립니다.WHERE 절 안에 다시 WHERE 절이 있는 것도 잘 모르겠습니다.감사합니다.
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
실무에서의 복수 항목에 대한 관리 방법이 궁금합니다.
실무에서도 복수 항목에 대해서 원자성을 고려해 테이블을 분리하는지 궁금합니다. 예를 들어, 카드 정보라는 테이블이 있을 때, 혜택이라는 컬럼에는 '캐시백', '쿠폰 할인' 이런 식으로 복수의 데이터가 들어가게 되는데, 그럼 따로 카드 혜택이라는 하위 테이블을 만들어서 관리하나요? 이런 복수 항목이 늘어날 때마다 테이블을 하나씩 만들어야 하는지... 테이블 구조가 복잡해지는 느낌이 들어 질문드립니다.
-
미해결김영한의 실전 데이터베이스 - 기본편
9. 인덱스2.pdf 중에서
[4페이지 - 예시 2]하나는 "~", 다른 하나는 "AND"인 부분 뭔가 어색?한 거 같습니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
화면과 관련한 정보 처리 질문입니다
안녕하세요..! 네이티브 앱 환경에서 서버 개발을 하다보니, 여기 강의에서나오는 리뷰 수가 어떻게 보일지 같은 문제를 서버에서 컨트롤 하자는 얘기가 자주 나와 질문 드립니다. 예를들어, 15000건의 리뷰수를 100+ 였다가, 15k 같은식으로 변경 되는걸 서버에서 string으로 내려달라는 것이죠. 현재는 원본데이터를 도메인에서 처리하고, 보여질 데이터를 dto 단에서 처리하는 식인데요..매번 화면에 표현되는걸 실험이라고 계속 바꿔대는데, 조금 불편한 느낌이 생기더라구요. 이런 경우는 보통 어떻게 처리하는게 좋을까요? 화면을 제어하는 필드가 많아질 수록 더 관리가 안되는거 같아요. 특히 os 별 다르게 처리한다던가..
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
Service 간 의존하는 경우
안녕하세요! 너무 구현적인 질문을 드리는 걸 수도 있지만, 개념을 나누고 이를 결과적으로 코드로 구현해보려는 입장에서 어느정도 규칙이나 일관성을 두고 구현하면 더 좋겠다는 생각에 질문드립니다! 현재 구현상으로 1. 하나의 개념을 한 서비스로 만들고, 서비스간의 의존은 피하는 형태로 구현하신 게 맞을까요? 2. 만약 그렇다면, 예를 들어 ReviewService에서 현재는 pointHandler를 호출하고 있는데, 이 핸들러의 로직이 더욱 응집되어 PointService의 메서드 자체를 호출하는 것이 하나의 동작으로써 자연스럽다면, 이런 경우는 PointService를 ReivewService에서 의존해서 메서드를 호출하기보단, ReviewHandler 및 추가로직이 응집된 PointService 서비스 하위레이어(?)를 두어서 이를 의존하게 하는 형태로 구현하시는 건지 알고 싶습니다..!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
개념을 나타내는 객체 내에 로직이 들어있는 것은 좋지 않을까요?
ReviewService에서 addReview를 할 때, ReviewTarget 객체와 ReviewContent 객체를 넘겨주어서 Validator에서 이를 검증하는 코드를 봤습니다. 이와 같이 개념을 표현하기 위한 객체 내부에 검증 메서드(비즈니스 적인 요소 or 값 누락 등)를 두는 건 좋은 방법이 아닐까요? 예를 들어 validator에서는이러한 개념을 구성하는 요소간 복합 검증이 필요한 경우 이러한 내용을 구현하고, 각 요소 자체에서 할 수 있는 검증은 ReviewTarget같은 객체에서 validate()메서드를 두어, 해당 객체가 갖고있는 데이터에 대한 검증을 하게 한다면 어떨까 생각이 들었습니다.아직 강의를 끝까지 보지 못했지만, 개념 객체 역할을 하는 class가 단순 dto 처럼 값만을 들고 있는 역할을 하는 것 같아 질문드립니다..!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
격벽의 의미
안녕하세요! 격벽은 주요 개념을 나누고 가능한 직접 의존하지 않게 하는 판단 기준이라고 생각이 들었습니다! 그런데 예를 들어 복잡한 조회 쿼리의 경우에는 컨트롤러단에서 각 개념 간 조회를 하고 이를 어플리케이션 단에서 데이터를 필터링하는 것보다 join을 하는 경우가 성능적으로나 구현적으로 나은 방식이 될 수 있을 거 같습니다! 이런 경우 서로 다른 두 개념이 있을 때 한 개념 내 테이블과 다른 개념 내 테이블을 직접 join하는 경우가 있을 거 같은데요, 혹시 이런 경우도 가능한 지양하시는 편이실까요?? 벽을 침범하지 않는다는 것이 이런 경우에도 적용되어야 하는 것인지 궁금합니다!