묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 부트 - 핵심 원리와 활용
springboot에서 actuator없이 micrometer를 사용할수 있나요?
springboot에서 actuator 강의 다음에 마이크로미터 강의가 나왔는데 actuator 없이 micrometer를 사용할수 있나요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
현재 아키텍처 구조에서의 트랜잭션 관련해서 질문이 있습니다.
안녕하세요 강의 잘 보고 있습니다! 현재 아키텍처는Controller -> Service -> Resposiotry 구조로 흐름이 이어지고 Service는 각 개념에 대한(Product, Review 등..) 조회 쿼리를 묶는 Finder, 그외 CUD 기능을 묶는 Mananger 또는 Handler ? 로 이뤄져 있습니다.이 구조는 예전에 토스 슬래시 "지속 성장 가능한 코드를 만들어가능 방법"에 대해 인상 깊게 봤는데 조회용, CUD용을 별도 컴포넌트로 관리하고 Service는 이를 핸들링 하는 파사드 패턴의 구조와 유사하게 생각했었습니다. 여기서 질문이 있는데요Product와 Review는 격벽을 두는 서로 다는 개념이지만 Product라는 1급 개념이외의 하위 개념 (섹션, 카테고리)들은 상품을 추가할 때 하나의 트랜잭션으로 묶이는 대상이라고 생각이 들었습니다. 그럼 이 경우에는 리뷰는 상품과 서로 다른 개념이기 때문에 서로를 알지 못하지만, Product의 하위 급수 개념들은 ProductService 내에서 하나의 트랜잭션으로 묶는,즉, xxxService는 동일한 개념에 속한 개념들을 하나의 트랜잭션으로 묶는 파사드의 일종이라고 생각하면 될까요? 만약 맞다면 개념과 격벽을 이해하기에 각 개념은 하나의 트랜잭션으로 묶여야하나?에 대한 고민도 개념을 구분하는 방법이 될 수 있겠구나!라는 생각이 들기도 하네요 항상 잘 보고 있습니다 감사합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
킬구형 혼자 삽질하면서 배치 운영하는데 궁금한 부분이 있어
안녕 킬구형 나는 오랜만에 배치 복습하려고 형 강의 구매했어!일단 그냥 책 보면서 실무에서 배치를 운영을 하려니깐 고민이 있어.형 생각이 궁금해서 질문을 남겨 1. Jenkins , Spring Batch형 일단 나는 Batch를 실무에서 Jenkins 스케줄러 + Batch 이렇게 사용하고 있어. 그런데 배치 인프라에 대해서 요즘 고민이 생기는 거 같아. 나는 job enabled를 false로 설정하면서 운영하고 있는데 만약에 배치가 N개로 운영되고 있다고 가정하면 port 충돌에 대해서 고민이야 물론 parameter로 port를 넘겨줄 수 있어서 현재는 스크립트로 남는 포트를 parameter로 넘겨주면서 사용하고 있어. 간편성을 생각한다면 그냥 enabled를 true로 하고 api 형식으로 그냥 호출만 해주면 이런 복잡한 과정 없이 사용할 수 있을 거 같은데 어떻게 생각해. 2. CI/CD하나의 jar에서 여러 개의 배치가 돌아가는데 이때 CI/CD 과정에서 문제가 생길 수 있을 거 같다. 현재는 ln 심볼릭 링크로 해결을 하고 있는데 이게 적절한 방식인지? 아니면 다른 방식이 있는지 궁금해 3. JobParametersIncrementer형 Spring Batch에서 JobParametersIncrementer(RunIdIncrementer 등) 관련해서 궁금한 점이 있어 만약 업무적으로 특별한 파라미터(날짜, 키 등)가 없는 반복 배치라면이 때는 run.id와 같은 증분기 기반의 값으로 JobInstance의 고유성을 관리 하지만 업무적으로 중요한 파라미터(날짜, 키 값 등)가 있다면 이 경우에는 run.id 대신 해당 파라미터를 JobInstance의 기준으로 써야 멱등성 및 실패/재실행 제어가 더 적합하다고 생각해. 실제로 파라미터가 없는 경우에는 run.id로 멱등성을 보장하고, 파라미터가 있는 경우에는 run.id 증분기를 쓰면 오히려 동일 파라미터로 재실행/복구 등 업무상 중요 컨트롤이 어렵지 않나요? 이런 경우 run.id 증분기를 같이 쓰는 게 맞는지, 아니면 아예 쓰지 않는 게 맞는지 설계 원칙이 궁금해요.https://github.com/spring-projects/spring-batch/issues/4910https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-6.0-Migration-Guide
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
상품목록/코드느끼기 - 룰셋에 의한 암묵적 구현과 운영진과의 소통
안녕하세요, 강사님.강의 잘 듣고 있습니다. '섹션2. 상품 목록 - 코드 느끼기' 수업에서룰셋에 의한 암묵적인 구현으로 '카테고리-상품 맵핑이 존재하는 상품은 ACTIVE 상태'임을 보장할 때, 다음 두 가지 방식을 말씀하셨습니다.연관된 맵핑이 존재한다면 상품을 삭제할 수 없다.상품을 삭제할 때 연관된 맵핑이 함께 삭제된다.어떤 방법을 선택할지는 운영진들과 소통해야한다고 하셨는데 (16:30~)처음에는 운영진과 왜 소통이 필요한건지 잘 이해가 안되어서 고민해보니맵핑이 단순히 다대다 연관관계 표현을 넘어 도메인 개념으로 동작하여 운영진에게 노출되는 경우를 말씀하신건가 싶습니다. 만약 그렇지 않다면 설명 부탁드립니다. 예시 맵핑에 추가적인 정보가 붙는다고 가정해보면 연관관계 표현뿐 아니라 하나의 엔티티, 도메인 개념으로 기능하고 운영진들에게도 노출된다.ex) 프로모션 이벤트에 포함된 상품마다 할인율이 다르다면 promotion-product 맵핑에 할인율이 포함되고, 운영진들도 프로모션-상품 조합마다 할인율을 조정해야함. ->promotion-product 맵핑 자체가 업무 개념이 되어 운영진에게 노출되고 사용되어짐.룰셋에 의한 암묵적 구현은 다음 방식들 중 선택할 수 있다.모든 프로모션에서 A 상품을 제외해야 A 상품을 삭제할 수 있다. (하나라도 맵핑이 있다면 상품 삭제 불가)A 상품을 삭제하면 모든 프로모션에서 제외된다. (상품 삭제 시 연관된 모든 맵핑 제거)따라서 어떤 룰셋을 정의할지 운영진들과의 소통이 필요하다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
격벽에 대한 내용을 코드로 표현 시 질문이 있습니다!
안녕하세요 유투브를 쭉 챙겨보다 강의를 내셔서 바로 달려온 구독자 중 한명입니다 !다름이 아니라 섹션 2의 개념 정리에서 개념도의 격벽에 대한 내용을 코드로는 어떤식으로 표현되는지를 좀더 확실히 이해하고 싶어 질문드립니다. 현재 상품과 카테고리 테이블 구조는 N : N으로 되어있고 ProductCategory는 이 다대다 관계를 연결하는 매핑 테이블로 이해했습니다. 그렇다면 상품과 카테고리는 서로가 서로를 알지 못하는 격벽으로 나눠져있으며 모든건 이 매핑 테이블인 ProductCategory 로 이뤄지고상품과 카테고리의 정보를 가져오기 위해서는 두 개념은 서로를 알지 못하니 ProductFinder 에서ProductCategoryRepository 를 사용해 Category를 얻은 후 Product를 반환한다.가 제가 이해한 격벽을 구현한 코드가 맞을까요 ? 또 이 격벽을 위한 코드에서 조인을 사용하지 않는 이유가 궁금했습니다.RDBMS과 NoSQL의 차이점 하나가 JOIN으로 알고 있는데 JOIN을 사용하지 않고 개별적으로 접근한다는 점이 조금 새롭게 다가왔거든요.기존에 다른 수강생 분들의 QA를 종합해서 정리했을 때는 다음과 같이 정리됐습니다.무적의 한방 쿼리 사용을 지양 (쿼리가 점점더 비대해짐) 조인을 사용하지 않음으로써 다양한 조합(재사용)이 가능복잡한 쿼리문을 들여다보지 않고 각 쿼리문들을 통해 로직의 흐름을 파악할 수 있다???제가 이해한 내용이 맞을까요?? 항상 잘 보고있습니다! 감사합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
AOP 적용 가능한가요?
킬구형 공부중에 문득 궁금해진건데 혹시 스프링배치도 AOP를 적극적으로 활용해?스프링배치도 기본 구조는 스프링이랑 같아서 AOP를 쓸 수는 있을 것 같은데 실제로 활용을 하는지 궁금하네쉽게 쓰기에는 @Transaction 어노테이션도 뭔가 활용성이 있을 것 같고.. API 리퀘스트 실패 시 자동으로 재처리 하는 AOP 기능을 만들어보기도 했는데 FaultTolerance 관련으로 비슷하게 활용할 수도 있을 것 같고..아무튼 스프링배치에서 AOP를 적극적으로 활용하는지 궁금해
-
해결됨실시간 채팅 서버 구축: 분산 처리부터 성능 최적화까지
빌드 파일
빌드 파일을 파일 마다 각각 만드는데 그렇게 하는 이유는 무엇인가요???
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
1장에 들어가기 전에 배치 프로젝트(디렉토리) 구성 방법에 대한 질문
☠ 질문 가이드 ☠ " 시스템 종결자의 지령이다. 질문하기 전에 이 규칙들을 숙지하도록. " 1. 코드 실행에 문제가 있다고?전체 코드를 보여줘라. 단편적인 에러 메시지만으로는 아무것도 알 수 없다.실행 환경도 알려달라. JDK 버전, 스프링 버전 등을 함께. 2. 오타를 발견했나?즉시 제보하도록. 자네같은 날카로운 눈을 가진 동료가 필요하다. 3. 질문은 자유롭게"이런 걸 물어봐도 될까요?" 같은 소심한 멘트는 불필요하다. 궁금한 건 바로 물어봐라. 배치 시스템에 소심한 건 없다. 4. 검색은 기본비슷한 질문이 있는지 먼저 확인하도록.하지만 이해가 안 된다면? 주저하지 말고 추가 질문해라.GPT가 거짓말친다고? 나에게로 오라. 💀 5. 서로 존중하라여기는 모두가 시스템을 지배하고자 하는 동료들이다.서로를 이해하고 돕는 문화를 만들어가자. ⛔ 인프런 서비스 자체에 대한 문의는 1:1 문의하기로.💀그쪽 서버는 막강한 CTO가 있어 건드리지 않는 게 좋을 거다 💀- KILL-9 올림 P.S.존댓말로 질문하면 rm -rf를 시전한다. 편하게 물어보도록.강의에서 놓친 부분이나 더 보충하면 좋을 내용도 자유롭게 제보하라. 너희의 피드백이 이 강의를 더 강력하게 만든다. 🔥 시스템을 함께 진화시켜 나가자.🔥 킬구형님 안녕하세요!(그래도 선생님이신데 반말하기엔 좀 그런것 같아서 존댓말로 하겠습니다..!)먼저 좋은 강의 감사드립니다.사실 구매한지는 좀 되었는데, 지난 1주일동안 Batch와 스케쥴러의 차이점, 왜 이런 어노테이션을 사용하는지부터, 왜 이런 환경설정을 해야하는지, Framework와 Boot의 동작차이점은 무엇인지 세세하게 먼저 이해하는데 집중하다보니 힘이 많이 들었는데 0장 만으로도 상당히 많은 기본기가 쌓인 것을 느낄 수 있었습니다(무엇을 모르고있었고 무엇을 알아야하는지 등).배치가 막연하게 느껴졌는데, 아직 극초반이지만 자신감이 생기고 있습니다. 감사드립니다!1장에 들어가기전에 앞서, 조금이라도 더 실무에 가까운, 가깝지 않더라도 유지보수가 간편하고 알아보기 쉽게 체계를 구성해보고자, 형님께서는 실무적으로 배치 프로젝트를 어떻게 구성하시는지 질문드리고자 합니다.각파일들의 디렉토리 위치가 없는데 임의적으로 해야하나요? - 인프런 | 커뮤니티 질문&답변위 질문에서 형님께서는 상관이 없다고는 하셨는데, 그래도 실무에서는 어떻게 구성하시는지 궁금해서 질문드리게 되었습니다!그리고 0장에서도 간단한 1개의 Job도 5개의 Step으로 이루어져 있는데, 위 질문의 AI답변처럼 1개의 Config 책임으로 두기보다는, Job - Step으로 책임을 분리하여 두는 것이 편할 것 같은데, 이게 실무에서도 실제로 이런 방향으로 관리가 이루어지는지 궁금합니다! 답변내용 참고하면서 본격적으로 1장부터 프로젝트를 구성해보고자 합니다. 감사합니다!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
SettlementTargetSummary가 db core 모듈에 있는 이유가 있을까요?
제가 느끼기엔 SettlementTargetSummary는 개념 객체에 좀 더 가까운 것 같은데, 혹시 db core 모듈에 위치해 있는 특별한 이유가 있을까요? 코드 자체도 @Entity 어노테이션이 붙지 않은 걸 보니 테이블로 관리하지 않는 것 같은데 여기에 두신 이유가 궁금합니다! 감사합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
2Depth 강의 도중 궁금한 점 있어요!!
CommonService 클래스 부분에서이 코드 테스트를 하며 생각을 해봤는데요EX)루트 댓글 A(논리삭제) ㄴ 댓글 B ㄴ 대댓글 C상황인 경우에서 B를 삭제했을 경우에 논리 삭제 되어있던 루트 댓글A도 삭제가 되면서루트 댓글 A(물리삭제) ㄴ 댓글 B(물리삭제) ㄴ 대댓글 C이런 상황으로 된다면 대댓글 C는 물리삭제 된 루트 댓글A를 parent로 가지는 고아 댓글이 되어버리는 것은 아닌가 궁금해서요!! 깔끔하게 딥한 강의 너무 잘 듣고 있어요!! 감사합니다 :)
-
미해결나도! 스프링으로 인공지능을 할 수 있다(인프1탄)
동영상 속도 조절 가능한가요? 속도 빠른데 조정 버튼이 없어요.하는
동영상 속도 조절 가능한가요? 너무 빠른데 조정 버튼이 없어요.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
데이터 검증 로직 책임에 대한 질문이 있습니다.
안녕하세요. 정말 재밌게 수강중입니다. 다름이 아니라 데이터 검증 책임에 대해서 궁금한게 있습니다.저는 사용자에 의해 넘겨받은 데이터를 Controller 에서는 값의 존재여부와 타입 정도만 확인하고 실제로 비즈니스 레이어에서 사용될 때 검증하는 것을 선호하는데, 강의에서는 Request(DTO) 객체에서 toContent() 함수를 호출하면서 검증하더라구요.특별히 Request 에 위치시킨 이유가 있을까요?관점이 궁금합니다. fun toContent(): QuestionContent { if (title.isEmpty()) throw CoreException(ErrorType.INVALID_REQUEST) if (title.length > 100) throw CoreException(ErrorType.INVALID_REQUEST) if (content.isEmpty()) throw CoreException(ErrorType.INVALID_REQUEST) return QuestionContent(title = title, content = content,) } 해당 로직이 아래 방식으로 들어가는게 책임이 맞지 않을까? 라는 생각입니다. data class QuestionContent( val title: String, val content: String, ) { init { if (title.isEmpty()) throw CoreException(ErrorType.INVALID_REQUEST) if (title.length > 100) throw CoreException(ErrorType.INVALID_REQUEST) if (content.isEmpty()) throw CoreException(ErrorType.INVALID_REQUEST) } }
-
미해결토비의 스프링 부트 - 이해와 원리
11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지
안녕하세요. 정말정말 왕초보인 수강생입니다. 강의 대로 진행중인데 어찌해야 할지 몰라 문의드립니다.11강 프로젝트 생성의 3:54에서 부터(cmd -> spring shell -> $ init) 저는 아래와 같이 에러메세지가 뜹니다.이걸 어떻게 해결해야 할지 감 못 잡고 있습니다. ㅜㅜ--Using service at https://start.spring.ioFailed to retrieve metadata from service at 'https://start.spring.io' (PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target)-- (현재 설치환경)스프링 부트 2.7.18버전을 설치했고 IntelliJjava는 21버전 설치spring initializr에서 스프링부트 3.5.6 버전으로 템플릿 받아둔 상태입니다.환경변수 JAVA_HOME, SpringBoot_Home 셋팅해두었습니다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
리스너의 실무 로직
킬구형 1장 - 작전3에서 아래와 같이 얘기한 부분에 대해 궁금한게 있어. '리스너는 감시와 통제만 담당한다. 실제 시스템 제거 로직(비즈니스 로직)은 분리하라. 리스너가 너무 많은 일을 하면 유지보수가 어려워지고 시스템 동작을 파악하기 힘들어진다' 청크 기반 배치 잡이라고 하고 A라는 테이블에서 데이터를 읽어와서 B라는 테이블에 데이터를 삽입하는데 B 테이블에 데이터가 없다면 삽입, 있다면 수정하는 로직이 있어. 이 과정들이 모두 끝나고 마지막으로 B 테이블에 수정 날짜 컬럼이 잡 시작 시간보다 이르다면 A 테이블에 데이터가 없으므로 B 테이블에서 이러한 데이터들을 삭제하려는 로직을 넣는다고 했을 때 아래 궁금증들이 있어.1. 위 얘기를 토대로 생각해보면 삭제 로직은 청크 기반 스텝 이후 태스크릿과 같은 다음 스텝으로 넣는게 좋은 것 같은데, 실무에서는 해당 잡 전용 리스너를 하나 추가로 만들어서 afterJob 메서드에 배치 상태가 COMPLETED인 경우에 삭제 로직을 실행하도록 하는 방식은 지양하는 편인거야? 전용 리스너를 만들어서 사용하는 경우도 있어?만약 리스너에 삭제 로직을 넣는다고 했을 때 리스너에서 데이터 삭제 과정 중 오류가 발생한 경우에는 잡이 실패 상태로 종료되는거지?2번과 같은 맥락인데 리스너에 삭제 로직을 넣는 경우 트랜잭션이 필요할텐데 리스너는 트랜잭션 범위가 어떻게 돼? 스텝에서는 청크 범위, 태스크릿의 반복 범위라고 본 걸로 기억하는데 리스너는 트랜잭션 설정 자체가 안되는건지 리스너 범위 내부에서만 설정되는건지 궁금해.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
조회 시 개념간 격벽
안녕하세요.상품 상세조회 섹션을 보고 궁금한 점이 생겨 질문을 드립니다 !평소에는 개념간 격벽을 신경쓰지만 조회 시에는 지키기가 쉽지 않더라고요.특히 list 조회인데 다른 개념이 있어서 조회 + in query + 조립 등을 하면 너무 과한가..? 싶은 생각이 가끔 듭니다.제가 생각하는 방법과 트레이드 오프입니다.개념간 격벽을 유지하고, 쿼리를 분리아무래도 복잡해지는 구현DB 커넥션을 위한 오버헤드 증가팀원의 공감을 생각보다 얻기 힘듦(사실 저부터 확신이 없는...)조회의 경우 느슨한 규정화면 요구사항에 따라 변하는 쿼리재사용성 x주체가 모호함점점 쌓이는 비슷한 쿼리와 projection dto들거의 혼자 백엔드 개발을 진행하다보니 이런 고민에 대해 선택을 내리기 참 어렵네요 ㅎㅎ..제미니님은 어떤식으로 선택하시는지 궁금합니다 !감사합니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
cancel관련질문
안녕하세요.강의내용중 payment는 자기가 취소되어있는지 모르지만 대신 cancel은 payment를 사용한다고 말씀하시는데이게 어떤의미인지 잘 이해가 되지 않습니다.상태반영은 order쪽에 하는데 cancel이 payment를 사용한다?? 이게 어떤의미일까요??
-
미해결Spring AI 실전 가이드: RAG 챗봇 만들기
429 에러 발생합니다
https://platform.openai.com/docs/guides/error-codes/api-errors 여기서 할당량 초과 에러 코드라는데, ChatGpt plus 구독중인데 따로 결제를 해야되는건가요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
따닥방지
안녕하세요. 저였으면 찜추가 찜삭제 API 를 나누는걸로도 방지할 수 있다고 생각해요.말씀해주신것처럼 컨트롤러에서 분기문 들어가는게 좀 어색한것같아서요! 이런 방식도 가능할까요? 뭔가 저는 Restful 관점에서도 이게 자연스러우니 이렇게 해결하실 것 같았는데 언급이 없으셔서 문제가 있을수도있나 싶어서 여쭈어봅니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
루트 쿼리라는것은
강의에서 말씀하신 루트쿼리라는것은 가장 먼저 실행되는 쿼리를 말하는것일까요? 아니면 toOne코드에 대해서 실행하는 쿼리를 말하는것일까요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
메서드를 분리하는 기준
강의 내용을 보시면 한 메서드안에서 코드를 작성하시다가 리팩토링을 해서 메서드를 따로 분리하셨는데, 메서드를 분리하는 기준이 따로 있을까요? 한 메서드 안에서, 로직이 너무 길어지면 메서드를 따로 만들어서 분리해야하는것일까요?