카프라 활용 1~2를 보면서 궁금한 점이 생겼는데 DB서 insert 가 발생했을 때는 @KafkaListener 를 통해 생성된 데이터를 받을 수 있는데 update나 delete 가 발생했을 때는 @KafkaListener로 받을 수 없더라고요? DB에서 update또는 delete문이 발생했을 때의 이벤트도 받으려면 어떻게 해야할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 혹시 강의 전체 소스코드는 어디에 있나요? 강의 자료에는 해당 강의에서 수정한 내용이나 추가한 내용만 있는데, 그거말고 전체 소스 코드를 받을 수 있나요? 강의를 보며 따라 치다보니 에러가 났는데 도저히 못찾겠습니다ㅠㅠ
service에서 repository를 주입받을 때, repository는 메소드 실행 전 new로 새로 만들기 때문에 테스트케이스의 메소드는 전부 다른 인스턴스를 주입받는 것 아닌가요? 아래 비슷한 질문에서 repository의 변수는 static이기 때문에 동일한 타입의 인스턴스가 전체 공유하고 있다고 답변 달아주신걸 확인했습니다. 이부분은 repository를 주입받는 방식이 아니라 service에 선언했을때도 동일한데 그럼 DI방식으로 분리하기 전후 차이점이 무엇인가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강의따라갈려니까 관련해서 오류가 계속 발생하고 extends가 안되는데 어떻게 해야하는지 추가글이나 방법을 알려주세요.
typo나 폴더 위치를 잘못 설정해서 localhost:8080/hello 가 실행되지 않는 줄 알았는데, 몇 번을 재검토 해봐도 다 맞게 쓴 것 같아서 어디가 잘못 되었는지 궁금해서 질문드립니다. 환경설정밖에 안 하기는 했지만 입문강의임에도 내용이 잘 이해가 안 되는데 듣다보면 괜찮아질까요..?
1. 엔티티 설계시 주의점 10분6초에서 fetch=FetchType.LAZY 을 fetch=LAZY 로 변경하시는데요. 강의 아래화면에서 방향을 보니까 alt +endter를 누르시는데 저는 오른쪽 화면 처럼 나옵니다. 어떻게 해야하나요? 24분 40초에 나오는 setMember(Member member) 부분 코드 설명이 아래처럼 이해해도 되나요? public void setMember(Member member){ // 현재 Order 객체의 member 필드에 매개변수로 받은 Member 객체를 할당합니다. this.member = member; // Member 객체의 getOrders 메서드를 호출해 주문 목록을 가져온 뒤, 현재 Order 객체(this)를 그 목록에 추가합니다. // 이는 Member 객체 내부의 주문 목록에도 현재 Order 객체가 포함되도록 하는 역방향 연결을 설정합니다. member.getOrders().add(this); } 3.getOrders()는 메소드로 정의된게 없는데 왜 빨간줄이 안뜨나요? 강의에서 setter 기능은 쓰지 말라고 하셨는데 setMember와 setter 는 다른 기능인가요? setMember 이 부분을 쓰는 이유가 아래 동그라미 표시가 있기 때문인가요?
[질문 내용] 안녕하세요 현재 H2 테이블을 이 생성되지 않고 있습니다. 관련 질문들을 찾아봐서 update에서 create로 바꿔봐도 안되고 있느데 문제를 모르겠습니다. SprongBoot Applicaton에 @EnitityScan을 하여도 생성아 안되고 있습니다. spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug org.hibernate.type: trace 이렇게 DB도 생성이 되었고 커넥션도 문제가 없습니다. @SpringBootApplication @EntityScan(basePackages = "jpabook.jpashop.domain") public class JpashopApplication { public static void main(String[] args) { SpringApplication.run(JpashopApplication.class, args); } } 위에서 말한 것처럼 EnitityScan을 하였는데도 테이블이 생성이 안되어서 진행을 못하고 있습니다. 문제가 어디에 있는것 일까요? 파일 디렉토리 구조는 다음과 같습니다. 추신: 현재 로그를 보니 H2가 임베디드로 실행되는거같은데 Gradle에도 runtimeOnly라고 잘 적어놨습니다. 이유를 도저히 모르겠습니다. 2024-03-12T20:56:51.434+09:00 INFO 5352 --- [ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:6f48c70e-23df-4595-9e73-2ad1be4993e1' 아래는 제 Gradle 코드입니다. plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } group = 'jpashop' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' } test { useJUnitPlatform() } 도움을 주신 다면 감사하겠습니다.
엔티티가 member, A,B,C 가 있습니다. 엔티티 사이의 연관관계는 member, A : 일대다 양뱡향 A,B : 일대다 양뱡향 B,C : 일대다 양방향 관계입니다. 이때 C 에 대한 조회를 하는데 있어서 memberId 도 같이 응답을 해줘야합니다. 이런 경우 어떻게 처리하는게 좋을지에 대한 질문이 생겼습니다. memberId = C.getB().getA().getMember().getId() 이렇게 계속 호출을 해서 가져오는 방법은 성능상 안좋을 것 같아 실무에서는 어떻게 하시는지 궁금합니다. 애초에 DB 설계가 안좋은건가요?
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } 강의 자료에서 나온 대로 JUnit4로 테스트 진행하기 위해서 위와 같이 종속성 추가했음에도 불구하고 테스트를 진행하면 JUnit5로 실행이 됩니다. 이유가 뭔가요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. JUnit5 로 진행하고 강의에서 내용 그대로 작성을 하였는데, insert 쿼리문이 발생했습니다.. 8:54 초 내용에서 @Transactional 어노테이션을 붙이면 자동으로 롤백해버리기 때문에 DB에 insert를 날릴 이유가 없다고 하셧는데.. 왜이러는걸까요..ㅠㅠ h2 데이터베이스를 사용한 것이 아닌 mysql 데이터베이스를 연결하였지만 그거 말고 다른 설정들은 다 동일하거든요
MemberRepository는 jpaRepository인 상태이고, findById관련해서 동시성 테스트를 하고 있는데, 해당 테스트가 통과를 하지 않아 그 이유가 궁금합니다. 단순하게 여러 스레드에서 findById하는 테스트 코드인데 왜 통과를 못하는지 잘 이해가 가지 않습니다. @SpringBootTest @Transactional public class Test{ @Autowired MemberRepository memberRepository; Member member; @BeforeEach void setUp() { member = Member.builder().name("testMember").build(); memberRepository.save(member); } @Test public void test() throws Exception { int threadCount = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); CountDownLatch latch = new CountDownLatch(threadCount); AtomicInteger failCount = new AtomicInteger(); AtomicInteger successCount = new AtomicInteger(); for (int i = 0; i < threadCount; i++) { executorService.submit( () -> { try { memberRepository.findById(member.getId()).get(); successCount.addAndGet(1); } catch (Exception e) { System.out.println(e.getMessage()); failCount.addAndGet(1); }finally { latch.countDown(); } } ); } latch.await(); assertThat(successCount.get()).isEqualTo(threadCount); assertThat(failCount.get()).isEqualTo(0); } }
jpa 트랜잭션 락 기능중에 낙관적 락과 비관적 락이 있는데 실제로 이 락을 실무에서도 많이 사용하는지 궁금합니다. 인터넷 예시로 게시글 조회수 카운트나 좋아요 카운트 관리 할 때 많이 사용한다고 하는데 조회수나 좋아요 카운트는 카운트가 실시간으로 정확히 맞을 필요는 없는데 굳이 락을 이용해서 관리를 해야만 하는지 의문점이 들기도 합니다. 실제로 실무에서 많이 사용한다면, 좀 더 실무에 와 닿을 수 있는 케이스를 알려주시면 감사하겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 왼쪽에 실행하기 버튼이 안 뜹니다..ㅠㅠ 오른쪽 위 실행버튼을 누르면 전에 실행했던 것들이 실행되어서 의미가 없어요..
스프링 JdbcTemplate강의까지 듣는 동안 스프링 부트가 잘 켜졌는데 갑자기 Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-03-11T23:11:12.707+09:00 ERROR 3024 --- [ main] o.s.boot.SpringApplication : Application run failed 이러한 오류가 뜨면서 부트가 실행되었다가 죽어버립니다... run/edit Configurations까지 들어가봤는데 spring boot 옵션도 안보이고... 이상하네요 ㅠㅠ
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon Mar 11 22:58:47 KST 2024 There was an unexpected error (type=Internal Server Error, status=500). 이런 오류가 뜨는데 전날은 인텔리제이에서 실행시키면 hello를 눌렀을 때 매핑을 통해서 hello페이지로 잘 이동했었고 cmd를 사용했을 때만 저 오류가 떴는데 오늘 다시 실행해보니 인텔리제이 내부에서 실행시켜도 저 오류가 뜹니다. build.gradle인데 여기가 문제였을까요? plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') }