30%
69,300원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
mybatis usegenerateKey
마이바티스로 제너레이트키를 활용해봤는데 의아한 점이 생겼어요 log.info("before board = {} , hashcode = {}",board, board.hashCode()); freeBoardRepository.save(board); log.info("after board = {} , hashcode = {} ",board, board.hashCode()); board 가 dao 인자로 들어갈 때를 기준으로 전 후 해시코드값을 비교해봤는데 동일하네요.. 이게 왜 의문이냐면 Board 객체의 필드는 final로 선언되어 있고 dao에 접근한 뒤, bno 값을 어떻게;; 넣게되었는지 setter가 없고 생성자도 없고 final 또한 지정되어있고 해시코드마저 동일하니 ㅠㅠ 아래가 객체 정의입니다 ㅠㅠ 도대체 어떻게 bno가 삽입된 걸 까요.. @Getter @Builder public class FreeBoard { private final int bno; private final String memberId; private final String tag; private final String title; private final String content; private final Timestamp regdate; private final int viewcnt; private final char showboard; }
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
외부 내부 모두 신규 트랜잭션인데, 외부커넥션을 먼저 반납하는경우
안녕하세요. 강의 잘 듣고 있습니다. 문득 궁금한점이 생겨서... @Testvoid inner_rollback_requires_new() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("outer.isNewTransaction()={}", outer.isNewTransaction()); log.info("내부 트랜잭션 시작"); DefaultTransactionAttribute definition = new DefaultTransactionAttribute(); definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); TransactionStatus inner = txManager.getTransaction(definition); log.info("inner.isNewTransaction()={}", inner.isNewTransaction()); log.info("외부 먼저 트랜잭션 커밋"); txManager.commit(outer); log.info("그다음 내부 트랜잭션 커밋"); txManager.commit(inner);} 위와같이 외부 트랜잭션이 먼저 시작되고, 내부보다 먼저 커밋이나 롤백한 이후에 나중에 시작한 트랜잭션인 내부 트랜잭션의 커밋이라 롤백을 호출하면 IllegalStateException을 던지더라구요. (사실 @Transactional을 이용하면 이런일이 발생하지 않게되어서 이상한 코드 인것같습니다만.., 내부트랜잭션에서 커밋이나 롤백을 누락하거나 / 멀티쓰레드 환경인데 커넥션을 파라미터로 받아서 사용한다거나 하면 겪게 될 수도 있을듯 해서요...) 사실 두 커넥션 간의 연관관계가 없다 생각했는데, 어떠한 이유로 연관이 있나보네요. 일단은 아직 고급편강의를 듣지 않았지만.. 고급편도 곧 들을 예정입니다. 고급편에서 확인할 수 있는 내용일까욤?? 일단, 트랜잭션 동기화 매니저는 내부적으로 커넥션을 생성한 쓰레드로 그룹핑을 하여 관리한다고 생각하고.. 같은 쓰레드로컬 내에서 커넥션이 여러개 있을때, 먼저 생성된 커넥션이 먼저 반납되는 것 자체가 이상상태로 스프링은 취급한다 라고 생각하면 맞을까요..? 질문을 다시요약해보면, 1. 트랜잭션 전파옵션을 PROPAGATION_REQUIRES_NEW로 하여 2개의 별도의 커넥션이 생성됨. 2. 한 쓰레드로 부터 생성된 커넥션은 2개인 상태. 3. 먼저생성된 커넥션의 커밋이 먼저 수행됨. 4. 나중에 생성된 커넥션의 커밋을 수행할때 illegalStateException 예외 발생. -> 두개의 커넥션간의 연관관계는 사실 없다고 생각드는데, 예외가 발생한것에 대해 의문점이 생깁니다! 5. 스프링은 동일한 쓰레드로 부터 여러 커넥션이 생성되었을때, 나중생성된 커넥션부터 순차적으로 커밋되지 않으면 이것 자체를 이상상태로 취급? 하는것인지 궁금합니다!
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
질문 아님.^^
주니어 개발자 분들이 지금 이 말을 잘 듣고 느끼시길 바래봅니다. 세상이 편해져도 노력없이 얻는건 없습니다. 오히려 4차 산업 5차 산업으로 발전할 수록 기본 지식을 더 많이 필요할 뿐이지 편하다고 생각하시지 마시고기술이 편해진다는 건 더 많은 지식을 요구한다는 것으로 받아 드리시고 루틴 처럼 자기 개발 잘 하셔서 고액 연봉자또는 훌륭한 사업자로의 길로 가시길 기원해 봅니다.대한민국 개발자 화이링!! ^^
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
1인 개발 데스크탑과 노트북에서 DB는 어떻게 처리하나요??
1인 개발을 할때 데스크탑에서 DB관련 작업을 진행하다 노트북으로 진행을하게 되면 이 부분은 어떻게 진행이 되는걸까요!??!?! DB 관련 수업을 들으며 진행하다 문득 궁금해져 QnA 남깁니당 ~
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
런타임 오류 발생
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hello.itemservice.config.JdbcTemplateV3Config': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class org.h2.Driver in either of HikariConfig class loader or Thread context classloader 해당 오류가 발생하는 원인이 무엇일까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
Transaction 적용구간에 대한 질문
안녕하세요? 강사님.덕분에 Springboot 수월하게 학습하고 있습니다.좋은 강의 항상 감사드립니다.다름이 아니라Transaction 적용구간에 대한 문의 드립니다.아래 가상 소스를 예를 들면방안1, 방안2 모두 문제점들이 있는데 실제 현업에서는 주로 어떠한 방법으로 해결하시는지 고견을 듣고 싶습니다. 물론, Controller 외부에서 별도 호출하는 방식으로아래 문제를 피해갈 수 있을것 같지만, 서비스 관리 특성성 하나의 메서드로 관리하고 싶다는 전제 입니다. 방안1) 경우 메소드에 Transaction을 적용하면순수 DB처리 이외도 처리도 포함되어 트랜잭션 처리이 짧을 수록 좋은데 길어질 수 있는 문제가 있습니다.방안2) 경우메소드를 쪼개어 순수DB 처리 메소드에만 Transaction을 적용할 수 있겠지만, external 메소드, 등록(), 의 경우 프록시 특성상외부에서 내부 메서드 호출시 트랜잭션이 적용되지 않습니다. 방안1)BasicService{ @Transactional public void 등록() { 1. 이미지 파일 저장 2. 이미지 파일 리사이징 3. ----트랜잭션 구간--- 3-1) 내용 등록 3-2) 업로드 파일 등록 }} 방안2) BasicService{ public void 등록() { 파일업로드(); DB저장(); } public void 파일업로드() { 1. 이미지 파일 저장 2. 이미지 파일 리사이징 } @Transactional public void DB저장() { 3. ----트랜잭션 구간--- 3-1) 내용 등록 3-2) 업로드 파일 등록 }} 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
안녕하세요 영한님! 강의 항상 잘 챙겨보고 있는 수강생입니다.
1. 강의 내용과 관련된 질문인가요? (예/아니오) : 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) : 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) : 예[질문 내용]항상 열심히 수강하고, 배우는 수강생입니다. 정말 영환님 강의 듣고 실력이 일취월장 하여 좋은 곳에도 취업을 하고, 항상 감사합니다. 다름이 아니라 마지막 강의인 SpringBoot 강의 까지 끝나신 다면, 현재 많은 개발자들이 어려워하고, 학습하기 힘들어 하는 WebFlux를 영한님이 강의해 주신다면, 좋을거 같다는 생각이 들어 질문 남깁니다.~ 항상 많은 부분을 알려 주시고, 가리킴을 주셔서 감사합니다
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 AOP 관련 질문드립니다
안녕하세요 항상 좋은 강의 감사합니다 AOP와 관련하여 @transactional에 대한 질문이 생겼습니다 spring data jpa에서 save 및 saveAll을 사용하다가 문득 강의를 적용해보고자 생각이 들어, 테스트를 해보았는데요 1번 테스트 public void method_transaction () { 1. sampleRepository.saveAll(); // 1만건 리스트 2. for( 1만번 반복) { sampleRepository.save(); } } 2번 테스트 @transactional public void method_transaction () { 1. sampleRepository.saveAll(); //1만건 리스트 2. for(1만번 반복) { sampleRepository.save(); } } 1번과 같이 @transactional이 없는 메서드에서 save()와 saveAll() 호출 시에는, save()에서 트랜잭션 생성 비용으로 인해서 saveAll()이 훨씬 빠른 것은 이해했습니다. 반면, 2번과 같은 코드에서는 AOP 강의에서 내부 함수 호출 시에, 프록시가 동작하지 않는다고 배웠는데요. 비록 상위 메서드에 @transactional이 걸려있어서, 트랜잭션 생성 비용은 안들더라도 saveAll()은 내부 함수 호출이기때문에 프록시가 동작하지 않아서 save()보다 속도가 더 빠를 것이라고 생각했는데, 성능 차이가 유의미하게 나타나지 않더라구요. 혹시 프록시 객체를 생성하고 해제하는 리소스는 많이 크지 않은 것인가요? 아니면 테스트를 10만건 정도로 했는데 그 정도의 사이즈에서는 속도 차이가 없는 것인지 질문드립니다 혹은 제가 설계를 잘못한 것인지… 질문드립니다! 감사합니다
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
강의 중 궁금한 사항
안녕하세요 영한님! 28:30 경에 예외는 다 예외로 할거야라고 하신부분이 잘 이해가 가지않습니다. 제가 이해한 바로는 잔고부족을 체크 예외를 쓰지 않고 리턴해서 다음 프로세스를 태운다로 이해했는데 맞을까요?DB 1편에서 체크 예외의 단점들에 대해 들었었는데, 그 부분때문에 체크 예외대신 리턴으로 쓴다고 하신건지 궁금합니다~
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 프록시 내부 호출에 대해 질문이 있습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 트랜잭션 프록시의 내부 호출 강의를 듣고 궁금한 점이 생겨서 질문드립니다. class Service { public void external() { internal(); } @Transactional public void internal() { return; } } 위와 같은 상황에서 외부에서 external()을 호출하면 -> 프록시가 호출되고 -> 트랜잭션이 적용되지 않은 상태로 실제 external()이 호출되고 -> this.internal()이 호출될 때는 프록시를 통하지 않고 호출했기 때문에 트랜잭션 AOP가 적용되지 않는다고 이해했습니다그럼 두 메서드 모두 @Transactional이 붙어있을 때 내부 호출을 하면 어떻게 될까 궁금해서 확인을 해보니 그때는 internal() 메서드를 호출할 때 트랜잭션이 적용이 되더라구요 ! 모든 내부 호출 시 this.XXXX() 호출이기 때문에 트랜잭션 AOP가 적용되지 않는다고 생각했는데 잘못 이해했나봐요 @Slf4j static class BasicService2 { @Transactional public void tx() { log.info("call tx"); final boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active = {}", txActive); this.tx2(); } @Transactional public void tx2() { log.info("call tx2"); final boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active = {}", txActive); } } 이렇게 하면 tx()에서 this로 tx2()를 직접 호출해도 트랜잭션이 적용되더라구요 프록시 방식의 AOP에서 내부 호출 시 AOP가 적용되지 않는다는 것은 모든 Spring AOP의, 모든 내부 호출이 그렇다는게 아니라 트랜잭션 AOP에서, 트랜잭션이 적용되지 않은 채로 호출된 메서드에서, 내부 호출을 할 때만 AOP가 적용되지 않는다는 뜻일까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
강의 끝까지 갔는데 findItems에서 에러나는 분 혹시 계시면 참고하십쇼..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. SpringDataJpaItemRepository에서 영한님이 분명히 @Param 조심하라고 그렇게 말씀하셨는데 기어이 안 듣고 이상한 Param 썼다가 2시간 날린 사람 나야 나 ~~~~~ 저같은 바보 있으면 도움 되시길 기원합니다 @Param 반드시 org.springframework.data.repository.query.Param 이거 쓰셔야 합니다...
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
JpaItemRepositoryV1의 findAll() 로직 질문 있습니다
안녕하세요. JpaItemRepositoryV1의 findAll() 메소드의 로직 중에 ... if (StringUtils.hasText(itemName) || maxPrice != null) { jpql += " where"; } boolean andFlag = false; List<Object> param = new ArrayList<>(); if (StringUtils.hasText(itemName)) { jpql += " i.itemName like concat('%',:itemName,'%')"; param.add(itemName); andFlag = true; } ... 이 param이 없어도 테스트 코드가 정상 동작하고, 안쓰는것 같은 느낌이 들어서요,안쓰는것 맞을까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
임베디드 모드를 많이 사용하나요?
임베디드 모드를 사용하게 되면 장점이 있긴 하지만 통합 테스트를 할때 실제 운영 디비와 다르다는 가장 큰 단점이 존재하는데 이것에 대해 어떻게 생각하시나요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
마이바티즈 스프링 모듈이 해주는 예외 변환
안녕하세요 항상 좋은 강의 감사합니다. 강의 마지막 즈음에 JDBC는 스프링 내부적으로, 마이바티즈는 스프링 마이바티즈 모듈이 예외변환 을해준다고 하셨는데, 그럼 예외 변환을 위한 @Repository의 AOP프록시 객체는 필요가 없는건가요 ? 확인해보니 @Repository를 붙이면 무조건 프록시 객체로 만들어 주는것 같은데. 마이바티즈나 JDBC템플릿을 사용할때는 Repository 객체를 꼭 프록시 객체로 만들어야 하나 싶은 의문이 듭니다! 마이바티즈나 JDBC템플릿을 사용할 때는@Component만 사용하여 빈등록을 하여도 괜찮을까요 ? 감사합니다!
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
Test updateItem() 질문있습니다.
안녕하세요 항상 좋은 강의 감사드립니다! Jpa강의를 예전에 이미 다들었는데, 아직 실무에서 안쓰다보니 가물가물한 하네요..ㅜ ItemRepositoryTest에 updateItem() 테스트를 보면 save한후 update하고, 그후 find를 하게 되어있습니다. save()를 했을 때 영속 컨텍스트에 데이터가 저장되고, update(), find()했을때는 영속 컨텍스트에서 데이터를 가져와 사용하고 커밋되기 전 롤백되기 떄문에 쿼리가 발생하지 않는 걸로 알고있습니다. 그런데 save()를 할때 insert 쿼리는 발생하는게 이해가 가질 않습니다. 커밋을 하지않았기 때문에 insert쿼리는 발생하지 않고 영속 컨텍스트에만 저장되어 있어야 하지않나 생각이듭니다.. 기초적인 질문이라 죄송합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
Error creating bean with name 'itemController'
[질문 내용] 안녕하세요. 강사님 수업을 잘 듣고 있습니다.Jpa 부분의 강의까지는 별 탈 없이 진행이 되었는데 오늘 Spring Data Jpa 강의를 듣고 테스트를 돌리는 과정 중에 java.lang.IllegalStateException: Failed to load ApplicationContext 와 Error creating bean with name 'itemController' Unsatisfied dependency expressed through constructor parameter 0; 라는 에러가 나타나게 되었습니다. itemController의 빈 생성이 정상적으로 된 것 같지는 않아 itemConroller 부분의 @Controller 어노테이션과 @RequiredArgumentConstructor 어노테이션이 정상적으로 존재하는지 확인도 해보았지만 빠져있지는 않았습니다. 혹여나 Spring Data Jpa 부분에서 제가 무언가를 잘못 타이핑 한건가 싶어 어제까지는 정상적으로 작동하였던 JpaConfig 파일을 ItemServerApplicaton에 Import 해보았으나 동일한 에러가 나타났습니다. 구글링을 통해서도 정보를 찾아보았지만 해결이 잘 안되는데 이런 상황에서는 어떻게 해결하여야 하는지 알려주시면 감사하겠습니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
실제 운영에서 트랜잭션을 Repository에 적용하기도 하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]실제 운영에서 배운 내용과 같이 @Transactional을 Repository에 적용하기도 하나요?보통은 적용하지 않고, REQUIRES_NEW와 같은 특수하게 필요한 상황일때 사용하는 것일까요??
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
쿼리
궁금한게 19분19초쯤 insert랑 update쿼리 나오는데 order.setUsername("정상"); 이 코드는 insert쿼리에 그리고 order.setPayStatus("완료"); 이 코드는 update쿼리에 쓰이는 건가요
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
h2 외의 데이터 베이스 테스트
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 스프링 부트 공식 메뉴얼을 읽어 보니 스프링에서 임베디드 데이터 베이스 모드를 지원하는 데이터베이스는 H2, HSQL, Derby databases 로 나와있었습니다. 그럼 그 외에 mysql과 같은 데이터베이스를 테스트 하기 위해서는 테스트용 데이터 베이스를 만들고 @Transaction 어노테이션을 통해 데이터베이스 접근 테스트를 진행하면 되는건가요?? 아님 다른 더 좋은 방법이 있나요?? 감사합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
memberrepository
memberrepository가 무엇을 뜻하는건가요 코드에 없는뎅...