묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 오류,,,
안녕하세요 제가 다른 강의 때문에 자바 1.8버전을 사용하고 있고 인텔리제이도 잘 알지도 못해서 아무거나 깔다가 인텔리제이 에듀를 깔아서 사용하고 있었슴미다 cmd에서 오류가 생기는 것 같아 인텔리제이 에듀를 삭제하고 커뮤니티를 다시 깔아서 처음부터 하려고 하였는데 "Error running 'All in hello-spring': No junit.jar" 라는 메시지와 함께 실행이 되지 않습니다ㅜㅜ 왜 이러는 것일까요 자바 1.8이나 자바 11버전을 용도에 따라 골라 사용하거나 그럴 수는 없는건가요? ---------------------------------------------------------------------------------------------------------------- https://stackoverflow.com/questions/4757800/configuring-intellij-idea-for-unit-testing-with-junit 페이지를 참고하여 junit을 수동으로 추가한거같은데 "Tests were not found in module 'hello-spring.main'. Use module hello-spring.test instead" 라는 메시지가 뜹니다
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
http://localhost:8080/hello 오류
http://localhost:8080/hello 이 부분 다른 분들도 오류 나는 것 같은데 답변들 다 확인해보아도 답을 못 찾겠습니다 콘솔에는 에러 메세지도 없고 패키지 위치는 선생님과 똑같은거 같은데 해결을 할 수가 없습니다ㅜ 자바 버전이나 인텔리제이 에듀인게 오류 원인일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
prg 패턴에 관해서 질문 드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용] post mapping에서 prg패턴이 필요하다는 사실을 강의를 통해 알게 되었습니다. 1.api 통신을 한다면 유저가 새로고침을 할 수 있는 모든 post 에 관해서 prg 패턴을 적용시키는 것이 일반적인가요? 2. api 통신에서 post를 할때 front에 id를 return해주어야 한다고 할 때, prg 패턴을 적용시키는 것이 힘들 것 같은데, 이 같은 상황에서는 일반적으로 어떻게 해결하는지 궁금합니다. 3. delete할 때도 유저가 새로고침을 통해 id와 함께 여러번 접근할 수 있을 것같은데, deletemapping 또한 redirect, get 패턴을 적용시켜야 하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ModelAttribute가 있을 때, Model 객체 생성
안녕하세요. 강의 잘보고 있습니다. (질문을 많이 하는 거 같아서 좀 죄송스럽지만..) 영한님이 @ModelAttrubute가 파라미터에 있으면 파라미터에 Model 객체가 있지 않아도 자동으로 Model 객체가 생성되고 Model.addAttribute 까지 해준다고 하셨는데요.(파라미터에 @ModelAttribute가 선언돼 있으면 Model은 선언되지 않아도 무조건 생성된다고 생각해도 될까요?) 그럼 이 역할을 해주는 게 ArgumentResolver일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ReturnValueHandler의 반환
안녕하세요. 강의를 보다 궁금한 점이 생겨 질문 드립니다. ReturnValueHandler가 여러가지 controller들의 반환값을 처리해서 핸들러 어댑터로 값을 준다고 하셨는데, 이때 @ResponseBody나 HttpEntity를 반환하는 controller는 ReturnValueHandler에서 어떤 타입으로 반환되나요? 그리고 강의 앞부분에서 핸들러 어댑터는 ModelAndView를 dispathcerServlet에 반환해서 viewResolver를 실행시키는 것으로 배웠는데, @ResponseBody, HttpEntity 일때는 핸들러 어댑터가 무슨 타입을 반환하고, dispatcherSerlvet에서 어떻게 처리되는지도 궁금합니다. 좋은 강의 항상 잘 듣고 있습니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Test class 위치
안녕하세요. 강의 너무 잘 듣고 있습니다. 상세히 설명해주셔서 감사합니다. 한 가지만 여쭤보겠습니다. 테스트 클래스를 test 디렉토리에 만들 때, 만드시 원래 소스코드와 패키지 이름과 위계 등을 맞춰서 대응되게 만들어줘야 하는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@Controller와 @RestController 동시 사용
안녕하세요! 강의 잘 듣고 있습니다! 질문1) 영한님께서 @Controller가 붙은 클래스의 메서드에서 return 하는 String 값은 논리적인 view를 찾아서 반환한다고 하셨던 걸로 기억합니다. 제가 시험삼아 @Controller와 @RestController를 동시에 붙이고 테스트해보니(templates에 ok.html을 따로 만들었습니다) ok.html이 아닌 ok라는 body 메시지가 리턴되었는데 우선순위가 있나요? @Controller와 @RestController 위치를 변경해도 마찬가지였습니다. 질문2) 질문이 좀 이상할 수도 있는데 @Controller와 @RestController를 동시에 붙여도 상관없나요? 서로 충돌나는 게 없을까요? 질문3) @Controller를 사용했을 때 반환할 뷰 파일의 위치는 무조건 resources/templates 에 두어야 하나요? 테스트 해보니 resources/static에 넣으니 불러오지를 못해서용
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JPA repository, REST API 개발
spring, MVC, JPA를 공부하면서 전체적인 흐름을 보려고 노력을 했는데요..! 자꾸만 아리송합니다 ㅠㅠ 강의를 보고 프로젝트에 적용해보려고 했으나.. 아직 쉽지않네요 ㅠㅠ 본 강의에서는 REST API방식이 아닌, 타임리프 같은 뷰 템플릿을 사용하여 만듭니다. 그래서 컨트롤러로 요청을 받고 모델에 값을 저장해서 뷰로 값을 보내죠 ! 그 뷰에서 따로 JSTL같은 문법으로 모델에 담긴 값을 받아서 렌더링(?)을 해주는데요 ! 지금 API 통신은 어떻게 되는지 감이 잘 안오네요 ㅠㅠ 리액트 개발자 분들과 프로젝트를 진행중인데, 소통은 어떻게 하는지 레퍼런스나 키워드 알려주실 수 있나요..? 두번째 질문입니다 ! 강의에서는 member 클래스와 repository 클래스를 만듭니다. 여기서는 JPA를 사용하지 않아서 respository를 만든 것 같은데요, JPA를 사용하면 interface에 JpaRepository를 만듦으로서 이 해당 클래스를 대체했다고 봐도 무관할까요?? 그래도 Member 클래스와 같은 클래스는 기본적으로 만들어 줘야 하는건지 모르겠습니다 ㅠㅠ (Entity 설계는 끝난 상태입니다 ! Entity설계한것이 Member 클래스의역할을 하는건가요??)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestBody 객체 바인딩 방식에 대한 질문입니다.
선생님 안녕하세요? 항상 열심히 듣고 있습니다. MVC 1편 뿐만 아니라 활용편(야생형 코스)을 수강하면서 H객체 바인딩 방식에 대해 질문이 생겨 글을 남깁니다. 제가 토이 프로젝트를 진행하면서 json형식 데이터를 messageBody에 담아 클라이언트에서 HTTP POST 요청을 통해 컨트롤러에 전달하여 DB에 객체를 저장하고자 했습니다. 코드는 아래와 같습니다. @RestController@RequiredArgsConstructor@Slf4jpublic class MemberController { private final MemberService memberService; /*** * 회원 등록 */ @PostMapping("/members") public String createMember(@RequestBody Member member) { try { memberService.join(member); } catch (IllegalStateException e) { return "fail"; } return "success"; }... 이하 생략} @Entity@Getter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; private String password; @Enumerated(EnumType.STRING) private MemberStatus status; @Embedded private BodyMeasureInfo bodyMeasureInfo; protected Member() {} public Member(String name, String password, BodyMeasureInfo bodyMeasureInfo) { this.name = name; this.password = password; this.bodyMeasureInfo = bodyMeasureInfo; this.status = MemberStatus.LOG_OUT; }이하 생략 .....}HTTP API 형식으로 회원 저장 URI에 POST 요청을 했을 때, 제가 예상했던 객체 바인딩은 API messageBody에 있는 name, password, bodyMeasureInfo가 바인딩 된 후, status는 객체 생성시 디폴트로 LOG_OUT으로 설정되는 것이었지만,결과는 name, password, bodyMeasureInfo만 객체에 바인딩 되었고 status는 LOG_OUT으로 설정되지 않고 null인 상태로 DB에 저장되었습니다.질문은 어떤 방식으로 객체에 생성자가 아닌 다른 방법으로 파라미터가 바인딩 되는 것인지 입니다.혹시 이런 경우를 이후 챕터에서 설명하신 ArgumentResolver를 확장해야하는지 또한 여쭙고 싶습니다.답변해주시면 감사하겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
핸들러 관련하여 질문드립니다.
안녕하세요! 강의에서 preHandle 메소드에서 Object handler를 파라미터로 받아서, HandlerMethod 타입인지 확인후에 HandlerMethod 로 캐스팅하여 여러가지 핸들러에 대한 정보를 읽어올 수 있다고 하셨는데요! 제가 궁금한건 스프링MVC1편 강의에서 핸들러라 하면, 그... 결국에 @RequestMapping 을 사용하는 사용자가 정의한 컨트롤러 객체 아닌가요? 저 메소드의 인자로 받은 handler는 핸들러 어댑터가 실행하는 컨트롤러 객체가 아니라 다른 객체인건가요? 왜냐하면 저기서는 HandlerMethod 타입으로 캐스팅하는데 이게 컨트롤러 객체이면 타입이 HandlerMethod가 될 수 없을것 같아서 궁금하여 질문드립니다! 정리하면 파라미터로 넘어온 handler가 @RequestMapping을 사용하는 컨트롤러 객체라면 어떻게 HandlerMethod 타입으로 캐스팅이 될 수 있는지? 궁금합니다. 감사합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요! 질문이 있습니다.
안녕하세요! 언제나 좋은 강의 감사드립니다 :) 파일업로드 예제에 대해 실습하면서 의문사항이 생겨 질문 드립니다. 처음 파일업로드를 완료한 상태에서, 따로 파일을 선택하지 않은 상태에서 웹브라우저를 새로고침하면, 저절로 이전에 파일업로드 처리가 완료된 POST /upload API 요청이 한번 더 나가서 파일업로드 처리가 한번 더 수행됩니다. 이럴경우, 사용자가 의도하지 않았는데도 파일업로드 처리가 될 우려가 있을 것 같고, 서버 측에서도 괜히 파일업도르 처리를 한번 더 수행하는 상황이 생길거 같은데,,, 왜 api call이 한번 더 나가는 걸까요?? 아니면 혹시 해결법이 있을까요? 리다이렉트를 수행시키면 될까요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ExceptionHandler
안녕하세요 영한님 @ExceptionHandler public ErrorResult exHandler(Exception e){ log.error("[exceptionHandler] ex", e); return new ErrorResult("EX", "내부 공통처리 오류"); } ============================================ 여기서의 ApiExceptionV2Controller 컨트롤러에서 @ExceptionHandler 를 사용하면 ( 클라이언트에서 의 accept 가 application/json 일때 값이 잘 넘어가는것을 확인 했습니다. 그런데 accept 가 TEXT/HTML 일때 에는 view 페이지가 넘어가는것을 확인했습니다. 이말은 즉 , accept 가 TEXT/HTML 일때 에는 BasicErrorController 가 작동한다고 보면될까요 ? (WebServerCustomizer 의 Bean 은 주석 한상태)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
findByName 메소드 작성 질문 있습니다.
안녕하세요. 제가 람다랑 optional, 컬렉션 그런부분을 아직 잘몰라서 자바 공부가 더 필요한데요. 이 부분 듣다가 궁금증이 있어서 질문 남기게 됐습니다. - 중점적인 내용은 `findName 메소드를 findById메소드 처럼 구현하면 안되냐`입니다. -> 다른 질문글을 통해 id는 유일한 기본키로 사용되서 중복이 없고, 이름은 중복이 있을 수 있다고 하셨습니다. 제가 코드는 정확히 모르겠지만 영한님의 강의를 들어보며 추측해보면 -> store - 객체 -> , values() - 값들중 -> . stream() - 모두 돌리는데 -> .filter() - 가로안에 있는 조건에 해당하는 값이 걸리면 -> .findAny() -리턴해라 이런 의미의 식 같습니다. 또 filter 안에 있는 람다표현식?은 member를 받아서 받은 멤버 객체의 name이 findByName 메소드 호출시 매개변수로 받은 name과 같은지를 체크한 것 같구요. 여기서 궁금한점이 store의 member를 하나씩 쭉 돌리는데 우리가 매개변수로 넘겨준 name과 같은 member를 모두 optional에 담아서 반환하는건가요? 즉, findById는 중복 없이 Optional에 하나의 Member 객체만 담아서 반환되어 코드를 저렇게 짠 것이고 findByName은 중복이 있을 수 있어, 매개변수로 받은 name과 같은 모든 member 객체를 optional에 담아 반환해주는 코드인건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor 에러 질문
안녕하세요. 강사님이 해주신 강의를 듣고 있는 수강생입니다. 코드를 따라가면서 @ModelAttribute를 복습하면서 컨트롤러에있는 메소드들이 실행될때마다 @ModelAttribute가 붙은 메소드로 부터 반환된 모델들이 생성된다는 것은 이해했습니다. 그래서 items.html 에서 모든 아이템에 대해서 등록지역을 출력하고 싶어 코드를 다른 html에 있는 코드를 items.html에 아이템을 반복하면서 조회하는 부분에 넣어주면 되겠거니 했지만 제목에 기재한 오류가 발생했습니다. 검색을 통해 해결을 하려했지만 그렇지 못해서 질문에 올렸습니다. 아래에 코드를 첨부해드리오니 확인 부탁드립니다. !! 감사합니다!! 에러가 발생하는 지점은 <input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled> 이부분입니다. <tr th:each="item : ${items}"> <td><a href="item.html" th:href="@{/form/items/{itemId} (itemId=${item.id})}" th:text="${item.id}">회원id</a></td> <td><a href="item.html" th:href="@{|/form/items/${item.id}|}" th:text="${item.itemName}">상품명</a></td> <td th:text="${item.price}">10000</td> <td th:text="${item.quantity}">10</td> <td> <div th:each="region : ${regions}" class="form-check form-check-inline"> <input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled> <label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label> </div> </td></tr>
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원 리스트가 안떠요 ㅠㅠ
목록페이지를 그냥 들어가면 # 이름 이렇게 잘 뜹니다. 하지만 회원등록을 하고 난 후 회원목록에 들어가면 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "${member.id" (template: "members/memberList" - line 19, col 15)] with root cau member.id 를 찾을수없다고 나옵니다 ㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@InitBinder와 @Validated 사용 시 문제 IllegalStateException: Invalid target for Validator
검증 시 @InitBinder 를 사용해서 Validator 를 추가했을 때, 강의 예제와 같은 상황에선 문제가 없습니다. 하지만, 너무 햇갈리는 상황이 일어나서 질문드립니다. 컨트롤러의 매핑 메서드의 인자에 @Validated 애노테이션을 추가하지 않더라도 매핑 메서드에서 model.addAttribute(); 에 Item 이 아닌 객체를 넣을 시 다음과 같은 오류가 발생합니다.. java.lang.IllegalStateException: Invalid target for Validator ====== 추가. 우선 디버깅을 하다보니 @Validated 를 붙이지 않아도 무엇이든지 값을 매핑해야할 일이 있다면 @InitBinder 를 통해 등록한 Validator 의 support() 가 호출 된다는 것을 알 수 있었습니다. 근데, 이걸 보고나니 더욱 의문이 남는게 Validator의 support() 를 실행했을 때 false 가 나와서 해당 검증기를 지원하지 않는다고 하면 그냥 검증을 안하고 넘어가는게 아닌가봅니다..잘 이해가 가지 않습니다. 결국 Model 객체에다가 Item이 아닌 다른 객체를 넣을 때, 결과적으로 DataBinder.java 안의 assertValidators(Validator ... validators); 메서드에서 if (validator != null && (target != null && !validator.supports(target.getClass()))) { throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + target); } 조건이 참이되버려서 지원하지 않는다면 그냥 예외가 터져버리고 맙니다. 이런식으로 된다면 @InitBinder 로 검증기를 등록해서 사용하다간, 되려 예측하지 못한 검증찾기 실패 오류만 늘어나는것이 아닌지 생각됩니다... 한 컨트롤러내에서 Model 객체에 Item 객체 말고도 실제론 다양한 객체를 넣을텐데 이런 경우엔 @InitBinder 를 사용하지 않고 전부 수동으로 메서드에서 검증을 해야하는건가요? 해결 방법이 궁금합니다.. 마지막으로 해당 상황을 재현할 수 있는 샘플코드를 작성해보았습니다.. 뭔가 질문이 난잡한거 같아서 죄송합니다..ㅠ 항상 감사드립니다. MyController.java @Controller@RequiredArgsConstructorpublic class MyController { private final MyValidator myValidator; @InitBinder public void init(WebDataBinder webDataBinder) { webDataBinder.addValidators(myValidator); } @GetMapping("/index/{text}") public String myView(@PathVariable String text, Model model) { SomeObject someObject = new SomeObject(); someObject.setText(text); model.addAttribute("someObject", someObject); return "myView"; } @GetMapping("/index") public String index(@ModelAttribute TargetObject targetObject, Model model) { model.addAttribute("targetObject", targetObject); return "myView"; }} MyValidator.java @Componentpublic class MyValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return clazz.isAssignableFrom(TargetObject.class); } @Override public void validate(Object target, Errors errors) { TargetObject myTarget = (TargetObject) target; if (myTarget.getText().equals("error")) { errors.reject("error"); } }} SomeObject.java @Datapublic class SomeObject { private String text;} TargetObject.java @Datapublic class TargetObject { private String text;}
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Filter를 사용하면 더 좋은 경우가 있을까요?
안녕하세요. interceptor 사용하는 게 더 좋다고 말씀해주셨는데 filter를 쓰면 더 좋은 경우가 있을 거 같은데 설명 부탁드립니다!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
레이아웃에서 공통과 추가를 인자로 받는 부분에 대해 질문이 있습니다.
[템플릿 레이아웃1 강의에서의 질문] 안녕하세요. 김영한 강사님. 강의 정말 잘 듣고있고 있는데 궁금한 점이 생겨 여쭤봅니다. base.html 의 틀을 여러 곳에서 사용하고 싶을 때 강의에선 th:fragment="common_header(title, links)" 와 같이 공통을 제외하고 바뀌어야할 부분은 인자로 받아서 replace 하는데 사용하고 있습니다. 그런데, base.html를 사용하고 싶은 어떤 a.html이 있다고 가정할 때 a.html은 넘겨줄만한 추가 links나 title이 없는 경우 th:replace="template/layout/base :: common_header(~{::title})" 다음과 같이 사용할 수 있도록 선택적으로 인수를 받거나 주는 방법은 없을까요? 레이아웃이 되는 html은 사용하고자하는 많은 html 이 있을 것이라고 생각합니다. 선택적으로 받을 수 없다면 항상 사용하고자 하는 html 쪽에서 추가할 것이 없고 레이아웃을 그대로 따르기만 하는 상황에선, 쓸모없는 태그를 만들고 필요없는 인자를 항상 넘겨야하는지 의문이 생깁니다. 강의를 다듣고 강의에서 배운 내용들을 적극 활용해 혼자서 프로젝트를 해보는 중에 이런 문제에 부딛혔고 여차여차 어떻게든 해나가려다 보니 thymeleaf-layout-dialect 라는 것도 줏어듣게 되었는데, 이부분은 의존성 추가를 해서 해결하는 부분이라 순수하게 타임리프에서 제공하는 방법으론 해결할 수 없는지 궁금합니다. 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 요청 메시지 - JSON 편을 보며 궁금합 점이 있습니다.
안녕하세요! 김영한님. 항상 좋은 강의 너무 감사합니다. 강사님 덕분에 웹에 대해서 많은걸 빠르고 정확하게 알 수 있었습니다. 질문 드리고 싶은게 있는데요! 강의를 보던 도중 HttpServletRequest -> @RequestBody 어노테이션을 사용하여 json 을 바로 HelloData 타입에 맵핑 시켜버리는 정말 간단하고 효율적인 방법이 있다 라는 걸 배웠을때. "이런 지식(@RequestBody에서 객체로 바로 맵핑이 가능하는 하다는 것)을 모르는 상태에서 코드를 해석하는건 거의 불가능이겠네..?" 라는 생각과 함께 "그럼 이런것들은 어디서 찾아봐야 하는거야??" 라는 궁금증으로 이어지게 되었습니다. 지금이야 강사님께서 스프링mvc를 매우 친절하게 거의 씹고 소화가 되도록 입에 넣어주시기 까지 해서 무리없이 배우고 있지만, 강사님 도움 없이 제가 혼자 공부를 해야할 때는 과연 어떻게 해야할지 잘 모르겠습니다! (막힐 때마다 동영상 강의를 틀 수 도 없는 노릇이구요 ㅜ) 혹시 이런 정보를 담고있는 레퍼런스가 있을까요? 없다면 어떻게 학습해야할지 궁금합니다. 그리고 강사님은 스프링부트 뿐만이 아니라 프레임워크를 새로 배우실 때에는 어떤 식으로 접근하시는지 약간의 노하우를 알려주시면 정말 감사할 것 같습니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
한글 인코딩 관련 질문입니다.
ms.getMessage("hello", null, null)을 넣고 테스트를 돌렸을 때 아래와 같이 뜨면서 테스트가 실패합니다. Expecting: <"??"> to be equal to: <"안녕"> but was not. org.opentest4j.AssertionFailedError: Expecting: <"??"> to be equal to: <"안녕"> but was not. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at hello.itemservice.message.MessageSourceTest.helloMessage(MessageSourceTest.java:19) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) 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:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:834) 2021-08-07 10:51:06.397 INFO 12216 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' MessageSourceTest > helloMessage() FAILED org.opentest4j.AssertionFailedError at MessageSourceTest.java:19 1 test completed, 1 failed > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Users/dpffp/Desktop/STUDY/message/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 19s 4 actionable tasks: 1 executed, 3 up-to-date 오류 메세지를 읽어 봤는데 messages.properties 파일에 hello=안녕 이 hello=??으로 바뀌어서 그런 것 같았습니다. 위는 제 messages.properties 파일의 현재 상태입니다. 그래서 인코딩 문제인가보다 하고 인텔리제이 인코딩을 다시 해 주었습니다. 1. Help >> Edit Custom VM Options 클릭해서 파일에 -Dfile.encoding=UTF-8 추가 후 인텔리제이 껐다 켜기 2. Settings >> Editor >> File Encodings >> Global, Project Encoding, Properties Files 설정을 UTF-8로 변경 이후 인텔리제이 껐다 켜기 이 두 가지 방법을 해 보았는데도 여전히 messages.properties파일에 한글이 ?? 으로 깨집니다. 이걸 다시 제가 한글로 수정 후 저장을 하면 다시 ?? 으로 돌아와 버리네요. 어떻게 해결하면 좋을까요?