월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
try문에서 return시 chain.doFilter 동작이유..:)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요.아래의 그림부분에서 이해가 안되서, 글남깁니다.!!제가 학습하기로는 return문이 실행될 경우에는 메서드단위 자체를 종료하는 것으로 알고 있는데요!만약 미인증 사용자가 items에 요청이 들어올 경우 sendRediect메서드가 실행됨과 동시에 return으로 doFilter 메서드가 종료될 것으로 예상됩니다.그럼에도 불구하고, 아래의 try문에 log와 chain.dofilter가 실행되는 이유가 무엇인가요..?스크립트 상에는 필터를 더이상 진행하지 않는다고 하고있습니다.만약, 위의 코드에서 chain.doFilter를 제거할 경우에는 빈화면의 http://localhost:8080/login?redirectURL=/items페이지가 나옵니다. (현재의 return시에는,try문의 내부.. if문까지만의 종료로 보입니다.!) 자문자답해봅니다.. :)너무 이해가 안되서, 흐름을 다시한번 정리했더니 이해가 되네요.결론은 스크립트와 동일하게 동작하네요!필터의 경우에는 모든 HTTP요청에 대해서 필터가 실행되기때문에 items url 요청 -> 필터 실행 -> if문에 걸려서 redirect 후 리턴 (다음 필터 실행 X ) , finally문은 실행여기서 다시 login url 요청 -> 필터 실행이 되기때문에만약, chain.doFilter가 없는 경우, 해당 스텝에서 다음필터로 진행이 안되기때문에.. 이후 동작이 안 이루어진거였습니다.!!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
downloadImage
스프링 MVC 2편 섹션 11. 파일 업로드에 '예제로 구현하는 파일 업로드, 다운로드' 강의의 30:10분쯤을 보면 downloadImage 메서드를 만들었는데요.메서드명만 다운로드이고 이미지는 보여주는 것까지만 구현하고 다운로드는 구현하지 않은 건가요? 다음에 설명하시는 파일 다운로드는 다운로드 기능을 구현하신 것 같은데 이미지는 다운로드는 구현하지 않으신것 같아 여쭤봅니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션은 메모리를 쓰는 것이기 때문에 필요할 때에만 생성해야 한다
안녕하세요스프링 MVC 2편 중 섹션 6. 로그인 처리1 - 쿠키, 세션의'로그인 처리하기 - 서블릿 HTTP 세션1' 강의에서 7:41분쯤에 세션은 메모리를 쓰는 것이기 때문에 필요할 때에만 생성해야 한다라고 하셨는데요.세션 저장은 서버에서 하는데 메모리를 쓴다고 하시는 부분은 서버의 메모리를 사용하게 된다는 말씀이신가요?사용자의 메모리가 아닌?세션을 생성할 때 사용자의 메모리를 사용하게 되는 것이 있을까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Spring Security API 구현 시 로그인 유지 기능
신입입니다. 회사 실무 프로젝트 개발을 하다가 Spring Security API 구현 시 로그인 유지 기능 구현을 하고 있는데요. Spring boot, JPA, API로 구현을 해야 하는데 모두 낯설어서JPA1,2편 먼저 수강했습니다.ㅠㅠ 토큰 기반 방식으로 api로 로그인을 했을 때 로그인 유지를 되게끔 하고싶어서 알아보니 WebSecurityConfigurerAdapter 이걸 사용해서 구현하는 방법만 있더라구요.근데 이건 Deprecated됐다고해서...... SecurityFilterChain을 사용해야되던데...이 부분에 대한 강의가 김영한님 강의 중 어느 부분인가요? ㅠㅠㅠ
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
home.html / index.html
예전 강의에서는 index.html을 시작페이지로 설정하였었는데이번 강의부터는 home.html이 시작페이지로 설정되는데둘의 차이점이 무엇인가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
1편에서 설명해주셨던 "@{ | ${data} | }" 문법에 대해서 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]<li><a th:href="@{|/hello/${param1}/${param2}|}">path variable</a></li>이런식으로도 쓸수 있다고 하신거같은데 따로 말씀을 안해주셔서 질문 드립니다. 해당 문법 보다는 설명해주셨던 문법을 많이 쓰는지 아니면 그냥 취향에 따라서 맞춰 쓰면 되는지 질문 드립니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
/images/{filename}
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.mvc2 강의 Multipart 파트를 보다가 아래부분에서의 GetMapping의 "/images/{filename}" 이 경로가 어떻게 호출되는 건지 궁금합니다. 뷰의 이미지 소스 경로에서 th:src="|/images/${imageFile.getStoreFileName()}| 이 부분때메 애가 호출하는 것인지 궁금합니다. 답변 주시면 감사하겠습니다. @ResponseBody @GetMapping("/images/{filename}") public Resource downloadImage(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename)); }
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
errors.properties
errors.properties에서#Bean Validation 추가 NotBlank={0} 공백X Range={0}, {2} ~ {1} 허용 Max={0}, 최대 {1}이렇게 추가하는 경우 Range의 매개변수가 {2} ~ {1}로 되는데각각의 매개변수는 어디서 받아 오는 건지 모르겠습니다.@NotNull @Range(min = 1000, max = 1000000) private Integer price;이 부분인 줄 알고 순서를 바꾸었더니 1000000~1000으로 출력 되었습니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
/basic-objects url 매핑 함수에 대해 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]/basic-objects 매핑 함수에는 HttpSession 밖에 없는데 어떻게 쿼리스트링을 html 에서 param 으로 바로 가져올 수 있는건가요?argument resolver 나 http 메시지 컨버터의 개입이 있어서 그런 것인가요??
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 인터셉터가 똑바로 동작하지 않아 질문드립니다.
안녕하세요, 이 강의를 수강한 프로젝트를 진행 중인 학부생입니다.코드를 구성하던 중 이해가 가지 않는 현상이 발생하여 질문드립니다. LoginInterceptor.javapackage Alchole_free.Cockpybara.interceptor; import Alchole_free.Cockpybara.constant.SessionLoginConst; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @Slf4j //@Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); log.info("session = {}", session); if (session == null || session.getAttribute(SessionLoginConst.LOGIN_MEMBER) == null) { log.info("로그인되지 않은 사용자"); response.sendRedirect("/login"); return false; } log.info("정상 요청"); return true; } } WebConfig.javapackage Alchole_free.Cockpybara.config; import Alchole_free.Cockpybara.interceptor.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; //@Slf4j @Configuration //@RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { // private final LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/", "/join", "/login", "/css/**", "/*.ico", "/error"); } } 위와 같이 코드를 구성하고 어플리케이션을 실행시켜도 인터셉터가 똑바로 등록되지않더군요. 디버깅을 해봤는데 아예 Configuration 자체가 적용이 안되는 것 같습니다.어떤 문제인지 도무지 파악할 수 없어 질문드립니다. 혹시 몰라 설정 파일들도 올립니다. build.gradleplugins { id 'java' id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'Alchole_free' version = '0.0.1-SNAPSHOT' java { 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-web' implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //swagger 설정 implementation group:'io.springfox', name:'springfox-swagger2', version:'2.8.0' implementation group:'io.springfox', name:'springfox-swagger-ui', version:'2.8.0' } tasks.named('test') { useJUnitPlatform() } application.properties# ?????? ?? ?? spring.datasource.url=jdbc:mariadb://localhost:3306/cockpybara spring.datasource.username=root spring.datasource.password=cockpybara spring.datasource.driver-class-name=org.mariadb.jdbc.Driver # JPA ?? spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.format_sql=true //JPA ???? Hibernate? ????? ???? SQL? formating?? ?? spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect #show parameter binding logging.level.org.hibernate.type.descriptor.sql=DEBUG logging.level.org.hibernate.SQL=DEBUG
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:for 사용 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]다음 내용에서 th:each로 반복문을 사용하고 있는데 th:for 반복문을 다시 사용하는 이유는 뭔가요? <!-- multi checkbox --> <div> <div>등록 지역</div> <div th:each="region : ${regions}" class="form-check form-check-inline"> <input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input"> <label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label> </div> </div>
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ExceptionHandler와 BasicErrorController에 대한 궁금증
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? [질문 내용]안녕하세요. 강의를 듣던 도중 궁금한 점이 생겨 질문을 남겨 봅니다.API 예외를 처리할 때는 ExceptionHandler를 사용하여 처리하고,HTML 화면을 제공할 때 예외 처리는 BasicErrorController를 사용하는게 편하다고 강의에서 말씀해주셨는데요@Controller @Slf4j public class TestErrorController { @ExceptionHandler(IllegalArgumentException.class) @ResponseBody public ErrorResult IllegalArgumentException(IllegalArgumentException e) { log.info("IllegalArgumentException ", e); return new ErrorResult("BAD Argument", e.getMessage()); } @GetMapping("/test/error/{id}") public String testException(@PathVariable String id) { if (id.equals("bad")) { throw new IllegalArgumentException("bad argument"); } return "home"; } @GetMapping("/test/error2/{id}") @ResponseBody public String testException2(@PathVariable String id) { if (id.equals("bad")) { throw new IllegalArgumentException("bad argument"); } return "OK"; } }위와 같이 RestController가 아닌 Controller에서View를 반환해주는 메서드가 있고, HTTP 메시지바디에 문자열을 반환해주는 메서드가 있는 상태에서API 예외를 처리하는 @ExceptionHandler를 작성 하였고 테스트를 위해/test/error/bad, /test/error2/bad를 호출해보면 둘 다 @ExceptionHandler가 예외를 처리하여 JSON 문자열이 반환되어 지더라구요..여기서 궁금점이 생기게 되었는데요위와 같이 하나의 컨트롤러에서 View를 반환해주었을 때 IllegalArgumentException이 발생했다면 BasicErrorController처럼 오류페이지를 반환하고,API 의 경우 IllegalArgumentException이 발생하면 @ExceptionHandler에서 처리를 할 수 있는 방법은 없는 걸까요??만약 위의 질문에 대한 답이 없다 라고 한다면 실무에서 개발 설계를 할 때, API 컨트롤러와 View를 반환해주는 컨트롤러를 분리하여 설계를 하나요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 파서 주석 궁금증
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]보면 <!--/* ... /--> 이 있고, <!--/*--> ... <!--*/--> 이 있는데, 본문에서는 그냥 한줄표현, 여러줄 표현이라고 하셨는데, 제가 해보니까 그런 차이는 아닌것 같더라구요.<!--/* ... */--> : 아예 소스 상 주석처리 상태. 그래서 절대경로로 열어도 뷰에는 안나옴<!--/*--> ... <!--*/--> : 소스상으론 주석처리 안된상태. 그래서 절대경로로 열면 뷰에 보임이렇게 해석했는데 맞는 내용일까요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 필터질문
로그인 필터 로직에서 if(session == null || session.getAttributes~~뒤에 조건은 왜 필요한가요??
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Post 전송 방식의 쿼리 파라미터
안녕하세요 ! 로그인 관련 학습 도중에 @PostMapping("/login") public String loginV4(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, @RequestParam(defaultValue = "/") String redirectURL, HttpServletRequest request) { ..생략.. } 로그인 form의 로그인 버튼을 누르면 폼의 데이터 + redirectURL 을 쿼리 파라미터 받아서 이용하는 부분에서 제가 loginForm.html 파일에 오타를 내어 <form action="/login" th:action th:object="${loginForm}" method="post">이라고 작성하여야 할것을 <form th:action ="@{/login}" th:object="${loginForm}" method="post">이라고 작성을 하였는데 , 폼의 데이터는 전송되는데 쿼리파라미터 (redirectURL)부분만 전송이 안되더라구요 .action="/login" th:actionth:action ="@{/login}"이 두개의 코드는 어떤 차이가 있는건가요 ?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
개인적으로 repository save 구현 후 데이터가 생성되지 않습니다.
타임리프와 MVC 컨트롤러 저장 기능만 간단하게 만들어서 테스트를 해보았는데 저장 기능이 동작하지 않는 부분에 대해서 질문합니다.간단하게 만든 유저 클래스 정보는 아래와 같습니다.아래 사진은 리포지토리 저장 기능만 구현해둔 상태입니다. 아래는 컨트롤러 내용입니다.아래는 타임리프로 간단하게 만든 입력창 입니다.실제로 localhost를 띄우면 정상적으로 나옵니다.그러나 이름과 나이를 입력 후 제출을 누르면 데이터가 생겨나지 않습니다.확인을 위해 리포지토리 Save 메서드에 로그로 저장 성공 시에 로그 출력을 걸어두었는데 아무것도 뜨지 않으며 터미널창에 반응조차 없습니다. 이 부분에 대해서 배웠던 코드랑 비교해도 차이점을 잘 모르겠습니다.강의 들을 때는 정상적으로 동작했었으나 제가 개인적으로 위와 같이 따로 만든 경우에는 반응이 없습니다. 왜 이런 현상이 일어나는지 혹시 알 수 있을까요? 계속해서 고민해보고 생각해보았는데 도무지 모르겠어서 질문 올립니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
생성한 변수 hm 미사용 & 미치는 영향
스프링 MVC 2편 중 섹션 7. 로그인 처리2 - 필터, 인터셉터의 '스프링 인터셉터 - 요청 로그' 강의 11:09쯤에 코드 중 다음과 같은 코드가 있는데요. if(handler instanceof HandlerMethod){HandlerMethod hm = (HandlerMethod) handler;}위와 같이 만든 hm이라는 변수를 사용하지 않는데 만드는 이유가 뭔지, 왜 캐스팅해서 무엇을 보여주고자 하는지 모르겠습니다.바로 밑에 로그에 출력하는 handler에 영향을 주나요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링부트 검증 직접 처리 중 오류 발생시 컨트롤러 진입 전에 예외 발생
스프링 MVC 2편 중 섹션4. 검증의 '검증 직접 처리-개발' 강의의 28:50에서 김영한 강사님이 강의 자료를 보고 설명하시는데 다음과 같은 문구가 있는데요. '타입 오류는 스프링MVC에서 컨트롤러 진입도 전에 예외가 발생한다' 이 부분에서 질문이 있습니다. 일단 폼에서 값을 넘기면 post를 타고 해당 requestmapping이 된 url을 컨트롤러에서 발견을 하고 넘어온 값들을 해당 메서드에서 매핑된 VO를 찾아 값을 넣어주려는 것 아닌가요?일단 컨트롤러 진입 후 VO에 값을 매핑하는 것 같은데 진입도 전에 에러가 나는 건 어떻게 에러가 나타나는 건가요?일단 VO까지는 가야지 타입이 무엇인지 알 수 있고, VO는 컨트롤러에서 확인할 수 있지 않나요?답변 부탁드립니다!
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
html 코드도 따라쳐야 하는 건가요?
강의 듣다가 궁금증이 생겼는데thymleaf가 담긴 html코드도 손으로 따라쳐야하나요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
MessageSource가 Locale 정보를 가져오는 코드 위치가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 지금 스프링 코드를 보면서 MessageSource와 LocaleResolver의 흐름을 파악하고 있었습니다.LocaleResolver가 어떻게 resolve하고 set하는지는 코드가 명확해서 파악은 되고 있습니다. 그런데, Thymeleaf에서 #{label.ex}와 같은 메세지 코드가 있을 때, MessageSource가 어디서 호출되고, Locale정보를 어떻게 가져오는지 확인이 어려운 상태입니다. 저의 추측으로는 LocaleContextHolder에서 Locale 정보를 가져오는 거 같은데 눈으로 직접 확인을 해보고 싶어서요.Spring 코드에서 이 부분이 어디서 호출되는지 알려주시면 감사하겠습니다.