월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트에서 @Slf4j 를 따로 선언하는 이유가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 테스트 클래스에 @Slf4j를 붙이고 그 아래 static 클래스에도 붙이셔서 그 이유가 궁금합니다.테스트 클래스에만 선언하면 되지않나? 라는 생각이 들어서 static 클래스에 있는 @Slf4j를 지워 보고 했는데 로그는 잘 나오더라구요.혼자 찾아보려 했는데 잘 안돼서 질문남깁니다 ㅠ
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 데이터 jpa
스프링 데이터 jpa 사용 시에 삭제하는 기능을 구현하면findById로 삭제할 엔티티를 찾은 다음에 delete하는 것그냥 바로 삭제할 id를 가지고 native쿼리 1번은 두번 db를 들락거리고2번은 한번 db를 들락거리는데2번이 좋은것 아닌가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper Bean
[질문 내용]MyBatisConfig 에서 private final ItemMapper itemMapper; 이 부분이 bean을 찾을 수 없다고 하는데 테스트는 정상적으로 동작하는 이유가 궁금합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper Bean을 찾을 수 없습니다.
1. MyBatisConfig 클래스에서 ItemMapper 빈을 찾을수 없습니다. IDE 에러일줄 알았는데 Application을 실행해보면 에러가 뜨네요.2.현재 ItemServiceApplication의 빈 탐색범위가 hello.itemservice.web으로 되어있는데 그렇다면은 Controller 빈만 주입받고, Service, Repository등의 클래스는 전부 Configuration 어노테이션 이용해서 주입받는건가요? 만약에 맞다면 실제로 ItemMapper는 어디서 주입받는거에요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 AOP주의사항 - 해결방법 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]영한님께서 이번 강의에서 트랜잭션 프록시 객체에서 외부메서드를 호출하고, 진짜 객체의 외부 메서드에서 자기 자신의 내부 메서드를 호출할 때 내부 메서드에는 @Transactional을 설정해도 트랜잭션이 적용되지 않는 점 이해 했습니다. 강의에서 이 부분을 해결하기 위해 별도의 클래스를 만들고, Bean으로 주입(이 경우 프록시객체가 Bean으로 등록)해서 프록시 객체가 @Transactional 메서드를 호출하는 방식으로 해결하는 점도 이해했습니다. 스프링 MVC강의에서 빈 스코프 문제(프로토타입과 싱글톤 Bean을 같이 사용할 때 문제점)을 해결하기 위해 Dependency Lookup을 사용하신 방법이 떠올라 V3테스트코드를 작성해보았습니다. @Slf4j @SpringBootTest public class InternalCallV3Test { @Autowired CallServie callServie; @Test void printProxy() { log.info("callService class={}", callServie.getClass()); } @Test void internalCall() { callServie.internal(); } @Test void externalCall() { callServie.external(); } @TestConfiguration static class InternalCallV1TestConfig { @Bean CallServie callServie() { return new CallServie(); } } @Slf4j static class CallServie { @Autowired private ObjectProvider<CallServie> selfProvider; public void external() { log.info("call external"); printTxInfo(); CallServie self = selfProvider.getObject(); log.info("self class={}", self.getClass()); self.internal(); } @Transactional public void internal() { log.info("call internal"); printTxInfo(); } private void printTxInfo() { boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active={}", txActive); boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly(); log.info("tx readOnly={}", readOnly); } } } 실행 결과는 다음과 같습니다.DL을 이용해서 스프링 컨테이너에서 프록시를 가져와서, 프록시의 메서드를 호출하면 트랜잭션이 적용되는 것 처럼 보입니다. 질문1) 이 방법으로 트랜잭션이 적용되는게 맞을까요?2) 이 방법을 혹시 스프링-고급편에서 다루나요?3) 1번 질문이 맞다면 클래스를 새로 만들고, 메서드를 옮기는 비용보다 DL로 프록시객체를 찾아오는 비용이 더 쌀 것 같은데, 둘 중 어느 방법이 선호되는 편인가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
도메인 모델을 나눌 때 중간테이블
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]현재 다니고 있는 회사에서는 Pojo 모델과 Entity 모델을 나누어서 관리하고 있습니다. 이 때, M:N 테이블을 나누어 주는 중간 테이블은 POJO 모델을 만들지 않고 infrastructure 레이어에 위치시키고 도메인 레이어에는 노출시키지 않으려고 하고 있는데요, 이 때 해당 중간 테이블을 구분되는 두 도메인중 어느쪽에 위치시켜야할지 고민이 되어 질문을 남깁니다.보통 이러한 중간 테이블에 대응하는 Entity는 어느 패키지에 두는지 기준이 궁금합니다.추후 데이터베이스를 나누었을 때 이러한 중간 테이블을 어디에 위치 시켜야할지 아니면 서로 다른 데이터베이스에 중간테이블을 중복 저장 시켜야할지 궁금합니다.양 쪽 모두에서 간간히 조회에 활용 됩니다. 위 방법 자체에 문제가 있다고 느끼신다면 어떤 대안이 있을지 남겨주시면 감사하겠습니다. 감사합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
JPA를 이용해서 springboot 시작 이후 Datasource설정
안녕하세요 강의 너무 잘 듣고 있습니다.개인 프로젝트를 하고 싶어서 궁금한게 생겼는데요위에 사진처럼 Datasource를 application.properties에 설정한 값 말고 트랜잭션 시작하기 전에 새로 데이터베이스 커넥션을 만들어서 처리해주고 싶습니다.jpa를 이용하고 싶은데 .properties말고 트랜잭션 시작전에 커넥션을 만들어서 JPA를 이용하려면 어떻게 해야될지 잘 모르겠습니다.autoconfiguration에서 "spring.datasource"로 들어오는 properties 설정값이나JpaBaseConfiguration으로 설정된 값을 트랜잭션 시작전에 connection을 새로 설정해서 처리할 수 있는지도 궁금합니다.
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
실무에서의 test DB 구성 방식이 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]기존 질문 답변을 모두 읽어 보았지만, 실무에서의 테스트 db 세팅 방법의 정확한 방향이 잡히지 않아 질문드립니다.테스트 db 환경을 로컬로도 구축하신다는 의미가 예를 들어 mysql을 사용하는 경우 로컬 mysql db에 실운영 mysql db 스키마를 등록하고 이를 test db로 사용하신다는 의미로 이해해도 될까요??h2 임베디드 db 만을 신뢰하여 통합테스트와 같은 테스트를 실행하기에는 test의 신뢰도가 떨어진다는 내용들을 봐서 실제 사용하는 db를 쓰는 것이 맞을 것 같기는 한데 위와 같은 방식으로 하면 배보다 배꼽이 더 커질 것 같아 걱정입니다.배민과 같은 좋은 기준을 가진 회사의 방식이 궁금하고 이를 적용하고 싶은데 답변만으로 어려우시다면 추후 테스트 코드 강의에 이를 반영하여 주시길 바라는 마음에서도 질문 남겨봅니다.(테스트 코드 강의 나오면 바로 구매할께요!)
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
jpa 연관관계 질문
안녕하세요. 현재 저는 jpa를 공부하면서 회원 -> 게시글 -> 댓글을 구현하고 있습니다. 강의를 보고 대략적으로 게시글@many to one (lazy)Member member@one to manyList<Comment> comments = new array 로 구현하였는데 em.find(게시글, id)을 하면member는 다 모든 필드가 다 null인 객체가 들어오고comments는 PersistentBag 객체로 되어 있고 내부에 comment들이 다 들어옵니다. (디버거로 확인하였습니다.) 쿼리를 보니select * from 게시글 where id = idselect * from 댓글 where 게시글id = 게시글id이렇게 두개가 나가더라구요.... 왜 하나는 자동쿼리가 나가고 하나는 안나갈까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 내부호출
강의에서는 트랜잭션 내부호출을 해결하기 위해 클래스를 분리하여 외부에서 호출하는 방식으로 하셨는데 내부 호출을 하는 메소드에 @Transactional말고 호출을 하는 쪽에서 @Transactional을 설정하는 것은 어떻게 생각하시나요?정밀하게 트랜잭션이 적용되는 곳만 설정하는게 더 나은 방법일까요?
- 미해결스프링 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의존관계를 주입하는 이유가 뭔가요?