20:35 예시 코드처럼 입력했는데, 공백을 입력하고 중복확인을 하는 경우처럼 반환되는 Member 가 없는 경우 NullPointerException 이 발생합니다. memID 로 찾아지는 Member 가 있는 경우 0 을 반환하면서 잘 동작합니다. 선생님 예시에서는 작동이 잘 되는데 왜 저는 안 되는 걸까요? 옵셔널이나 예외처리를 해주어야 할까요? @RequestMapping("/memRegisterCheck.do") public @ResponseBody int memRegisterCheck(@RequestParam("memID") String memID) { //넘어오는 파라미터 이름과 받는 이름이 같은 경우 생략 가능 Member m = memberMapper.registerCheck(memID); if (m != null || m.equals("")) { //아이디가 중복이거나 공백인 경우 => 사용불가 return 0; } return 1; //사용 가능 } java.lang.NullPointerException kr.board.controller.MemberController.memRegisterCheck(MemberController.java:25) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) javax.servlet.http.HttpServlet.service(HttpServlet.java:489) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) javax.servlet.http.HttpServlet.service(HttpServlet.java:583) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. 우선 spring 부터 jpa 까지 수업 잘 듣고 있습니다! 명강의 항상 감사합니다. 임베디드 타입 공유 문제에 해결책으로 불변객체를 만들라는 말씀을 하셔서 궁금증이 생겼습니다. 제가 아는 바로는 불변의 의미가 상수의 개념과는 다르다고 알고 있습니다. "변수에 값을 바꿀 수 있냐"는 의미가 아니라 "처음 할당한 메모리 공간에서 값을 재 할당할 수 있느냐" 인걸로 알고 있습니다. 하여 , 아래와 같은 객체는 불변의 객체라고 볼 수 있느냐가 궁금합니다. 혹여라도 아래 객체가 불변 객체가 아니라고 한다면 컬럼이 수십 개인 실무에서는 어떻게 생성자 만으로 가독성 좋은 코드를 만드시는 지가 궁금합니다 ㅠ @GETTER @Embeddable class Address { private String city; private String street; private String zipcode; Address() { } Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } // 세터 대신 Address changeCity(String city) { return new Address(city, this.street, this.zipcode) } } //사용 member.setAddress(member.getAddress().changeCity("seoul"));
밑에 질문에 대한 답변을 통해 location.href 도 server에 http request message를 보낸다는 것을 알게되었습니다. 그럼 이렇게 form 구문과 type=submit 으로 http request 메시지를 보내는 것과 <form action="item.html" th:action th:object="${item}" method="post"> ..... <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button> ..... 그냥 location.href를 통해 http request message를 보내는 것과 무슨 차이인가요?? <button class="w-100 btn btn-secondary btn-lg" th:onclick="|location.href='@{/form/items}'|" type="button">취소</button> 만약 둘 다 server 한테 새 VIEW를 받아야하는 것이면 그냥 둘 중 하나로 통일해도 되는거 아닌가요? 복습 중인데 이쪽에서 이해가 계속 막히네요
와 같이 build.gradle에 작성을 했을 때 에러가 난다면 dataBinding { enabled = true } 이렇게 시도해보세요 :) 라고 되어있는데 다음과 같이 수정하였으면 좋겠습니다. 와 같이 build.gradle에 작성을 했을 때 에러가 난다면 dataBinding { enable = true } 이렇게 시도해보세요 :) (enabled = true -> enable = true로 수정을 해야 잘 작동하는 것으로 확인하였습니다 수정 부탁드립니다. 감사합니다 :) )
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의 듣기 전에 혼자서 update 테스트 코드를 짜봤는데 오류가 나더라고요. 어느 부분이 잘못된건지 알 수 있을까요? void updateItem(){ //given Item item1=new Item("itemA",10000,10); itemRepository.save(item1); //when Item item2=new Item("itemB",20000,12); itemRepository.update(item1.getId(),item2); //then Item updateItem=itemRepository.findById(item2.getId()); assertThat(updateItem.getItemName()).isEqualTo("itemB"); assertThat(updateItem.getPrice()).isEqualTo(20000); assertThat(updateItem.getQuantity()).isEqualTo(12); }
안녕하세요 선생님, 선생님께서 남겨주신 코드와 다르게 제 코드처럼 작성해도 무방할지 질문드립니다. [선생님 코드] 선생님께서 작성하신 코드는 input 지역변수의 스코프 값이 넓습니다. public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int sum = 0; int count = 0; int input = 0; System.out.println("숫자를 입력하세요, 입력을 중단하려면 -1을 입력하세요 : "); while (true) { input = scanner.nextInt(); if (input == -1) { break; } sum += input; count++; } double average = (double) sum / count; System.out.println("입력한 숫자들의 합계 : " + sum); System.out.println("입력한 숫자들의 평균 : " + average); } [제가 작성한 코드] 저는 input의 스코프값이 넓다고 생각해서 자체적으로 while문에서만 해당 변수를 부여하고, 사용 했는데 하기와 같이 사용해도 무방할까요? public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int sum = 0; int count = 0; System.out.println("숫자를 입력하세요, 입력을 중단하려면 -1을 입력하세요 : "); while (true) { int input = scanner.nextInt(); if (input == -1) { break; } sum += input; count++; } double average = (double) sum / count; System.out.println("입력한 숫자들의 합계 : " + sum); System.out.println("입력한 숫자들의 평균 : " + average);
처음 강의 부분에서 main 함수를 실행시키는데 실행 결과가 이렇게 뜨면서 에러가 납니다. 그리고 HelloSpringApplicationtest.java 의 코드도 위 사진과 같이 강사님하고 다른데 뭐가 문제일까요..? +추가로 제가 직접 코드를 바꿔서 run을 실행하니까 비슷하게 된것 같긴 한데 실행 완료가 되지 않습니다.. 다 똑같이 했는데 왜이럴까요..?
Comment객체에는 Article객체를 하나의 column으로 가지고 있는데 이는 외래키와의 매핑하고 매핑되는 column을 article_id라고 정하는 것은 이해를 했습니다 하지만 Comment a = new Comment(1L, article, "Park", "굳 윌 헌팅"); 위 코드처럼 article을 인수로 넘겨주면 article안에는 id, title, content라는 여러 column이 있는데 이중에 왜 id값이 선택되는지 궁금합니다 예시로 data.sql에서 INSERT INTO comment(article_id, nickname, body) VALUES(4, 'Park', '굳 윌 헌팅'); 이런 sql문을 넣는데 article_id라는 column은 Article타입인데 정수(Long)를 넣어도 어떻게 성립이 되는건지 궁금합니다.
void ThreadManager::Join() { LockGuard guard(_lock); for (thread& t : _threads) { if (t.joinable()) t.join(); } _threads.clear(); } for문 후에 _threads에 들어와서 실제로 join 되지 않고 clear되는 thread가 존재 할 가능성이 있어 보입니다. 그래서 Lock이 필요하다는 생각이 듭니다. 근데 강의 코드에서는 없이 사용하셔서 Lock이 없어도 괜찮은지 질문드립니다.
사용자마다 서로 다른 세션 저장소가 생성되고 관리되는지 궁금합니다. 만약 공유된다면 session 저장소를 삭제하는 과정에서 다른 사용자의 정보도 같이 삭제되어 문제가 발생할 수도 있을 것 같습니다. 더 나아가서 HttpSession은 서블릿이 제공하는 기능이라고 하셨는데, 서블릿이 아닌 HttpServletRequest 객체의 getSession 메소드로 세션에 접근하는 이유가 궁금합니다. 세션 저장소가 사용자별로 다르기 때문에 request 객체로 이를 식별하기 위함일까요? //세션 삭제 로직 HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } LoginControllerV3에서 로그인 성공 처리과정 중에 세션에 값을 저장하고 쿠키에 세션 id를 등록하는 과정이 언제 이루어지는 것인지 궁금합니다. request.getSession으로 세션 저장소를 가져오고 session.setAttribute에서 세션에 loginMember를 저장함과 동시에 쿠키에 LOGIN_MEMBER의 이름으로 세션 id를 등록하는 걸로 이해했는데 올바르게 이해한건가요? @PostMapping("/login") public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request){ if (bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); log.info("login? {}", loginMember); if (loginMember == null){ bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginFrom"; } // 로그인 성공 처리 // 세션 저장소 호출, 없으면 신규 세션 생성 HttpSession session = request.getSession(); // 세션 저장소에 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); return "redirect:/"; } 감사합니다!
안녕하세요 이진트리 개념 듣고 강의 듣기전에 한번 풀어보았는데 이런 식으로 작성해도될까요? 틀린부분 있으면 피드백 부탁드립니다! function solution(k) { let answer = []; function dfs(n, arr) { let arr1 = [...arr, n]; if (n > k) { arr.length && answer.push(arr); return; } else { dfs(n + 1, arr); dfs(n + 1, arr1); } } dfs(1, []); return answer; }