월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
ext["hibernate.version"]=5.6.5.Final 관련
===================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle은 강의 교안과 같이 아래와 같은 상황이며, 이 중에서 ext["hibernate.version"]=5.6.5.Final에 대해서 질문드리고자 합니다.plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } ext["hibernate.version"] = "5.6.5.Final" repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' //JdbcTemplate 추가 //implementation 'org.springframework.boot:spring-boot-starter-jdbc' //H2 데이터베이스 추가 runtimeOnly 'com.h2database:h2' //MyBatis 추가 implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' //JPA, 스프링 데이터 JPA 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { useJUnitPlatform() } gradle 문법을 찾아보니, build.gradle 내에서 "hibernate.version" 의 이름을 가진 변수명(?)이 참조하는 요소가 ext["hibernate.version"] = "5.6.5.Final" 임을 확인했습니다. 그런데, 여기에서는 hibernate.version을 참조하는 변수(?)가 없음에도 불구하고 어떻게 gradle이 인식하는지 문의드립니다. 작은 질문 추가) 위에서 마땅한 용어가 없어서, "변수" 라는 용어를 썼는데, 적절한 용어가 있는지도 추가로 문의드립니다!
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
MemoryRepository의 map 타입의 필드에 static 한정자를 붙이는 이유가 궁금합니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.스프링DB2편 - 프로젝트 구조설명1기본 강의에서 7분가량에 나오는 코드 화면입니다메모리에 저장되는 repository 형태로 코드가 제시되어 있는데요. 여기서 store 필드에 static 한정자가 붙은 이유가 궁금합니다.private static final Map<Long, Item> store = new HashMap<>(); 왜 이런 질문을 드리냐면 제 생각엔 1) MemoryItemRepository 클래스에는 @Repository 어노테이션이 붙어있고 별다른 옵션이 없으므로 싱글톤으로 Bean이 생성되고 관리될 것이라 생각되고, 2) 싱글톤으로 관리된다면 static을 뺀 private final Map<Long, Item> store = new HashMap<>(); 코드와 동일한 작동을 나타낼 것이라 저는 생각하는데혹시 제가 알아차리지 못하고 있는 static을 쓰고 있는 이유가 있는지 궁금합니다
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트에서 JPA의 경우 커밋되는 시점에 DB에 반영되기 때문에 jpql이 로그에 남지 않는 것에 관하여 질문드립니다.
jpa의 update 쿼리는 @commit을 붙이지 않으면 jpql이 남지 않는 것으로 배웠습니다. 그런데 "다양한 데이터 접근 기술 조합" 강의의 '주의점'에서 jpa는 기본적으로 트랜잭션 커밋되는 시점에 반영한다고 합니다. 그러면 save도 insert jpql이 로그에 남지 않아야 하는 것 아닌가요? 왜 insert의 경우 jpql이 남는 것지 궁금합니다! 위 사진은 save 테스트 메서드를 했을 때 남는 로그입니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
간단한 오타입니다
안녕하세요아주 사소한 오타 제보 드립니다.ㅎㅎ3. 데이터 접근 기술 - 테스트.pdf ->11page 그림 [1]4. SELECT SQL4. Item1, Item2, Item3 반환부분 숫자가 4로 같아서 말씀 드립니다!요청과 반환은 주체가 다르므로 숫자가 달라지는게 맞는 것 같습니다. [2]1) 테스트를 로직을 실행한다 -> 테스트 로직을 실행한다.2) 트래잭션 -> 트랜잭션 감사합니다.
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용시 오류가 납니다.
MyBatis 적용 2 에서 테스트 실행시 오류가 발생하여 질문드립니다. @Import(MyBatisConfig.class)를 적용한뒤 부터 빈을 찾을수없다고 뜹니다..Description:Parameter 0 of constructor in hello.itemservice.config.MyBatisConfig required a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' that could not be found.Action:Consider defining a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' in your configuration.2023-05-12 17:54:39.382 ERROR 1252 --- [ Test worker] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@32f0fba8] to prepare test instance [hello.itemservice.domain.ItemRepositoryTest@2f521c4]이게 핵심 에러내용인것같은데, ItemMapper를 찾을수가 없다고 뜹니다.강의 소스 코드의 경우 MyBatis적용시 문제없이 진행되어서 더 헷갈리네요.. 도와주세요ㅜㅜ
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
DTO 위치
안녕하세요.현재 db2 강의 첫 챕터의 프로젝트 구조 설명1 - 기본에서 궁금한 점이 있어서 질문을 남깁니다.아직 지식이 부족한지 dto 위치 관련된 이전 답변들이 이해하기가 많이 어렵드라고요 ㅠ;;선생님께서 dto 위치가 최종단이 어디인지에 따라서 위치가 정해진다고 하셨습니다.그렇게 이해하고 나서 controller의 update, service의 update, repository를 보니 모두 매개변수로 ItemUpdateDto를 가지고 있드라고요.그래서 고민을 하다가 dto는 결국 역할에 따라 분리된 controller, service, repository에서 필요한 data를 이동시키기 위한 운반체와 같다 생각을 하고 코드에서도 보면 controller, service에서는 ItemUpdateDto를 사용하지 않고 이동만 시키고 실질적으로 dto를 사용하는 단이 repository라는 것을 알게 되었습니다.이와 같은 과정을 통해서 ItemUpdateDto의 위치가 repository에 위치해야하는 것인지, 이렇게 생각한 것이 맞는지 여쭤보고 싶습니다. 그리고 어디에 두기 애매한 dto는 따로 패키지에 둔다고 했는데 이런 애매한 dto는 controller, service, repository에서 각각 쓰이는 애매한 거라 생각이 드는데, 이러면 한방향이 아닌 순회하는 code가 되어서 안좋은것인지 궁금합니다.
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
스프링 트랜잭션 전파에 대해서 질문이 있습니다.
안녕하세요. 선생님. 좋은 강의 만들어주셔서 너무 감사드립니다.스프링 트랜잭션 전파 부분을 공부하던 중에 궁금한점이 생겨서 질문을 올리게 되었습니다.강의를 들으면서 외부 트랜잭션과 내부 트랜잭션이 묶여서 하나의 트랜잭션이 되는것으로 알게 되었습니다혹시 외부 트랜잭션과 내부 트랜잭션에 대한 데이터 베이스 서버가 다를 경우에도 기존과 동일하게 하나의 트랜잭션으로 묶이게 되나요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
적용 가능한 jdk 버전은?
안녕하세요.itemservice-db-start를itemservice-db로 바꿔서 돌려보니까 JDK관련 에러 메세지가 나서 Build 설정을 'IntelliJ IDEA'로 했으나 되지 않았습니다.혹시나 해서 JDK를 azul-15 로 선택했더니 정상 동작합니다.제가 테스트 한 버전은 jdk 19.0.2 버전입니다. 스프링 입문편 부터 여기까지 쭉 jdk 19버전으로 정상 동작되었는데 이번에 에러가 발생해서 좀 당황했습니다.어느 버전부터 적용 가능한지 아니면 jdk 와 무관한 다른 설정문제인지 궁금합니다.그럼 답변 부탁드립니다.감사합니다.
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
itemMapper 트렌잭션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]itemMapper는 트랜젝션을 해주나요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatisItemRepository와 MybatisConfig
MyBatisItemRepostiory에서 @Repostiory와 @RequiredArgsConstructor을 통해서 스프링빈으로 등록하고 ItemMapper와 의존관계를 주입했잖아요근데 MYBatisConfig에서 다시MybatisConfig에 ItemMapper의존관계를 주입하는 이유가 뭔가요?
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@BeforeEach, @AfterEach 작동방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님.@Transactional과 관련해서 @BeforeEach가 어떻게 작동하는지 궁금해서 테스트를 좀 해봤는데요.@SpringBootTest class Test { @BeforeEach void before() //데이터 저장로직 존재 @Transactional @Test void count() //before()에서 저장된 데이터 개수와 비교검증 }위와 같은 테스트 클래스를 만들었습니다.제가 생각하는 테스트 흐름은 아래와 같습니다.//테스트 시작 before(); //데이터1, 데이터2 저장 //트랜잭션 시작 count(); //데이터 개수가 2이어야 테스트 성공 //트랜잭션 종료. 롤백 //테스트 종료before()가 트랜잭션 범위 밖에 있기 때문에 저장한 데이터가 롤백되지 않을거라 예상했습니다.그런데 실제로 테스트를 진행해보니 정상적으로 롤백이 되더라구요.왜 그런지 생각을 곰곰히 해봤는데단순히 각 테스트케이스 실행 전에 @BeforeEach를 따로 실행시켜주는 것이 아니라@SpringBootTest class TestProxy { Test target; void count() { 트랜잭션 시작(); if (@BeforeEach가 있으면) { target.before(); } target.count(); 트랜잭션 종료(); } }위처럼 트랜잭션 AOP 프록시에 before()가 직접 삽입되기 때문에 각 테스트케이스의 트랜잭션 안에서 before()가 실행되는 것으로 이해하면 될까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
간단한 오타 입니다
안녕하세요스프링DB2편-데이터접근활용기술 -> 1. 데이터 접근 기술 - 시작.pdf일관성 있게 afterEach() 로 변경되면 좋을 것 같습니다! +++추가identity 전략이고 하는데, -> identity 전략이라고 하는데,문맥 상 위처럼 변경되는 게 좋을 것 같습니다! +++추가형광펜 칠한 부분띄어쓰기가 잘못 들어간 것 같아요! 감사합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트코드 작성시 컴파일오류가 발생합니다.
https://drive.google.com/file/d/1WpW1BMidCxTZA4qmKPoDP5_6Ct0fVTh6/view?usp=sharing @TestConfiguration static class Config { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }여기서 Autowire을 할 수 없다고 하는데, 테스트 코드는 정상적으로 실행되는데 TransactionManager의 로그는 뜨지 않는 걸로 보아 뭔가 문제가 있는 것 같습니다 ㅠㅠ
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 데이터 JPA 질문입니다
스프링 데이터 JPA의 질문이 기본적인 CRUD를 지원해서 구현체를 안 만들어줘도 되는 것 아니었나요 ??JpaItemRepositoryV2를 만들면 이 부분이 깨지는 것 아닌지 궁금합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
PersistenceException은 런타임 예외이지 않나요 ?
PersistenceException이 RuntimeException을 상속 받았던데 이러면 service 계층에서 처리 할 의무가 없으니 DataAcessException으로 변환하지 않아도 JPA예외에 의존하는 것이 아니지 않나요 ?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
쓰기 지연 질문입니다
JPA를 사용하지 않으면 데이터베이스에 바로 SQL을 을 보내지만, 커밋을 할 때 저장을하고, 롤백을 하면 내용을 원래대로 복구하던 것을JPA를 사용하면 커밋을 할 때 까지 SQL을 보내지 않기 때문에 롤백이란 기능이 사라졌다고 생각하면 되는 것일까요?그렇다면 원래는 커밋을 하지 않아도 내부에선 반영이 되기 때문에 테스트를 할 수 있었는데 이런 경우는 어떻게 되는 것인가요 ? (테스트코드에서 @Transactional같은 경우 )
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
스프링 db-2 트랜잭션 질문
트랜잭션이 적용이 되어있는지 확인을 하실때, 의존성 주입으로 확인을 하시는 것을 보고 왜 저렇게 해야하지 그냥 직접 객체 생성을 해서 하면 안될까..? 의문을 가지고 해봤는데 안되는 모습을 보고 질문드립니다. 왜 작동이 안하는 것일까요@Autowired 로 안하고, 그냥 new 로 직접 등록했습니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부호출 1 질문이 있습니다
고급편을 듣고 이 강의를 들었으면 알 수 있을 것 같은 내용이지만, 다른 분들을 위해 또 성격이 급해서 질문을 남깁니다. CallService의 프록시 객체는 CallService를 상속받은 자식 객체로 이해했는데요. 언뜻 생각하기로는 internal을 내부 호출을 하더라도 override된 internal이 호출되기 때문에 트랜잭션이 적용될 것 같다는 생각이 드는데, 간단하게라도 이렇게 동작하지 않는 이유를 알 수 있으면 좋겠습니다. 검색을 해보니 AOP가 런타임에 인터셉트 하는 방식으로 동작하기 때문에 그렇다고 하는데요. 그렇다면 왜 override 하는 방식으로 구현하지 않았는지도 궁금해집니다.
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 전파에 대한 궁금증이 있어서 질문 드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용]안녕하세요 선생님 제가 트랜잭션 전파 내용을 모두 완강하고 혼자 약간의 궁금증이 생기는 부분이 있어서 질문을 남깁니다.제가 궁금한 부분은 물리 트랜잭션을 시작하는 메서드 A가 있고 여기에 참여하는 메서드 B가 있는데 만약 트랜잭션 A가 먼저 커밋이 되면 그 후에 B가 어떤 상황이 오더라도 물리 트랜잭션에 영향을 줄 수 없을까요??제가 배운기억으로는 A 논리 트랜잭션 커밋 B 논리트랜잭션 커밋이 되는경우에 물리 트랜잭션이 커밋이 된다고 배웠던 것 같은데A 논리 트랜잭션만 커밋해도 물리 트랜잭션이 커밋이 될까? 하는 의문에 실험 해 본 결과 B 논리 트랜잭션은 커밋을 하지 않아도 커밋이 되더라구요(혹시 잘못된 테스트 일까요?)그럼 만약 A 논리 트랜잭션이 커밋이 되고 난 후 B 논리 트랜잭션이 롤백이 된다면 B 논리 트랜잭션이 참여는 했었지만 물리 트랜잭션을 시작한 A 논리 트랜잭션이 먼저 커밋이 되면 B의 롤백은 참여하고 있던 물리 트랜잭션에 영향을 줄 수 없을까요??(이 경우 앞에 다른 물리 트랜잭션을 시작하는걸 만들어 두개의 논리 트랜잭션을 이어 붙여서 트랜잭션 전파를 사용하는게 가장 좋다고 생각하지만 혹시나 하는 마음에 질문을 하게 되었습니다.)제가 테스트 해본 결과는 영향을 줄 수 없는데 혹시 제가 잘못된 방법으로 테스트를 한건지 제대로 테스트를 한건지 아니면 제가 잘못 이해한 내용이 있는건지 궁금해서 질문글을 작성하게 되었습니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
커넥션 풀 관련 질문 드립니다.
안녕하세요 항상 강의 잘 듣고 있습니다. 커넥션풀을 기본으로 사용해야된다고 이해를 했는데hikaricp 의 경우 기본이 10개입니다.그런데 tomcat thread 의 경우 기본이 200개던데요청이 많이 오는 경우 둘다 기본으로 사용하면 thread pool에 비해 thread가 너무 많이 생성이 돼서 서비스 운영시 문제가 될거 같은데실 서비스에서 저렇게 기본 값으로 많이 사용하는지 궁금합니다!