묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
member.getTeam()과 team.getMember()에 대해 질문드립니다.
안녕하세요. member.getTeam()과 team.getMember()의 동작원리에 대해 이해가 되지않는 부분이 있어서, 구글링을 통해 아래와 같이 정리해보았는데 이렇게 이해하는게 맞을까요? member.getTeam()member.getTeam()을 호출하면, JPA는 내부적으로 MEMBER테이블에서 현재 member의 JoinColumn으로 명시했던 TEAM_ID값(=외래키값)을 가져와서 TEAM테이블의 기본키를 참조하여 해당 Team 데이터를 조회하고, Team 객체를 생성해서 반환한다.1. member.getTeam()이 호출되면 내부적으로 MEMBER테이블에서 현재 member의 JoinColumn으로 명시했던 TEAM_ID값(=외래키값)을 가져온다.2. Team테이블의 기본키가 이 외래키와 일치하는 Team 데이터를 찾는 SQL쿼리를 실행한다.3. 조회된 데이터로 Team객체를 생성해서 반환한다. team.getMember()team.getMember()를 호출하면, JPA는 내부적으로 TEAM테이블에서 현재 team의 기본키값을 가져와서 MEMBER테이블의 외래키를 참조하여 해당 Member 데이터를 조회하고, Member객체를 생성해서 기존 비어있는 리스트에 추가한다.1. team.getMember()가 호출되면 내부적으로 TEAM테이블에서 현재 team의 기본키값을 가져온다.2. Member테이블의 외래키인 TEAM_ID가 이 기본키와 일치하는 Member 데이터를 찾는 SQL쿼리를 실행한다.ex) SELECT * FROM MEMBER WHERE TEAM_ID = 1;3. 조회된 데이터로 Member객체를 생성해서 기존 비어있는 리스트에 추가한다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
멀티 스레드 트랜잭션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 영한님 강의를 보고 사이드 프로젝트를 하며성장 하고 있습니다.관련된 내용을 찾아 보다가 인사이트를 얻기 어려워조언을 얻고자 질문을 남깁니다. 테스트에 트랜잭션이 걸려있고, ExecutorService submit을 통해 단순히 데이터를 저장 할때 PessimisticLockingFailureException예외가 발생 합니다.테스트 트랜잭션이 락을 가지고 있고 커밋 되지 않아서 문제가 발생 한다고 하는데멀티 스레드는 트랜잭션 전파와 연관이 없기 때문에별도의 물리 트랜잭션이라고 생각 하고 있습니다.하지만 왜 이런 예외가 발생 하는지 모르겠습니다 ㅠㅠ힌트라도 알려 주시면 감사합니다@Transactional @DisplayName("멀티 스레드에서 모임을 저장 한다.") @Test void saveEventWhenMultiThread() throws InterruptedException { //given ExecutorService executorService = Executors.newFixedThreadPool(2); int taskCount = 3; CountDownLatch countDownLatch = new CountDownLatch(taskCount); //when //then for(int i = 0; i < taskCount; i++) { int testNum = i; executorService.execute(() -> { try { eventRepository.save(createEvent("멀티 테스트" + testNum , "테스트 모임", 30)); } finally { countDownLatch.countDown(); } }); } countDownLatch.await(); executorService.shutdown(); } Exception in thread "pool-2-thread-2" Exception in thread "pool-2-thread-1" org.springframework.dao.PessimisticLockingFailureException:
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
logout 후에 login 페이지 이동은 어디서 시켜주는건가요?
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.location.href = /api/logout 를 통해스프링 시큐리티로 logout 보내고 세션 삭제한 뒤 브라우저를 보면 login?logout이 찍힌걸 확인 할 수 있는데login으로 어디서 보내준건지 헷갈립니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
조회 시 Entity를 뿌리는 것 아닌가요 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]view 계층과 주고 받을 때는 dto로 주고 받아야 하니 들어올 때 form을 사용했는데, 지금처럼 em.createQuery("select i from Item i", Item.class).getResultList(); 이런 repo 코드를 정제없이 그대로 return 해주는 경우 Entity를 직접 전달하고 있는 것 아닌가요 ??잘못 이해하고 있는 부분에 대해 짚어주시면 감사하겠습니다.만약 잘 이해하고 있고, 예제라서 이렇게 처리한 것이라면, 정제하는 과정이 서비스 단에서 일어나는게 좋을까요 ? 컨트롤러 단에서 일어나는게 좋을까요 ?
-
미해결실전! Querydsl
Querydsl Fetchjoin 해서 이미 조회한 엔티티를 Spring Data JPA findBy 다시 하면 영속성 컨텍스트에서 가져오지 않고 쿼리가 실행되는 문제
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님 안녕하세요.프로젝트를 진행하다가 Querydsl의 fetcjoin을 쓰고, 로직 처리를 위해 엔티티를 따로 조회하기 위해 다음과 같이 코드를 짰는데, 중간에 for 문으로 c.getUser()했을 떄는 fetcjoin이 제대로 되어서 쿼리가 발생하지 않고, userId가 1인 UserEntity가 잘 조회됩니다.그런데 이미 userId가 1인 user 엔티티가 조회 됐음에도 불구하고 맨 아래의 userId가 1인 User findBy를 사용하여 조회하면 select UserEntity where userId=1 인 한 번 더 쿼리가 발생합니다.원래 fetcjoin는 엔티티.get연관엔티티() 에서만 작동을 하는 걸까요?for 문 돌면서 id 체크하고 c.getUser()로 재사용하기에는 비효율적일 것 같은데 지금과 같은 상황에서는 어떤 식으로 쿼리가 한 번더 발생하지 않으면서 동일한 이미 fetcjoin으로 가져온 엔티티를 사용할 수 있는 좋은 방법이 있는지 궁금합니다.fetcjoin 한 getPopUpStoreComments querydsl 코드는 위와 같습니다. 감사합니다.
-
미해결코드로 배우는 React with 스프링부트 API서버
npx tailwindcss init 가 안되네요.
강의대로 npx tailwindcss init 을 하게되면 'tailwind'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. 라고 뜨네요. 어떻게 해결 방법이 없을까요?vscode 재시작해봐도 똑같네요.구글링 해보니, 환경변수에 nodejs 경로를 path에 추가하라고 하는데, 이미 추가되어있구요.아, node버전이 기존에 18버전이 설치되어 있어서 그건 새로 설치하지는 않았습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
동시성 테스트와 데이터 초기화
안녕하세요 선생님 배운 테스트 강의를 통해 사이드 프로젝트를 하며 성장 중입니다.동시성 테스트를 하던 중 문제가 발생 하였고 해결은 하였으나 다른 방법이 있는지 조언을 구하고자질문을 남기게 되었습니다. 먼저 엔티티에 대한 설명을 드리겠습니다.모임과 모임 참여 테이블이 1 : N모임 참여 회원 테이블이 N : 1 입니다.모임은 최대 인원인 capacity를 가지고 있습니다.여러 회원이 모임에 동시 참여 했을때 인원수를 제한 되는지 보기 위한 테스트 입니다.동시성 문제를 막기 위해 비관적락을 모임을 조회 할때 사용 하였습니다. DB는 MYSQL을 사용 하였습니다.트랜잭션의 격리 수준은 기본인 REPEATABLE READ 을 사용 하였습니다.테스트 트랜잭션에서 모임을 저장 하고 비동기 작업의 다른 스레드에서 모임 조회를 시도 할 경우테스트의 모임 저장은 커밋되지 않은 트랜잭션으로 조회가 불가능한 문제가 있었습니다.문제 해결 방안으로는테스트 트랜잭션 어노테이션 제거비동기 작업 스레드를 통한 트랜잭션 커밋으로 이후 트랜잭션이 모임을 조회 하는 방법테스트의 일관성을 위해 2번 방법을 선택 하였습니다.모임과 회원을 저장하는 부분을 비동기 작업 스레드를 통해 커밋 하고이후 스레드의 트랜잭션으로 조회 하여 데이터를 읽을수 있도록 하였습니다. 테스트는 정상적으로 통과 되었지만 문제가 발생 했습니다.스레드 작업의 트랜잭션 커밋으로 다른 테스트에 영향이 가는 문제 입니다. 원인은 테스트 트랜잭션이 전파 되지 않음에 따라 스레드 작업이 롤백 되지 않았습니다.@Test void not_executors_Tx() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("outer.isNewTransaction={}", outer.isNewTransaction()); log.info("내부 트랜잭션 시작"); TransactionStatus inner = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("inner.isNewTransaction={}", inner.isNewTransaction()); } 결과 : outer.isNewTransaction = true / inner.isNewTransaction = true @Test void executors_Tx() { //given log.info("외부 트랜 잭션 시작"); ExecutorService executorService = Executors.newFixedThreadPool(5); TransactionStatus outer = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("outer.isNewTransaction() = {}", outer.isNewTransaction()); log.info("내부 트랜 잭션 시작"); executorService.submit(() -> { TransactionStatus inner = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("inner.isNewTransaction() = {}", inner.isNewTransaction()); }); executorService.shutdown(); } 결과 : outer.isNewTransaction = true / inner.isNewTransaction = false 커밋한 스레드의 결과로 인해 전체 테스트에 영향이 가게 되었습니다.밑의 페이징 정보 조회 테스트를 실행 하기 전에 모임 전체 조회를 해보니 테스터 라는스레드 작업에서 저장한 모임이 조회 되었습니다. 어떻게 하면 커밋된 데이터들이 다른 테스트에 영향을 주지 않을까?를 고민 하였고생각한 해결 방안은 @AfterEach를 사용 하자 였습니다.하지만 해결 되지 않았습니다. 다른 테스트 에선 여전히 커밋된 테스터 모임이 발견 되었습니다.이 부분은 왜 delete가 되지 않았는지 모르겠습니다.추측 하기로는 REPEATABLE READ 격리 수준에서 자신이 트랜잭션을 시작 하였을때 데이터만조회 하고 삭제 할수 있기 때문에 테스트 트랜잭션 에서는 스레드가 추가한데이터를 조회, 삭제가 불가능 해서 발생한 문제 이지 않을까 하는 추측 입니다. 그레서 모든 테스트에 @BeforeEach를 사용 하여 테스트 시작전에데이터를 모두 지우고 테스트 하니 통과 하였습니다. 선생님께 드리고 싶은 질문은 이렇게 해결 한것이 최선인지 궁금합니다.멀티 스레드는 테스트 할때 어떻게 동작 할지 모르기 때문에트랜잭션 어노테이션을 제거 하는 방법이 더 나을까요? @AfterEach void cleanUp() { userEventRepository.deleteAllInBatch(); bookmarkRepository.deleteAllInBatch(); eventRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); } @DisplayName("페이징 정보를 받아 모임을 조회 합니다.") @Test void getPagingEvents() { //given for (int i = 0; i < 10; i++) { Event event = createEvent("테스터" + i, "자전거 모임"); eventRepository.save(event); } Pageable pageable = PageRequest.of(1, 3); //when Slice<EventPreviewResponseDto> slice = eventService.getPagingEvents(pageable); //then assertThat(slice.getContent()) .extracting("author") .containsExactlyInAnyOrder("테스터3", "테스터4", "테스터5"); } @DisplayName("5명의 회원이 동시에 최대 인원이 3명인 모임에 참가 할때 3명만 참여 할 수 있다.") @Test void joinEventWhenParticipateAtTheSameTimeWithConcurrency() throws Exception { //given int taskCount = 5; ExecutorService executorService = Executors.newFixedThreadPool(5); CountDownLatch countDownLatch = new CountDownLatch(taskCount); Event findEvent = executorService.submit(() -> eventRepository.save(createEvent("테스터", "테스트 모임", 3))).get(); List<User> users = executorService.submit(() -> Stream .generate(() -> { User user = createUser("테스터", "testEmail"); userRepository.save(user); return user; }) .limit(taskCount) .toList()).get(); //when AtomicInteger exceptionCount = new AtomicInteger(0); for (User user : users) { executorService.submit(() -> { try { eventService.joinEvent(findEvent.getId(), user.getId()); eventRepository.flush(); // 엔티티 상태를 DB에 강제로 반영 } catch (BusinessException ex) { exceptionCount.incrementAndGet(); } finally { countDownLatch.countDown(); // 카운트다운 } }); } countDownLatch.await(); Long participateCount = executorService.submit( () -> userEventRepository.countParticipantByEventId(findEvent.getId())).get(); executorService.shutdown(); //then assertThat(participateCount).isEqualTo(3); assertThat(exceptionCount.get()).isEqualTo(2); }
-
미해결코드로 배우는 React with 스프링부트 API서버
outlet을 이용한 서브메뉴 강의에서 질문있습니다.
outlet을 이용한 서브메뉴에서 질문있습니다.main <-이 부분이 부모페이지고list add <-서브페이지면list page component<-자손페이지 인가요?강의에서 IndexPage.js에서 <Outlet/> 부분에 ListPage.js 코드가 들어가 있는 형태인거 같은데요.근데 제가 아래처럼 작동해봤을 떄 Todo List Page Component 이 부분이 안나오는데요.코드 어디가 문제인가요? 코드 복붙했는데요.아래는 IndexPage.js 코드입니다.import { Outlet } from "react-router-dom";import BasicLayout from "../../layouts/BasicLayout";const IndexPage = () => {return (<BasicLayout><div className="w-full flex m-2 p-2 "><div className="text-xl m-1 p-2 w-20 font-extrabold text-center underline">LIST</div> <div className="text-xl m-1 p-2 w-20 font-extrabold text-center underline">ADD</div></div><div className="flex flex-wrap w-full"><Outlet/></div></BasicLayout>);}export default IndexPage;아래는 ListPage.js 코드입니다.import React from 'react'export default function ListPage() {return (<div className="p-4 w-full bg-orange-200 "><div className="text-3xl font-extrabold">Todo List Page Component</div></div>)}
-
미해결Practical Testing: 실용적인 테스트 가이드
동시성 문제 테스트 관련해서 질문드립니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 개인 프로젝트를 진행하다 궁금한 점이 있어 질문드립니다.현재, 서로 다른 두 트랜잭션이 동시에 실행될 때 발생할 수 있는 동시성 문제를 해결하기 위해 락을 적용해두었습니다. 테스트 코드에서는 락이 없는 경우에는 문제 상황이 발생하고, 락 적용 시에는 정상 작동함을 보여주고자 합니다.인터넷에서 관련 자료를 찾아본 결과, Executor와 CountDownLatch를 활용하여 동시성 문제를 테스트하는 방식을 많이 사용하길래, 저도 이를 적용해 테스트를 구성하려 하고 있습니다. 멀티스레딩 환경에서는 실행 순서가 보장되지 않으므로, 운이 나쁘면 두 트랜잭션이 순차적으로 실행될 수도 있다고 생각했고 실행 순서를 제어하여 문제가 발생할 수 있는 상황을 코드로 만들어야 한다고 생각했습니다.그러나 Executor와 CountDownLatch만으로는 트랜잭션 단위로 묶인 작업들의 실행 순서를 제어하기 어려워, 원하는 동시성 문제 시나리오를 재현하는 데 한계가 있었습니다. wait, notify 등의 스레드 제어 메서드를 활용하면 원하는 실행 순서를 만들 수 있을 것 같지만, 이것이 최선의 방법인지 고민이 되어 질문드립니다. 선생님께서는 동시성 문제 테스트를 진행할 때, 실행 순서를 제어하여 문제가 발생하는 시나리오를 인위적으로 만들고 이런 상황에서도 정상 작동함을 확인하시나요? 아니라면 동시성 문제를 테스트할 때 어떤 방법을 사용하시는지 궁금합니다
-
미해결코드로 배우는 React with 스프링부트 API서버
자꾸만 이런식으로 에러가나는데 이유점 알려주세요 ㅠㅠㅠ
살려주세요 선생님..ㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
java -jar jpashop-0.0.1-SNAPSHOT.jar 예외발생
20분 47초경에서 정체중입니다.위와같은 오류가 계속 발생중입니다.위는 project structure입니다인텔리제이에서 그냥실행했을떄는 잘 작동합니다.
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
로그인 후 Token 발행 시 postman 에러메시지
안녕하세요. 본 수강 열심히 잘 듣고있습니다~ 감사합니다.제가 Postman으로 로그인하고나서 Token을 발행할 시에 postman에 테스트해본 결과 결과코드는 SUCCESS라고 나오고 data에도 Bearer에 토큰이 들어간것을 확인하였습니다. 그러나 메시지에는 정상완료가 아닌 에러가 발생했다고 해서 제가 아무리 코드를 확인하였지만 어디부분에서 잘못된건지 확인이 힘들었습니다. 사실은 선생님께서 보내주신 파일을 업로드안하고 강의보면서 제가 직접 코드를 타이핑쳤었는데 손코딩을해서 그런지 오타가 있을 것으로 사료됩니다. 불가피하게 파일을 덮어씌우는게 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v4에서 DTO 전용 리포지토리를 만들 때 유지보수 비용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]package jpabook.jpashop.repository.order.simplequery; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository @RequiredArgsConstructor public class OrderSimpleQueryRepository { private final EntityManager em; public List<OrderSimpleQueryDto> findOrderDtos() { return em.createQuery( "select new jpabook.jpashop.repository.order.simplequery.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" + " from Order o" + " join o.member m" + " join o.delivery d", OrderSimpleQueryDto.class) .getResultList(); } } 이 코드 같은 경우 유지보수가 더 좋아졌다고 할 수 있나요?만약, 다른 도메인 계층에 있는 엔티티가 수정될 경우 오히려 이 부분도 수정해야 하기 때문에 전체적으로 유지보수 비용이 증가한다고도 볼 수 있지 않나요? 원래처럼 일반 리포지토리에 두었을 때 API에 핏하게 설계했기 때문에 API 스펙이 변경될 경우 리포지토리를 수정해야하는 거랑 따로 DTO 전용 리포지토리를 만들었을 때 다른 도메인 계층의 엔티티가 수정되었을 때 이 부분 코드를 수정하는 거랑 유지보수 비용이 어느게 더 적은 지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest를 junit5용으로 고쳤는데 오류가발생합니다 + junit4를 사용해야만 할까요?
https://drive.google.com/file/d/1PBHzDQJ0Odvh2KWMa_BTOu3PZqHrMJkj/view?usp=drive_linkMemberRepositoryTest를 실행하면 이렇게 됩니다. junit5로 하고 있는데 이런식으로 오류가 발생합니다. JPA와 DB 설정, 동작확인 13분경까지 들었습니다. JpashopApplication를 실행해도 오류가 발생하기 시작했습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션 대안
아래와 같이 엔티티를 만들고, 여기에서 값 타입을 사용하는 것은 임베디드 타입을 사용하는 것과 어떤 차이가 있나요?@Embedded라는 애노테이션을 붙이지 않아서 질문드립니다. 똑같이 엔티티에서 Address 객체를 필드로 갖는데 무슨 차이인가 해서요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest junit5로 고친후 오류발생 + junit4를 사용해야만 할까요?
junt4로 gradle에서 설정하려고 하면 오류가 발생해서 juit5로 하는 중입니다. MemberRepositoryTest를junit5버전으로 고쳐서 아래의 코드로 실행했는데 오류가 나고 있습니다import jpabook.jpashop.Member; import jpabook.jpashop.MemberRepository; //import jpabook.jpashop.domain.Member; //import jpabook.jpashop.repository.MemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; @ExtendWith(SpringExtension.class) // JUnit 5 방식 @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); // JPA 엔티티 동일성 보장 } }밑에는 오류입니다.Unable to find a @SpringBootConfiguration by searching packages upwards from the test. You can use @ContextConfiguration, @SpringBootTest(classes=...) or other Spring Test supported mechanisms to explicitly declare the configuration classes to load. Classes annotated with @TestConfiguration are not considered.java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration by searching packages upwards from the test. You can use @ContextConfiguration, @SpringBootTest(classes=...) or other Spring Test supported mechanisms to explicitly declare the configuration classes to load. Classes annotated with @TestConfiguration are not considered.at org.springframework.util.Assert.state(Assert.java:79)1. @SpringBootTest(classes=...)로 명시적으로 설정 클래스 지정2. @SpringBootApplication이 있는 클래스의 위치 확인3. @ContextConfiguration을 사용해서 명시적으로 설정 클래스 지정이세가지를 시도해도 안되고 있습니다. 아니면 juni4룰 사용해야만 할까요?build.gradle에 JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" }를 하면 Build file 'C:\Users\Peter\Desktop\study\jpashop\build.gradle' line: 45A problem occurred evaluating root project 'jpashop'.> Could not find method testImplementation() for arguments [org.junit.vintage:junit-vintage-engine, build_55eer8btj8rd1l6xp0yqapa0y$_run_closure6@6e20627f] on root project 'jpashop' of type org.gradle.api.Project.라고 나옵니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 매핑에서 보여주는 테이블 연관관계의 관계선표기가 제대로 되어있는건가요 ?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? [질문 내용]PPT 양방향 매핑에서 테이블연관관계를 나타낼때TEAM의 PK가 MEMBER의 FK 로 존재한다면실선이 아닌 점선으로 표현되어야 하는 것 아닌가요 ?MEMBER의 경우 TEAM_ID가 PK가 아니니까 null을 허용할 수 있으니 팀이 없는 경우가 존재할 테니까 멤버가 팀을 가지고 있는 것은 선택적인 관계로 점선으로 표현해야하는 것이 아닌가 싶습니다
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
강의와 살짝 무관하지만.. MQ에 대한 질문이 있습니다!
RabbitMQ도 충분히 강력한 기능을 제공하는 것으로 보입니다.근데 이제 한번 소비한 메시지는 소비하면서 어딘가에 또 저장하지 않는 이상 재시도가 어려운것으로 알고있습니다.현업에서 RabbitMQ를 도입하시고 사용하시면서 Kafka의 어떤 토픽의 0번 오프셋부터 읽기(earliest)같은 요구사항이 있었던 적은 없으셨는지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 주인 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의에서 CATEGORY 엔티티에 Jointable을 만들고 Item에서 mappedBy를 통해 조회하였습니다. 제가 배운바로는 연관관계 주인은 외래키를 관리한다 하였는데 Jointable이 연관관계 주인 아닌가요?? 그러면 CATEGORY에서도 mappedBy를 설정해야 하는것이 아닌가요..?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 편의 메서드
안녕하세요.연관관계 편의 메서드에 대해서 궁금한게 있습니다.일대다 혹은 다대일 양방향 관계에서, 일 과 다 두 엔티티 모두에 연관관계 편의 메서드를 만드는게 좋을까요? 아니면, 연관관계에 종속되는(mappedBy) 엔티티에만 연관관계 편의 메서드를 작성하는게 좋을까요? @JoinColumn 과 mappedBy 로 연관관계의 주인만 잘 설정하면 DB 의 FK 에는 값이 잘 매핑될거고..다만 객채 관점에서 양방향 객체의 탐색을 위해 연관관계 편의 메서드를 작성하는 것으로 알아서, 그렇다고 하면 FK 키가 없는 쪽 엔티티(mapped BY) 에만 연관관계 편의 메서드를 만들면 되지 않을까 싶어서요. 감사합니다.
주간 인기글
순위 정보를
불러오고 있어요