월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Intellij IDEA가 아니라 Gradle을 사용하면 에러가 나와요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 여기서 Build and run using과 Run tests using을 Intellij IDEA로 설정하면 아무런 에러가 나오지 않고 잘 작동이 되는데, Gradle을 사용하게 되면 에러가 납니다. 이런 에러가 나옵니다. Project Structure의 SDK는 17로 해두었고,스프링부트 버전은 3.2.1, java는 17입니다. 현재 Gradle 버전은 8.5입니다. 제공해주신 피피티에서는 스프링 부트 3.2부터 JDK 17과 꼭 Gradle을 선택하라고 하셔서 고민이 되어 질문 남깁니다. 그냥 Intellij IDEA를 사용하여 수업을 들어도 괜찮을까요? 에러는 어떻게 해야 해결이 될까요..? 검색해봐도 잘 나오지 않아 여쭤봅니다.
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
submit 버튼을 눌렀을때 어떤 api 가 불러와지는지 코드 어디에 쓰여있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]저 submit 버튼을 눌렀을때 어떤 api를 호출하는지 html에 없는것 같아서요. <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"/> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <form th:object="${form}" method="post"> <!-- id --> <input type="hidden" th:field="*{id}"/> <div class="form-group"> <label th:for="name">상품명</label> <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"/> </div> <div class="form-group"> <label th:for="price">가격</label> <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"/> </div> <div class="form-group"> <label th:for="stockQuantity">수량</label> <input type="number" th:field="*{stockQuantity}" class="form-control" placeholder="수량을 입력하세요"/> </div> <div class="form-group"> <label th:for="author">저자</label> <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요"/> </div> <div class="form-group"> <label th:for="isbn">ISBN</label> <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요"/> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <div th:replace="fragments/footer :: footer"/> </div> <!-- /container --> </body> </html>설명해주시면 감사하겠습니다ㅜㅜ
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
devtools 오류
devtools가 적용이 안되어서 인터넷에 나와 있는 내용 다 긁어서 해봐도 안됩니다. ㅠㅠㅠ 어떻게 해야 하나요
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션7 상품 수정이 페이지가 연결이 안됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]상품 수정시, 수정 버튼을 누르면 위와 같이 나옵니다. 프론트를 하나도 몰라서, 오류가 뭔지 모르겠어요 ㅜㅜ package jpabook.jpashop.controller; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.service.ItemService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; @Controller @RequiredArgsConstructor public class ItemController { private final ItemService itemService; @GetMapping("/items/new") public String createform(Model model) { model.addAttribute("form", new BookForm()); return "items/createItemForm"; } @PostMapping("/items/new") public String create(BookForm form) { Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/"; } @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "items/itemList"; } @GetMapping("/items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "items/updateItemForm"; } @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/items"; } } <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"/> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <form th:object="${form}" method="post"> <!-- id --> <input type="hidden" th:field="*{id}"/> <div class="form-group"> <label th:for="name">상품명</label> <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"/> </div> <div class="form-group"> <label th:for="price">가격</label> <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"/> </div> <div class="form-group"> <label th:for="stockQuantity">수량</label> <input type="number" th:field="*{stockQuantity}" class="form-control" placeholder="수량을 입력하세요"/> </div> <div class="form-group"> <label th:for="author">저자</label> <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요"/> </div> <div class="form-group"> <label th:for="isbn">ISBN</label> <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요"/> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <div th:replace="fragments/footer :: footer"/> </div> <!-- /container --> </body> </html> 코드 올려드립니다! 확인 요청드립니다 ㅜ
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컨트롤러단 페이징 테스트
// 컨트롤러 코드 @GetMapping public ResponseEntity<?> postList(@PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) { Page<Post> posts = postService.getPosts(pageable); return ResponseEntity.ok() .body(ApiResponse.of("success", "게시물 전체 조회 성공", posts)); } // 테스트 코드 @DisplayName("게시물 전체를 페이징해서 조회해 온다.") @Test void postList() throws Exception { //given String sortProperty = "id"; String direction = "desc"; int pageNo = 0; int pageSize = 10; Pageable pageable = PageRequest.of(pageNo, pageSize, Sort.Direction.DESC, sortProperty); given(postService.getPosts(pageable)).willReturn(Page.empty()); //when ResultActions result = mvc.perform(get("/api/posts") .queryParam("page", String.valueOf(pageNo)) .queryParam("size", String.valueOf(pageSize)) .queryParam("sort", sortProperty + "," + direction)); //then result .andExpect(status().isOk()) .andExpect(jsonPath("$.status").value("success")) .andExpect(jsonPath("$.message").value("게시물 전체 조회 성공")) .andDo(print()); then(postService).should().getPosts(pageable); } 위 테스트 코드를 실행하면 httpstatus 200을 기대했지만 500이 떴다고 테스트 실패를 합니다.위 코드대로면 /api/posts?page=0&size=10&sort=id,desc이렇게 요청이 가는건데, 테스트코드 말고 포스트맨으로 직접 저렇게 요청 보내면 저는 정상적으로 응답이 옵니다 ㅠㅠ왜 저 테스트코드 실행하면 500에러가 나는걸까요..? 500 날만한 곳을 전혀 모르겠습니다 혼자 몇시간동안 끙끙앓다가 질문드립니다 ㅜㅜㅜ
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문할 경우 null값으로 member에 행이 추가되는
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 주문할 경우 따로 오류는 발생하지 않는데 주문 목록을 보면 회원명이 보이지 않습니다. 또한 주문할때마다 member 테이블에 null값으로 행이 하나씩 추가가 됩니다. 오류가 따로 안떠서 어떻게 해결해야할지 몰라 질문드립니다. 구글 드라이브에 파일올립니다..https://drive.google.com/drive/folders/1faJLS1AmApbM9t_cW_olFKj3YLvaBfQg?usp=drive_link
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
외래키 제약 조건
[질문 내용]강의 내용 중 "외래키를 꼭 사용해야할까?" 에 대한 물음에 두 가지 방안을 주셨는데요.빠른 처리가 중요하며 실시간 트래픽이 많은 시스템인 경우 -> "외래키를 사용하지 않는 쪽도 고려해볼만 함"돈이 왔다갔다 하는 등의 reliablity가 중요한 시스템인 경우 -> "외래키를 꼭 사용하라"그렇다면 질문이 있습니다.질문 1. 만약 외래키 제약조건이 관계형 DB에 이미 걸려있는 상태라면 Java 코드상에서는 아무런 설정 없이 비즈니스 로직을 개발해도 되나요?질문 2. 만약 외래키 제약조건이 관계형 DB에 걸려있지 않고 관계형 DB의 성능상의 이슈로 외래키 제약 조건을 애플리케이션에서 해결해야 한다면 해당 로직 또한 개발해야 하나요? 즉, JPA가 외래키 제약 조건을 체크해주는 기능이 있는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컨트롤러 테스트 (예외처리 테스트)
// 컨트롤러 코드 @PostMapping public ResponseEntity<?> postAdd(@RequestBody @Valid PostCreateRequest postCreateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); for (FieldError error: bindingResult.getFieldErrors()) { errorMap.put(error.getField(), error.getDefaultMessage()); } throw new ValidationException("유효성 검사 오류", errorMap); } postService.addPost(postCreateRequest.toEntity()); return ResponseEntity.status(HttpStatus.CREATED) .body(ApiResponse.of("success", "게시글 작성 성공", null)); }// 테스트 코드 @DisplayName("게시물의 제목과 본문을 반드시 작성해야 한다.") @Test void postAddWithoutTitleOrContent() throws Exception { PostCreateRequest post = PostCreateRequest.of("", " "); Assertions.assertThrows(ValidationException.class, () -> { mvc.perform(post("/api/posts") .contentType(MediaType.APPLICATION_JSON_VALUE) .content(mapper.writeValueAsString(post))) .andDo(print()); }); } 위 컨트롤러 코드를 보면 title과 content에 빈 값이 들어가면 ValidationException이 발생하고 유효성 검사 오류가 응답되어야 합니다. 그런데 응답을 보면Body = {"status":"fail","message":"유효성 검사 오류","data":{"title":"must not be blank","content":"must not be blank"}}이렇게 정상적으로 오류 발생 응답이 옵니다. 그런데 assertThrows 테스트코드는 통과하지 못합니다. 그럼 ValidationException이 발생하지 않았다는 뜻인데 응답은 예외가 발생했을 때의 응답입니다. 왜 테스트코드를 통과하지 못하는지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUNIT5 로 테스트시 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]JUNIT5 최신으로 테스트하고 싶어서 JUNIT5 로 테스트중인데요.12:35 시간에서 테스트중인 내용이, 예외 처리가 반대로 되어 질문드립니다. orderCount=9 면 테스트를 통과하고orderCoumt=11 이면 테스트를 통과하지 못합니다. Stock 초과 예외가 발생해야 테스트가 통과되는거 정상인것이 맞나요?이 조건이 맞다면 아래 코드는 왜 반대로 동작하는지 모르겠어서 질문드립니다 ㅜㅜ @Test public void 상품주문_재고수량초과() throws Exception { Member member = createMember(); ItemBook itemBook = createItemBook("시골 JPA", 10000, 10); int orderCount = 9; orderService.order(member.getId(), itemBook.getId(),orderCount); Assertions.assertThrows(NotEnoughStockException.class,() -> orderService.order(member.getId(), itemBook.getId(),orderCount) );
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
parent 와 child 관계
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.parent는 여러 child를 가질수 있기에 OneToMany로 보여지고여러 child는 1명의 부모를 두기에 ManyToOne으로 보이는데 왜 코딩에서는 아래처럼 관계 설정 되어 있는지 이해가 안가네요.@ManyToOne private Category parent; @ManyToOne private List<Category> child = new ArrayList<>();
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컨트롤러단 NotFound 테스트는 어떻게 하나요?
@DisplayName("요청 게시물 ID에 해당하는 게시물이 반드시 존재해야 한다.") @Test void postDetailWithNonExistPostId() throws Exception { //given //when ResultActions result = mvc.perform(get("/api/posts/{id}", 2000)); //then result .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.status").value("fail")) .andExpect(jsonPath("$.message").value("해당 게시물을 찾을 수 없습니다.")) .andDo(print()); }MockMvc로 컨트롤러 테스트를 하고 있습니다.게시물을 조회하는데 id에 해당하는 게시물이 없다면 제가 직접 정의한 EntityNotFoundException이 발생하게 구현했습니다. 이 익셉션이 발생하면 400에러가 발생됩니다.테스트 할 때 id 값을 엉뚱하게 2000으로 주는데 아래와 같이 200OK 가 뜨면서 null 값으로 가져오더라고요. 가져온 게시물은 null 값이면서 왜 id 2000의 게시물이 존재한다고 판단하고 정상적으로 동작하는걸까요?위와 같은 NotFound 예외처리 테스트할 땐 어떤식으로 해야될까요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
개발 방법론에 대한 질문 드립니다!
현재 강의에서 학습하고 있는 개발론을 도메인 주도 설계 DDD 라고 생각해도 무방할까요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberServiceTest Rollback 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 저는 롤백 false를 안해서 자동으로 rollback이 되는데 왜 insert 쿼리가 찍히는걸까요??
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 서비스 테스트를 하고 있는데 어디에서 잘못된건지 잘 모르겠습니다..
package jpabook.jpashop.service; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.Member; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderStatus; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.exception.NotEnoughStockException; import jpabook.jpashop.repository.OrderRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class OrderServiceTest { @PersistenceContext EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 2; //When Long orderId = orderService.order(member.getId(), item.getId(), orderCount); //Then Order getOrder = orderRepository.findOne(orderId); assertEquals("상품 주문시 상태는 ORDER",OrderStatus.ORDER, getOrder.getStatus()); assertEquals("주문한 상품 종류 수가 정확해야 한다.",1, getOrder.getOrderItems().size()); assertEquals("주문 가격은 가격 * 수량이다.", 10000 * 2, getOrder.getTotalPrice()); assertEquals("주문 수량만큼 재고가 줄어야 한다.",8, item.getStockQuantity()); } @Test(expected = NotEnoughStockException.class) public void 상품주문_재고수량초과() throws Exception { //... } @Test public void 주문취소() { //... } private Member createMember() { Member member = new Member(); member.setName("회원1"); member.setAddress(new Address("서울", "강가", "123-123")); em.persist(member); return member; } private Book createBook(String name, int price, int stockQuantity) { Book book = new Book(); book.setName(name); book.setStockQuantity(stockQuantity); book.setPrice(price); em.persist(book); return book; } } 예상 개수가 8개이고 결과는 2개가 나오는데 이게 어디서 수정을 해줘야 할 지 감이 안 잡힙니다.. java.lang.AssertionError: 주문 수량만큼 재고가 줄어야 한다. Expected :8Actual :2<Click to see difference> at org.junit.Assert.fail(Assert.java:89) at org.junit.Assert.failNotEquals(Assert.java:835) at org.junit.Assert.assertEquals(Assert.java:647) at jpabook.jpashop.service.OrderServiceTest.상품주문(OrderServiceTest.java:47) 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.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:76) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) 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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 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 - 웹 애플리케이션 개발
category 엔티티에선 부모 객체가 왜 필요한건가요?
현재 실전 스프링부트와 jpa활용1편을 수강중입니다. 엔티티 클래스 개발2 에서 카테고리 클래스를 만들 때, 부모 객체는 왜 생성하는지 이해가 되지 않습니다..! 이미 카테고리 클래스 자체가 부모 클래스가 되는게 아닌가요..?
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
entity를 다만들고 실행을 해보는데 자꾸 에러가 나오는데 해결을 못하겠습니다.
jpa활용 강의를 듣던중에 entity를 다 만들고 실행을 해보는데 에러가 나오긴하는데 어떤게 문제인지 정확히 잘 모르겠습니다.. 실행하면 실행되다가 에러메시지가 나오면서 바로 종료되버리는데 뭐가 문제인지 모르겠습니다ㅠㅠ그리고 구글 드라이브 업로드로 파일을 올리려고 했는데 자꾸 gradle. 경로를 찾을 수 없다고 압축이 안됩니다.. 그래서 일단 메시지로 올려봅니다.Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-01-07T20:07:18.943+09:00 ERROR 1872 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Property 'jpabook.jpashop.domain.Delivery.status' is annotated '@Enumerated' but its type 'jpabook.jpashop.domain.DeliveryStatus' is not an enumat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1775) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1173) ~[spring-context-6.1.1.jar:6.1.1]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:936) ~[spring-context-6.1.1.jar:6.1.1]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) ~[spring-context-6.1.1.jar:6.1.1]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0.jar:3.2.0]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) ~[spring-boot-3.2.0.jar:3.2.0]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) ~[spring-boot-3.2.0.jar:3.2.0]at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) ~[spring-boot-3.2.0.jar:3.2.0]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1342) ~[spring-boot-3.2.0.jar:3.2.0]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1331) ~[spring-boot-3.2.0.jar:3.2.0]at jpabook.jpashop.JpashopApplication.main(JpashopApplication.java:10) ~[classes/:na]Caused by: org.hibernate.AnnotationException: Property 'jpabook.jpashop.domain.Delivery.status' is annotated '@Enumerated' but its type 'jpabook.jpashop.domain.DeliveryStatus' is not an enumat org.hibernate.boot.model.internal.BasicValueBinder.prepareBasicAttribute(BasicValueBinder.java:805) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.BasicValueBinder.setType(BasicValueBinder.java:374) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.makePropertyAndValue(PropertyBinder.java:261) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:297) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.createBasicBinder(PropertyBinder.java:1169) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.bindBasic(PropertyBinder.java:1071) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.bindProperty(PropertyBinder.java:890) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.buildProperty(PropertyBinder.java:788) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.PropertyBinder.processElementAnnotations(PropertyBinder.java:709) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.EntityBinder.processIdPropertiesIfNotAlready(EntityBinder.java:977) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.EntityBinder.handleIdentifier(EntityBinder.java:305) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:231) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:422) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:255) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:278) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:321) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1432) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.1.jar:6.1.1]at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[spring-orm-6.1.1.jar:6.1.1]at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.1.jar:6.1.1]at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.1.jar:6.1.1]at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[spring-orm-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1822) ~[spring-beans-6.1.1.jar:6.1.1]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771) ~[spring-beans-6.1.1.jar:6.1.1]... 16 common frames omittedProcess finished with exit code 1
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2에 테이블 생성이 안돼요...ㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]프로젝트 환경설정을 마치고 프로젝트를 돌려봤습니다.똑같이 따라하면서요.그런데 사진과 같이 create문까지 잘 나오는데 h2에 테이블이 안보여요문제가 뭘까요? ㅠㅠ 주의 사항도 다 보면서 버전업 시켰는데도 안되네요..하루종일 구글링하고 찾아봐도 모르겠어요 도와주시면 감사하겠습니다
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
TransactionContext 로그가 안 찍히는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 화면을 보면 TransactionContext 에서" Rolled baxk transaction for test : .."라는 로그가 있는데제 거는 안 찍히면 어떤 문제일까요?
- 해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 데이터베이스 설치 강의에 연결 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]H2 데이터베이스 설치 강의에서 jpashop.mv.db 파일 생성 확인 후 JDBC URL: 변경을 하면 Connection is broken: "java.net.ConnectException: Connection refused: no further information: localhost" [90067-224] 이라는 에러가 뜨면서 연결되지 않습니다. 어떻게 해결해야 될까요?
- 미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Java HotSpot 에러가 뜹니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.jar빌드도 되고 다 member테이블도 생겼습니다. 그런데 마지막 단계에서 계속 이런 오류가 뜨면서 쿼리파라미터 로그는 확인할 수 없는데요, 어느 부분이 잘못되었는지 모르겠습니다ㅠㅠ제가 적은 코드입니다 (Junit5로 진행했습니다)package jpabook.jpashop; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional // test에 있으면 test 끝난 뒤 바로 롤백함 -> 테스트 조회 불가능 @Rollback(false) // 롤백 안되게! public void testMember() throws Exception { // given Member member = new Member(); member.setUsername("memberA"); // when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); // then assertEquals(findMember.getId(), member.getId()); assertEquals(findMember.getUsername(), member.getUsername()); assertEquals(findMember, member); // 같은 트랜잭션 안에서는 영속성 콘텍스트가 같음 => id가 같으면 같은 엔티티로 식별함 System.out.println("findmember == member: " + (findMember == member)); } }spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create #application 실행 시점에 기존에 있으면 drop하고 없으면 자동으로 테이블 생성 properties: hibernate: # show_sql: true #sysout으로 확인 -> logger로 확인할 것이므로 생략하자! format_sql: true logging: level: org.hibernate.SQL: debug #logger로 확인: hibernate가 생성하는 모든 sql문이 debug로 확인가능 org.hibernate.type: trace #쿼리 파라미터 로그 남기기감사합니다!