묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
JPA Entity Class 와 Domain Model Entity Class 를 분리해야 하는가? 에 대한 추가 질문
안녕하세요. 토비님!먼저 제가 정말 오랜 기간 고민해온 주제에 대해서 이렇게 강의를 내주셔서 너무 감사드립니다!!특히 강의에서 여러 차례에 걸쳐서 깊게 다룬, "JPA Entity Class 와 Domain Model Entity Class 를 분리해야 하는가?" 에 대한 토비님의 의견이 너무 공감되고 유익했습니다! 감사합니다!그리고 이에 대해서 두 가지 질문이 있습니다.첫 번째는,저는 사실 지난 3년 간 스타트업에서 Domain Entity 와 JPA Entity 를 분리해서 사용해왔습니다.그런데 강의에서 다뤄주신 내용이 제가 겪으며 갖게 된 생각과는 결이 조금 다르다고 느껴서 이렇게 질문을 드리게 되었습니다.제가 느꼈던 "Domain Entity 와 JPA Entity 를 분리해서 사용했을 때의 장단점"은 이랬습니다.장점 1. 도메인 모델의 수정이 DB 데이터 마이그레이션을 꼭 강제하는 게 아니라서, 도메인 모델 수정이 매우 자유롭습니다.상황에 따라 의도적으로 JPA Entity 클래스와 도메인 모델 클래스를 다른 모양으로 만들어두고 유지할 수 있습니다.(ex. User, UserDetail 이 쪼개져 있었는데, 어떠한 의사결정으로 인해 User 하나로 합쳐서 관리하는게 맞다는 판단이 든 경우, UserEntity, UserDetailEntity 는 놔둔 채로 User 만 합치는 게 가능.)장점 2. 도메인 모델들을 완전히 정규화된 구조로 가져갈 수 있습니다. 회사에서 비즈니스가 발전하다보면 종종 어쩔 수 없이 테이블에 성능을 위한 반정규화 필드나 soft delete 용 deleted_at 필드 등을 넣게 됩니다. 하지만 사실 이런 필드들은 순수 비즈니스 로직을 기술하는데에는 방해가 될 뿐인, 너무 Technical 한 부분들입니다. 이러한 반정규화 or 기능 필드들을 도메인 모델에는 넣지 않고 JPA Entity 에만 넣어서 어댑터에서 처리하면, 도메인 모델 내에서는 항상 순수 비즈니스 로직만을 기술할 수 있게됩니다.단점 1. JPA 의 lazy loading 을 활용할 수 없습니다. 항상 도메인 모델 객체는 완전한 상태로만 존재합니다. 그래서 성능 문제로 CQRS 패턴이 강제됩니다. 특히 저는 GraphQL 을 사용중이라 더욱 더 CQRS 가 필요했습니다.단점 2. Repository 의 save(= upsert) 로직을 직접 구현해야 합니다. 특히 복잡한 비즈니스의 핵심 도메인 모델들은 관계된 테이블도 많아가지고 이 save 구현이 엄청나게 길어집니다. 저는 이 save 로직을 직접 구현하고 관리할 때 회의감이 가장 많이 들었습니다. Spring Data JPA 가 그 동안 얼마나 압도적인 생산성을 제공해주고 있었는지도 느끼게 됐습니다.저는 스타트업에서 일하고 있다보니 특히 생산성을 중요하게 생각합니다.그런 점에서도 위의 장점들과 단점들이 모두 너무 치명적으로 느껴졌습니다.그래서 이 관점들에 대한 토비님의 의견과 토비님이 제 상황이시라면 어떤 선택을 하셨을지가 너무너무 궁금합니다. (참고로 저는 Kotlin Springboot + Spring Data JPA + Kotlin JDSL + GraphQL-Kotlin(code first)을 사용하고 있습니다.)두 번째는,사실 저는 Kotlin Springboot 를 사용중인데, 코틀린 언어와 JPA 가 너무 안 어울린다는 생각을 종종 합니다.예를 들면, DB table 에 정의된 column default 값을 쓰려면 JPA Entity 의 해당 필드에 null 을 넣어서 보내야하는데, 보통 테이블 컬럼에 default 를 쓰는 경우는 대부분 해당 컬럼이 not null 타입입니다. 그래서 당연히 JPA Entity 에도 필드 타입은 not null 로 하고 싶어집니다.물론 @Column(insertable=false)를 사용하긴 하지만, 결국 그럼 이 JPA Entity 객체를 생성할 때 해당 필드에 실제로 저장되지도 않을 값을 거짓으로 넣어야 하는 상황이 생깁니다.그래서 조금 더 Kotlin 에 잘 맞는 Exposed 를 고려하자니, 도메인 모델 클래스와 JPA Entity 클래스 분리가 강제되는 느낌이고, 이게 과연 JPA 의 생산성을 따라올 수 있을까? 올바른 선택이 맞을까? 하는 의문이 듭니다.그래서 궁금한 점은,혹시 토비님이 추천하시는 좀 더 Kotlin 언어에 잘 맞고 Kotlin Springboot 를 생산적으로 사용할 수 있는 방법이 있을까요?
-
미해결[Rookiss University] Haker님의 UE5 소스코드 분석 시리즈 #1 (게임 프레임워크)
AActor를 APhysicsVolume으로 Cast가 되는 이유
안녕하세요!아래 코드는 UPrimitiveComponent의 UpdatePhysicsVolume 함수인데, 컴포넌트의 owner인 액터를 가져와서 그대로 Cast<APhysicsVolume>을 했는데, 액터가 캐릭터일 수도 있을 텐데 이게 어떻게 가능한 것인지 모르겠습니다... 감사합니다// haker: just get the owner Actor and compare Physics Volume's priority APhysicsVolume* V = Cast<APhysicsVolume>(OtherComponent->GetOwner()); if (V && V->Priority > BestPriority) { if (V->IsOverlapInVolume(*this)) { BestPriority = V->Priority; BestVolume = V; } }
-
미해결코딩 몰라도 OK! CursorAI로 시작하는 개발 생활 (웹/초급)
뽀모도로 insert 버튼이 안나오고 에러가 뜹니다
뽀모도로 이제 막 시작했는데, ctrl + j, ctrl+k 인가 눌러서 말씀하신 명령어 입력했더니 화살표 처럼 나옵니다.insert 라는게 안떠서 그냥 엔터 눌렀더니 아래 빨간 글자로 막 오류가 뜨네요 ㅠㅠ어떻게 해야 제대로 설치가 될까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
user-loanHistory 폴더 구조 질문
안녕하세요!@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<UserLoanHistory> userLoanHistories = new ArrayList<>(); 이 코드를 봤을 때 User와 UserLoanHistory는 강한 연결관계를 가지고 있는 것 같습니다(이를 같은 aggregate라고 하는 것 맞나요?). 그래서 폴더 구조를 user 밑에 loanHistory를 넣으신 것 같은데, 일반적으로 이런식으로 폴더 구조를 잡나요? 아니면 domain 폴더 아래에 user와 같은 레벨로 loanHistory를 만들고, 대출 기능도 BookService에서 구현하는 게 아니라 UserLoanHistory용 컨트롤러/서비스/레포지토리를 따로 만들어 구현해도 되나요?
-
미해결코딩 몰라도 OK! CursorAI로 시작하는 개발 생활 (웹/초급)
node.js 설치 링크가 안열립니다
실습 첫강의 수업노트에 링크 눌렀는데1번 사진처럼 존재하지 않는 사이트라고 뜨네요ㅠㅠ링크 수정 및 전달 부탁드립니다! ㅠㅠ얼른 만들어보고싶은데 진행을 못 하고 있습니다! 답변 기다리겠습니다. 감사합니다:)
-
미해결카카오,구글 SNS 로그인(springboot3, vue3)
안녕하세요 선생님
혹시 다음 강의도 준비 중이신가요 ? 준비 중이시라면 어떤 강의 인지 알 수 있을까요
-
미해결Next.js 15로 완성하는 실전 YouTube 클론 개발
폴더구조
해당 영상에서 사용된 폴더구조는 어떤 아키텍처를 따른것일까요?
-
해결됨카카오,구글 SNS 로그인(springboot3, vue3)
application.yml에 동일 OAuth2 제공업체의 redirect-uri를 여러 개 등록할 수 있을지 궁금합니다.
안녕하세요.application.yml에 동일 OAuth2 제공업체의 redirect-uri를 여러 개 등록할 수 있을지 궁금합니다. 현재 OAuth 제공업체에 개발 및 테스트용과 배포용으로 redirect-uri를 여러 개 등록하였습니다.해당 redirect-uri를 application.yml에 복수로 등록하여 사용할 수 있을까에 대한 의견이 궁금합니다.
-
미해결
파이썬으로 hwp 파일을 읽어서 특정 문자열을 검색하는 기능을 구현하는 방법이 있을까요?
파이썬 초보입니다.파이썬으로 hwp 파일을 읽어서 특정 문자열을 검색하는 기능을 구현하려고 합니다.특정 문자열의 위치(행,열)와 그 문자열 주위의 문자열을 보여주는 기능입니다.그런데 한글은 서식과 표 등이 있어 텍스트 파일 처럼 조작하기가 쉽지 않아 보입니다.pyhwp 라이브러리는 설치해도 import 해서 사용하면 에러가 자꾸 나고hwp_extract 라이브러리를 이용해서 해봤는데 정확한 위치가 보여지지 않거나 텍스트만 보여지지 않고 문자열이 깨지는 등 원하는 대로 안 되네요..win32com 라이브러리를 쓰면 보안창이라는 화면이 뜨더군요, 안 뜨게 하려는데.. 그것도 안 맞아서..하여튼 만족할 방법이 잘 안 보이네요, 좋은 방법이 있을까요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
4. 단어뒤집기
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 명쾌한 강의 감사합니다.이 영상의 solution 함수에서 파라미터로 n이 들어가지만 실제로 쓰이지 않는 것으로 이해하였습니다. 그러면 1. solution 함수 파라미터에 n을 굳이 넣어야 할 필요가 있나요? 2. 만약 n을 사용하고 answer를 int[n]로 지정하면 될 것 같은데 그렇게 해도 괜찮을까요? 3. ArrayList는 길이가 정해져있는 배열에 비해 성능에 있어 불리하지는 않을까요? 만약 불리하다면 2로 푸는 게 좋을까 생각이 들어서요.
-
미해결RAG를 활용한 LLM Application 개발 (feat. LangChain)
Elasticsearch 를 벡터 데이터베이슬 활용가능한가요
여러 벡터 데이터베이스가 나왔는데 혹시 Elasticsearch 를 docker로 설치하고 사용하는 경우도 있는지 궁금합니다. Elasticsearch 도 벡터 데이터베이스를 지원한다는 글을 읽은바가 있고, 검색엔진 분야에서는 Open 소스로 많이 활동되다는 점에서 활용성이 좋아보여서 질문 드립니다.
-
미해결Next.js와 yolov11로 화재감지 시스템 구축하기
데이터셋 자료를 받을 수가 없어요.
안녕하세요,Roboflow에서 Dataset 다운로드 받을 수 있게 알려주셨는데, 영상과 같이 다운로드 받으면 실제 zip 파일에 README.dataset.txt파일과 README.roboflow.txt 파일만 존재합니다.데이터셋파일도 강의자료로 올려주시면 감사합니다.
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
ResourceManager에서 Multiple Sprite를 로드하는 방법
안녕하십니까? ResourceManager.cs 코드의 어드레서블 에셋 로드 부분에서 스프라이트 로드 관련 질문입니다. 현재 코드는 single sprite에 대한 방식만 제공하고 있는데요. 혹시 Multiple Sprite를 로드하는 방법에 대해 따로 추가로 연구하신 방법이 있는지 궁금합니다. 검색을 해보니 인프런 AI답변으로 Single 스프라이트로 로드 하는걸 추천한다고 했습니다.개인적인 프로젝트라면 개별 스프라이트로 분리해서 추가하는 것도 가능한데, 실제 현업에서는 Multiple Sprite로 작업이 많을 거 같기도 하고 궁금한 부분이라 질문드립니다. 감사합니다.
-
해결됨설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
타이밍 위반 질문
안녕하세요 🙂[1. 질문 챕터] : 섹션3 FPGA 5장[2. 질문 내용] : 타이밍 위반이 왜 일어나는지 모르겠습니다.[3. 시도했던 내용, 그렇게 생각하는 이유] :맛비님 영상에서는 타이밍 위반이 일어나지 않았는데, 저의 경우엔 I/O Delay가 없는 것에 대한 타이밍 위반이 일어납니다. Arty z7-10을 쓰고 있고, xdc 파일에 따로 I/O Delay가 없긴 한데, 그건 ZYBO z7-20 도 마찬가지인걸로 알아서 왜 타이밍 위반이 일어나는지 이해가 안됩니다.
-
미해결Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)
무한 스크롤링 질문
<div v-intersectionObserver="handleIntersectionObserver" class="bg-primary"></div>여기 div에 height 100px 했을때는 스크롤해서 하단에 닿이면 6개씩 잘보였는데 style 부분을 지우니까 스크롤 해서 하단에 닿였을때 나머지 게시물이 6개씩 보이는게 아니라 loadMore() 이 연속적으로 실행되어 전체가 다 보이게 됩니다 height가 0이 되면서 계속 노출이 돼서 그렇게 되는건가요?
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.30.14\": context canceled"
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://inf.run/DvsRD)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://inf.run/Ljaer) Vagrant up을 하면, kubeadm init 단계에서 이미지를 가져오지 못하고 아래아 같이 멈추어 있습니다.ping google.com을 통해 외부 연결은 정상적으로 되는건 확인했습니다.어떤 부분을 더 체크해야 할까요?==> cp-k8s-1.30.1: Running provisioner: shell... cp-k8s-1.30.1: Running: /var/folders/p7/4nthz5pn0g983598nhw8gqd00000gn/T/vagrant-shell20250627-87887-ucssq0.sh cp-k8s-1.30.1: I0627 19:51:36.035198 3710 version.go:256] remote version is much newer: v1.33.2; falling back to: stable-1.30 cp-k8s-1.30.1: [init] Using Kubernetes version: v1.30.14 cp-k8s-1.30.1: [preflight] Running pre-flight checks cp-k8s-1.30.1: [preflight] Pulling images required for setting up a Kubernetes cluster cp-k8s-1.30.1: [preflight] This might take a minute or two, depending on the speed of your internet connection cp-k8s-1.30.1: [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' cp-k8s-1.30.1: W0627 19:51:36.766582 3710 checks.go:844] detected that the sandbox image "registry.k8s.io/pause:3.6" of the container runtime is inconsistent with that used by kubeadm.It is recommended to use "registry.k8s.io/pause:3.9" as the CRI sandbox image. Log: sudo journalctl -u containerd -f --since "10 minutes ago" Jun 27 19:51:35 cp-k8s systemd[1]: Started containerd container runtime. Jun 27 19:51:36 cp-k8s containerd[3591]: time="2025-06-27T19:51:36.782079946+09:00" level=info msg="PullImage \"registry.k8s.io/kube-apiserver:v1.30.14\""Jun 27 19:54:57 cp-k8s containerd[3591]: time="2025-06-27T19:54:57.270115838+09:00" level=info msg="PullImage \"registry.k8s.io/kube-apiserver:v1.30.14\""Jun 27 19:56:35 cp-k8s containerd[3591]: time="2025-06-27T19:56:35.785071330+09:00" level=error msg="PullImage \"registry.k8s.io/kube-apiserver:v1.30.14\" failed" error="rpc error: code = Canceled desc = failedto pull and unpack image \"registry.k8s.io/kube-apiserver:v1.30.14\": context canceled"Jun 27 19:57:26 cp-k8s containerd[3591]: time="2025-06-27T19:57:26.762161620+09:00" level=error msg="PullImage \"registry.k8s.io/kube-apiserver:v1.30.14\" failed" error="failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.30.14\": failed to copy: read tcp 10.0.2.15:48760->52.219.124.238:443: read: connection reset by peer"Jun 27 19:57:26 cp-k8s containerd[3591]: time="2025-06-27T19:57:26.770337247+09:00" level=info msg="PullImage \"registry.k8s.io/kube-apiserver:v1.30.14\"" [질문 하기]
-
미해결
세대원인 경우 에드센스 결제 정보등록
세대원인 경우에는 에드센스 결제 정보등록을 혹시 어떻게 할까요?? 국가/지역대한민국 (KR)이전에 제출한 문서에 다음 문제가 있습니다.입력한 주소가 주소지 증빙 서류의 주소와 일치하지 않습니다.현재 주소가 표시된 서류 업로드다음 목록에 있는 주소지 증빙 서류의 사진을 제공하세요. Google에서 주소 서류를 처리하여 이름과 주소를 확인합니다. 필요하지 않은 기타 정보는 수정해야 합니다. 서류에서 정보를 수정하는 방법 자세히 알아보기허용되는 서류:• 90일 이내에 발행된 전기, 수도 또는 공공요금 청구서• 90일 이내에 발행된 신용카드 명세서• 90일 이내에 발행된 은행 명세서• 90일 이내에 발행된 임대 계약서
-
해결됨PCB HW설계 실무 : STM32를 활용한 Mixed-signal 보드 설계 프로젝트
DRC Error 문의
안녕하세요 삼코치님, Artwork 작업 중궁금한 점이 생겨 질문 남깁니다. 현재 강의의 회로에서 PHY CHIP 먼저 Routing을 하고 있었고 Design rule도 체크할 겸 DRC를 하는 와중에 해결이 안되는 부분이 있어 확인 요청 드립니다. Bottom layer에서 GND의 VIA를 연결했는데, 연결이 되어 있지 않다고 오류가 발생했습니다.VIA 자체에는 Full layer가 routing 되어있어서 큰 문제는 없을 거 같은데, 현재 power plane의 via에만 해당 DRC 오류가 발생하여, 과제 진행에 어려움을 겪고 있습니다. 확인해주시면 감사하겠습니다.
-
해결됨eks를 활용한 spring 운영서버 배포(feat. devops의 모든것)
프로젝트 연결
안녕하세요 강사님! Redis로 시작해 채팅 서비스를 거쳐 지금의 강의까지 도달한 학생입니다 :) 항상 유익한 강의를 제공해주셔서 정말 감사합니다. 이번 강의를 진행하기에 앞서 이전에 진행한 채팅 프로젝트를 적용해 배포해보려고 하는데요 혹시 강의를 진행하는데 있어 문제되는 부분이 생기지 않을까 싶어 미리 질문을 드렸습니다! 강의를 진행하는데 있어 프로젝트가 다르더라도 큰 문제가 없을까요?
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
vagrant up을 하면 설정과 다르게 설정이 됩니다.
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://inf.run/DvsRD)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://inf.run/Ljaer)[질문 하기]안녕하세요.항상 좋은 강의 감사합니다. 이번에 VB로 변경을 하고 있는데, 조훈님이 설정한 Vagrantfile과 다를게 아래와 같이 port를 2200으로 설정하고 있습니다. 혹시 원인 및 해결 방법을 알 수 있을까요? vagrant upBringing machine 'cp-k8s-1.30.1' up with 'virtualbox' provider...Bringing machine 'w1-k8s-1.30.1' up with 'virtualbox' provider...Bringing machine 'w2-k8s-1.30.1' up with 'virtualbox' provider...Bringing machine 'w3-k8s-1.30.1' up with 'virtualbox' provider...==> cp-k8s-1.30.1: Importing base box 'sysnet4admin/Ubuntu-k8s'...==> cp-k8s-1.30.1: Matching MAC address for NAT networking...==> cp-k8s-1.30.1: Checking if box 'sysnet4admin/Ubuntu-k8s' version '0.8.6' is up to date...==> cp-k8s-1.30.1: Setting the name of the VM: cp-k8s-1.30.1(github_SysNet4Admin)==> cp-k8s-1.30.1: Fixed port collision for 22 => 60010. Now on port 2200.==> cp-k8s-1.30.1: Clearing any previously set network interfaces...==> cp-k8s-1.30.1: Preparing network interfaces based on configuration... cp-k8s-1.30.1: Adapter 1: nat cp-k8s-1.30.1: Adapter 2: hostonly==> cp-k8s-1.30.1: Forwarding ports... cp-k8s-1.30.1: 22 (guest) => 2200 (host) (adapter 1)==> cp-k8s-1.30.1: Running 'pre-boot' VM customizations...==> cp-k8s-1.30.1: Booting VM...==> cp-k8s-1.30.1: Waiting for machine to boot. This may take a few minutes... cp-k8s-1.30.1: SSH address: 127.0.0.1:2200 cp-k8s-1.30.1: SSH username: vagrant cp-k8s-1.30.1: SSH auth method: private key