묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
[오타문의] 스프링 JdbcTemplate 예시
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예외를 확인하기가 편리하다. 인 것 같습니다! 감사합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Invalid bound statement
mybatis 작성을 다하고 test를 돌리는데 에러가 발생합니다. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): hello.itemservice.repository.mybatis.ItemMapper.save 제가 작성한 코드에 문제가 있는지하고 pdf를 복사해서 돌려보아도 계속 에러가 발생합니다..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Data를 작성한 이유가 무엇일까요?
강의 내에서 User 클래스를 작성할때, @Data를 작성한 이유가 무엇일까요? 타임리프 문법 내에서 getter, setter메소드를 사용해서 프로퍼티 접근을 하기위해 @Data를 적은것이라고 이해해도 될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
캐스팅을 하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ControllerV3 controller = (ControllerV3) handler; 와 같이 캐스팅을 하는 이유가 인자인 object가 더 포괄적(부모)이기 떄문인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션과 쿠키 생명주기
세션과 쿠키의 생명주기가 헷갈려서 질문드립니다.어떨때는 브라우저를 닫으면 쿠키와 세션이 종료되고 어떨때는 세션만종료되고 생각해보면 기준이 총 4개1.쿠키(생명주기 미설정)2.쿠키(생명주기 설정)3.세션(생명주기 미설정)4.세션(생명주기 설정) 이렇게 4가지 경우가 있는것 같은데 여기서 추가적으로 세션이 사라져도 쿠키가 살아있는 경우도 있나요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션에 여러 데이터를 저장할 수 있다.
@PostMapping("/login") public String loginFormV3(@Validated LoginForm loginForm, BindingResult bindingResult, HttpServletRequest request){ if(bindingResult.hasErrors()){ return "login/loginForm"; } Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword()); if(loginMember == null){ bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } // 로그인 처리 TODO 쿠키를 만들어서 브라우저로 전송하면 브라우저에서 요청시마다 쿠키를 함께 전달함 // 스프링에서 제공하는 HTTP 세션 매니저 사용 HttpSession session = request.getSession(); // 세션이 있으면 있는 세션 반환 없으면 새로 만들어서 반환함 // 세션에 로그인 회원 정보를 보관한다. session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); // 기본적으로 다 메모리에 저장됨 // 세션 생성하려면 .getSession에 파라미터를 true(근데 디폴트라 생략가능) // false라고 하면 새로운 세션을 반환하지 않고 null로 반환한다. //sessionManager.createSession(loginMember, response); return "redirect:/"; } 이 코드에서 session.setAttribute()을 통해 하나의 세션의 여러 값을 저장할 수 있다는 말이 잘 이해가 가지 않아서 질문드립니다 여기서 여러 값을 저장할 수 있다는 말은 하나의 key에 여러가지 value를 저장하는 MultiValueHashMap처럼 사용할 수 있다는 뜻인가요? 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 서블릿 response 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강사님께서 강의에서 작성하시는 이 부분은response를 사용하고 싶을 때 마다, 이런 기능을 다 직접 코드를 작성해야하나요?request를 요청하면 response 관련 정보가 들어있는 객체가 따로 자동 생성되는 것 아닌가요??
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db1 - 스프링과 문제해결 예외처리,반복 강의 관련
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링 예외 추상화 이해 파트 부분 강의에서 스프링이 제공하는 예외 변환기 부분에서 test 코드 짜실때 DataSource dataSource;@BeforeEachvoid init(){ datasource = new DriverManager~();}이런 식으로 작성하셨는데 @BeforeEach 안쓰고 @Test 코드 작성하기 전에 테스트 클래스 상위에 DataSource dataSource = new DriverManager~();이런식으로 작성하는건 안되나요??
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
29강. boardInsert 메서드 @ResponseBody 붙이는 이유
안녕하세요. boardInsert 메서드에 @ResponseBody를 붙이는 이유가 궁금합니다. insert 후에 리턴 값이 없는데 왜 @ResponseBody를 붙이는 건가요? callback 함수인 loadList 때문인가요? 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
finditems() 에러
'테스트 - 스프링 부트와 임베디드 모드' 수강 중에 ItemRepositoryTest를 h2를 모두 끄고 동작시켰는데강사님처럼 모두 성공을 뜨지 않고 finditems()에서 에러가 납니다.강의자료 초반에 데이터베이스에서 데이터가 보관되어 있어서 그렇다고 들었는데어떻게 해결해야하나요?? h2는 접속 종료한 상태입니다.
-
미해결스프링 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 같은 메소드를 생략해도 됩니다.혹여나 이 수업에서 막히시는 분들을 위해 공유드려요