묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
제 mysql 이 적용이 안되는 이유를 알아냈습니다.
연결이 위험하다면서 자꾸 제 local로 바뀌네요 전 여기서 해결하고싶은데 ... 어떻게 하면 다음페이지인 인덱스들도 접속 가능하게 할까요?? 그 url에서 http://localhost:8081/start.html 이런식으로 url 이 변경되며 화면이 전환되는 스타일인데 그게 안됩니다 ㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ExceptionHandler를 제대로 이해한건지 모르겠습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@ExceptionHandler 부분을 보고있는데 만약 회원가입 서비스에서 아이디 중복을 확인하는 서비스를 만든다고 가정했을때 중복이면 커스텀 예외를 만들어서 날려준다면.예외를 @ExceptionHandler써서 처리하는걸로 알고있습니다. 그러면 예외가 throw된 service단에서 처리되는건가요?이게 맞다면 api 내에서 throw로 커스텀 에러를 날리고 @exceptionHandler 을 사용한다면 커스텀 에러들이 발생한곳에서 처리되는건지 궁금합니다.3. 커스텀 예외를 만들시 extends RuntimeException를 하는게 controller등등에 예외가 전파되지 않기 위해서인걸로 아는데 그러면 예외를 runtime 에러로 만들었을 시 try catch문은 필요가 없는게 맞나요? 몇몇 코드를 찾아보니 @ExceptionHandler를 사용하고 runtime에러여도 trycatch를 굳이 쓰는 경우도 있던데 코드의 가독성을 위해서 넣은건지 궁금합니다.4. 아이디 중복같은 경우 굳이 예외로 던지지 않아도 해결할 수 있는데 예외를 던지는 이유는 로그라던가 코드의 안정성을 위한건지도 궁금합니다.그리고 커스텀 에러를 체크에러로 만들어서 처리하는 경우 에러를 @ExceptionHandler로 해결해도 전파되던데 이러한 경우는 어째서 인지 궁금합니다!6.spring data jpa 에서는 자동으로 spring이 추상화한 예외를 날려주는걸로 아는데 그러면 DataIntegrityViolationException.class 예외가 터졌을때 (외래키 중복 , 아이디 중복)두개의 오류를 각기 다른 방법으로 처리하고싶으면 어떻게 하나요? 에러코드나 스프링 메뉴얼을 분석해서 그 예외에 종속된 사용자 지정 예외를 만드나요?그러면 결국 그냥 예외가 터지는 try catch 부분에서 if 문을 짜서 그 에러코드를 가진 예외가 터졌을시에 대한것을 처리해주면 되는거 아닌지 헷갈립니다..그리고 그게 아니면 DataIntegrityViolationException.class 예외가 터졌을 시 해결하는 코드를 작성했는데 DataIntegrityViolationException.class에 종속된 다른 오류가 터진거면 어떻게 할지 잘 모르겠습니다..
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
메서드명 컬러의 의미
강사님 화면을 보면addTwoNumbers, multiplyTwoNumbers 같은 메서드명 (메서드가 맞나요.. 제가 자바가 아직 서툴러서😅)이 노란색으로 표시되는데 저는 회색으로 표시됩니다.이거 글자 색에 어떤 의미가 따로 있나요? 그리고 터미널에도 강사님은 INFO나 WARN 같은 글자들이 컬러로 표시되는데저는 그냥 다 하얗게 보여서요. 강사님과 똑같이 세팅하려면 어떻게 해야 하나요?검색해서 settings에 있는 semantic highlighting 적용해 봤는데 똑같이 안되는 거 같아요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
form태그의 상대경로
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요."src/main/resources/static/basic" 경로에 있는 "hello-form.html"파일의 form태그의 action 속성을 "/request-param-v1"으로 했는데 localhost:8080/request-param-v1이 정상적으로 나오는 이유가 무엇인가요? /basic은 무시되는 건가요?
-
해결됨실전! 스프링 데이터 JPA
강의 내용 중 testEntity 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. @SpringBootTest @Transactional @Rollback(value = false) class MemberTest { @Autowired EntityManager em; @Test public void testEntity() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m join fetch m.team", Member.class) .getResultList(); assertThat(members.get(0).getTeam()).isEqualTo(teamA); } }제가 작성한 테스트 코드는 위와 같습니다. 발생한 에러는org.opentest4j.AssertionFailedError: expected: "Team(id=1, name=teamA) (Team@3ec52163)" but was: "Team(id=1, name=teamA) (Team@100d071)" Expected :Team(id=1, name=teamA) Actual :Team(id=1, name=teamA) 위와 같습니다. 하나의 트랜잭션 안에서는 엔티티의 식별자가 같은 경우 ==비교를 하였을때 true라고 알고 있습니다.따라서 저는 member1의 team(teamA)과 teamA를 isEqualTo로 비교하였을때 true가 나올것이라 예상하였지만 false가 나왔습니다. 에러 문구를 보면 객체 주소가 달라서 false가 나온것 같아 Team엔티티에 equalsAndHashCode 오버라이딩을 해주어도 false가 나옵니다.물론 em.flush(), em.clear()를 하지 않고 영속성 컨텍스트에서 조회를 해오면 true가 나오는데 왜 영속성 컨텍스트를 초기화하고 DB에서 데이터를 가져오면 식별자가 같아도 같은 트랜잭션 내에서 ==비교가 true가 나오지 않는지 궁금합니다!
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
인텔리제이 테마?
안녕하세요. 강의 보면서 잘 따라가는 중인데요 인텔리제이 화면 모습이 강사님 화면이랑 좀 다른데혹시 테마가 달라서 그런 걸까요? 강사님 화면제 화면 아 그리고 강사님 화면 보면 "/add" 앞에 지구 모양이 생겨있는데 저는 이런게 안생겨요.. 이건 뭔가 설정을 해줘야하는건가요?그리고 지구 모양이 있는게 무슨 의미인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
v3와 v5를 실행할때 각각 404 ,500 에러가 발생합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.https://drive.google.com/drive/folders/1ZpCesyTQhZA09g5C1NzELrDZnLpAUsY7?usp=sharingv1,v2,v4는 잘 동작하는데 v3,v5는 각각 에러가 발생하여pdf파일에 있는 코드를 복붙해서 작성하였습니다.그래도 실행하니 v3는 404 v5는 500에러가 발생 하는데 어디가 문제인가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
배포해서 서버접속하는것까지 성공하였습니다
다만 궁금한것이 데이터베이스에 든게 없어서 배포하고 올린다음에 다시 내리고 데이터베이스 mysql채우고 다시 nohup으로 올렸는데 반영이 안되더라고요 어떻게 반영시키나요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Test - application.yml 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의를 따라 MemberRepositoryTest를 실행해도 h2데이터베이스에 Member테이블이 생성되지 않는 문제가 있었습니다. 강의를 여러번 돌려보고, 강의소스코드를 다운받아 실행해보아도 DB에 테이블이 생성되지 않았으며, 강의자료 pdf를 둘러보아도 해답이 없었습니다. 혹시나 하는 마음에 강의소스코드 중 test폴더 하위에 존재하는 application.yml을 확인하여 주석처리 된 것들을 다 해제하고 실행하니 그제야 h2DB에 member 테이블이 생성된 것을 확인하였습니다. 여기서 궁금한 점은 test파일을 실행할 때 test폴더 하위에 application.yml 파일이 존재해야하는지 입니다. 강의에서 강사님의 test폴더 아래 yml파일이 존재하지 않습니다.
-
미해결스프링 핵심 원리 - 기본편
인텔리제이 내장jdk사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]java11jdk를 따로 설치하지않고 인텔리제이에 내장된jdk를 사용해도되나요??
-
미해결스프링 핵심 원리 - 고급편
setProxyTargetClass()
문서에는 true가 기본적으로 설정해서 사용한다고 적혀있는데 default는 false 아닌가요?? 그냥 true를 기본적으로 많이 쓴다는 소리일까요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
또다시 서버 접속 질문입니다 ㅠ 죄송합니다
이번엔 인바운드에 –sgr-060b562a401b266118081TCP::/0launch-wizard-3 을 규칙으로 넣었더니 빠르게 연결이 안된다고 뜹니다 어떻게 해결하나요?? 재차 질문드려서죄송합니다 ㅠㅠ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
배포까자 완료하였는데 검색하여 서버에 접속할 수 가 없습니다.
배포도 했고 서버도 켰고 swap 설정도하고 인바운드 규칙도 다열고 했는데 서버에 접속하는 시간이 너무 오래걸려서 접속이 안됩나다ㅠㅠ왜그런걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Lazy 로딩 , FetchJoin 그리고 @BatchSize
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]공부를 하면서 제가 생각하는 부분이 맞는지 확인차 질문 드립니다. 모든 XToOne 은 fetch:Lazy로 되어있다는 가정Member와 Order는 양방향 참조Member를 사용할 때 Order는 가끔 사용되는경우Lazy 로 하고 Order를 사용할 때 마다 쿼리 나감자주 사용되는 경우패치조인을 사용해서 한번에 같이 불러온다.컬렉션인 경우XToOne은 패치 조인 하고 @BatchSize를 사용해서 페이징 및 최적화 까지 챙긴다 제 생각으론 동작방법만 제대로 알고 있으면 실무에서는default_batch_fetch_size 는 계속 등록해서 글로벌로 사용하면 좋아보이는데 그게 맞나요 ?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
meberRepository 질문
위 MemberServiceTest 클래스에서 memberRepository참조변수를 beforeEach메서드에서 초기화한게 아니고 필드에서 memberRepository를 한 번 초기화 하였는데 왜 BeforeEach 실행시 이렇게 모두 다른 memberRepository 주소값이 출력되는 지 잘 모르겠습니다. 필드에서 한번만 초기화 하였고 memberRepository의 값의 변화도 없는데 모두 같은 주소값이 출력되야 하는 거 아닌가요?
-
미해결실전! 스프링 데이터 JPA
멤버, 팀 테스트 코드 NullPointerException 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]선생님과 소스는 조금씩 다르지만 문제는 없다고 보는데 도대체 왜 널포인터익셉션이 발생하는지 모르겠습니다... 테스트 코드 작성 시 teamA,teamB 저장 및 콘솔로 출력확인, db 저장도 확인[test.java]@SpringBootTest@Transactional@Rollback(false)public class MemberTest {@PersistenceContextEntityManager em;@Testpublic void testEntity(){Team teamA = Team.builder().name("teamA").build();Team teamB = Team.builder().name("teamB").build();em.persist(teamA);em.persist(teamB);System.out.println("teamA = " + teamA);System.out.println("teamB = " + teamB);Member member1 = new Member("member1", 10, teamA); // 여기서 에러 발생=========================teamA,B 객체 모두 정상 출력=>teamA = Team(id=1, name=teamA) =>teamB = Team(id=2, name=teamB)[team.java]@Entity@AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED)@Data@Builder@ToString(of = {"id", "name"})public class Team {@Id@GeneratedValue@Column(name = "team_id")private Long id;private String name;@OneToMany(mappedBy = "team")private List<Member> members = new ArrayList<>();}3.[Member.java]@Entity@Getter@AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED)@Builder@ToString(of = {"id", "username", "age"})public class Member {@Id@GeneratedValue@Column(name = "member_id")private Long id;private String username;private int age;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "team_id")private Team team;public Member(String username, int age, Team team) {this.username = username;this.age = age;if (team != null) {changeTeam(team);}}// 멤버는 팀을 변경할 수 있음// 멤버에서 변경되면 팀에 있는 멤버리스트도 변경되어야 함public void changeTeam(Team team) {this.team = team;team.getMembers().add(this);}}생성자에서 team !=null 이 아닐 때 changeTeam(team)을 호출해야 하는데 에러 로그 상 changeTeam 메소드 호출 시 "team.getMembers().add(this);" 에서 널포인터가 발생합니다...확인 부탁드립니다![에러 메세지] java.lang.NullPointerExceptionat study.datajpa.entity.Member.changeTeam(Member.java:40)at study.datajpa.entity.Member.<init>(Member.java:32)at study.datajpa.entity.MemberTest.testEntity(MemberTest.java:38)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 Controller 패키지가 정상 작동 안 합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오): 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오): 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오): 예[질문 내용]여기에 질문 내용을 남겨주세요.Sptring boot가 controller 패키지를 인식안하고converter패키지를 controller로 인식하고있습니다.그래서 HelloController 클래스를 converter 패키지에 구현하고 진행중 입니다..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
fail() 에 빨간줄이 그어집니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]fail(); 여기서 오류가 나는데 이유를 모르겠어요 package hello.hellospring.service;import hello.hellospring.domain.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import static org.assertj.core.api.Assertions.*;class MemberServiceTest {//테스트는 한글메서드로 바꿔도 좋다.MemberService service = new MemberService();@Testvoid 회원가입() {//givenMember member = new Member();member.setName("hello");//whenLong saveId = service.join(member);//thenMember findeMember = service.findOne(saveId).get();Assertions.assertThat(member.getName()).isEqualTo(findeMember.getName());}@Testvoid 중복회원예외() {//givenMember member1= new Member();member1.setName("spring");Member member2= new Member();member2.setName("spring");//whenservice.join(member1);try{service.join(member2); //validate에서 걸려서 예외가 터져야 한다. fail(); 여기가 오류가 나요 }catch (IllegalStateException e){//성공assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");}//then}@Testvoid 회원조회() {}}
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
basic/items.html 입력시에만 화이트 라베 오류가 발생합니다. 제발 도와주세요 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.items.html 수정 전 코드 입력시에는 웹 페이지가 잘 작동하는데<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <link href="../css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"> <style> .container { max-width: 560px; } </style> </head> <body> <div class="container"> <div class="py-5 text-center"> <h2>상품 상세</h2> </div> <div> <label for="itemId">상품 ID</label> <input type="text" id="itemId" name="itemId" class="form-control" value="1" th:value="${item.id}" readonly> </div> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" name="itemName" class="form-control" value="상품A" th:value="${item.itemName}" readonly> </div> <div> <label for="price">가격</label> <input type="text" id="price" name="price" class="form-control" value="10000" th:value="${item.price}" readonly> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" name="quantity" class="form-control" value="10" th:value="${item.quantity}" readonly> </div> <hr class="my-4"> <div class="row"> <div class="col"> <button class="w-100 btn btn-primary btn-lg" onclick="location.href='editForm.html'" th:onclick="|location.href='@{/basic/items/{itemId}/ edit(itemId=${item.id})}'|" type="button">상품 수정</button> </div> <div class="col"> <button class="w-100 btn btn-secondary btn-lg" onclick="location.href='items.html'" th:onclick="|location.href='@{/basic/items}'|" type="button">목록으로</button> </div> </div> </div> <!-- /container --> </body> </html> 수정 후 코드를 복붙 후에 웹 페이지에 입력하면 화이트 라벨 페이지가 응답합니다...뭐가 문제인지 모르겠습니다.. 도와주세요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Test 오류 발생 원인이 무엇인지 잘 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV3; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; import java.sql.SQLException; /** * 트랙잭션 - @Transactional AOP */ @Slf4j //final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션 public class MemberServiceV3_3 { private final MemberRepositoryV3 memberRepository; public MemberServiceV3_3( MemberRepositoryV3 memberRepository) { this.memberRepository = memberRepository; } @Transactional //이 메소드를 호출할 때, 트랙잭션을 걸고 시작하겠다는 의미. // 성공하면 커밋 실패하면 롤백을 한다. public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); } private void bizLogic(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(fromId,fromMember.getMoney()- money); validation(toMember); memberRepository.update(toId,toMember.getMoney()+ money); } private static void validation(Member toMember) { if(toMember.getMemberId().equals("ex")){ throw new IllegalStateException("이제 중 예외 발생. 테스트 위해 만듦"); } } }이것이 원본 코드이고 package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV3; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.sql.SQLException; import static hello.jdbc.connection.ConnectionConst.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * 트랜잭션 - @Transactional AOP */ @Slf4j @SpringBootTest //스프링테스트 어노테이션이 있으면 이 테스트에서 //스프링부트가 이 테스트에서 스프링 컨테이너를 만들고 필요한 스프링 빈을 전부 등록하고 스프링 빈에 대한 의존관계 주입도 받을 수 있게 된다 class MemberServiceV3_3Test { public static final String MEMBER_A = "memberA"; public static final String MEMBER_B = "memberB"; public static final String MEMBER_EX = "ex"; @Autowired // 의존관계 주입을 받아서 사용한다. private MemberRepositoryV3 memberRepository; @Autowired private MemberServiceV3_3 memberService; @TestConfiguration static class TestConfig{ @Bean DataSource dataSource(){ return new DriverManagerDataSource(URL,USERNAME,PASSWORD); } @Bean PlatformTransactionManager transactionManager(){ return new DataSourceTransactionManager(dataSource()); } @Bean MemberRepositoryV3 memberRepositoryV3(){ return new MemberRepositoryV3(dataSource()); } @Bean MemberServiceV3_3 memberServiceV3_3(){ return new MemberServiceV3_3(memberRepositoryV3()); } } @AfterEach void after() throws SQLException { memberRepository.delete(MEMBER_A); memberRepository.delete(MEMBER_B); memberRepository.delete(MEMBER_EX); } @Test @DisplayName("정상 이체") void accountTransfer() throws SQLException { //given Member memberA = new Member(MEMBER_A, 10000); Member memberB = new Member(MEMBER_B, 10000); memberRepository.save(memberA); memberRepository.save(memberB); //when memberService.accountTransfer(memberA.getMemberId(), memberB.getMemberId(), 2000); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberB.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(8000); assertThat(findMemberB.getMoney()).isEqualTo(12000); } @Test @DisplayName("이체중 예외 발생") void accountTransferEx() throws SQLException { //given Member memberA = new Member(MEMBER_A, 10000); Member memberEx = new Member(MEMBER_EX, 10000); memberRepository.save(memberA); memberRepository.save(memberEx); //when assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) .isInstanceOf(IllegalStateException.class); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberEx = memberRepository.findById(memberEx.getMemberId()); //memberA의 돈이 롤백 되어야함 assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberEx.getMoney()).isEqualTo(10000); } }이것이 테스트 코드입니다.원본 코드는 따로 수정하지 않았고 테스트 코드만 가져와서 사용했는데 왜 오류가 발생하는지 잘 이해가 안됩니다 설명 부탁드립니다. 오류는 다음과 같이 나옵니다Execution failed for task ':test'.> No tests found for given includes: [hello.jdbc.service.MemberServiceV3_3Test.AopCheck](--tests filter)* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.2.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 577ms4 actionable tasks: 1 executed, 3 up-to-date 설명 부탁드립니다