묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Spring boot의 ErrorPage 제공 기능
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의를 듣다가 헷갈리는 부분이 생겨 글 올립니다.ServletExController의 각 메핑 메서드에response.send() 메서드가 있는데 이 메서드 호출 시 BasicErrorController가 호출되어서 Spring boot가 자동으로 등록한 /error를 호출하게 되는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
댓글 기능 구현에 대한 질문
안녕하세요.강의 잘보고 있습니다.현재 저는 게시글, 댓글 기능을 구현하고 있습니다. 타임리프 + 스프링부트로 구현하고 있는데, 게시글 상세를 눌렀을때 어떤 방식으로 댓글을 가져오는 것이 효율적인지가 궁금합니다. 게시글 상세 요청 -> 페이지 응답 -> 응답받은 페이지에서 ajax로 다시 서버에 댓글 페이지 요청게시글 상세 요청 -> 댓글이랑 상세페이지 한꺼번에 타임리프로 렌더링해서 페이지 응답 (즉, 항상 게시글 상세와 댓글을 함께 랜더링함)게시글 상세 요청 -> 첫 댓글 페이지랑 게시글 상세페이지 한꺼번에 타임리프로 렌더링해서 페이지 응답 -> 두번째 댓글페이지부터는 ajax로 응답 혹은 다른 방법이 있다면 알려주세요 !!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db1 - 트랜잭션 매니저 강의 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]트랜잭션 매니저 관련 강의를 듣고 있는데요 예를 들어 private final PlatformTransactionManager transactionManager;이렇게 해서 트랜잭션 매니저를 주입받는다고 했는데 이 클래스가 빈으로 등록된것도 아닌데 어떻게 주입받는건가요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
inputStream.close() 작성 하여도 UncheckedIOException 에러 발생
다른 분들이 올리신 글 보고 inputStream.close()를 추가해주었는데도 UncheckedIOException 에러가 발생합니다. 버전문제일까요..?현재 사용중인 버전은 2.7.14 입니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
itemName에 null
public class ServletUploadControllerV2 { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile() { return "upload-form"; } @PostMapping("/upload") public String saveFileV1(HttpServletRequest request) throws ServletException, IOException { log.info("request={}", request); String itemName = request.getParameter("itemName"); log.info("itemName={}", itemName); Collection<Part> parts = request.getParts(); log.info("parts={}", parts); for (Part part : parts) { log.info("==== PART ===="); log.info("name={}", part.getName()); Collection<String> headerNames = part.getHeaderNames(); for (String headerName : headerNames) { log.info("header {}: {}", headerName, part.getHeader(headerName)); } //편의 메서드 //content-disposition; filename log.info("submittedFileName={}", part.getSubmittedFileName()); log.info("size={}", part.getSize()); //part body size //데이터 읽기 InputStream inputStream = part.getInputStream(); String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("body={}", body); //파일에 저장하기 if (StringUtils.hasText(part.getSubmittedFileName())) { String fullPath = fileDir + part.getSubmittedFileName(); log.info("파일 저장 fullPath={}", fullPath); part.write(fullPath); } } return "upload-form"; } } <로그>2023-08-15 18:53:08.744 INFO 11860 --- [nio-8081-exec-7] h.u.c.ServletUploadControllerV2 : request=org.apache.catalina.connector.RequestFacade@46f8d0d2023-08-15 18:53:08.744 INFO 11860 --- [nio-8081-exec-7] h.u.c.ServletUploadControllerV2 : itemName=null2023-08-15 18:53:08.744 INFO 11860 --- [nio-8081-exec-7] h.u.c.ServletUploadControllerV2 : parts=[]2023-08-15 18:53:08.747 DEBUG 11860 --- [nio-8081-exec-7] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [926]2023-08-15 18:53:08.747 DEBUG 11860 --- [nio-8081-exec-7] o.a.coyote.http11.Http11InputBuffer : Received []2023-08-15 18:53:08.747 DEBUG 11860 --- [nio-8081-exec-7] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@7e5a37d:org.apache.tomcat.util.net.NioChannel@72e2ee37:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8081 remote=/0:0:0:0:0:0:0:1:50696]], Status in: [OPEN_READ], State out: [OPEN]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-8] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [926]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-9] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [0]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-8] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request headerjava.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1347) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1234) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:263) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-9] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request headerjava.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1347) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1234) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:263) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-8] o.apache.coyote.http11.Http11Processor : Error state [CLOSE_CONNECTION_NOW] reported while processing requestjava.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1347) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1234) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:263) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-8] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@45100ea6:org.apache.tomcat.util.net.NioChannel@3f9eb895:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8081 remote=/0:0:0:0:0:0:0:1:50697]], Status in: [OPEN_READ], State out: [CLOSED]2023-08-15 18:53:16.474 DEBUG 11860 --- [nio-8081-exec-9] o.apache.coyote.http11.Http11Processor : Error state [CLOSE_CONNECTION_NOW] reported while processing requestjava.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1347) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1234) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:263) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.78.jar:9.0.78] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]2023-08-15 18:53:16.475 DEBUG 11860 --- [nio-8081-exec-9] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@7e5a37d:org.apache.tomcat.util.net.NioChannel@72e2ee37:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8081 remote=/0:0:0:0:0:0:0:1:50696]], Status in: [OPEN_READ], State out: [CLOSED] itemName에서부터 null이 들어가서 오류가 나는 것 같은데 강사님 소스 그대로 붙여넣기 해도 동일한 오류가 발생합니다ㅠㅠitemName 파라미터를 왜 못 가져올까요,,
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV5 - handle 에러 표시
안녕하세요 !잘 따라하고 있다고 생각했는데, 아래 이미지와 같이 에러가 납니다.오타 등이 있나 해서, 코드 다운 받아서, 전체 복사 붙여 넣기 해봤는데 해당 항목에 똑같은 에러가 뜹니다.해당 파일의 전체 코드 드립니다.package hello.servlet.web.frontcontroller.v5; import hello.servlet.web.frontcontroller.ModelView; import hello.servlet.web.frontcontroller.MyView; import hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3; import hello.servlet.web.frontcontroller.v5.adapter.ControllerV3HandlerAdapter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { // private Map<String, ControllerV4> controllerMap = new HashMap<>(); //비교 위해 작성 private final Map<String, Object> handlerMappingMap = new HashMap<>(); private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); public FrontControllerServletV5() { initHandlerMappingMap(); initHandlerAdapters(); } private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); } private void initHandlerAdapters() { handlerAdapters.add(new ControllerV3HandlerAdapter()); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object handler = getHandler(request); if (handler == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } MyHandlerAdapter adapter = getHandlerAdapter(handler); ModelView mv = adapter.handle(request, response, handler); String viewName = mv.getViewName(); //논리이름 ex)new-form MyView view = viewResolver(viewName); view.render(mv.getModel(), request, response); } private Object getHandler(HttpServletRequest request) { String requestURI = request.getRequestURI(); return handlerMappingMap.get(requestURI); } private MyHandlerAdapter getHandlerAdapter(Object handler) { for (MyHandlerAdapter adapter : handlerAdapters) { if(adapter.supports(handler)) { return adapter; } } throw new IllegalArgumentException("handler adapter를 찾을 수 없습니다. handler = " + handler); } private static MyView viewResolver(String viewName) { return new MyView("/WEB-INF/views/" + viewName + ".jsp"); } } 어떤 부분이 잘 못 되었는지 확인 좀 부탁 드립니다늘 감사합니다 ♥
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
IncorrectResultSizeDataAccessException
'JdbcTemplate 적용1- 기본' 강의에서 findById()를 설명하실때,'결과가 없을경우'는 catch로 예외처리를 해주시는데'둘 이상일 경우' IncorrectResultSizeDataAccessException에 대해서는 왜 catch문으로 예외처리를 하지 않는것인지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
섹션2 체크박스에서 @ModelAttribute 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]섹션 2에서, 멀티 체크 박스를 만들 때 다음과 같은 메소드를 구현했습니다. @Slf4j @Controller @RequestMapping("/form/items") @RequiredArgsConstructor public class FormItemController { private final ItemRepository itemRepository; @ModelAttribute("regions") public Map<String, String> regions() { Map<String, String> regions = new LinkedHashMap<>(); regions.put("SEOUL", "서울"); regions.put("BUSAN", "부산"); regions.put("JEJU", "제주"); return regions; } //... }위 메소드는 컨트롤러마다 호출되어 모델에 Attribute를 자동으로 추가해주고 있습니다.근데, 이 코드를 구현하면서 다음과 같은 의문이 들었습니다.regions map에 들어가는 키-값 벨류는 비즈니스 로직에 해당하지 않나?비즈니스 로직이면 컨트롤러보단 서비스에 구현되어야 하는 내용이 아닌가?제가 MVC와 비즈니스 로직에 대한 개념이 아직 부족한건지,혹은 예제니까 간단하게 컨트롤러에 구현하신건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
model.addAttribute 질문있어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@RequestMapping("/save") public String members(@RequestParam ("username") String username, @RequestParam ("age") int age, Model model) { Member member = new Member(username, age); System.out.println("member = " + member); memberRepository.save(member); ModelAndView mv = new ModelAndView("save-result"); model.addAttribute("username"); return "save-result";이 코드에서 model에 addAttribute메소드를 username만 넘기고 age를 넘기지 않은 이유가 궁금합니다
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
inputStream 처리 문제에 관하여 (파일 업로드가 제대로 안될 때)
안녕하세요InputStream 자원을 닫지 않을시에 정상적으로 파일 업로드가 안되는 현상에 대해 도움 드립니다.두가지 방법이 있는데요.InputStream 자원을 다 쓰고 회수하기첫번째 for문 마지막에 inputStream.close 로 다 쓴 자원을 닫아줍니다.Try With resources문 사용inputStream을 선언할 시 try (InputStream inputStream = part.getInputStream()) { ...} catch (IOExcetpion e) {...}Try With resources문은 Java7 부터 지원하는 문법으로자원을 자동으로 반납해주는 문법입니다.자원을 실수없이 모두 반납할 수 있는 장점이 있습니다.try문 안에서 자원을 사용하시고,.close 같은 메소드를 생략해도 됩니다.혹여나 이 수업에서 막히시는 분들을 위해 공유드려요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV1 의 404 Error
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]FrontControllerServletV1 class 의 controller 의 값이 Null 이 나옵니다.이유는 모르겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀의 세션 처리
안녕하세요 강의 잘 듣고있습니다.커넥션 풀과 세션처리에 관해서 궁금증이 생겨 질문드립니다.커넥션이 맺어질때 클라이언트와 DB 간에 세션이 생성되고 커넥션이 종료되면 세션도 닫힌다고 이해했습니다. 그렇다면 커넥션을 닫는게 아닌 풀에 반환할때도 세션이 닫히나요? 만약 닫힌다면 어떻게 세션을 다시 열 수 있는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2의 JdbcConnection 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강사님 자료에서h2 커넥션은 JDBC 표준 커넥션 인터페이스인 java.sql.Connection 인터페이스를 구현하고있다.라고 나와있습니다.혹시,1.JDBC 표준 커넥션 인터페이스인 Connection 인터페이스가 존재한다.2.h2 Connection은 JDBC 표준 커넥션 인터페이스인 Connection 인터페이스를 상속 받아서 실질적인 기능을 구현한다.3.즉, h2 Connection은 JDBC 표준 커넥션 인터페이스인 Connection 인터페이스의 구현체이다.이런 순서로 이해하면 옳게 이해한 것이 맞나요? 항상 친절한 답변 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC와 API 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. 라고 말씀하셨습니다.근데 API의 정확한 의미가 무엇인가요?API는 애플리케이션 프로그램 인터페이스로 누군가가 코딩을 쉽게 할 수 있도록 만들어 놓은 것이라고 이해하고 있습니다.예를 들어, 계산기 API를 만들어 놓으면 다른 사람들이 계산기 API를 가져와서 사용하면 계산기를 쉽게 구현하고 사용할 수 있는 것입니다.근데 데이터 API처럼 공공 데이터를 사용할 때, 데이터베이스처럼 인증 키를 받아서 데이터를 가져올 수 있는 것도 API라고 하던대 어떤 설명이 맞는건가요?2개다 옳은 설명인건가요?아니면 데이터 API란 "해당 데이터를 가져오는 기능"을 가진 API라는 의미로 이해하면 되나요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
검증 순서
price에 "A"가 입력되면 먼저 바인딩에 실패하므로 beenValidation이 적용되지않는다그럼 타입변환에러로 생긴 메세지는 beenvalidator가 아니라 누가"검증"한건가요?? 컨버터가 한건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DB1 - JDBC 개발 조회 강의 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]jdbc 개발-조회 강의에서 MemberRepositoryV0Test 에서 findById 에서 isEqualTo()에서 결과가 참인 이유가 롬복의 @Data 가 equals()를 오버라이딩해서라고 하셨는데 롬복의 @Data 를 만약 안쓰면 isEqualTo() 값이 false가 되나요??@Data 안 써도 isEqualTo() 자체가 자바의 equals() 랑 비슷해서 참이 되어야 하는거 아닌가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 임시 저장소 기능 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강사님 강의 내용 중에 "임시 저장소 기능"이 있습니다."해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능"라는 문장에서 요청이 시작부터 끝날 때 까지라는 기준이 뭔가요?요청 시작 = 사용자가 HTTP 요청요청 종료 = 사용자의 HTTP 접속 종료 이렇게 이해하면 옳게 이해한 것인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
paramMap의 제네릭이 <String, String>인 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.paramMap의 제네릭이 String String인 이유가 파라미터로 값을 넘길때 int로 넘길수 없어서 인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
request.attribute 에 null 만 나옵니다
package hello.exception.servlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Slf4j @Controller public class ErrorPageController { //RequestDispatcher 상수로 정의되어 있음 public static final String ERROR_EXCEPTION = "jakarta.servlet.error.exception"; public static final String ERROR_EXCEPTION_TYPE = "jakarta.servlet.error.exception_type"; public static final String ERROR_MESSAGE = "jakarta.servlet.error.message"; public static final String ERROR_REQUEST_URI = "jakarta.servlet.error.request_uri"; public static final String ERROR_SERVLET_NAME = "jakarta.servlet.error.servlet_name"; public static final String ERROR_STATUS_CODE = "jakarta.servlet.error.status_code"; @RequestMapping("/error-page/404") public String errorPage404(HttpServletRequest request, HttpServletResponse response) { log.info("errorPage 404"); printErrorInfo(request); return "error-page/404"; } @RequestMapping("/error-page/500") public String errorPage500(HttpServletRequest request, HttpServletResponse response) { log.info("errorPage 500"); printErrorInfo(request); return "error-page/500"; } private void printErrorInfo(HttpServletRequest request) { log.info("ERROR_EXCEPTION: ex=", request.getAttribute(ERROR_EXCEPTION)); log.info("ERROR_EXCEPTION_TYPE: {}", request.getAttribute(ERROR_EXCEPTION_TYPE)); log.info("ERROR_MESSAGE: {}", request.getAttribute(ERROR_MESSAGE)); // ex의 경우 NestedServletException 스프링이 한번 감싸서 반환 log.info("ERROR_REQUEST_URI: {}", request.getAttribute(ERROR_REQUEST_URI)); log.info("ERROR_SERVLET_NAME: {}", request.getAttribute(ERROR_SERVLET_NAME)); log.info("ERROR_STATUS_CODE: {}", request.getAttribute(ERROR_STATUS_CODE)); log.info("dispatchType={}", request.getDispatcherType()); } }2023-08-13T23:49:48.327+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : errorPage 500 2023-08-13T23:49:48.327+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_EXCEPTION: ex= 2023-08-13T23:49:48.327+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_EXCEPTION_TYPE: null 2023-08-13T23:49:48.328+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_MESSAGE: null 2023-08-13T23:49:48.328+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_REQUEST_URI: null 2023-08-13T23:49:48.328+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_SERVLET_NAME: null 2023-08-13T23:49:48.328+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : ERROR_STATUS_CODE: null 2023-08-13T23:49:48.328+09:00 INFO 11300 --- [nio-8080-exec-6] h.exception.servlet.ErrorPageController : dispatchType=REQUEST// WebServerCustomizer package hello.exception; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @Component public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404"); ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500"); ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500"); factory.addErrorPages(errorPage404, errorPage500, errorPageEx); } }// ServerExController package hello.exception.servlet; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import java.io.IOException; @Slf4j @Controller public class ServletExContoller { // Exception (예외) @GetMapping("/error-ex") public void errorEx() { throw new RuntimeException("예외 발생!"); // HTTP Status 500 – Internal Server Error 발생 } // response.sendError(HTTP 상태 코드, 오류 메시지) @GetMapping("/error-404") public void error404(HttpServletResponse response) throws IOException { response.sendError(404, "404 오류!"); } @GetMapping("/error-500") public void error500(HttpServletResponse response) throws IOException { response.sendError(500); } }스프링부트 3.1.2 버젼으로 생성해서 String 상수의 "javax"를 "jakarta"로 변경한 것 외엔 강의에서 사용된 코드와 동일하게 작성하였습니다.그런데 /error-ex 로 접속할땐 상수값에 담긴 정보가 정상적으로 나오지만 /error-page/500, /error-page/404 로 접속하면 상수에 담긴 정보가 모두 null 로 나옵니다./error-page/500, /error-page/404 로 접속할땐 request.getAttribute() 에 아예 값이 안들어가는 것 같은데 무엇이 문제일까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
View와 ReturnValueHandler
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저희가 handler를 통해 ModelAndView를 반환한다고 배웠잖아요. 그러면 ReturnValueHandler를 거치는 것은 결국 최종적으로 ModelAndView가 되기 위한 어댑팅이라고 이해하면 될까요? 아니면 그 상위에 있는 무언가..?결국 view를 처리하기 위한 무언가가 되어야 하는데, 그러니까 결국엔 view를 처리할 수 있는 무언가가 되는건가요?그럼 또 view에서도 어댑팅으로 처리하게 되는건가요?이게 viewResolver의 과정..이겠죠?