강의 잘 보고 있다. 잘 정리된 자료 덕분에 배치 작업을 이해하고 있는 중이다. 다만 설명 중 이해 안되는 부분이 존재한다. 바로 이 부분 멱등하지 않은 ItemProcessor 를 내결함성(FaultTolerance) 기능 과 함께 사용해야 하는 상황이라면, 반드시 processorNonTransactional 를 설정하도록 하자. 오히려 멱등하지 않은 ItemProecessor의 경우에는 이 설정을 비활성화 해야 하는 거 아닌가? 나의 부족한 영어실력과 GPT를 통해 스프링 배치는 ItemProcessor가 트랜잭션이나 멱등성을 가져야 한다고 되어 있는 것으로 이해하였다. It must be either transactional or idempotent. 출처: https://docs.spring.io/spring-batch/reference/transaction-appendix.html 떠라서 멱등하지 않은 ItemProcessor는 processorNonTransactional()을 지양해야 하는 것으로 나는 이해된다... 답변 부탁한다. (존대로 질문하면 rm -rf 하신다길래 이렇게 남겨요 ㅎㅎ..)
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 세션8 웹페이지 만들기를 영한님 강의를 보면서 혼자서 output까지 할수 있는상황을 만들려고 코드를 보고,따라 치고 그러는 와중 이었습니다. 그러는 와중 상품 등록 처리에서 완료하고, 상품 상세 폼으로 가지 말고, 그냥 전체 상품을 보여주자 라는 생각이 들어서 코드의 리턴값(뷰값을) 을 "basic/item" 에서 "basic/items"로 변환을 하였습니다. (사진 참조) 그리고 인터넷으로 상품 등록을 시키고 결과 화면이. 이렇게 나오는것이었습니다. 그래서 결과가 잘나오는지 확인하기 위해서 localhost8080:/basic/items을 인터넷으로 쳐보니 등록된 상품이 나오는 것을 확인할 수 있었습니다. 그래서 어떻게 해야 결과가 나올까 생각하다가 리다이엑트가 생각나서 리다이엑트를 적용하고 등록하니 위에 화면처럼 다시 갈수 있는것을 확인할 수 있었습니다. 그래서 질문이 왜 리다이렉트를 쓰면 결과가 정상적으로 나오고 그냥 리턴값을 basic/items으로 하면 화면은 정상적으로 아이템즈 화면인데, url값은 basic/items/add 가 추가된것인지 궁금합니다. 답변부탁드립니다.
안녕하세요 선생님 현재 강의의 6페이지에 (파이썬으로 간단한 ETL 작성해보기) 파이썬으로 구글 코랩에서 작성하는 데이터 파이프라인 이라는 문구에 링크를 걸어두신 거 같은데요, PDF 다운로드 후 링크가 지속적으로 안열립니다. 웹페이지가 아니라 직접 파일 다운로드 해서 열어도 안되는데 어떻게 해야 되나요?
1. 현재 학습 진도 1-5 6강 최빈값찾기 최빈 문자를 찾는 것 2. 어려움을 겪는 부분 이런 코드는 어떨지 궁금합니다! def find_max_occurred_alphabet(string): mem = {} max_v = 0 max_k = '' for s in string: if s.isalpha(): if s not in mem: mem[s] = 1 else: mem[s] += 1 for k, v in mem.items(): if max_v < v: max_v = v max_k = k return max_k 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보았는데 답이 다르다면 이런식으로 여기에 올려 첨삭을 받는 형식일까요? 또 궁금한 것이 왜 string에 겹치는 최빈값이 문자열이 많은데 정답은 i, e, b인지 궁금합니다. o, l, t 일수도 있지 않나요? 밑의 질문 내용에서 답을 얻었습니다! 복수정답으로 이해했습니다! 감사합니다!
반복자 range가 5번 i라는 변수에 반복 코드를 생성하고 print(' 파이썬 프로그래밍')이면 변수와 print(' 파이썬프로그래밍') 사이에 연관성이 있어야 하지 않을까하여 질문 드립니다. print(' 파이썬프로그래밍')사이에 위의 변수i 에 걸려서 그 변수가 range만큼 반복한 값(for이라는 반복자를 사용)이 출력될텐데 print(' 파이썬프로그래밍') 와 변수 i와의 연관성을 잘 모르겠습니다.
[질문 내용] 처음 문제를 풀떄 Card 클래스에 compareTo 오버라이딩을 @Override public int compareTo(Card o) { if(number != o.getNumber()){ return this.number - o.number; } return shape.compareTo(o.getShape()); } 위 코드처럼 작성했는데 숫자가 낮은 카드 먼저 안 나올때가 있는데 잘못 작성한걸까요?
13강 15분 즈음에 나오는 DeleteUserCookie함수는 도대체 어디에 있는건가요? 강의 듣는도중 노션에 없는 예시가 음성으로만 나오는데 관련된 코드가 따로 있는건가요? 한 두 강의에서만 그런게 아니라 이전 강의에서도 노션에 없는 코드를 음성으로만 설명하는 경우가 있던데 원래 그런건가요...?
안녕하세요 문제1번 관련 문의 사항이 있어 글 남깁니다. 1번에 getCount는 synchroinized 하는 이유가 뭔가요? 중간에 호출되는 부분이 없는 것 같고, t1.join() t2.join() 으로 마지막 출력할때도,,, synchroinized이게 안필요하다는 생각이 들어서요 제가 이해를 잘못한건지 문의드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] h2데이터베이스를 사용해보고 난 후 직접 mysql을 연결하여 해보고 싶어져 연동을 시도하였습니다. <오류화면> <application.properties> 그런데 이때 사진과 같은 오류가 발생합니다. application.properties에 mysql에 대한 정보를 정확히 적었으나 해당 오류가 발생합니다. application.properties의 위치는 src/main/resources에 위치하고 있습니다. 사진과 같이 build.gradle에 의존성도 추가해 두었습니다. 이 때, 영상에서 말씀해주신대로 빌드를 intelliJ로 설정해두면 해당 오류가 발생하나 gradle로 변경하면 정상적으로 db와 연결되어 작동합니다,, intelliJ가 속도가 빠르다고 하셔서 사용하고 있었으나 intelliJ로 빌드하면 오류가 발생하는지 모르겠습니다...ㅜ 코드가 정확히 작성되어도 해당 오류가 발생할 수 있는 것일까요? 이대로 gradle로 빌드하면서 나아가도 나중에 문제가 없을지 궁금합니다.
안녕하세요. 트랜잭션 메시징에 대해 궁금한 것이 생겨 질문드립니다. 트랜잭션 메시징은 데이터베이스 작업과 메시지 발행 작업을 원자적으로 수행하여 데이터의 일관성을 보장하는 것으로 알고 있습니다. 강의 내용 중 '트랜잭션 메시징의 한계'에서 분산 트랜잭션을 완벽하게 보장하지는 않는다고 하셔서 이를 DB의 트랜잭션과 메시지 전송의 트랜잭션이 서로 독립적으로 작동한다고 이해했습니다. 그럼 RabbitMQ에서 트랜잭션 메시징을 지원한다고 할 수 있나요?
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 안녕하세요? 강의 계속 잘 듣고 잇습니다. 이제거의 막바지에 이르렀네요 ㅎㅎ.. 게시글 목록조회 최적화와 관련하여 질문드리고자 합니다. 제가 처음에 이해한 바는 최신의 천개의 데이터를 레디스에 적재하고, 그 외의 데이터는 직접 articleServcie를 통해 가져오자 라고 이해를 했었습니다.(hot, cold Data) 그런데 이후의 결과적으로는 아래 두가지 캐시가 존재하게 되었더라구요 1.zset을 활용한 인기글 데이터 관리(목록 조회 최적화) 2.실제 데이터 queryModel(단건 조회 최적화) 이런 구조에서는 zset에서 천개의 데이터를 관리하긴 하지만 실제로 queryModel에는 데이터가 있을지 없을지 확신을 할 수 없는 상황이라는 생각이 듭니다. 즉 실제로 zset에 있는 데이터라 해도 하루가 지났다면 queryModel이 있을지 없을지 모르는 상황이라고 인지했습니다. 질문1) 제가 이해한바가 맞을까요? 맞다면 이 구조를 선택하신 이유가 조금 궁급합니다. 두 캐시를 합쳐서, queryModel자체를 하나의 캐시에서 천개의 데이터만 관리하면 되지않나? 라는 의문이 생겨가지구요 어차피 천개의 데이터만 관리한다면 메모리를 그렇게 크게 차지 하지 않을 것 같기도 하구요 질문2) 지금과 같은 구조에서는 zset을 활용한 article_id가 그렇게 큰 의미가 있는 부분인가? 라는 생각이 듭니다. - 어차피 최신순(1000개이하)의 데이터에 대해서 id를 추출하는거면 DB에서 offset을 세어도 그렇게 안느린 거 아닌가? 하는 생각이 들구요 - zset에 포함되어 있더라도, 실제 데이터(QueryModel)가 있는지 없는지 확답을 할 수 없는 상황이니 큰 의미가 있는건가? 하는 의문이듭니다. 차라리 최신 천개의 데이터에 대해서는 조회에 필요한 모든 데이터를 캐싱해둔다면 큰 의미가 있을거라고 생각이 드는데, 지금의 경우에 대해서는 잘 모르겠네요 ㅠㅠ -결론적으로, 현재 회사에서 RDB를 주로 쓰고 있는 주니어 개발자 입장에서 관련해서 레디스를 도입해본다면.. 아키텍처 복잡도가 올라가는 부분에 비해 엄청 크게 이득이 되는 부분이 있나?? 라는 생각이 많이 들었습니다. 질문3)추가로, 이거는 좀 다른 부분이긴 한데 read-service에서 like, unlike등 업데이트 이벤트 핸들러의 경우 동시요청에 대해서 lostupdate처럼 동작하는 부분이 있을 것 같은데 이부분은 배제하신건지, 혹은 제가 잘못생각하고 있는건지 궁금합니다. 양질의 강의 정말 감사드립니다
해당 강의를 수강하고 하루죙일 찾아봤지만 실질적으로는 문제를 해결하지 못했습니다. ㅜㅜ 문제가 왜 발생했는지 추적한 결과 실제로 xml를 불러들일때, fk 관련 속성을 잘 갖고 오지만, @JoinColumn 을 생성할 때 fk 속성을 삽입하는 코드가 실질적으로 존재하지 않고, fk제약 조건 생성을 위해 alter 시에 @JoinColumns로 지정됩니다. 실제 어노테이션 기법으로 작성 할 경우 @JoinColumn으로 수집이 되지만, -참고- @JoinColumns 으로 수집 시 xml 스펙에서 join-column 태그는 Unbounded로 스펙이 정해져 그렇게 처리 된 거 같아요. 하이버네이트 6.6 버전에서는 jpa 매핑 관련해서 xml 3.1 버전으로 관리되고, 7.0 버전부터는 xml 7버전으로 매핑이 관리될 것 같습니다. 하이버네이트 6.6 버전에선 실질적으로 버그라고 생각되고, 7.0 버전에는 JPAXMLOverridenAnnotationReader 클래스가 사라진 상황이라 7 버전으로 올려서 확인해봐야 할 것 같지만, 스프링 부트 3.x.x버전은 아무래도 하이버네이트 6.6 버전 기준으로 버저닝이 될 거 같아 해당 문제의 해결 방법은 실질적으로 찾진 못했습니다. ㅜ
지금까지 만든 컨트롤러들 MemberFormController, Save,List 전부 궁극적인 기능은 똑같은데 로직이 달랐던 거고, 각 버전마다 프론트 컨트롤러 만들어서 점점 좋게 리팩토링 시켜갔는데 .. 결국 궁극적인 목표가 같은 컨트롤러들을 (로직은 다르지만) 여러 개 만들고 어댑터를 사용하면서 바꿔가야 하는 상황이 어떤 상황인지 이해가 안가요.. (최종으로 리팩토링된 컨트롤러 쓰면 되는거 아닌가요? ) 그리고 v5 프론트 컨트롤러에서, v3 버전이든 v4 버전이든 들어오는 경로에 따라서 v3,v4로 컨트롤러가 결정되는데 개발자가 각 컨트롤러에 맞게 구현한다 라는 표현도 이해가 안가요.. (이미 요청하는 경로로 정해지는데 뭘 구현한다는건지..?) 들어오는 요청이 같은데 컨트롤러를 골라서 한다던가.. 그런것도 아닌거같고 그리고 v4도 깔끔하게 코딩해서 ModelView를 직접 생성하지 않게 해서 만든건데 왜 굳이 어댑터를 사용해서 modelview를 만들고 v3나 v4나 같게하는건지...? ai 답변말고 지식인분들의 답변을 기다립니다
앞서 생성자, 소비자 강의에서 생산자가 데이터를 생성하면 다음과 같이 데이터를 넣었고 queue.offer(data); 소비자는 큐에서 생산자가 생산한 데이터를 꺼내어 소비하였습니다. queue.poll(); 이번 강의에서는 큐에 작업을 넣고, 빼서 처리합니다. 생산자 소비자에서는 데이터를 넣고 빼고 이번 스레드풀 강의에서는 작업을 넣고 빼니 처음에는 작업을 넣고 빼는 큐와 생산자,소비자가 사용하는 큐가 별도로 있는 건가? 했는데 강의를 들어보니 별도로 있는건 아니고 같은 큐인것 같더라구요. 그런데 생산자,소비자에서는 어떤 작업의 결과인 데이터를 생산 하여 큐에 넣고 꺼내어 소비 한다는 것이 직관적이어서 이해가 잘되었는데요. 이번 강의에서는 생산자가 '작업'을 큐에 넣고 빼서 소비자가 큐에서 작업을 빼는데 큐에 넣는 주체가 ' 데이터 '에서 ' 작업 '으로 바뀌어 설명하니 무엇을 생산하는 것이지? 하며 헷갈린다고나 할까요. 생산자소비자 강의에서처럼 어떤 작업의 결과를 큐에 넣고 빼는 것이 아니라 실제로는 작업 자체를 생산하여 큐에 넣는건가요? 그러니까 앞선 생산자와 소비자는 단순 이해를 위한 것이고 실제로는 Runnable 이라던지 Callable 같은 작업 객체 자체가 생산되어 큐에 들어가는 것인가요? 감사합니다