스핀락 질문.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스핀락에서 스레드1이 나오자마자 다시 들어가는 경우는 불가능한가요?? 딱 마침 스레드2보다 먼저 CPU를 선점할 수도 있는거 아닌가요? 계속 돌려봐도 0이 나오네요. 타이밍이 좋게 한 놈이 반복해서 들어갈 수도 있는 구조 아닌가 궁금합니다.
- C#
- unity
- 네트워크
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스핀락에서 스레드1이 나오자마자 다시 들어가는 경우는 불가능한가요?? 딱 마침 스레드2보다 먼저 CPU를 선점할 수도 있는거 아닌가요? 계속 돌려봐도 0이 나오네요. 타이밍이 좋게 한 놈이 반복해서 들어갈 수도 있는 구조 아닌가 궁금합니다.
해결됨
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
안녕 킬구횽. 정성 가득한 강의 감사한 마음으로 공부하고 있다. 고맙다. 다름이 아니라, 해당 작전에서 설명한대로 TransactionManager을 분리해서 사용하고 있었는데, 이때 이해가 가지 않는 상황이 있다. 글이 조금 길어서, 요약을 먼저 하겠다. 요약 비즈니스용 트랜잭션 매니저(JPA) 과 메타데이터용 트랜잭션 매니저(JDBC) 을 분리한 경우 , UnexpectedRollbackException 이 발생한 후에 OptimisticLockingFailureException 까지 추가로 발생한다. 그러나 트랜잭션 매니저를 분리하지 않은 경우 , UnexpectedRollbackException 은 발생하지만 OptimisticLocking 예외는 발생하지 않는다 . 이유가 궁금하다. 상황 설명 다음은 @Configuration 클래스다. @Bean @Primary @ConfigurationProperties("spring.datasource.service") public DataSource dataSource() { return DataSourceBuilder.create() .type(HikariDataSource.class) .build(); } @Bean @BatchDataSource @ConfigurationProperties("spring.datasource.batch") public DataSource batchDataSource() { return DataSourceBuilder.create() .type(HikariDataSource.class) .build(); } @Bean @Primary public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } @Bean @BatchTransactionManager public PlatformTransactionManager batchTransactionManager(@BatchDataSource DataSource dataSource) { return new JdbcTransactionManager(dataSource); } 다음은 job을 구성하는 ( 잘못 작성된 ) tasklet이다. 트랜잭션 전파 속성은 Propagation.REQUIRED를 사용하고 있다. class TestTasklet implements Tasklet{ private final TestRepository testRepository; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { try{ // testRepository의 @Transactional method 호출 // but @Transactional method에서 RuntimeException을 throw } catch(RuntimeException e){ // sucess process logic } return RepeatStatus.FINISHED; } 위 코드에서, 예외를 캐치하는 것으로 예외를 처리한 것은 나의 실수였다. 런타임 예외를 던지는 트랜잭션은 rollback-only 마킹 처리되어 해당 트랜잭션이 커밋될 수 없었기 때문이다. 이해가 가지 않는 지점은 지금부터다. 이를 설명하기 위해 내가 파악한 흐름을 정리해봤다. 오류가 있을 수 있다. (비즈니스: JPA / 메타 데이터: JDBC) 트랜잭션 매니저를 분리하는 경우 TransactionTemplate의 execute 메서드 실행 doInTransaction 메서드 실행 시작 TestTasklet의 execute 메서드의 실행 * transaction from JPA execute 메서드 내부에서 런타임 예외가 발생하는 트랜잭션 메서드 호출 -> 트랜잭션에 rollback-only 마킹됨 내부적으로 정상 처리하였으므로 RepeatStatus.FINISHED 반환 StepExecution update (version 1 -> version 2) 커밋 * 메타데이터용 DB 커넥션 사용하는 것을 확인함 doInTransaction 메서드 실행 완료 TransactionTemplate의 execute 메서드에서 커밋 시도 * transaction from JPA UnexpectedRollbackException 발생 * rollback-only 마킹으로 인함 롤백 시작 version 1 -> version 2로 StepExecution update 시도 이때 다음 예외가 발생한다. OptimisticLockingFailureException: Attempt to update step execution id=4 with wrong version (1), where current version is 2 반면, 트랜잭션 매니저를 분리하지 않으면 OptimisticLocking 예외가 발생하지 않는데, 왜 OptimisticLocking 예외가 발생하지 않는지 궁금하다. (비즈니스, 메타 데이터: JPA ) 트랜잭션 매니저를 분리하지 않는 경우 TransactionTemplate의 execute 메서드 실행 doInTransaction 메서드 실행 시작 TestTasklet의 execute 메서드의 실행 execute 메서드 내부에서 런타임 예외가 발생하는 트랜잭션 메서드 호출 -> 트랜잭션에 rollback-only 마킹됨 내부적으로 정상 처리하였으므로 RepeatStatus.FINISHED 반환 StepExecution update (version 1 -> version 2) 커밋 doInTransaction 메서드 실행 완료 TransactionTemplate의 execute 메서드에서 커밋 시도 UnexpectedRollbackException 발생 롤백 시작 version 1 -> version 2로 StepExecution update 시도 OptimisticLock 예외가 터지지 않고 정상적으로 버전 업데이트가 완료된다. 이때 OptimisticLocking 예외가 발생하지 않았다는 것은, 현재 stepExecution의 버전이 1 이라는 것으로 받아들여진다. 의문인 점은, StepExecution update (version 1 -> version 2)이 커밋되는 것을 디버깅을 통해 확인했는데, 어째서 롤백 시점에서 stepExecution의 버전이 1이냐는 것이다. 무언가 엔티티 매니저와 관련이 있는 것 같은데, 잘모르겠다. 도움이 될까하여, 로그 일부를 첨부한다. 트랜잭션 매니저 분리하는 경우 2025-07-27T22:16:13.626+09:00 TRACE 141032 --- [server] [ main] o.s.jdbc.core.StatementCreatorUtils : Setting SQL statement parameter value: column index 1, parameter value [28], value class [java.lang.Long], SQL type unknown 2025-07-27T22:16:13.626+09:00 TRACE 141032 --- [server] [ main] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.update] 2025-07-27T22:16:13.626+09:00 DEBUG 141032 --- [server] [ main] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit 2025-07-27T22:16:13.626+09:00 DEBUG 141032 --- [server] [ main] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [HikariProxyConnection@33286612 wrapping org.postgresql.jdbc.PgConnection@6ae1d5f1] 2025-07-27T22:16:13.627+09:00 DEBUG 141032 --- [server] [ main] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [HikariProxyConnection@33286612 wrapping org.postgresql.jdbc.PgConnection@6ae1d5f1] after transaction 2025-07-27T22:16:13.627+09:00 DEBUG 141032 --- [server] [ main] o.s.jdbc.support.JdbcTransactionManager : Resuming suspended transaction after completion of inner transaction 2025-07-27T22:16:13.627+09:00 DEBUG 141032 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit 2025-07-27T22:16:13.627+09:00 DEBUG 141032 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(858762286<open>)] 2025-07-27T22:16:13.630+09:00 INFO 141032 --- [server] [ main] o.s.batch.core.step.tasklet.TaskletStep : Commit failed while step execution data was already updated. Reverting to old version. 2025-07-27T22:16:13.630+09:00 DEBUG 141032 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Closing JPA EntityManager [SessionImpl(858762286<open>)] after transaction 2025-07-27T22:16:13.630+09:00 DEBUG 141032 --- [server] [ main] o.s.batch.repeat.support.RepeatTemplate : Handling exception: org.springframework.transaction.UnexpectedRollbackException, caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 2025-07-27T22:16:13.631+09:00 DEBUG 141032 --- [server] [ main] o.s.batch.repeat.support.RepeatTemplate : Handling fatal exception explicitly (rethrowing first of 1): org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 2025-07-27T22:16:13.633+09:00 ERROR 141032 --- [server] [ main] o.s.batch.core.step.AbstractStep : Encountered an error executing step switchAliasTargetStep in job addressIndexingJob 분리하지 않는 경우 2025-07-27T22:18:22.239+09:00 TRACE 114800 --- [server] [ main] o.s.jdbc.core.StatementCreatorUtils : Setting SQL statement parameter value: column index 1, parameter value [8], value class [java.lang.Long], SQL type unknown 2025-07-27T22:18:22.240+09:00 TRACE 114800 --- [server] [ main] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.update] 2025-07-27T22:18:22.240+09:00 DEBUG 114800 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit 2025-07-27T22:18:22.240+09:00 DEBUG 114800 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(707576293<open>)] 2025-07-27T22:18:22.241+09:00 INFO 114800 --- [server] [ main] o.s.batch.core.step.tasklet.TaskletStep : Commit failed while step execution data was already updated. Reverting to old version. 2025-07-27T22:18:22.242+09:00 DEBUG 114800 --- [server] [ main] o.s.orm.jpa.JpaTransactionManager : Closing JPA EntityManager [SessionImpl(707576293<open>)] after transaction 2025-07-27T22:18:22.242+09:00 DEBUG 114800 --- [server] [ main] o.s.batch.repeat.support.RepeatTemplate : Handling exception: org.springframework.transaction.UnexpectedRollbackException, caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 2025-07-27T22:18:22.242+09:00 DEBUG 114800 --- [server] [ main] o.s.batch.repeat.support.RepeatTemplate : Handling fatal exception explicitly (rethrowing first of 1): org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 2025-07-27T22:18:22.246+09:00 ERROR 114800 --- [server] [ main] o.s.batch.core.step.AbstractStep : Encountered an error executing step switchAliasTargetStep in job addressIndexingJob
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
13. jpa reader,writer 까지만 보고 질문드립니다. JpaPagingItemReader , JpaItemWriter 를 사용해서 JPA 기반으로 DB에 직접 접근해 처리할때, Writer나 Processor에서 복잡한 비즈니스 로직이 필요한 경우 에는 어떻게 설계하는 것이 좋은지 궁금합니다. 만약 주문을 처리하는 배치가 있다고 했을 때 배치 작업에서 주문을 조회 ( JpaPagingItemReader -Entity 리턴) writer에서 주문 상태 변경 주문 내역 추가 배송 테이블에 적재 등 여러 도메인을 걸치는 비즈니스 로직 수행 필요 이렇게 되면 reader에서 조회한 것을 processor에서 command와 같은 객체로 변환해서 writer에서는 service 로직을 호출하는 것이 좋을까요?
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
안녕하세요 토비님, 우선 강의를 통해 제가 알고 있던 헥사고날 과 DDD(도메인 주도 설계) 에 대해 다시 한번 깊이 생각해볼 수 있는 소중한 경험이 되었습니다. 좋은 강의 만들어주셔서 정말 감사합니다. 토비님께서 생각하시는 헥사고날에, DDD 과 멀티 모듈 의 바람직한 설계에 대해 궁금해서 질문을 남기게 되었습니다. 여기서의 멀티 모듈은 우선 MSA 를 제외하고 순수 멀티 모듈을 통해 시스템을 설계를 한다는 것을 전제하고 있습니다. 가장 흔하게 보이는 멀티 모듈 구성의 패턴은 Storage (JPA), External (외부 Dependency), N 개의 서비스에 해당하는 Web Server 모듈 & 기타 등이 있는 것 같은데요. 멀티 모듈을 현 강의에서 보여주고 말씀해주시는 헥사고날과 DDD 와 결합했을 때, 어떻게 구성하면 좋을지 많은 생각이 들고 또한 현업에서 비슷한 고민을 하고 있어서 토비님의 생각이 궁금해 질문을 남기게 되었습니다. 감사합니다.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
여자 물체가 분홍색으로 나와요. 쉐이더를 standard로 바꾸는것도 해봤고 다른분이 파일 올려준거 에셋파일에 넣으라고해서 넣었는데도 계속 분홍색으로 나와요 어떻게 해야되죠 ? 인풋 시스템이 지금 방식은 옛날방식이라고 새로운방식으로 사용하라고 하는데 어떻게 해야할까요 아래가 오류 메세지입니다 InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings. UnityEngine.Input.GetKey (UnityEngine.KeyCode key) (at <9d2f564c4eed4a90bb0e96c187775d6e>:0) PlayerController.Update () (at Assets/Scripts/PlayerController.cs:14)
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
프로젝트 수행시에 itemReader로 데이터 조회가 안된다면, application.yaml 설정에 data: mongodb: database: cyberops 추가해보세요~ 🤔
해결됨
[말 한마디로 뚝딱!] AI와 함께 나만의 수익화 웹사이트를 만드는 법
이런 오류가 뜨는데 이유가 뭘까요?
미해결
김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
Client의 close()에 synchronized를 사용하는 것은 이해가 됐습니다. ReadHanlder, WriteHandler 양쪽에서 동시에 호출할 수 있기 때문이라고 생각하면 바로 이해되는데... ReadHandler, WriteHandler의 close()에는 어떤 이유로 동기화 처리를 하는건지 궁금합니다. (해당 스레드들은 Client에서만 접근되는게 아닌가요?) 그리고 모든 IO 스트림이 Client 클래스에서 관리되는데 굳이 핸들러에도 close()를 두신 이유가 궁금합니다!
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 강의 따라하는데, indexing이 무한히 로드 중이여서 아래 문구와 같이 자동 import를 하고 싶어도 할 수가 없습니다 ㅠㅠ.. 구글링을 통해 invalidate cache 하고 restart 해보기 compiler>excludes에 해당 프로젝트 파일 제외시켜보기 appearance&behavior에서 sync기능 비활성화 시켜보기 ( https://eottabom.github.io/post/intellij-indexing/ 참고함) jdk 17로 잘 설정되어 있는지 등등 확인해보았지만 인덱싱이 무한히 실행되고 있어 어노테이션 임포트를 못하고 있습니다... 조언 부탁드리겠습니다! 😂 😂
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
도메인에 "속성과 행위가 모두 포함"되어야하는데 그러면 만약에 "행위" 자체가 "외부 의존"을 가져야만 하는 경우에는 이런 것은 어떻게 만드는 것이 좋을까요?
미해결
김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
안녕하세요! SessionV6에서 closed 변수를 사용하는 이유를 모르겠습니다! 어차피 close();가 몇번이건 호출되어도 예외가 발생안할텐데 체크하는 이유가 뭔지 알고싶습니다!
미해결
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
thread1.join(); thread2.join(); 메인스레드 내에서 thread1,2를 join()을 하는데요. thread1.join()을 먼저 만났으니 메인 스레드는 thread1이 종료 될때까지 다음 코드를 실행하지 않을텐데요. 여기서 메인스레드가 thread1의 결과를 기다리는 것이므로 thread1,2는 무관하게 그대로 번갈아가며 실행 되는 것이 맞나요? CPU((코어)가 1개라고 가정했을때요. 그래서 메인은 thread1이 종료되고 결과를 기다릴뿐 thread1과 2의 종료 순서는 보장되지않는 것이 맞을까요? 따라서 thread2가 먼저 작업을 끝낸 실행일 때도 있을 수 있겠죠? 단지 메인이 thrad1의 결과를 먼저 받으려고 기다릴뿐인거죠?
해결됨
유니티 머신러닝 에이전트 완전정복 (응용편)
안녕하세요. 닷지 ckpt 모델 파일을 onnx로 변환 후 unity에서 추론하는 방법에 대해 알려주실 수 있을까요? 제가 시도를 해보았을 때는 NullReferenceException이 나면서 정상 작동하지 않습니다. ml-agent learn에서 자동으로 출력되는 onnx파일들은 정상 작동이 되구요. 감사합니다.
해결됨
[말 한마디로 뚝딱!] AI와 함께 나만의 수익화 웹사이트를 만드는 법
실행/디버그 구성하는 부분에서 갑자기 메인 클래스 부분이 jh로 변경되어 있고 파일 구조를 보면 jhApplication도 이미 생성되어 있는데 어떻게 하신건가요? 끊김제거 및 추가 설명 강의에서도 이 부분이 없습니다
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
하나씩 따라하는데 문자입력 잘 못하면완전히 다 어긋나버리고 제미나이도 잘 모를때가있는데 잘못된거 찾는데만 한세월걸리네요 소스코드라도 좀 공유해주세요
미해결
[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
서버에서 브로드캐스트 이벤트 발생 시 퀘스트 클리어 확인 후 보상을 지급하고 DB 갱신을 하는 부분까지 이해했습니다. DB쪽에서 보상처리 라던지 퀘스트 상태저장 시 실패할 가능성도 있을 듯한데 만약 실패했다면 서버의 메모리를 이전상태로 롤백해줘야할듯한데 서버 메모리를 이전상태로 변경하려니 코드가 많이 지저분해지는듯한데 실패가능성은 없나요?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 17:13경 하신 설정이 최신 intellij와 스프링부트에서도 필요한 설정인가요? 어떤 기능을 하는 설정인지 궁금합니다. 2025년 기준 인텔리제이에서 확인할 수 없어 여쭙습니다.
미해결
[Unity6] 함께 만들어가는 서바이벌 게임 개발 - 스팀 출시 도전기
앞으로의 강의에서 충분히 해결될 이슈 같지만, 그래도 12강에서 테스트 하시다가 의문을 가지실 분들도 계시지 않을까 싶어서 질문 하나 남깁니다. 이 이슈가 나중에 몇 강 강의에서 해결되는지 또는 간단하게 해결할 수 있는방법을 알고 싶습니다. 강의 내용 27분 22~34초대에서 스켈레톤이 움직이지 않고 앞으로만 움직이는 현상이 목격됩니다. 애니메이터의 MOVE 트리거가 발동되기 전에 스켈레톤이 비활성화되면서 생긴 이슈 같습니다. 실제로 강의 내용을 따라하다보면 똑같은 시점에서 같은 문제가 발생합니다. 스켈레톤 A는 애니메이션이 정상 작동하는 대상이고 스켈레톤 B는 애니메이션이 작동하지 않은 채 앞으로만 움직이는 대상입니다. 앞으로 다양한 몬스터가 나올 것을 기대하고 있기에, 충분히 추후에는 해결되는 이슈라고 생각하고 있습니다. 그래도 혹시나 12강에서 똑같은 이슈를 만나시고 궁금해하시는 분들이 계실까봐 가볍게 내용을 남깁니다.
해결됨
모르면 야근하는 문자 인코딩 완전 정복
안녕하세요 강사님, - Java 리플렉션 + 어노테이션 - JDBC 7월중에 오픈 예정이라고 들었습니다.. 언제 쯤 오픈 예정이신지 궁금합니다..
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
안녕하세요 토비님! 좋은 강의 정말 감사드립니다. @TestConfiguration 에 대한 설명을 해주신 부분 중에서 테스트 결과와 다른 부분이 있는 것 같아 확인차 질문 드립니다. <28. 회원 애플리케이션 서비스 테스트 (2)> 의 11:38에서 " @TestConfiguration 에 어떤 Bean을 정의하면 이게 우선이 되어 돌아갑니다." 라는 말씀을 해주셨는데요. 해당 말씀이 맞는지 테스트해 보기 위해, 현재의 강의 예제 코드에서 @TestConfiguration 이 붙은 클래스의 PasswordEncoder 를 정의한 Bean 메서드의 이름을 testPasswordEncoder로 변경하고 테스트를 돌려 보니 아래와 같은 오류가 발생하였습니다. ( EmailSender 의 경우 DummyEmailSender에 @FallBack 이 붙어 있어서 @TestConfiguration 의 EmailSender Bean 메서드의 이름을 다르게 구성하더라도 테스트는 정상적으로 동작합니다.) @TestConfiguration 이 정의되었다고 해서 우선순위로 동작하지는 않는 것으로 보이고, 기존 Bean의 적용 우선순위에 따라 @TestConfiguration 에서 정의한 메서드 이름과, 이를 사용하는 곳의 필드 이름이 동일한 경우 해당 Bean을 찾아서 동작하는 것으로 보였습니다. 혹시 제가 잘못 이해하고 있거나 보완이 필요한 부분이 있다면 편히 말씀 부탁드립니다. 확인 부탁드립니다. 감사합니다 :)