아직 수업을 다 들은게 아니라 모르는 거일수도 있지만 궁금한게 생겨 문의드립니다. 광고 손쉽게 만들기 - level1~5 강의에서 google ads 관리자 계정을 만들고 기존 계정을 연결하는걸 설명해주셨는데 이 때 기존계정 여러개를 하나의 관리자 계정에 연결하는 걸로 말씀하시더라구요. 기존계정이 여러개인 이유가 무엇인지 궁금합니다. 아 52번 강의에 답변 될 내용이 있네요. 질문은 삭제가 안되서 그대로 둡니다.
[질문 내용] 기존 링크 https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-dependencies/build.gradle 변경된 링크 https://github.com/spring-projects/spring-boot/blob/main/platform/spring-boot-dependencies/build.gradle 다음 링크로 변경이 필요할 거 같습니다.
https://github.com/chulminkw/DLCV_New/blob/main/faster_rcnn/runpod/mm_faster_rcnn_train_kitti.ipynb 안녕하세요 수업이 매우 유익하여 잘 듣고 있습니다. kitty데이터를 이용하여 mmcv를 연습하는 깃허브 코드에서는 mmcv 설치코드가 따로 되어있지 않습니다. 캐글 코드에 있는 mmcv설치 코드를 붙여넣어봤지만 오류가 나서 여쭤봅니다 . ㅠㅠ
안녕하세요 실무에서 '관리자(Admin) 예약 변경 기능' 정책을 두고 기획팀과 이견이 있어, 실무에서는 어떤 방식이 범용적인지 여쭙고 싶습니다. [시스템 상황] 유저가 예약할 때 다양한 할인(이벤트, 타임세일, 쿠폰, 기업지원 등)이 적용되며, 이 정보는 예약 시점에 스냅샷(Snapshot) 으로 저장됩니다. 현재 어드민(상담원/운영팀) 이 유저의 예약 시간/날짜를 변경하는 기능을 개발 중입니다. [이슈 사항] 기획상으로는 어드민에서 시간을 변경할 때도 모든 할인 조건을 '실시간'으로 재검증 하라고 합니다. 문제는 재검증 과정에서 '쿠폰 박탈' 같은 상황이 발생한다는 점입니다. 예시 상황: 유저가 5만원 짜리 예약에 5만원 이상 결제 시 사용 가능한 10% 쿠폰 을 씀. 어드민이 사정상(또는 유저 요청으로) 가격이 저렴한 타임이나 옵션으로 변경함 -> 결제액이 4만원 이 됨. 기획 요구사항: "최소 결제 금액(5만원) 조건을 불만족하게 되었으니, 자동으로 쿠폰 적용을 해제(원복)하고 금액을 재계산 한다." [제(개발자) 의견 및 고민] 저는 위 기획이 어드민 기능의 목적 과 UX(고객 경험) 에 맞지 않는다고 생각합니다. 고객 경험 훼손: 유저는 단지 시간을 바꿨을 뿐인데, 시스템이 엄격하게 검증해서 "조건 미달이니 쿠폰 뺏어가겠습니다"라고 하면 컴플레인 요지가 다분합니다. (유저 입장에선 혜택 유지를 원하니까요.) 데이터 복잡도: 이미 스냅샷으로 저장된 할인 정보를, 수정 시점에 다시 현재 기준의 마스터 데이터(쿠폰 유효기간, 최소금액 등)와 대조해서 '줬다 뺏는' 로직을 짜는 건 구현 복잡도 대비 실익이 너무 적습니다. 관리자의 재량: 어드민에서의 변경은 보통 '강제성(Override)' 을 띠는 경우가 많은데, 시스템이 칼같이 혜택을 잘라버리는 게 맞나 싶습니다. [질문] 보통 예약 도메인에서 관리자(Admin)가 개입하여 예약을 변경할 때 도, 이렇게 엄격하게 유저의 할인 자격(최소금액, 유효기간 등)을 재검증하여 박탈 시키는 게 맞나요? 아니면 어드민 권한 변경인 경우 "기존 스냅샷(혜택)을 최대한 유지" 해주거나, 가격 변동이 불가피하면 "취소 후 재예약" 을 하는 프로세스가 더 일반적인가요? 개발자로서 이 복잡한 '조건부 쿠폰 회수' 로직을 방어하고 싶은데, 설득력 있는 논리가 필요합니다. 조언 부탁드립니다!
위와 같이 입력했는데 soup 출력값이 전혀 안나와서 len 으로 확인해보니 0로 나오네요. 혹시나 해서 언론사 사이트 주소로 바꿔봤는데 html 정보 정상적으로 받아오는건 확인 했어요 강의 시점이랑 멜론 사이트가 뭐가 바뀐건지 앞 강의에서 네이버 부터 막혀서 해결되기전에 먼저 보려고 했는데 또 바로 막히네요...
네이버 뷰탭 실습부터 막혔는데요 지금은 뷰탭이 없어서 블로그 탭으로 대체해서 보고 있습니다. 네이버 사이트가 전체적으로 강의 시점이랑 html 구조가 많이 다른것 같아요 그리고 어떤 선택자를 선택해도 결과 출력이 되지 않길래 html를 출력해봤는데 검색 결과 자체가 안나오는 것 같더라구요 이 결과는 User Agent 를 지정하지 않았을 때 결과구요 위와 같이 User Agent를 적용하면 결과가 400 Bad Request로 떠요 url 프린트 해서 나오는 링크로는 검색결과로 제대로 접속되고 있어요 왜 이런건지 알 수가 없어서 질문드립니다. 시작부터 막히니 막막하네요 ㅠㅠ
작년 12월 러바블을 시작으로 커서, 안티그래피 그리고 클로드코드 등을 활용하여 바이브코딩을 해왔습니다. 그러면서 백엔드의 중요성을 몸소 느끼게 되었죠. 아주 간단한 건 버셀과 수파베이스를 어찌저찌 ai에게 물어보면서 연동을 했지만, 전문적인 지식이 필요함을 느끼게 되었습니다. 그러던 중 기적처럼 어제 이 강의가 개설된 것을 알게 되었죠. 너무 감사합니다. 한번 열심히 배워보겠습니다. 비개발자 출신이기에 다소 어려울 수도 있겠지만 뭐 하다보면 되겠죠 .ㅎ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 궁금한게 있는데요 선생님 강의중에서 데이터베이스 시리즈 꼭 자바를 알아야만 들을 수 있는건가요?백엔드가 파이썬으로 공부중인데 자바를 또 배워야할까요?
비트맵 자료 구조 강의를 수강하고, 해당 자료구조가 활용되는 상황에 대해 이해하지 못한 부분이 있어 질문 드립니다. 강의에서 말씀하신 비트맵을 사용하지 않았을 때 유저마다 고유한 키 값으로 string set으로 저장한다는 의미가 무엇인가요? 유저의 고유 키마다 쿠폰에 대한 set이 있고, 어떤 쿠폰이 발급됐는지 저장하는 구조인가요? 강의에서의 상황은 유저가 해당 쿠폰을 발급 받았는지를 식별하기 위한 상황인가요? 해당 정보를 DB가 아닌 레디스에 저장할 이유가 무엇인가요? 아니면 둘 다 저장하는 방식인가요? 만약 해당 쿠폰을 발급할 수 있는 기간이 일주일이면 일주일 동안 레디스에 해당 정보가 만료되지 않고 유지되어야 할까요? 해당 상황은 쿠폰 번호가 유저마다 다른가요, 다 같은 쿠폰 번호인가요? 만약 다른 쿠폰 번호라면 db에 따로 저장이 되어야 할까요? 감사합니다.
섹션 19 부분은 예전에 강의하셨을 때 쓰신 스프링부트 2점대 버전을 3점대 버전으로 업그레이드하는 강의인가요? 최신 강의 기준 업데이트 하신 3점대 버전으로 강의를 듣고 있는데 섹션 19에서 강의가 정확히 어떤 강의인지 궁금합니다. 만약 2점대 버전을 3점대 버전으로 업그레이드 하는 강의라면, 섹션 19에서 분산 트레이싱, swagger, kubernates 부분만 들어도 되는걸까요?
중요한 것은 아닐 수도 있고, 영상에서도 해당 내용은 설명은 하시지 않고 넘어가셔서 정확하지 않을 순 있습니다. 그래서 문의드립니다. 6. 로그인 처리1 - 쿠키, 세션 PDF 5페이지 도메인이 가장 중요하다. 도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함 '영역은 제외한 시스템이' 에서 영역'은'이 맞는 표현인가요 영역'을'이 맞는 표현인가요? '영역은' 이라고하면 제외한 시스템이 구현한다는 뜻으로 이해가 되는데 제외한 시스템이 무엇을 말하는지 잘모르겠고.. '영역을'이라고 한다면 영역을 제외하고 시스템이 구현한다는 뜻으로 내용이 자연스레 이해가 되는데 영상에서 이 부분을 딱히 설명을 하시지 않으셔서 잘모르기에 문의드립니다.
6분대 까지의 기록 입니다. 5.0 버전에 맞게 ValidatedPramJobConig 구현 내용입니다 참고하세용 package com.example.SpringBatchTutorial.job.ValidatedParam; import lombok.RequiredArgsConstructor; import org.jspecify.annotations.Nullable; import org.springframework.batch.core.configuration.annotation.JobScope; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.job.parameters.CompositeJobParametersValidator; import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import java.util.Arrays; /** * desc: 파일 이름 파라미터 전달 그리고 검증 * run: --spring.batch.job.name=validateParamJob -fileName=test.csv */ @Configuration @RequiredArgsConstructor public class ValidatedParamJobConfig { /* * [Spring Batch 5.0 변경점] * JobBuilderFactory, StepBuilderFactory가 Deprecated(삭제)되었습니다. * 대신 JobRepository와 PlatformTransactionManager를 직접 주입받아 사용합니다. */ private final JobRepository jobRepository; private final PlatformTransactionManager platformTransactionManager; @Bean public Job validateParamJob() { /* * [변경] new JobBuilder("Job이름", jobRepository) 형태로 생성합니다. */ return new JobBuilder("validateParamJob", jobRepository) .incrementer(new RunIdIncrementer()) // 실행할 때마다 JobParameter에 run.id를 증가시켜 재실행 가능하게 함 .validator(new FileParamValidator()) // 검증 로직이 필요하면 여기에 validator를 추가합니다. .start(validateParamJobStep()) // 첫 번째 Step 시작 .build(); } private CompositeJobParametersValidator multipleValidator(){ CompositeJobParametersValidator validator = new CompositeJobParametersValidator(); validator.setValidators(Arrays.asList(new FileParamValidator())); // 여러개의 검증 클래스를 변수로 할당가능 return validator; } @Bean @JobScope // Job 실행 시점에 Bean이 생성되도록 설정 public Step validateParamJobStep() { /* * [변경] new StepBuilder("Step이름", jobRepository) 형태로 생성합니다. */ return new StepBuilder("validateParamStep", jobRepository) /* * [변경] tasklet이나 chunk를 설정할 때 TransactionManager를 반드시 인자로 넘겨야 합니다. */ .tasklet(validateParamTasklet(), platformTransactionManager) .build(); } @Bean @StepScope // Step 실행 시점에 Bean이 생성되도록 설정 public Tasklet validateParamTasklet() { return (contribution, chunkContext) -> { // 비즈니스 로직 영역 System.out.println("validateParamTasklet 호출됐나요~"); // Tasklet 종료 상태 반환 return RepeatStatus.FINISHED; }; } } /* [Spring Boot 2.x ~ Batch 4.x 버전 기록용] 당시 특징: JobBuilderFactory와 StepBuilderFactory를 사용하여 간편하게 생성. 현재(5.0+)는 삭제된 방식임. @Configuration @RequiredArgsConstructor public class ValidatedParamJobConfig { [과거 방식의 핵심] 이 당시에는 @EnableBatchProcessing이 선언되어 있으면 스프링이 자동으로 JobBuilderFactory, StepBuilderFactory를 빈으로 등록해줬음. -> 개발자가 JobRepository나 TransactionManager를 신경 쓸 필요 없이 Factory만 주입받으면 됐음. [코드가 왜 방식을 바꾼이유에 대한 고찰] 과거에는 Factory 방식이 유행했다면 요즘은 Builder 방식으로 전환하려는것 같음. 추가로 PlatformTransactionManager 을 과거에는 써서 DB에 접근을 하였는데 이 방식이 DB를 하나를 바라보게끔 되어있었다고함 그래서 Step 마다 트랜잭션을 사용하려면 설정이 까다로웠다고(Bean을 재정의 하거나 Factory를 커스텀) 현재는 Step을 만들때 트랜잭션을 인자로 직접 넘겨주기에 Step A는 metaTransactionManager Step B 는 serviceTransactionManager 로 설정하는것으로 쉬워졌다고함 https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide 공식 깃헛 사이트에서 Transaction manager bean exposure/configuration 을 컨트롤 F 해서 보면 상세히 나와있음 아래 슬로건을 미는 느낌인거같음 개발자가 코드를 짤 때 귀찮더라도, '누가(Repository)', '어떻게(TransactionManager)' 일하는지 명시적으로 적어라. 그래야 나중에 사고가 덜 난다 5.0있는데 왜 2.x ~ 4.x 를 기록함 이라할수있는데 프로젝트를 뛰다보면 3.0버전대가 너무 많음 5.0으로 신규로 구현할 수도 있으니 과거와 현재 방식을 기록하는거에 초점 두는게 좋다생각함 private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job validateParamJob() { [Job 생성] factory.get("이름")을 호출하면 내부적으로 JobRepository가 자동 주입된 빌더가 반환됨. -> 5.0부터는 new JobBuilder("이름", jobRepository)로 직접 주입해야 함. return jobBuilderFactory.get("validateParamJob") .incrementer(new RunIdIncrementer()) //.validator(new FileParamValidator()) // 여기서 정의해줘도 되지만 재활용성을 위해 별도의 클래스로 제작 job.ValidatedParam.FileParamValidator .validator(multipleValidator) .start(validateParamJobStep()) .build(); } private CompositeJobParametersValidator multipleValidator(){ CompositeJobParametersValidator validator = new CompositeJobParametersValidator(); validator.setValidators(Arrays.asList(new FileParamValidator())); return validator; } @JobScope @Bean public Step validateParamJobStep() { [Step 생성] factory.get("이름") 사용. 특징: .tasklet() 설정 시 TransactionManager를 넣지 않아도 Factory가 내부적으로 가지고 있는 기본 TransactionManager를 사용함. -> 이 '암시적(Implicit) 구성'이 편하긴 했으나, 명확성이 떨어져 5.0에서 제거됨. return stepBuilderFactory.get("validateParamStep") .tasklet(validateParamTasklet()) 트랜잭션 매니저 생략 가능했음 .build(); } @StepScope @Bean public Tasklet validateParamTasklet(@Value("#{jobParameters['fileName']} String fileName) { //System.out.println(fileName); // 여기서 파일명을 받아 작업할 수 있지만 // Tasklet 까지 오기 전 Job이 실행할 때 검증할 수 있도록 Validator 를 제공을 함 위쪽의 validateParamJob 메서드로 이동 [Tasklet 구현] 익명 클래스 방식으로 구현. 단순 출력 후 FINISHED를 반환하여 스텝을 종료함. return (contribution, chunkContext) -> { System.out.println("validateParamTasklet"); return RepeatStatus.FINISHED; }; } } */ job.ValidatedParam.Validtor 시작 package com.example.SpringBatchTutorial.job.ValidatedParam.Validator; import org.springframework.batch.core.job.parameters.InvalidJobParametersException; import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.batch.core.job.parameters.JobParametersValidator; import org.springframework.util.StringUtils; public class FileParamValidator implements JobParametersValidator { // thorws 저거밖에 못찾겠어서 저걸로 했는데 문제없이 됐습니다. @Override public void validate(JobParameters parameters) throws InvalidJobParametersException { String fileName = parameters.getString("fileName"); if (!StringUtils.endsWithIgnoreCase(fileName,"csv")){ throw new InvalidJobParametersException("This is CSV"); } } } job.ValidatedParam.Validtor 끝