안녕하세요. spring mvc 강의 1편,2편을 모두 들은 뒤에, 스스로 복습하다가 궁금한 점이 생겨서 글 남기게 되었습니다. 스프링 MVC에서는 DispatcherServlet이 front-controller 의 역할을 하는 것으로 강의 내용으로부터 이해했는데요. 여기서 궁금한 점이 2가지 있습니다. 1. 스프링 부트를 이용한 스프링 MVC에서 톰캣의 servlet container에 존재하는 servlet은 DispatcherServlet 하나 뿐인건가요? 2. DispatcherServlet이 여러개 등록될 수 있다면, 실제로 DispatcherServlet을 여러개 등록하여 사용하는 서비스의 예시가 궁금합니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 공부하는 개발자 최태현님! 재미있게 강의 듣던 중 질문 드릴 부분이 있어 또 찾아오게 되었네요 ㅎㅎ 이번에는 ' 35강 책 대출/반납 기능 리팩토링과 지연로딩' 적용 후의 문제 에 대해서 질문 남겨보겠습니다! user_loan_history의 대출 / 반납 시, 대출(book_name : java / user_id : 22) 반납 (book_name : java / user_id : 22) 위와 같이 '처음' 한번의 '대출과 반납' 에는 문제가 없으나, 아래와 같이 ' 이미' '대출과 반납' 이 진행되었던 [id: 7 / book_name : java] 를 가지고 '대출과 반납 을 '다시' 진행해보면,, 대출이 된 상태(is_return : 0)는 정상적으로 유지가 됩니다. (대출 시도 시, 이미 이미 대출된 책이라는 에러 메시지 정상 출력) 반면 반납의 경우, 브라우저 alter창에서는 반납 되었다고 뜨지만 DB에서는 정상적으로 적용되지 않네요., ㅠㅠ (브라우저통해 반납 시도 시, 무한 성공 but DB 미적용 ) (위 이미지 상의 '일기'라는 책은 검증용으로 '대출과 반납'을 단 1회만 해둔 상태) 추가 테스트 (history 데이터 삭제 후 진행) 책 반납 시, 해당 책에 관한 데이터가 user_loan_history에서 기록이 삭제 되도록 따로 구현이 필요한 부분일까요..?? (강의에 있는데 제가 놓친 부분이라면 죄송합니다..!!) 그럼, 오늘 하루도 잘 마무리 하시고 행복한 밤 되시길 바라며이번에도 미리 답변 감사드리며 배포 진행하고 있을게요! 행복하세요 감사합니다!
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] /error-ex/{statusCode} 로 파라미터를 받아 다양한 sendError(statusCode)를 시도해보는 중에 궁금한 점이 생겼습니다. 현재 ErrorPage에는 404, 500, RuntimeException이 등록되어 있습니다. 첫 요청의 DispatcherType이 REQUEST로 들어오고 WAS -> 필터 -> ... -> 컨트롤러 -> send(등록안된코드) WAS에서 505에 해당하는 ErrorPage 탐색 등록된 것이 없어 뭔가 기본값인 "/error"로 DispatcherType=ERROR 요청을 보내는 것 같습니다. 이후, TemplateInputException이 발생합니다. "/error" 컨트롤러가 [error] 뷰를 리턴하는데 해당하는 템플릿이 없다는 내용 같습니다. 여기서의 질문입니다. 제가 이해하기로는 이 예외가 다시 WAS로 올라가서, 위 과정 중 2번을 수행해야할 것 같습니다. WAS는 등록된 ErrorPage 중 RuntimeException에 해당하는 컨트롤러로 다시 DispatcherType=ERROR 요청을 해야할 것 같은데 그러한 과정 없이 예외가 터지고 끝인 것 같습니다. 톰캣에서 특정 Exception은 알아서 처리하고 끝내는걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예 [질문 내용] 여기에 질문 내용을 남겨주세요. "C:\Program Files\Java\jdk-11.0.15\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\lib\idea_rt.jar=52585:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\ex1-helllo-jpa\target\classes;C:\Users\cookie\.m2\repository\org\hibernate\hibernate-entitymanager\5.3.10.Final\hibernate-entitymanager-5.3.10.Final.jar;C:\Users\cookie\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\cookie\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\cookie\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\cookie\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\cookie\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\cookie\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\cookie\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\cookie\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\cookie\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\cookie\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\cookie\.m2\repository\net\bytebuddy\byte-buddy\1.9.5\byte-buddy-1.9.5.jar;C:\Users\cookie\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\1.1.1.Final\jboss-transaction-api_1.2_spec-1.1.1.Final.jar;C:\Users\cookie\.m2\repository\com\h2database\h2\1.4.199\h2-1.4.199.jar;C:\Users\cookie\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar hellojpa.JpaMain 3월 01, 2023 11:29:32 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...] 3월 01, 2023 11:29:33 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core { 5.3.10.Final } 3월 01, 2023 11:29:33 오후 org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found 3월 01, 2023 11:29:33 오후 org.hibernate.annotations.common.reflection.java .JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations { 5.0.4.Final } 3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) 3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp:// localhost/~/test ] 3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {user=sa} 3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 3월 01, 2023 11:29:34 오후 org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect Hibernate: select member0_.id as id1_0_0_, member0_.name as name2_0_0_ from Member member0_ where member0_.id=? 3월 01, 2023 11:29:35 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp:// localhost/~/test ] Process finished with exit code 0 이렇게 출력이 되고 준영속 상태 영상 5:53초에 로그이고 강사님처럼 로그기록이 안뜨고 저는 위에 처럼 뜨는데, 어디가 잘못된지 모르겠습니다. package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { //영속 Member member = em.find(Member.class, 150L); member.setName("AAAAA"); em.clear(); Member member2 = em.find(Member.class, 150L); System.out.println("================="); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }
프로젝트를 다시 만들어 실습을 진행중에 있습니다. 이번 프로젝트에서는 CustomAuthenticationProvider를 생성하지 않고 기본으로 사용되는 DaoAuthenticationProvider를 사용할려고 CustomAuthenticationProvider를 등록하지 않았습니다. 그런데 @GetMapping("/denied") public String accessDenied(@RequestParam(value = "exception", required = false) String exception, Model model) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Account account = (Account)authentication.getPrincipal(); model.addAttribute("username", account.getUsername()); model.addAttribute("exception", exception); return "user/login/denied"; } 이 컨트롤러에서 인증 객체 조회가 되지 않아 에러가 발생했습니다. 기존 프로젝트의 CustomAuthenticationProvider에서의 인증 로직이 끝나고 UsernamePasswordAuthenticationToken타입으로 인증객체가 return되고 이것이 SecurityContext에 저장되는 흐름과 현재 진행중 프로젝트의 DaoAuthenticationProvider에서 인증 로직이 끝나고UsernamePasswordAuthenticationToken타입으로 인증객체가 return되고 이것이 SecurityContext에 저장되는 흐름이 완전히 동일하다고 생각되어서 기존 프로젝트와 똑같이 컨트롤러에서 인증객체가 조회될 것이라고 생각했는데 그렇지 않습니다. 혹시 인증 흐름상에서 제가 놓치고 있는 부분이 있는건가요?
안녕하세요, 강사님. 강사님 도움 덕분에 1회차 한번씩 다 돌리고 2회차 다시 정주행 하면서 복습중입니다. 이제 이 것도 거의 끝나가네요. 다 강사님 덕분입니다. 😄 궁금한 것이 생겨 문의드립니다! ArrayList<Customer> customer = new ArrayList<>(); customer.add(new Customer(20, "챈들러")); customer.add(new Customer(42, "레이첼")); customer.add(new Customer(21, "모니카")); customer.add(new Customer(18, "벤자민")); customer.add(new Customer(5, "제임스")); customer.stream().map(x -> x.age >= 20 ? x.name + " 5000원" : x.name + " 무료" ) .forEach(System.out::println); 위와 같은 코드가 있을 때. 최종 연산 forEach 에서는 어떤 기준으로 cumtomer 객체의 name 값을 출력해주는지 알 수 있을까요? (따로 x.name 을 출력하라는 코드를 작성한게 없어 보이는데 name 만 한거 같아서요!) 데이터를 전체 출력해주는 거였다면 챈들러 5000원 20 레이첼 5000원 42 모니카 5000원 21 벤자민 무료 18 제임스 무료 5 이렇게 출력됐어야 할 것 같아서요. 그리고 혹시 만약 마지막 최종연산 forEach 에서 list 에 담긴 객체의 특정 필드값만 순회하면서 출력하는 방법도 있을까요?
↑ 되는 경로 ↑ 안되는 경로 밑에 분과 동일한 증상을 겪었는데 저같은 경우는 데스크탑 바로 밑에 프로젝트 경로를 옮기면 실행이 되고 데스크탑 하위 다른 디렉토리에 프로젝트를 넣어서 실행하니까 안되더라구요. 다른 친구한테도 부탁해서 해봤었는데 동일한 조건에서 안되더라구요,, 전에 진행했던 프로젝트들은 다 바탕화면 밑에 하위 디렉토리를 만들어서 진행했을 때 이런 문제가 없었는데 이 프로젝트만 유독 왜 이런 문제가 생길까요?? 당장에 프로젝트가 되는 상황이긴 하나 이런 문제가 다시 발생하면 안될 것 같아 질문 드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 좋은 강의 감사합니다. 공부중에 궁금한게 있어서 글을 적습니다. CustomAuthenticationProvider는 현재 support로 UsernamePasswordToken인지 확인하고 있는데 DaoProvider의 경우에도 같은UsernamePasswordToken으로 검증하고 있던데 이런 경우 제가 등록한 provider가 더 우선권을 갖게 되어서 provider list를 순회 할때 custom provider가 더 먼저 지나가게 됨으로 daoprovider는 거치지 않는 것이 맞는건가요? 또한 제가 등록한 custom provider는 parent로 daoprovider를 갖게 되는지도 궁금합니다.
채점 결과 태스트 케이스2~5까지는 정답으로 나옵니다. 4개 모두 200ms안에 끝납니다 반면에 가장 테스트 케이스 크기가 작을 case1에서는 타임리밋이 뜹니다 이유는 무엇이고 해결책은 무엇일까요? import java.util.*; public class Main { static String answer = "NO"; static int N,M; static int[] ch,dis; public void BFS(int t1, int t2, ArrayList<ArrayList<Integer>> arr) { Queue<Integer> Q = new LinkedList<>(); Loop:for(int i = 1;i<=N;i++) { if(ch[i] == 0) { Q.offer(i); while(!Q.isEmpty()) { int tmp = Q.poll(); ch[tmp] = 1; dis[tmp] = 1; if(dis[t1] == 1 && dis[t2]==1) { answer = "YES"; break Loop; } int len = arr.get(tmp).size(); for(int j = 0;j<len;j++) { int n = arr.get(tmp).get(j); Q.offer(n); } } Arrays.fill(dis, 0); } } } public static void main(String[] args){ Scanner in=new Scanner(System.in); N = in.nextInt(); M = in.nextInt(); ch = new int[N+1]; dis = new int[N+1]; ArrayList<ArrayList<Integer>> arr = new ArrayList<>(); for(int i = 0;i<=N;i++) { arr.add(new ArrayList<Integer>()); } for(int i = 0;i<M;i++) { int a = in.nextInt(); int b= in.nextInt(); arr.get(a).add(b); } int t1 = in.nextInt(); int t2 = in.nextInt(); Main T = new Main(); T.BFS(t1, t2, arr); System.out.print(answer); } }
혼자 풀어봤을 때, 다음과 같은 코드를 작성하였는데요. 타임리밋이 일어날 만한 곳이 while문밖에 없는거같아서 계속 보는데 이유를 모르겠습니다. 첫 요소가 K만큼 들어왔으면 그 다음부터는 1번씩만 put하니까 괜찮을 것이라 생각했는데 어떠한 이유로 타임리밋이 뜨는걸까요 ㅠㅠ? public static String solution(int n,int k,int[] arr) { String answer =""; HashMap<Integer,Integer> map = new HashMap<>(); // 매출의 종류 => HashMap & Sliding Window int lt=0; for(int rt = 0;rt<=(n-k);rt++) { while(lt-rt<k&<<n) { map.put(arr[lt], map.getOrDefault(arr[lt],0)+1); lt++; } answer += map.size()+" "; if(map.get(arr[rt])>1) { map.put(arr[rt], map.get(arr[rt])-1); }else { map.remove(arr[rt]); } } return answer; }
PDF를 보면서 복습을 하는데 1. 핸들러어댑터호출 핸들러어댑터를 통해 new-form 이라는 논리뷰 이름을 획득한다. 2. ViewResolver 호출 new-form 이라는뷰 이름으로 viewResolver를 순서대로호출한다. BeanNameViewResolver 는 new-form 이라는 이름의스프링 빈으로등록된 뷰를찾아야하는데 없다. InternalResourceViewResolver 가 호출된다. 3. InternalResourceViewResolver 이뷰 리졸버는 InternalResourceView 를반환한다. 4. 뷰 - InternalResourceView InternalResourceView 는 JSP처럼포워드 forward() 를호출해서 처리할수 있는경우에 사용한다. 5. view.render() view.render() 가호출되고 InternalResourceView 는 forward() 를사용해서 JSP를실행한다. 그런데 코드를 찾아보니까 render()가 실행되면서 resolveViewName()로 viewResolver를 순회하던데 이때 InternalResourceViewResolver가 호출되는게 맞나요 ?
안녕하세요! spring 부트 3.0.3 버전에서 자바 17을 이용해서 강의 내용을 따라하는 중에 HelloServlet을 만들고 localhost:8080/hello에 접속을 시도했으나 localhost :8080페이지와 같은 Whitelabel Error Page가 뜨네요. 다른 질문 들을 참고하여 @ServletComponentScan이나 세팅에서 자바로 실행하도록 설정을 변경하였으나 같은 문제가 발생합니다. 도움을 주신다면 정말 감사합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이렇게 오류가 나서 해결이 안되는데 방법이 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] @ModelAttribute() 에서 regions() 는 map을 사용했고 itemTpyes()는 배열을 사용했고 deliveryCodes()는 리스트를 사용하셨는데 각각을 이렇게 사용하신 이유가 따로 있을까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 좋은 강의 잘 듣고 있습니다. 감사합니다. 다름이 아니라 제가 혼자서 토이프로젝트를 만드는중에 ADMIN / USER 권한을 분리하고 인터셉터를 통해서 권한이 없으면 /admin/**이 포함된 url에는 접근을 못하도록 코드를 구현했습니다. 포스트 맨으로 확인을 해 보았을 때, 실제로 권한이 없으면 원하는 값이 나오지 않지만 HTTP 상태코드가 200(OK)로 나옵니다. 제가 이해한게 맞다면, 인터셉터의 역할은 올바른 요청일 땐 정상 흐름으로 작동하고 잘못된 요청(return false;)일 땐 리다이렉트 처리해서 흐름을 바꿔주는(?) 것으로 알고 있습니다. 혹시 인터셉터를 통해서 상태코드도 변환할 수 있는 방법이 있는지 궁금합니다! 혹시 안된다면 다른 방법이 있는지도 궁금합니다!