학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.sendError 나 Exception 발생 시 내부적으로 호출될 컨트롤러 (/error-page/404, /error-page/500) 을브라우저에서 url 을 직접 입력해서도 호출할 수 있는데이러한 접근은 보안 상에 큰 문제가 없을 것 같은데 굳이 막지 않아도 되는 걸까요?
@GetMapping("/nonModelAttribute") public void getList(Page page) { } @GetMapping("/modelAttribute") public void getList(Model model,@ModelAttribute Page page) { } @Slf4j @Component public class PageArgumentResolver implements HandlerMethodArgumentResolver{ @Override public boolean supportsParameter(MethodParameter parameter) { // TODO Auto-generated method stub return parameter.getParameterType().equals(Page.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return null; } } 강의에서 위 두개가 같다고 하셨는데 위의 /nonModelAttribute의 요청의 경우 Page 객체의 경우에는 Argument에서 객체를 만들지않으면 아예 null이 들어오기때문에 ArgumentResolver를 통해서 객체가 생성이 된다는것을 알수있는데 /modelAttribute의 경우에는 해당 부분에서 객체를 생성하지않아도 객체가 생성이 되던데 두개의 차이점이 있는건가요?? 그리고 만약에 차이가 있다면 ModelAttribute의 객체는 어디서 생성이 되는건가요?
안녕하세요. 강의 듣다보면 선생님께서 추상화라는 말씀을 자주 하시는데요 프로그래밍에서 추상화라는 말이 잘 와닿지가 않습니다ㅠㅠ 선생님 강의 외에도 다른 강의나 서적들도 보면 추상화라는 말이 꽤 나오는걸 볼 수 있는데 그때마다 추상화라는걸 어떻게 생각해야 할 지 잘 모르겠어서 질문 드려봅니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 회원가입 테스트에서 이름으로 테스트하는 대신 아이디를 비교하는 테스트로 해도 되나요? 이런 식으로요! // then assertThat(saveId).isEqualTo(member.getId());
안녕하세요, 수업을 다 듣고 따로 프로젝트를 생성하여 에러 메시지를 errors.properties에서 작성한 후 적용 여부를 확인해봤는데 적용이 되지 않아 질문드립니다. 프로젝트 환경 Spring Boot 3.2.1 / Java 17 / Jar Packaging / IntelliJ IDEA 입니다. 설정 및 작성 코드 application.properties spring.messages.basename=messages,errors errors.properties #추가(스프링이 생성한 기본 오류 메시지 코드 설정하기) typeMismatch.java.lang.Integer = 숫자를 입력해주세요!!!!! typeMismatch = 타입 오류입니다!!!! #Bean Validation 추가 NotNull.validation.minVal = 널 안됨!! Range={0}, {2} ~ {1} 허용 Max={0}, 최대 {1} NotNull={0} Null 안됨!!!! 검증 대상 객체 @Data @NoArgsConstructor @AllArgsConstructor public class Validation { // @NotNull(message = "값 필수 입력!") // @NotNull(message = "{NotNull}") @NotNull @Min(1) private Integer minVal; @Max(100) private Integer maxVal; @Range(min = 10, max = 100) private Integer rangeVal; } 컨트롤러 @Slf4j @RestController public class ValidationController { @GetMapping("/test") public String setValues(@Validated @ModelAttribute Validation validation, BindingResult bindingResult) { log.info("validation={}", validation); if (bindingResult.hasErrors()) { List<FieldError> fieldErrors = bindingResult.getFieldErrors(); for (FieldError fieldError : fieldErrors) { log.info("errorMessage={}", fieldError.getDefaultMessage()); } } return "OK"; } } 위와 같이 작성을 하였고 에러를 발생시켜 보면 errorMessage={} 의 로그 부분에서 errors.properties에 설정한 메시지가 아니라 스프링에서 기본으로 제공하는 오류 메시지가 출력 됩니다. 여러가지 테스트 결과 application.properties와 errors.properties 자체를 인식하지 못하는 건가 했지만 파일을 인식하는 것을 확인함 애너테이션에 메시지를 직접 적용하는 것은 적용이 됨 @NotNull(message = "{NotNull}") 과 같이 {} 안에 errors.properties에서의 적용 이름?을 직접 넣으면 메시지가 제대로 출력됨 강의에서의 프로젝트와 다른 점이 버전 뿐인 것 같은데, 혹시 자바 혹은 스프링 부트의 버전에 따라 검증 애너테이션의 메시지가 적용되는 로직에 차이가 있나요? 그게 아니라면 어떤 이유로 이렇게 되는 건지 꼭 이유를 알고 싶습니다. 제가 작성한 부분 중 틀린 부분이나 추가해야 할 부분이 있다면 알려주세요..! 여러군데 검색을 해봤지만 원하는 답을 얻을 수 없어 질문 올립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 사진처럼 JSP코드에서 자바코드가 인식이 안되네요...라이브러리 설치하라는데로 했는데 뭐가 문제인지알수있을까요? build.gralde 파일 plugins { id 'java' id 'war' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상 implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' //스프링부트 3.0 이상 implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상 //JSP 추가 끝 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' //providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 잘했는데 왜 안녕하세요 null. 이라고 뜨는지 모르겠습니다. ㅠㅠ 뭐가 문젠가요
<div>상품 종류</div> <div th:each="type : ${itemTypes}" class="form-check form-check-inline"> <input type="radio" th:field="*{itemType}" class="form-check-input"> <label th:for="${#ids.prev('itemType')}" th:text="${type.description}" class="form-check-label"> BOOK </label> </div> 여기서 thymeleaf 로 Model 객체 내 에 있는 itemTypes 인 enm 배열을 받아서 사용하는거잖아요? 그러면 정적 값들을 하나도 적어놓을 필요가 없는데 왜 BOOK만 적어놓은건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 이런식으로 (안녕하세요 hello!!!) 가 안뜨고 (안녕하세요 null) 이 뜹니다. 뭐가 문제죵?
ArgumentResolver가 Interceptor를 대체할 수 있을까요?? 프로젝트가 커지면 커질 수록 제외할 패턴이나 인증이 필요한 라우터 패턴을 webconfig에 입력해줘서 관리를 계속 해줘야하는데 관련 DTO를 만들어서 해당 dto가 붙어있으면 인증이 필요한 메소드라는 것을 나타내면 인터셉터가 없이 ArgumentResolver로 대체가 가능하지 않을까하는 생각이 들어서요 그래서 이런 인증 수행을 인터셉터가 아니라 리졸버 안에서 해도 무방하지 않을까 생각하는데 ArgumentResolver와 Interceptor가 지향하는 것이 다르기 때문에 그렇게 하면 안되는 것이가 궁금해서 질문드립니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 회원가입에서 spring1 , spring2 등록하고 회원 목록에 들어가면 #이름 만 뜹니다 ㅠㅠConsole 창에도 member = spring1 으로 잘 뜨는데 왜 안될까요?? 회원 목록에서 소스 보기하면 저 가운데가 코드가 안뜨는데 이거 때문일까요? 코드는 강의자료 그대로 복붙했습니다! 딱히 에러가 뜨는건 아니라 뭐가 잘못된지 모르겠네요 ㅠㅠ 구글 드라이브 첨부해드려요! https://drive.google.com/file/d/1s2D6rLue9yPAHlZbNnCFVKsv2aKGZtEX/view?usp=sharing 오류 해결했습니다^^;;; 주석처리된 부분이 있었네요 ...ㅠㅠㅎㅎㅎㅎㅎ
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @Test public void save() { //given Member member = new Member(); member.setName("spring"); //when repository.save(member); //then Member result = repository.findById(member.getId()).get(); assertThat(result).isEqualTo(member); } @Test public void findByName() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when Member result = repository.findByName("spring1").get(); //then assertThat(result).isEqualTo(member1); } @Test public void findAll() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when List<Member> result = repository.findAll(); //then assertThat(result.size()).isEqualTo(2); } } 안녕하세요 지난 번에 동일한 질문을 올렸었는데 제가 설명을 명확하게 하지 않은 것 같아서 다시 올리게 되었습니다. "회원 서비스 테스트" 강의 중 내용입니다. 제가 헷갈리는 것은, 중복된 인스턴스명으로 인스턴스를 만드는데 왜 예외가 발생하지 않는가? 입니다. 예를 들어 아래 코드를 작성하면 Variable 'member1' is already defined in the scope라는 에러가 납니다. public void hello() { Member member1 = new Member(); Member member1 = new Member(); // Variable 'member1' is already defined in the scope } 다시 원래 코드로 되돌아와서, findAll()이 실행 후 member1 = "spring1", member2 = "spring2" 라는 인스턴스가 만들어집니다. 이후 findByName()을 실행할 때 밑에서 두번째 코드처럼 같은 이름인 member1으로 인스턴스를 만드는데 왜 에러가 발생하지 않는건가요? (findAll()에서 member1 생성 -> findByName()에서 member1 생성이 가능한 이유?) Member member1 = new Member(); // findAll() 에서 member1 생성 member1.setName("spring1"); // name 할당 ---------- Member member1 = new Member(); // 인스턴스명이 같은데도 불구하고 findAll() 에서 member1 생성
안녕하세요 강의 중에 IntelliJ 가 제공하는 파라미터 이름이 다르게 보여서 질문 드립니다. 강의에서는 errorCode, 저는 s 현재 인텔리제이 2023.3.2 Ultimate 사용 중 입니다. 인텔리제이 자체에서 decompile 해주는거 같은데 혹시 다른 설정이 있는지 문의 드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] V5강의에서 HandlerAdapter가 HandlerMapping를 통해 모든 핸들러를 조회한 뒤 적절한 핸들러를 호출한다고 이해했습니다 그런데 이 강의에서는 정확히 어떤 역할을 하는 지 궁금합니다. SpringMemberFormControllerV1, SpringMemberListControllerV1를 V5 강의에서 보여주신 V3,V4로 생각하면 될까요?