묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 부트 - 핵심 원리와 활용
SEVERE: A child container failed during start LifecycleException: Failed to start component 해결방법
java -jar embed-0.0.1-SNAPSHOT.jar 시아래와 같이 에러가 발생하는 경우org.apache.catalina.core.ContainerBase startInternal SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@247bddad] at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:252) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:430) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:926) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) at hello.embed.EmbedTomcatSpringMain.main(EmbedTomcatSpringMain.java:36) Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@247bddad] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4829) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4962) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ... 16 more Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\embed\build\libs\tomcat.8080\webapps\] is not valid at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:777) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:734) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 25 moremain 클래스에 코드를 수정하면 정상적으로 에러가 발생하지 않습니다.public class EmbedTomcatSpringMain { public static void main(String[] args) throws LifecycleException, IOException { System.out.println("EmbedTomcatSpringMain.main"); // 톰캣 설정 // 톰캣 설정 Tomcat tomcat = new Tomcat(); ... // 스프링 MVC 디스패처 서블릿 생성, 스프링 컨테이너 연결 ... String docBase = Files.createTempDirectory("tomcat-basedir").toString(); // 디스패처 서블릿 등록 Context context = tomcat.addContext("", docBase); ... tomcat.start(); } } 참고)맥북 사용자가 아닌 윈도우 사용자이기 때문에윈도우에서 나타나는 에러를 공유드렸습니다.맥북은 따로 확인하지 못하기 때문에 공유한 부분에 대해 양해해주세요.
-
미해결스프링 부트 - 핵심 원리와 활용
NoClassDefFoundError가 아닌 UnsupportedClassVersionError가 뜨는 경우 해결방법
NoClassDefFoundError가 아닌 UnsupportedClassVersionError가 발생하는 경우 java 버전이 하위 버전인 경우일 때 나타나는 것을 확인했습니다.자바 17 버전으로 하셔야 강의처럼 NoClassDefFoundError가 나타납니다.아래는 8, 11 버전에 대한 에러를 확인해서 공유드립니다ㅎㅎError: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: hello/embed/EmbedTomcatSpringMain has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)위의 에러는 java8 버전일 때 나타나는 에러입니다.Error: LinkageError occurred while loading main class hello.embed.EmbedTomcatSpringMain java.lang.UnsupportedClassVersionError: hello/embed/EmbedTomcatSpringMain has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0위의 에러는 java11 버전일 때 나타나는 에러입니다. 프로젝트랑 환경변수가 java17로 되어 있어도 cmd나 터미널을 이용해서 자바버전을 확인하세요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
8:41 질문
@PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } 파라미터로 들어온 값으로 UpdateMemberResponse를 만들어주지 않고 memberService.findOne을 통해 하는 이유가 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult typemismatch, ExceptionResolver TypeMismatchException
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]BindingResult에서 처리된 typemismatch와 ExceptionResolver강의에서 처리하는 TypeMismatchException의차이가 궁금해요.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
변경감지를 통한 데이터 변경에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 김영한님 JPA강의를 모두 듣고 개인프로젝트를 하던 중에 궁금한 점이 생겨서 질문 올리게 되었습니다.김영한님께서 데이터의 업데이트는 변경감지를 통해서 하는 것이 좋다고 말씀하셨던 게 기억이 나는데요. 물론 변경감지만을 이용하라는 말씀은 아니시겠지만 변경감지를 통한 업데이트를 어디까지 사용해야 하는 가에 대해서 좀 의문이 생겼습니다.예를 들어 이런 경우입니다.회원이 게시판을 조회하면 조회수를 조회수를 증가시키는 로직인데요. (조회수 증가와 게시판 조회를 서로 다른 트랜잭션으로 했음)이럴 때에 변경감지를 통해서 조회수를 증가시킬 경우에 변경감지를 통해 변경된 값이 그대로 update되는 형태를 취하는 것인데, 이럴 경우 요청이 한 번에 많이 들오면 update순서가 보장되지 않아 정확한 조회수 증가가 이뤄지지 않을 것 같았습니다. 하지만 그렇다고 LOCK을 걸자니 조회수 하나 때문에 게시판 조회까지 LOCK이 걸려 조회 속도를 낮추는 것도 문제인 듯 하였습니다. 생각해 보면 이러한 조회수 증가는 쿼리를 UPDATE .. SET column = column +1 이런 식으로 만들고 처리하면 현재 컬럼의 값을 기준으로 1씩 증가하기 때문에 LOCK을 걸 필요도 없고 순서에 상관없이 일관된 값이 보장될 것 같은데 변경감지를 통해 값을 업데이트 하는 방식을 사용하면 현재 조회된 Entity의 조회수 값에 1을 추가하고 그 값으로 직접 UPDATE되는 형태라서 문제가 된 것이 아닐까 싶었습니다.이런 경우 UPDATE쿼리를 따로 날려 주는 방식이 더 효율적인 방식이 맞을까요? 실무에서는 어떤 방식을 취하고 있는 지 궁금합니다..!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@ModelAttribute 질문
@PostMapping("/members/new") public String create(@Valid @ModelAttribute MemberForm form, BindingResult result) { if (result.hasErrors()) { return "members/createMemberForm"; } Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode()); Member member = new Member(); member.setName(form.getName()); member.setAddress(address); memberService.join(member); return "redirect:/"; }@GetMapping("/members/new") public String createForm(Model model) { return "members/createMemberForm"; }이런식으로 @ModelAttribute를 사용하여 코드를 짜보려고 하니 에러가 나왔고, 아마 html에서 memberForm 객체가 없어서 이용하지 못했고, 결국 매핑에 문제가 생겨 출력(?)을 하지 못해서 그런 것 같은데 예전 스프링 MVC강의에서는 @ModelAttriute를 이용해 코드를 잘 작성했던 거 같은데 왜 이번 강의에서는 사용하지 않았는지 궁금합니다. @PostMapping("/members/new") public String create(@Valid MemberForm form, BindingResult result) { MemberForm이 어떻게 파라미터로 받을 수 있는지 궁금합니다. (이미 Model에 객체가 있으면 파라미터로 받듯이 받을 수 있는 건지?) 위의 코드를 이용해서 웹페이지를 만드려면 createMemberForm.html 에서<form role="form" action="/members/new" th:object="${memberForm}" method="post">이부분 대신 html 파라미터를 넘겨주는 식으로 고쳐야하는 것 일까요? html을 잘 몰라 질문드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서는 find 메서드를 만들지 않은 이유가 따로 있나요 ?
ItemService에서는 ItemRepository의 기능을 위임받아 저장 및 검색 기능을 구현했는데OrderService에서는 검색기능을 구현하지 않았더라구요. ItemService에서 위임 받는 것 처럼 하면 간단할 것 같은데 굳이 만들지 않고 OrderRepository의 findOne기능을 사용하는 이유가 따로 있는 것일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test/resources/application.yml이 없으면
main/resources/application.yml 을 따라가게 되는 건가요 ? 자바에서는 디비를 사용하고 싶고, test에서만 메모리 DB를 사용하고 싶다면 아무런 내용이 없는 application.yml를 test/resources 아래 생성만 하면 되는 건가요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드와 CASCADE의 관계
//==연관관계 메서드==// 가 주석으로 달린 메서드들이 연관관계에 있는 객체에 값을 넣어줄 때 반대편에도 자동으로 값을 넣어주는 역할을 하는 메서드가 맞나요? 이렇게 따로 메서드를 구현해주는 이유가 있나요? CASCADE 옵션을 사용하면 어차피 알아서 다 해주지 않나요 ?? 기본편에서 설명해주셨다고 했는데 어떤 강의를 다시 수강해보면 될까요 ? 지연로딩에서 ***ToMany의 디폴트는 Lazy고, ***ToOne의 디폴트는 Eager인 이유가 ***ToMany같은 경우 하나만 불러와도 기본적으로 수많은 값이 따라오기 때문에 스프링 측에서 Lazy로 해놓았고, (Member의 Order을 조회하면 수많은 Order이 자동으로 따라오기 때문에 디폴트가 Lazy) ***ToOne의 경우 객체 하나만 조회하면 쿼리문을 하나밖에 더 날리지 않기 때문에 Eager로 해놓았지만, 실무에서는 테이블 전체를 조회할 때가 있기 때문에 디폴트값인 Eager를 쓰지 않고 Lazy를 사용한다 이게 맞을까요? (Order하나만 조회하면 Member 1개만 따라오기때문에 디폴트가 Eager지만, select o from Order o 와 같은 쿼리문으로 Order를 전체 조회했을 때는 Order에 따른 멤버가 전부 따라오므로 그냥 Lazy 옵션을 준다) 이렇게 이해했는데 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티와 테이블 설계 및 Category 클래스 질문입니다
기본편에서 관계에 따른 연관관계 설정하는 방법은 공부했는데, 위와 같은 기능 목록을 보고 기능목록을 보고 위와 같이 어떤 도메인을 써야 할지, 도메인끼리 1:N인지, N:N인지, 1:1인지 단방향인지, 양방향인지(실무에서는 N:N과 양방향은 지양하라고 하셨지만) 등 도메인 모델과 테이블 설계가 어렵다면 무엇을 참고하는 것이 좋을까요 ? ( 영한님이 분석해 놓은 회원 엔티티와 회원 테이블을 보고 코드를 작성할 순 있는데 스스로 회원 엔티티와 테이블을 분석하기가 너무 어렵습니다.) Category 클래스 안에서 스스로 일대다 관계를 맺고 있는데 이것은 무엇을 위해 만든건가요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category - Item 관계
카테고리 : 과일, 빨강, 노랑 // 아이템 : 사과, 배, 체리이렇게 존재할 때==================과일 -> 사과 배 체리빨강 -> 사과 체리노랑 -> 배==================사과 -> 과일 빨강배 -> 과일 노랑체리 -> 과일 빨강==================사과(아이템)같은 경우 과일과 빨강이라는 카테고리에 속해있고,과일(카테고리)같은 경우 사과 배 체리라는 아이템이 속해있기 때문에다대다 관계가 맞나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
static/index.html 은 Mapping을 안해줬는데도 되는 이유가 무엇인가요 ?
@GetMapping("/") public String index() { return "index"; } 이런 소스 없이 자동으로 localhost:8080 들어가면 Index.html로 연결되는 이유가 무엇일까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@BeforeEach, @AfterEach 작동방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님.@Transactional과 관련해서 @BeforeEach가 어떻게 작동하는지 궁금해서 테스트를 좀 해봤는데요.@SpringBootTest class Test { @BeforeEach void before() //데이터 저장로직 존재 @Transactional @Test void count() //before()에서 저장된 데이터 개수와 비교검증 }위와 같은 테스트 클래스를 만들었습니다.제가 생각하는 테스트 흐름은 아래와 같습니다.//테스트 시작 before(); //데이터1, 데이터2 저장 //트랜잭션 시작 count(); //데이터 개수가 2이어야 테스트 성공 //트랜잭션 종료. 롤백 //테스트 종료before()가 트랜잭션 범위 밖에 있기 때문에 저장한 데이터가 롤백되지 않을거라 예상했습니다.그런데 실제로 테스트를 진행해보니 정상적으로 롤백이 되더라구요.왜 그런지 생각을 곰곰히 해봤는데단순히 각 테스트케이스 실행 전에 @BeforeEach를 따로 실행시켜주는 것이 아니라@SpringBootTest class TestProxy { Test target; void count() { 트랜잭션 시작(); if (@BeforeEach가 있으면) { target.before(); } target.count(); 트랜잭션 종료(); } }위처럼 트랜잭션 AOP 프록시에 before()가 직접 삽입되기 때문에 각 테스트케이스의 트랜잭션 안에서 before()가 실행되는 것으로 이해하면 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 등록
<BookForm>@Getter @Setter public class BookForm { private Long id; private String name; private int price; private int stockQuantity; private String author; private String isbn; } <Controller>@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:/"; } <Service>@Service @RequiredArgsConstructor @Transactional(readOnly = true) public class ItemService { private final ItemRepository itemRepository; public void saveItem(Item item){ itemRepository.save(item); } public Item findOne(Long itemId){ return itemRepository.findOne(itemId); } public List<Item> findAll(){ return itemRepository.findAll(); } } <Repository>@Repository @RequiredArgsConstructor @Slf4j public class ItemRepository { private final EntityManager em; public void save(Item item){ if(item.getId() == null){ log.info("item={}", item); em.persist(item); //신규등록 }else{ em.merge(item); } } public Item findOne(Long id){ return em.find(Item.class, id); } public List<Item> findAll(){ return em.createQuery("select i from Item i", Item.class) .getResultList(); } } <Log>2023-04-21 15:08:16.380 INFO 7536 --- [nio-8080-exec-2] j.jpashop2.repository.ItemRepository : item=Book(author=qwe, isbn=1234)<Test>로그에 찍히는거 보면 값이 다 전달이 되고 테스트 코드에서도 성공으로 떠서 저장이 되야 될거 같은데 h2 db에 가면 값이 저장이 안되어 있네요아예 디비랑 연동이 안되나 싶었는데 멤버는 정상적으로 회원가입이 되는데 아이템만 저장이 안되네요 뭐가 문제일까요... ddl-auto 는 create로 되어있구요 h2 db 버전은 1.4.2 입니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
expected 옵션이 없어서 질문드립니다.
Junit5로 테스트를 생성해서 그런지Test애노테이션에 expected 라는 옵션이 없어서@Test() public void 상품주문_재고수량초과() throws Exception { //given Member member = createMember(); Item book = createBook(10000, 10, "시골 JPA"); int orderCount = 11; //when Assertions.assertThatThrownBy(() ->orderService.order(member.getId(), book.getId(), orderCount)) .isInstanceOf(NotEnoughStockException.class); }이렇게 만들어서 돌렸는데 테스트가 통과했다면 그냥 넘어가도 되는 것일까요? @Test() public void 상품주문_재고수량초과() throws Exception { //given Member member = createMember(); Item book = createBook(10000, 10, "시골 JPA"); int orderCount = 11; //when Assertions.assertThatThrownBy(() ->orderService.order(member.getId(), book.getId(), orderCount)) .isInstanceOf(NotEnoughStockException.class); fail("재고 수량 부족 예외가 발생해야 한다."); }이렇게 돌리면 재고 수량 부족 예외가 발생해야 한다.java.lang.AssertionError: 재고 수량 부족 예외가 발생해야 한다. 라는 예외가 발생했습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
getTotalPrice에서 사용하는 필드? 질문입니다
public int getTotalPrice() { return orderPrice * count; } public int getTotalPrice() { return getOrderPrice() * getCount(); } 주문 아이템의 가격을 반환해야할 때 당연히 위처럼 코드를 작성해야겠다고 생각했는데, 강의를 보니 아래처럼 하시더라구요결국 같은 값을 반환하는 것 같은데 어떤 차이가 있는지 알 수 있을까요 ?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Editor에 관한 질문이 있습니다!
다른 질문들을 보고도 아직Post 엔티티를 Editor를 사용해서 변경하는 것과 아래 코드가 어떠한 차이가 있는지 잘 이해가 되지 않습니다...public Post toUpdate(PostUpdate req) { this.title = req.getTitle() != null ? req.getTitle() : this.title; this.content = req.getContent() != null ? req.getContent() : this.content; return this; }
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트코드 작성시 컴파일오류가 발생합니다.
https://drive.google.com/file/d/1WpW1BMidCxTZA4qmKPoDP5_6Ct0fVTh6/view?usp=sharing @TestConfiguration static class Config { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }여기서 Autowire을 할 수 없다고 하는데, 테스트 코드는 정상적으로 실행되는데 TransactionManager의 로그는 뜨지 않는 걸로 보아 뭔가 문제가 있는 것 같습니다 ㅠㅠ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew build 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]윈도우 cmb창에서 명령 프롬프트에서 gradlew.bat 를 실행하려면 gradlew 하고 엔터를 치면 됩니다. --> 여기까지는 실행이 됬으나 gradlew build에서 BUILD FAILED 됩니다... 도저히 모르겠습니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
@TestPropertySource 사용에 대해서 궁금하게 있습니다.
강사님께서 application.properties는 스프링 프레임워크의 기본 동작 방식이 아니다스프링 부트 초기화 과정에서 추가 해주는 거라고 말씀해주셨는습니다. @ContextConfiguration는 통합 테스트를 위해서 ApplicationContext를 로드하고, 구성요소 클래스를 넘겨주면 빈을 등록해주는거 같더라구요 SpringApplication.run을 할경우에는Environment 구현체는 ApplicationServletEnvironment가 빈으로 등록이 되고,@ContextConfiguration로 테스트를 할경우에는Environment 구현체는 StandardEnvironment 구현체가 빈으로 등록되는걸 확인했습니다.그래서 Enviroment 구현체가 등록이 되면application.properties를 가져올수있지 않나? 라는 생각에 해당 구현체를 찾아보니StandardEnvironment 는 propertySource를 받지 않는걸 확인했습니다. 제가 궁금한건1.같은 구성 정보 클래스를 넘겨주고 빈으로 등록을 했는데 구현체가 달라지는지 궁금합니다.2.스프링부트에서 테스트를 하는데@TestPropertySource를 따로 명시적으로 메타어노테이션으로 선언해서 사용하는 이유가 궁금합니다.