30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 DB에 임의의 데이터 넣기
제가 schema.sql 파일로 테이블을 만들고, data.sql 파일로 row값을 넣었는데요.테이블에 의미없는 데이터를 100개정도 넣어둘려 하는데, 100개를 타이핑하기에는 힘들잖아요?그래서 같은내용의 데이터를 아이디(primary key)만 바꿔서 100개정도 넣는 쿼리문이 있나요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO사용에 대한 질문
강의 23분18초 부분updateItem을 DTO로 받는것에 대해 질문 2가지있습니다.1. 아래와 같이 서비스계층의 DTO를 만들어서 파라미터로 사용하는부분은 이해했는데, 애초에 그냥 form을 넘겨주는것은 잘못된 설계인가요?@PostMapping("/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") BookForm form) { UpdateItemDto updateItemDto = new UpdateItemDto(form); itemService.updateItem(updateItemDto); //itemService.updateItem(form); return "redirect:/items"; }강의에선 생략하는 부분인것같은데 만약 엔티티에 change() 함수를 만든다했을때 Item을 상속받는 Book, Album,Movie 각각에 change함수를 만들어주어야하나요..? (Item이라는것을 상속받는 3개의 클래스에대해 어떻게 처리해줘야할지 모르겠어요.)Item (부모클래스)에 필드들을 private -> protected로 바꾸고, Book의 change함수를 아래와 같이 만들면되나요? (이경우 Album, Movie 사용한다고 가정하면 똑같이 만들어줘야하는지?)public void change(UpdateItemDto dto) { this.name = dto.getName(); this.price = dto.getPrice(); this.stockQuantity = dto.getStockQuantity(); this.author = dto.getAuthor(); this.isbn = dto.getAuthor(); }
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
타임리프 파싱 오류
https://drive.google.com/file/d/19kE1MqjQqEW--lxC_1x8EprFxsnAtWRB/view?usp=sharing 주문 목록까지는 나오는데 ORDER로 해놓고 검색을 하면 이렇게 파싱이 안됩니다. 경로도 맞는데 어디서 문제가 있는지 모르겠습니다.거의 다왔는데 마지막에 애먹네요 ㅠㅠ
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderSearch 질문입니다.
안녕하세요.OrderSearch 클래스가 강의에서는 repository패키지내에 있는데강의 자료에는 package jpabook.jpashop.domain; 로 되어있어요 보통 실무에서는 OrderSearch같은 검색조건 관련 클래스를 어느 패키지에 두나요?검색조건 관련된 것들까지 전부 도메인패키지에 넣으면 뭔가 이상한것같기도하고..근데 리포지토리는 데이터를 crud하는 용도로만 쓰는것 같아서 여기도 아닌것같고.. 답변 부탁드립니다.
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
학습 방향
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]학자형 코스로 스프링 기본편 부터 활용1편까지 들었습니다. 팀 프로젝트에 들어가기전 지금까지 공부한 내용들을 복습, 점검겸 작은 토이 프로젝트를 혼자 해보려고 합니다. 타임리프를 쓸 예정이고 기간은 4주 정도로 해보려 합니다. 제가 궁금한점은 활용 2편이 api관련된 내용으로 알고 있는데, 그러면 스프링 data jpa -> query dsl -> 토이 프로젝트 -> 활용2편 -> 팀프로젝트 이런식으로 듣는게 좋을까요?? 제가 비전공자라 인맥도 없고 이번이 웹 개발 처음 공부하는 거라 프로젝트 관련하여 많이 막막하네요. 처음 토이 프로젝트를 할때 이 점을 중점적으로 해보면 좋겠다든지 팁 같은거좀 얻을 수 있을까요? 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
카테고리 설계 방법
쇼핑몰 카테고리를 설계시 상의 하의 아우터 이런식으로 나누려고 했는데 성별도 나눠야 할꺼같아서 남자 여자 아이들 이런식으로 나눌까 고민중에 있습니다. 후자를 선택하면 아무래도 깔끔하긴 한데 뭔가 굳이? 이런생각이 들어서(겹치거나 하는 것들이 많아서) 어떻게 해야 좀더 괜찮을지 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
domain 작성 후 프로그램 구동시 어떤 원리로 테이블이 생성되는건가요?
잘 따라하면서 테이블 H2 데이터베이스에 테이블생성 까지 완료되었습니다. 그런데, 어떻게 테이블이 생성되는건지 그 경로를 알고싶습니다. domain 을 작성하였을 뿐인데, 실행시키는 것 만으로 어떻게 테이블이 만들어지는건가요? @Entity 어노테이션이 붙어있으면 자동으로 인식해서 테이블을 만들어 주는 것인가요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
디버그창에 문제가 생겨서 질문합니다
alter table orders 이렇게 한줄로 쭉 나오는데 강의에서 보면 문단이 내려가더라구요 제가 무슨 설정을 잘못해서 이렇게 된걸까요 한줄로 보니까 더 불편합니다
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@BeforeEach 사용해서 테스트
안녕하세요!선생님이 알려주신 테스트 방법에 @BeforeEach 어노테이션을 사용해서 작성 중입니다. 그런데 테스트를 개별로 돌리면 문제 없지만 통합으로 한번에 돌리면 java.util.NoSuchElementException: No value present이 발생하는데 어떤 부분이 문제일까요?밑줄 그어진 부분이 오류 뜨는 부분인데 코드를 봐도 잘 모르겠습니다.. 확인 한번 해주실 수 있으실까요? BusinessMarkServiceTest@SpringBootTest @Transactional public class BusinessMarkServiceTest { @Autowired BusinessMarkService businessMarkService; @Autowired MemberService memberService; @Autowired BusinessService businessService; @Autowired LoginService loginService; @BeforeEach public void before() { Member member = new Member(); member.setNickname("testMember"); member.setMail("testMember@test.com"); member.setPassword("test1234!"); member.setMember_type("B"); member.setMember_status("J"); member.setHint_password("hint_01"); member.setAnswer_password("answer"); member.setUpdated_at(now()); member.setCreated_at(now()); memberService.join(member); Member member2 = new Member(); member2.setNickname("testMember2"); member2.setMail("testMember2@test.com"); member2.setPassword("test1234!"); member2.setMember_type("B"); member2.setMember_status("J"); member2.setHint_password("hint_01"); member2.setAnswer_password("answer"); member2.setUpdated_at(now()); member2.setCreated_at(now()); memberService.join(member2); Business business = new Business(); business.setBusinessName("테스트밥집"); business.setHomepage("test.com"); business.setPhone("010-1234-5678"); business.setAddress("제주특별자치도 제주시 첨단로 242"); business.setLng((float) 33.450701); business.setLat((float) 126.570667); business.setCreated_at(now()); business.setUpdated_at(now()); businessService.join(business); Business business2 = new Business(); business2.setBusinessName("테스트밥집2"); business2.setHomepage("test2.com"); business2.setPhone("010-1234-5678"); business2.setAddress("제주특별자치도 제주시 첨단로 242"); business2.setLng((float) 33.450701); business2.setLat((float) 126.570667); business2.setCreated_at(now()); business2.setUpdated_at(now()); businessService.join(business2); } @Test public void 좋아요_체크() throws Exception{ //given Member loginMember = loginService.login("testMember2@test.com", "test1234!"); Business findBusiness = businessService.findOne(1L); //when BusinessMarkDto businessMarkDto = new BusinessMarkDto(loginMember,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto); //then assertEquals(1, businessMarkService.getBusinessLikeInfo(businessMarkDto).getBusinessLikeNum()); } @Test public void 좋아요_해제() throws Exception{ //given Member loginMember = loginService.login("testMember@test.com", "test1234!"); Member loginMember2 = loginService.login("testMember2@test.com", "test1234!"); Business findBusiness = businessService.findOne(1L); //좋아요 표시하기 BusinessMarkDto businessMarkDto = new BusinessMarkDto(loginMember,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto); BusinessMarkDto businessMarkDto2 = new BusinessMarkDto(loginMember2,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto2); //when //businessMarkDto2가 한번 더 좋아요 눌러서 해제 시키기 businessMarkService.pushBusinessMark(businessMarkDto2); //then assertEquals(1, businessMarkService.getBusinessLikeInfo(businessMarkDto).getBusinessLikeNum()); } @Test public void 좋아요_개수() throws Exception{ //given Member loginMember = loginService.login("testMember@test.com", "test1234!"); Member loginMember2 = loginService.login("testMember2@test.com", "test1234!"); Business findBusiness = businessService.findOne(1L); //좋아요 표시하기 BusinessMarkDto businessMarkDto = new BusinessMarkDto(loginMember,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto); BusinessMarkDto businessMarkDto2 = new BusinessMarkDto(loginMember2,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto2); //when long businessMarkNum = businessMarkService.getBusinessLikeInfo(businessMarkDto2).getBusinessLikeNum(); //then assertEquals(2, businessMarkNum); } @Test public void 좋아요_여부() throws Exception{ //given Member loginMember = loginService.login("testMember@test.com", "test1234!"); Business findBusiness = businessService.findOne(1L); //when BusinessMarkDto businessMarkDto = new BusinessMarkDto(loginMember,findBusiness.getId()); businessMarkService.pushBusinessMark(businessMarkDto); Boolean check = businessMarkService.getBusinessLikeInfo(businessMarkDto).getCheck(); //then assertEquals(true, check); } } BusinessMarkService@Slf4j @Service @Transactional @RequiredArgsConstructor public class BusinessMarkService { private final BusinessMarkRepository businessMarkRepository; private final BusinessRepository businessRepository; //좋아요 및 취소 public Boolean pushBusinessMark(BusinessMarkDto businessMarkDto) { businessMarkRepository.BusinessMarkSearch(businessMarkDto.getMember().getMail(), businessMarkDto.getBusinessId()) .ifPresentOrElse(businessMark -> businessMarkRepository.deleteById(businessMark.getId()), ()-> { Business business = getBusiness(businessMarkDto); businessMarkRepository.save(new BusinessMark(businessMarkDto.getMember(), business)); }); return true; } //업체 게시글 찾기 @Transactional(readOnly = true) public Business getBusiness(BusinessMarkDto businessMarkDto) { return businessRepository.findById(businessMarkDto.getBusinessId()) .orElseThrow(() -> new IllegalArgumentException("해당 게시글은 존재하지 않습니다.")); } // 좋아요 개수 @Transactional(readOnly = true) public BusinessMarkResponseDto getBusinessLikeInfo(BusinessMarkDto businessMarkDto) { long businessLikeNum = getBusinessLikeNum(businessMarkDto); boolean check = checkPushedLike(businessMarkDto); return new BusinessMarkResponseDto(businessLikeNum, check); } @Transactional(readOnly = true) public Boolean checkPushedLike(BusinessMarkDto businessMarkDto) { return businessMarkRepository.BusinessMarkSearch(businessMarkDto.getMember().getMail(), businessMarkDto.getBusinessId()) .isPresent(); /*Optional<BusinessMark> businessMark = businessMarkRepository.BusinessMarkSearch(businessMarkDto.getMember().getMail(), businessMarkDto.getBusinessId()); if(businessMark != null){ return true; } return false;*/ } @Transactional(readOnly = true) public long getBusinessLikeNum(BusinessMarkDto businessMarkDto) { return businessMarkRepository.BusinessMark(businessMarkDto.getBusinessId()); } } MemberService@Slf4j @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class MemberService { @Autowired private final MemberRepository memberRepository; @Autowired private PasswordEncoder passwordEncoder; /** 회원가입 **/ @Transactional public String join(Member member){ //비밀번호 암호화 후 레포지토리에 넘기기 String encodedPassword = passwordEncoder.encode(member.getPassword()); member.setPassword(encodedPassword); validateDuplicateMember(member);//중복회원검증 memberRepository.save(member); return member.getMail(); } /** 중복회원검증 **/ private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByMail(member.getMail()); if (!findMembers.isEmpty()){ throw new IllegalStateException("이미 존재하는 회원입니다"); } } private void validateDuplicateNickname(Member member) { Member findMembers = memberRepository.findOndByMail(member.getMail()); if (!findMembers.getNickname().equals(member.getNickname())){ throw new IllegalStateException("이미 존재하는 회원입니다"); } } /** 회원전체조회 **/ public List<Member> findMembers(){ return memberRepository.findAll(); } public Member findOne(String mail) { return memberRepository.findOndByMail(mail); } /** 회원 수정 **/ @Transactional public void update(String mail, String nickname, String answer_password){ Member member = memberRepository.findOndByMail(mail); if(nickname.equals(member.getNickname())) { validateDuplicateNickname(member); } member.setNickname(nickname); member.setAnswer_password(answer_password); member.setUpdated_at(now()); } /** 회원 탈퇴 **/ @Transactional public String delete(String mail, String password){ Member findUser = memberRepository.findOndByMail(mail); if(!passwordEncoder.matches(password,findUser.getPassword())){ //throw new IllegalStateException("비밀번호가 맞지 않습니다."); System.out.println("암호 실패"); return null; } findUser.setUpdated_at(now()); findUser.setMember_status("D"); return findUser.getPassword(); } } BusinessService@Slf4j @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class BusinessService { @Autowired private final BusinessRepository businessRepository; @Autowired private final MemberRepository memberRepository; @Autowired private PasswordEncoder passwordEncoder; /** 중복업체검증 **/ private void validateDuplicateBusiness(Business business) { List<Business> findBusiness = businessRepository.findByBusinessName(business.getBusinessName()); if (!findBusiness.isEmpty()){ throw new IllegalStateException("이미 존재하는 업체명입니다"); } } /** 업체생성 **/ @Transactional public String join(Business business){ validateDuplicateBusiness(business);//중복회원검증 log.info("business {}", business); businessRepository.save(business); return business.getBusinessName(); } /** 업체 수정 **/ /** @Transactional public void saveBusiness(Business business){ businessRepository.save(business); } **/ @Transactional public void update(Long id, String BusinessName, String homepage, String phone, String address, float lat, float lng, String etc){ Business business = businessRepository.findById(id).orElseThrow(); if(!BusinessName.equals(business.getBusinessName())) { validateDuplicateBusiness(business); //중복 업체명 검증 } business.setBusinessName(BusinessName); business.setHomepage(homepage); business.setPhone(phone); business.setAddress(address); business.setLat(lat); business.setLng(lng); business.setEtc(etc); business.setUpdated_at(now()); } /** 업체 삭제 **/ @Transactional public String delete(Member member, Long id){ Member findUser = memberRepository.findOndByMail(member.getMail()); //Business business = businessRepository.findById(id).get(); Business business = businessRepository.findById(id).orElseThrow(); if(!passwordEncoder.matches(member.getPassword(),findUser.getPassword())){ //throw new IllegalStateException("비밀번호가 맞지 않습니다."); System.out.println("암호 실패"); return null; } business.setStatus("D"); business.setUpdated_at(now()); return findUser.getPassword(); } /** 업체 찾기 **/ public Business findOne(Long id) { Business business = businessRepository.findById(id).orElseThrow(); return business; } } LoginService@Service @Transactional(readOnly = true) @RequiredArgsConstructor public class LoginService { @Autowired private final MemberRepository memberRepository; @Autowired private PasswordEncoder passwordEncoder; public Member findOne(String mail){ return memberRepository.findOndByMail(mail);} /** 로그인 **/ @Transactional //public String login(Member member){ public Member login(String mail, String password){ List<Member> findMember = memberRepository.findByMail(mail); Member findUser = memberRepository.findOndByMail(mail); if (findMember==null){ //throw new IllegalStateException("해당 이메일의 유저가 존재하지 않습니다."); //System.out.println("이메일 실패"); return null; } if(!passwordEncoder.matches(password,findUser.getPassword())){ //throw new IllegalStateException("비밀번호가 맞지 않습니다."); return null; } System.out.println("로그인 완료 :"+findUser.getNickname()); //세션 표시를 위해 닉네임값 넘기기 return findUser; } /** 비밀번호 매치 **/ @Transactional public String passwordMatches(Member member){ Member findUser = memberRepository.findOndByMail(member.getMail()); if(!passwordEncoder.matches(member.getPassword(),findUser.getPassword())){ //throw new IllegalStateException("비밀번호가 맞지 않습니다."); System.out.println("암호 실패"); return null; } return findUser.getPassword(); } /** 비밀번호 변경 **/ @Transactional public void updatePassword(String mail, String editPassword){ Member member = memberRepository.findOndByMail(mail); if (editPassword.equals(member.getPassword())) { throw new IllegalStateException("이전 비밀번호와 동일합니다."); } member.setPassword(editPassword); member.setUpdated_at(now()); } }
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cmd gradlew 무응답
윈도우이고 cmd로gradlewgradlew.bat둘 다 입력해도 아무 반응이 없네요 libs 폴더도 안생기고
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
repository 작성 시 , spring-data-jpa 의 jpaRepository 와 persistence manager 객체 주입의 선택 기준
질문 : 실제 작업을 할때, 어떤 경우에 spring-data-jpa의 jpa repository 를 쓰고, 어떤 경우에 EntityManager 를 써야 할까요 ? 안녕하세요. 선생님 이번 강의에 spring-data-jpa 의 jpa repository 를 사용하지 않고 EntityManager 를 주입받아 repository 를 사용 하는 이유는 학습의 목표가 jpa 의 동작을 더 잘 이해하기 위함이라고 들엇습니다.( 출처 : https://www.inflearn.com/questions/549972)그러면 실제 작업을 할때, 어떤 경우에 spring-data-jpa의 jpa repository 를 쓰고, 어떤 경우에 EntityManager 를 써야 할까요 ? 하나의 트랜잭션의 명령을 길게 여러개 쓰고 싶으면 jpa repository 의 함수를 직접 작성한다라고 이해해도 될까요 ?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
IllegalStateException: Failed to load ApplicationContext
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]복습하려고 새로 프로젝트를 다시 따라 쳐보려 했는데요,에러를 만나 해결이 안되어 글 남깁니다!첫 테스트인 MemberRepositoryTest 실행중에 발생했고파일 압축해서 올리겠습니다. java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$8(ClassBasedTestDescriptor.java:363) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:368) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$9(ClassBasedTestDescriptor.java:363) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:362) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:283) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:282) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:272) at java.base/java.util.Optional.orElseGet(Optional.java:364) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:271) at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:102) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:101) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: org.h2.Driver at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:132) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90) ... 71 moreCaused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: org.h2.Driver at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ... 91 moreCaused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: org.h2.Driver at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ... 105 moreCaused by: java.lang.IllegalStateException: Cannot load driver class: org.h2.Driver at org.springframework.util.Assert.state(Assert.java:97) at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:171) at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:123) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 106 more plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.14.RELEASE' id 'java' } group = 'reviewjpa' version = '0.0.1-SNAPSHOT' 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-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'junit:junit:4.13.1' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } spring: datasource: url: jdbc:h2:tcp://localhost/~/jpareview username: sa password: driver-class-name: org.h2.Driver jpa: hibrernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true logging: level: org.hibernate.SQL: debug
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성 메소드 vs 생성자
안녕하세요! 강의를 보다가 궁금한 점이 생겼는데, Order 엔티티에public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems)이렇게 생성메소드를 만들어서 Order를 생성해서 사용하셨는데, 왜 생성자가 아닌 생성 메소드를 만들어서 사용한것인지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA 라이브러리 추가하면 히카리로 기본 동작하나용?
드라이버 매니저로 커넥션 받아오는거 테스트 하고 있었는데 왜 히카리로 동작하나요? Spring Db1편 강의에서 바뀐게 JPA 추가한게 전부인데 JPA 라이브러리 추가하면 히카리가 기본동작인가요?(휴대폰으로 결제를 하고 계정을 확인했는데 애플 계정으로 강의를 잘못 사서... 카카오 계정으로 Spring 과정 정주행 했습니다..ㅎㅎ)
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
IllegalStateException("이미 존재하는 회원입니다.")관련 질문
중복검사시 IllegalStateException("이미 존재하는 회원입니다.")로 예외를 발생하도록 강사님께서 로직을 작성하셨습니다.저는 이걸로 controller에서 받아서 예외가 발생했다면 html화면에 빨간색으로 글자를 바꾼다던가 alert창을 띄운다던가 이런 로직을 짤거라고 생각을 했는데 강사님께서 이 강의에서는 이 부분에 대해서는 추가적으로 설명이 없으셔서요 ㅜㅜrest api구현할게 아니라면제가 생각한 방법대로 해도 되나요??그리고여기서도 예외를 터뜨리셨는데 위와 같은 이유로rest api 구현이 아니라면 보통 repository나 service에서 예외를 터뜨려서 controller에서 경고창을 띄운다던가 페이지를 이동시킨다거나 글자색을 변하게 한다던가 이런식으로 로직을 짜는 건가요??
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderServiceTest 코드의 NullPointerException
[질문 내용](구글 드라이브에 업로드한 전체 프로젝트 링크 : https://drive.google.com/file/d/1rHbKUDz6JSdGbSuCNprE86n8_K0tP0Ls/view?usp=sharing)OrderService 코드를 테스트 하기 위해 OrderServiceTest 파일을 만든 후, 해당 파일 아래에 상품주문 테스트 코드를 작성하여 실행했습니다그 결과 다음과 같은 오류가 발생합니다java.lang.NullPointerException: Cannot invoke "jpabook.jpashop.service.OrderService.order(java.lang.Long, java.lang.Long, int)" because "this.orderService" is null아래의 Order, OrderRepository, OrderService 코드 모두 강사님의 코드와 비교해보았으나 딱히 다른점을 찾지 못했습니다. 왜 이런 일이 일어날까요?OrderService 코드package jpabook.jpashop.service; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.repository.ItemRepository; import jpabook.jpashop.repository.MemberRepository; import jpabook.jpashop.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; private final MemberRepository memberRepository; private final ItemRepository itemRepository; //주문 @Transactional public Long order(Long memberId, Long itemId, int count) { //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); //배송정보 생성 Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); delivery.setStatus(DeliveryStatus.READY); //주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); //주문 생성 Order order = Order.createOrder(member, delivery, orderItem); //주문 저장 orderRepository.save(order); return order.getId(); } //주문취소 // @Transactional // public void cancelOrder(Long orderId) { // //엔티티 조회 // Order order = orderRepository.findOne(orderId); // //주문 취소 // order.cancel(); // // } //검색 // public List<Order> findOrders(OrderSwarch orderSwarch) { // return orderRepository.findall(orderSwarch); // } } OrderRepository 코드package jpabook.jpashop.repository; import jpabook.jpashop.domain.Order; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; @Repository @RequiredArgsConstructor public class OrderRepository { private final EntityManager em; public void save(Order order) { em.persist(order); } public Order findOne(Long id) { return em.find(Order.class, id); } // public List<Order> findAll(OrderSearch orderSearch) { // // } } Order 코드package jpabook.jpashop.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name="delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //연관관계 먀서드// public void setMember(Member member){ this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } //생성 매서드// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //비지니스 로직 /* 주문 취소 */ public void cancel() { if (delivery.getStatus() == DeliveryStatus.COMP) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다"); } this.setStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } //조회 로직 /** * * 전체 주문가격 조회 */ public int getTotalPrice() { int totalPrice = orderItems.stream().mapToInt(OrderItem::getTotalPrice).sum(); return totalPrice; } } OrderServiceTest 코드package jpabook.jpashop.service; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.repository.OrderRepository; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @SpringBootTest @Transactional public class OrderServiceTest { @Autowired EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception{ // given Member member = new Member(); member.setName("member1"); member.setAddress(new Address("seoul", "river", "934=134")); Book book = new Book(); book.setName("pricnciple"); book.setPrice(1000); book.setStockQuantity(10); int orderCount = 2; // when Long orderId = orderService.order(member.getId(), book.getId(), orderCount); // then Order getOrder = orderRepository.findOne(orderId); Assert.assertEquals("상품 주문시 상태는 order", OrderStatus.ORDER, getOrder.getStatus() ); } } 에러 메시지java.lang.NullPointerException: Cannot invoke "jpabook.jpashop.service.OrderService.order(java.lang.Long, java.lang.Long, int)" because "this.orderService" is null at jpabook.jpashop.service.OrderServiceTest.상품주문(OrderServiceTest.java:50) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2를 in-memory 로 설정 변경시 Failed to load Application 발생
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]test 코드를 실행시 , H2 데이터 베이스를 in-memory 로 설정하는것이 더 좋다고하여 아래와 같이 application.yml 설정변경 후 test 코드를 실행하였습니다spring: datasource: # url: jdbc:h2:mem:test 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 그러자 MemberServiceTest 실행시 아래와 같은 Failed to load Application 에러 표시가 발생합니다.이런저런 테스트를 해보니, test 폴더의 resource 폴더 아래에 application.yml를 만들더라도, 테스트 코드 실행시 java 폴더의 resource폴더 아래에 있는 application.yml 파일이 우선권을 가지고 갑니다.어떻게 설정을 변경해야 test 폴더의 application.yml이 테스트 코드 실행시 우선권을 가지고 갈 수 있나요? 해당 부분에 대해서 구글 및 인프런 커뮤니티를 검새해도 따로 정확한 답변이 없어서 질문드립니다전체 오류:java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$8(ClassBasedTestDescriptor.java:363) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:368) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$9(ClassBasedTestDescriptor.java:363) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:362) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:283) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:282) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:272) at java.base/java.util.Optional.orElseGet(Optional.java:364) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:271) at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:102) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:101) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:132) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90) ... 71 more Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ... 86 more Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:138) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 103 more
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
html에서 form 데이터를 받는 것에 대한 질문입니다.
html에서 form 데이터를 받는 것에 대한 질문입니다.html form 에서 보내는 데이터를 Controller에서 ModelForm으로 받고 있는데여기에 대한 질문입니다.저 ModelForm으로 값을 받을수 있는 이유가 form태그 안에 name값을 넣어준 input태그들과 매칭되어서 값을 받아 올수 있는건가요?아니면 form 태그에 명시한 th:object에 의해서 memberForm형태로 넘길 수 있는건가요?
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
카테고리 아이템
실무에서 카테고리와 아이템을 일대다 다대일로 풀어서 카테고리 아이템을 실제로 사용하나요? 아니면 그냥 단순하게 카테고리와 아이템 이 두테이블만 갖고 해도 되나요? 제가 한건데 혹시 이렇게 하는게 맞나요? 마땅히 물어볼 곳이 없네요
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
SSR 환경에서의 질문 있습니다.
안녕하세요 질문이 있습니다. 스프링과 thymeleaf를 이용해서 SSR 방식으로 프로젝트를 만들 때 세션이 아닌 JWT 토큰 방식으로 로그인 처리를 할 수 있는지 궁금합니다. 보통 검색을 해보거나 강의를 보면 대부분 CSR 환경에서 JWT 토큰 방식으로 로그인을 처리하고 SSR 방식에서는 세션으로 로그인 처리를 하던데 JWT 토큰 방식의 로그인 처리에 대해 정보를 얻기가 힘들어서 여쭤봅니다 ㅠ스프링+thymeleaf의 SSR 방식에서 JWT 토큰 방식의 로그인이 가능하다면 혹시 참조할 수 있는 링크나 강의가 있을까요??세션과 JWT 토큰 둘 중 어느 방식이 SSR 환경에 적합한지 여쭤보고 싶습니다.