묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 인메모리 데이터베이스 눈으로 확인
강의를 들으면서 h2 인메모리 기능을 보고 매우 좋은 기능이라고 생각이 들었습니다.한편 "인메모리 h2 데이터베이스도 @Test를 이용해 삽입한 데이터를 눈으로 확인할 수 있을까?"에 대한 궁금증이 남더라구요.궁금해서 테스트해보았는데 데이터가 남지 않더라구요. 1. main의 application.yml에서 h2를 인 메모리로 바꾸고 서버를 실행하였습니다. (서버를 메모리상에서 계속 실행시켜두고 싶었습니다.)2. http://localhost:8080/h2-console에 들어가보니 테이블이 정상적으로 생성된걸 확인할 수 있었습니다.3.test의 application.yml애서 h2를 인메모리로 바꾸었습니다.->test의 application.yml의 ddl-auto를 none으로 하니 main에서 스프링을 실행시켜 서버를 구동하고 테이블을 만들었음에도 불구하고 Test는 서버를 찾지 못한다. 즉 main의 인메모리 서버와 Test의 인메모리 서버는 application.yml에서 이름을 동일하게 했음에도 작동을 안하는것을 보면 Test의 h2(인메모리)와 main의 h2(인메모리)는 독자적으로 작동한다.4.Test의 회원가입을 ROLLBACK을 false로 바꾸고 실행해 보았습니다. (이때 서버가 인메모리가 아닌 경우,즉 일반 TCP h2 서버에는 데이터가 테스트이후에도 남아있었습니다.)(Test의 ddl-auto는 create)->main(실제어플리케이션)와 @Test의 h2인메모리는 서로 다르기 때문에 ddl-auto값이 none이였으면 실패했을것이고 create이기때문에 테이블을 만들 수 있어 테스트가 실패하지않고 진행되었다.5.확인해보니 h2 인메모리 서버에는 데이터가 남아있지 않았습니다.->h2인메모리는 @Test와 main(실제어플리케이션)에서 각자 독자적으로 실행되기때문에 남지않는다.->h2를 인메모리로 할 경우 Test가 끝나면 삽입했던 데이터를 메모리에서 삭제해버리기때문에 ROLLBACK을 false로 해도 인메모리 h2 서버에는 데이터가 남지 않는다.즉 tcp h2서버를 사용할때 @Test에서 rollback을 false로 해두면 데이터베이스에 데이터가 삽입된걸 눈으로 확인 할 수 있지만 @Test에서는 애초에 main과 다른 h2인메모리를 사용하고 테스트가끝나면 @Test의 인메모리h2를 삭제해버리기 때문에 눈으로 확인할 수 없다라고 이해를 했는데 옳바른 이해일까요?한편으로 데이터가 데이터베이스에 삽입 삭제하는걸 눈으로 확인 하고 싶을 것 같은데 h2데이터 베이스를 인메모리로 두면 확인이 안될것 같아서 불안할 것 같더라구요. 만약 현업에서 테스트를 한다면 인메모리보다는 아예 개발DB를 두고 테스트를 하기때문에 이러한 고민은 안해도 되는게 맞는거겠죠?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
용어 관련 질문입니다.
public int add(int a, int b){ ... }이렇게 메서드를 정의할 때 a와 b를 파라미터 내지는 인자라고 부르는데,@ResponseStatus(code= HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류")애너테이션에서 중괄호를 사용해 code = ... , reason = ... 데이터를 추가할 때 추가되는 요소들은 뭐라고 부르나요?code나 reason을 부르는 어떻게 불러야 하는지 궁금합니다.감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Formatter적용에서 locale 정보
Formatter를 이용하여 문자 변경시 테스트는 따로 ko로 설정을 하고 WebConfig에 적용하고 실행 할 때는 하지 않았는데 어떻게 locale 정보가 ko로 나오는건가요? 강사님 설명이나 자료를 찾아봐도 이것에 대한 설명은 없어서 질문 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서버와 클라이언트
개념이 잠깐 헷갈려서 질문드립니다.모바일이나 웹 페이지에서는 서버와 클라이언트가 명확하게 구분되는데..서버 간의 통신이나 시스템 간의 통신에서는 서버와 클라이언트를 어떻게 구분하나요?웹 페이지에서의 표현을 빌려 사용하면서버 간의 통신에서는 요청하는 서버를 클라이언트로 간주하고, 응답하는 서버를 서버로 간주하면 괜찮을까요?서버와 클라이언트라는 개념에서, 서버는 응답하는 요소 / 클라이언트는 요청하는 요소로 이해해도 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원가입 테스트 오류 발생 문의
안녕하세요,테스트 진행 중 오류가 발생하여 문의드립니다.회원가입을 테스트할 때 @Transactional을 주석처리하면 정상 작동되지만, 활성화하면 오류가 발생합니다.java.sql.SQLException: Connection is closed이것은 JdbcMemberRepository의 sava() 작성 내용입니다.@Transactional을 활성화하면 오류가 발생하는 원인과 해결 방법이 궁금합니다..!!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 WebDataBinder와 Model관련해서 궁금한 점이 있습니다.
안녕하세요 항상 좋은 강의 만들어주셔서 감사합니다.강의 자료를 보다,강의 내용과는 조금 거리가 있을수도 있지만, 궁금한 점이 생겨 질문드립니다.강의자료에서는 "WebDataBinder 는 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다." 라고 되어 있는데 그러면 public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model)해당 부분에서 파라미터로 넘어오는 데이터들은 @Validated에 의해서 검증기가 동작하면서 WebDataBinder 에 담기고 @ModelAttribute에 의해 model에도 담기게 되는건가요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
setter에 대해서 궁금점이 있습니다.
안녕하세요! 강의를 잘 듣고 있는 신입 개발자입니다 ㅎㅎㅎ..setter 사용에 대해서, 궁금한 점이 있습니다.우선, 저는 setter 사용이 왜 안좋은지에 대해서 명확한 답을 얻지 못했습니다. 심지어 Java로 개발된 여러 프레임워크나 라이브러리 등에서 많은 setAttribute와 같은 메서드가 사용되는 것을 보았기 때문입니다. 심지어 Spring 역시도요.여러 블로그에 해당 주제에 대해 찾아보면 다음과 같은 이유가 나옵니다.변경된 의도를 파악하기 어렵다.객체의 일관성을 유지하기 어렵다.어떤 class의 프로퍼티를 변경하려면 결국은 해당 클래스의 특정 메서드를 통해 변경을 해야합니다. 일반적으로 class의 변수는 private하게 선언되기 때문에요,즉 setAttribute를 쓰지않는다면,updateAttribute와 같은 별도의 메서드를 생성해서 변경해야 합니다.1. 변경된 의도를 파악하기 어렵다 의 이유라면, updateAttribute와 같은 메서드와 setAttribute와 같은 메서드의 readability의 차이가 있다는 말로 귀결되는데, 사실 저희가 setter에 대한 거부반응을 모두 지우고 두 메서드를 바라본다면 저는 차이를 느끼기 어렵습니다. 혹시 아닌가요...?2. 객체의 일관성을 유지하기 어렵다. 의 이유라면, 객체를 Immutable하게 유지하기 위함인데, 때에 따라서는 이러한 전략이 필요하지만 그렇지 않다면, 객체 값(프로퍼티)의 변경이 발생할 때 마다 새로운 인스턴스를 생성해야 한다는 말이 됩니다. 이거는... 많이 변경되어야 하는 객체라면 메모리 문제가 너무 커지지 않을까요?개인적으로 Builder와 생성자에 관한 것은 해당 문제와 연관성이 별로 없다고 생각하기 때문에, 위 두가지 이유가 결국 근거라고 생각해요. 강사님 역시 setter에 대해 사용하지 않는 것을 권고한다고 말씀하셔서, 혹시 어떤 명확한 이유인지 궁금해서 여쭤보고 싶습니다.
-
해결됨실전! 스프링 데이터 JPA
EntityGraph 이용시 컬렉션 페치조인의 경우 질문
안녕하세요!JPQL로 엔티티 페치조인이 아닌 , 일대다 입장에서 컬렉션 페치조인을 할 경우 -> 데이터 뻥튀기 문제가 발생하여 distinct 키워드로 뻥튀기된 데이터를 없애주어야 했느데요 , EntityGraph를 이러한 컬렉션 페치조인에 사용하여도 distinct를 쓴것 처럼 데이터 뻥튀기 문제가 발생하지 않는지 궁금합니다. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
컨트롤러에서 컨버터 사용
컨버터를 등록하면 컨트롤러에서 자동으로 컨버터가 작용되는데이 작동을 컨트롤 할수 있을까요 ??어떤 경로로 들어올땐 컨버터를 작용,어떨때는 미작용이런식으로 가능한가요 ??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터와 필터
인터셉터와 필터를 함께 사용하는것도 가능한가요?필터로는 로그를 찍게 하고, 인터셉터로는 로그인을 확인한다던지..둘 중 하나만 쓰는게 합리적인것 같긴 한데.. 혹시 가능하다면 현업에서 두 가지를 함께 사용하는 경우가 있나요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Propagation.REQUIRES_NEW 를 사용하는 이유가 무엇인가요?
안녕하세요! 선생님.다른 락에서는 트랜잭션에 Propagation.REQUIRES_NEW 를 사용하지 않았는데 namedLock 에서는 왜 사용하나요?
-
미해결실전! 스프링 데이터 JPA
아래 질문 글 Yong.K 님의 질문의 답변에 관한 질문글 입니다 - flush관련
아래 질문글 Yong.K 님의 글에 대한 답변으로 ,JPQL이 실행되기 전 flush가 되지만이때 flush는 em.flush() 처럼 영속성 컨텍스트를 완전히 flush 시키는 것이 아니라 ,실행될 JPQL과 관련된 엔티티만 부분적으로 fluish 시키는 것이라고 설명해주셨습니다.하지만 이렇게 부분적으로만 flush 시킨다면 ,벌크연산 후 clearAutomatically에 의해 영속성 컨텍스트가 비워져 버리면 문제가 생길 수 있어,벌크연산의 옵션으로 flushAutomatically가 있고 - 이 옵션을 활성화 시키면 em.flush()를 호출한 것 처럼 완전히 flush 되는것으로 이해하였습니다. 그렇다면 벌크연산 사용시 flushAutomatically 옵션을 비활성화 시키고 - clearAutomatically 옵션만을 활성화 시킨다면 여전히 문제가 발생할 여지는 남아있는 것이 맞는지 궁금합니다.즉 그렇다면 결과적으로 clearAutomatically 옵션만 활성화 시키는게 아니라 , flushAutomatically 옵션도 함께 활성화시켜야 하는것은 아닌지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
공통관심사항 메소드들 호출궁금한게 있습니다
서블릿 필터 destroy()메소드는 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.라고 알고있는데 이경우 Dispatcher Servlet의 종료직전 호출된다는 의미인가요? 만약 맞다면 필터의 메소드들의 종료시점은 Dispatcher Servlet 호출 이후일수도 있으니 아래 순서가 틀릴수도 있다는 뜻인지 궁금합니다HTTP 요청 -> WAS -> 필터 -> Dispatcher Servlet-> 컨트롤러(핸들러)
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
MySQL과 Redis의 성능에 관하여 문의드립니다.
MySQL의 특징으로 어느 정도의 트레픽까지는 문제없이 활용 가능하다라고 설명해주셨는데 어느 정도를 수치로 말씀해주실 수 있을까요?그리고 Redis가 MySQL보다 절대적으로 성능이 뛰어난지, 아니면 특정 트래픽 이상부터 성능이 뛰어난게 체감이 되는건지도 궁금합니다.그리고 성능이라고 표현하신게 비용 대비 퍼포먼스인지, 속도만 놓고봤을 때 더 빠르다인지 모호한 감이 있어서 구체적으로 말씀해주시면 정말 감사하겠습니다.좋은 강의 촬영해주셔서 감사합니다. 다음 강의도 기대하고 있겠습니다!
-
미해결스프링 핵심 원리 - 기본편
MemberApp 실행
회원 도메인 실행과 테스트 부분에서 MemberApp 클래스에 public static void main(String args[]) 를 만들고 여기서 실행하는 것은 이해했습니다.그런데 기존의 CoreApplication 에도 메인 메서드가 있어서 프로젝트에 메인 메서드가 2개이고 이렇게 프로젝트가 구성이 되어도 실행하는데 문제가 없는건가요??
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
글 수정 오류 질문드립니다.
ㄷ원래 잘 되었다가. 이번 챕터진행하고 확인해보니 안되고 있습니다. console.log 찍어서 값 잘 변경되는지 확인했고 컨트롤러에서 dto를 찍으니 전부 널 값이 들어가있는데 ajax에 문제가 있는 건가요?
-
미해결
김영한님 로드맵 관련 질문
안녕하세요 자바 지식은 알고 있는데 김영한님의 스프링부트 로드맵부터 들을지 스프링 로드맵부터 들을지 모르겠습니다. 10월달부터 회사에서 스프링부트를 쓰는데 우선순위를 어디에 둬야할지요.... 답변 부탁드립니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO를 이용해서 변경감지를 이런 식으로 하는지 검토 부탁드려요!
안녕하세요, 강의에는 나오지 않았지만 변경감지를 병합보다 추천하셔서 DTO를 사용해서 한 번 짜보았는데 봐주실 수 있나요? ```java package jpabook.jpashop.service;import lombok.Getter;import lombok.Setter;@Getter @Setterpublic class UpdateItemDto { private Long id; private String name; private int price; private int stockQuantity; private String author; private String isbn;}```일단 UpdateItemDto는 간단히 Getter, Setter만으로 구성했습니다. @PostMapping("items/{itemId}/edit")public String updateItem(@PathVariable("itemId") Long itemId, @ModelAttribute("form") BookForm form) { UpdateItemDto updateItemDto = new UpdateItemDto(); updateItemDto.setId(form.getId()); updateItemDto.setName(form.getName()); updateItemDto.setPrice(form.getPrice()); updateItemDto.setStockQuantity(form.getStockQuantity()); updateItemDto.setAuthor(form.getAuthor()); updateItemDto.setIsbn(form.getIsbn()); itemService.updateItem(itemId, updateItemDto); return "redirect:/items";}위 코드는 ItemController 안의 updateItem 메소드입니다.@Transactionalpublic void updateItem(Long itemId, UpdateItemDto updateItemDto) { Item findItem = itemRepository.findOne(itemId); //findItem으로 찾아온 값은 영속상태 findItem.change(updateItemDto);}위 코드는 ItemService 클래스의 updateItem 메소드입니다. public void change(UpdateItemDto updateItemDto) {// if (updateItemDto.getId() != null) {// this.id = updateItemDto.getId();// } if (updateItemDto.getName().length() != 0) { this.name = updateItemDto.getName(); }// if (updateItemDto.getPrice() != null) {// this.price = updateItemDto.getPrice();// }// if (updateItemDto.getStockQuantity() != null) {// this.stockQuantity = updateItemDto.getStockQuantity();// } this.price = updateItemDto.getPrice(); this.stockQuantity = updateItemDto.getStockQuantity();// if (updateItemDto.getAuthor() != null) {// this.author = updateItemDto.getAuthor();// }// if (updateItemDto.getIsbn() != null) {// this.isbn = updateItemDto.getIsbn();// } }마지막으로 Item 클래스의 change 메소드입니다.Book의 상위 클래스이기 때문에 author과 isbn 필드가 없어서 이 change 메소드를 Book 클래스 내로 옮겨야 하는지 고민을 했습니다.그러나 그렇게 진행하면 부수적인 문제가 너무 많이 생겨 그냥 Item 클래스 내에 남기고 author와 isbn을 수정하는 기능은 없앴습니다.id는 바꿀 필요가 없다고 생각하여 기능을 뺐습니다. Form에도 id를 수정하는 란은 없는데기존에 영한 님이 강의하실 때 ItemController 내에서 book.setId(form.getId)); 하셨는데 잘못된 부분인 것 같습니다.name같은 경우 String이라 웹 상에서 수정을 할 때 빈 칸으로 두면 null보다 empty string으로 받는 것 같아서updateItemDto.getName() != null 조건에 안 걸리는 것 같더라구요. 그래서 빈 칸을 empty string을 찾는 식으로짰습니다. 마지막으로 price와 stockQuantity는 int라서 != null 조건을 걸수가없는데웹 상에서 빈 칸일 때 이전 price와 stockQuantity를 유지하는 방법을 여쭤보고 싶습니다.결론적으로 제 질문은:1. UpdateItemDto의 경우 controller 패키지의 BookForm과 이름 외에 똑같은데 그래도 DTO 클래스를 따로 만드는데 의의가 있는건가요?2. ItemController 내에서 어설프게 Entity를 생성하지 말라고 하셨는데 DTO 객체를 생성하는 것은 괜찮은가요?3. 전반적으로 이런 방식으로 변경감지를 하는건지가 궁금합니다.4. change 메소드를 Item 밑에 두는게 맞는지 Book 밑에 두는게 맞는지?답변 주시면 정말 큰 도움이 될 것 같습니다.감사합니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
component scan 범위 지정관련 문의 드립니다.
service, repository interface에 직접 Bean 으로 DI 를 위하여 scan 범위를 controller 만 잡는다는 의미를 정확하게 이해하고 싶어서요. scan 범위를 제거한다면 @service, @repository 에 의해서 모든 서비스와 레포지토리가 대상이 되고 Spring container에 등록은 되지만 수동으로 등록하는 Bean(MemoryConfig)에 의해ItemService와 ItemRepository에 주입되어 타입이 정해지는걸로 이해하는데요. scan 범위를 지정한것은 불필요한 service, repository가 bean으로 등록되는것을 막기위한 효율의 측면인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Failed to load ApplicationContext 에러
에러 코드 전문 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) 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.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) 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:190) 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)Caused by: mapping values are not allowed here in 'reader', line 10, column 15: properties: ^ at org.yaml.snakeyaml.scanner.ScannerImpl.fetchValue(ScannerImpl.java:910) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:400) at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251) at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:628) at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166) at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:59) at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:45) at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:140) at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:119) at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:214) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:184) at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:314) at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:305) at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:286) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:188) at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:314) at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:305) at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:286) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:188) at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:115) at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:135) at org.springframework.boot.env.OriginTrackedYamlLoader$OriginTrackingConstructor.getData(OriginTrackedYamlLoader.java:99) at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:514) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:198) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166) at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:84) at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54) at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36) at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:107) at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:128) at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86) at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116) at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240) at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85) at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344) at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:132) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ... 27 more 환경설정 1.yml spring:datasource:url: jdbc:h2:tcp://localhost/~/jpashopusername: sapassword:driver-class-name: org.h2.Driverjpa:hibernate:ddl-auto: createproperties:hibernate:# show_sql: trueformat_sql: truelogging.level:org.hibernate.SQL: debug2.gradleplugins {id 'org.springframework.boot' version '2.7.3'id 'io.spring.dependency-management' version '1.0.13.RELEASE'id 'java'}group = 'jpabook'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'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.2'compileOnly 'org.projectlombok:lombok'runtimeOnly 'com.h2database:h2'annotationProcessor 'org.projectlombok:lombok'testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') {useJUnitPlatform()} 해결을 위해 시도했던 것들 1. yml에 ;MVCC=TRUE를 삭제해보았다. (X) 2. h2 DB가 실행되지 않아서 발생할 수 있다는 답변을 보고 켜보았다. (X) 3. yml을 복붙해서 다시 실행해보았다. (X) 4. Test에 @WebAppConfiguration 어노테이션을 추가해보았다. (X)