묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외부분에 대해서 질문드립니다
교재내용중에, " 해당람다에서 체크예외를 밖으로 던질수 없기때문에 언체크 예외로 바꾸어 던지도록 예외를 전환했다 " 의 의미는===> 람다에서는 bizLogic()을 호출할때 발생하는 체크예외를 throws를 사용해서 밖으로 던질수 없기때문에 try~catch로 예외를 처리했고, 체크예외를 처리할떄 catch안에서 throw로 IllegalStateException(언체크예외)로 바꾸어 던지는 이유는 트랜잭션 템플릿이 비즈니스로직을 수행하다가 언체크 예외가 발생하면 롤백하기 때문이다. 이렇게 이해하면될까요??
-
미해결스프링 시큐리티 OAuth2
강의에서 사용하는 keycloak 버전인 19.0.1 다운로드 URI 공유
강의를 매끄럽게 따라하려면 똑같은 keycloak 버전을 사용하셔야 합니다.2x.x.x 버전 사용 시 openid를 강제로 사용해야 할 수 있습니다. 다운로드 URI : https://github.com/keycloak/keycloak/releases/download/19.0.1/keycloak-19.0.1.tar.gz
-
미해결스프링 시큐리티 OAuth2
Missing parameter: code 에러
Oauth 2.0 User 모델 소개(2)영상에서 assessToken 호출을 위한 과정을 진행하는데 발생한 문제입니다.keycloack 버전이 달라 발생한 문제인지 질문드립니다.현재 keycloack 버전 21.1.2 입니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
쿠키 로그아웃 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 코드에서보면 새로운 쿠키를 만들어서 setMaxAge로 00 으로 설정해서 만료시키는거같은데 그런 이유가 있나요 ? 기존에 쿠키의 수명 0으로 만들어 만료시키는 방법은 안되나요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional이 필요한곳과 필요없는곳
안녕하세요 service 관련 코드를 공부하다가 질문이 생겨서 문의드립니다.제가 지금까지 봤던 코드들은 @Transactional(readOnly = true) 는 Read할 때 사용을 하고 @Transactional은 Read를 제외한 CUD일 때 사용을 한다고 알고있는데, 인터넷을 찾아보니 "모든 CUD 관련 코드에 @Transactional을 무분별하게 사용하면 성능에 저하가 올 수 있다. 트랜잭션은 묶음의 처리입니다. 단건의 INSERT, DELETE, UPDATE 는 Transaction 이 필요하지 않습니다." 라고 블로그에서 보았습니다. 모든 CUD 관련 코드에다가 @Transactional을 붙이면 안되는건가요? 또한 @Transactional(readOnly = true) 는 Read 관련 코드에 붙이는게 필수는 아닌가요? 어떤 방식으로 코드를 짜는게 좋은 코드인지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
getBeanDefinitionNames(); 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 스프링 강의 중 bean등록 후에 test 에서 빈출력 부분 beanDefinition관련해서 질문드려요. 현재 자바 17버전 build, run using, tests using 전부 IntelliJ IDEA 인데, 밑에 에러처럼 TestDescriptor 를 찾을 수 없다고 에러가 계속 나고 있습니다ㅠㅠ... 구글링해보니 pom.xml 에서 Junit 버전을 업그레이드 해야 한다고 돼있는데 pom.xml조차 제 프로젝트에서 찾을 수가 없어서 문의드려요.. 이 경우는 어떻게 해결해야 하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
어노테이션 유효성 검증과 ResponseEntityExceptionHandler
@Valid, @Validated 어노테이션으로도 유효성 검증이 가능하다는 것을 알고 있습니다. 그리고 GlobalExceptionHandler에서 ResponseEntityExceptionHandler 추상 클래스를 상속받아 메서드를 재정의해서 구현하는 방식으로 전역적으로 예외 객체 관리가 가능하다는 것을 알고 있는데요. 잘 이해가 되지 않는 부분이 있어 질문을 드립니다. 강의에서와 같이 DTO를 사용해 제약 조건을 추가해 타임리프에 오류 메시지를 추가하는건 BindingResult를 통해 이루어지는 것을 알고 있는데 어노테이션을 사용하면 타임리프에서의 유효성 검증만 가능한 것이고 ResponseEntityExceptionHandler 추상 클래스를 상속받아 메서드를 재정의해서 구현하는 경우에는 타임리프에 적용을 할 수 없고 RESTful API 개발에만 적용할 수 있는 것인가요?타임리프 쓰면 그냥 DTO에 제약조건 걸고 어노테이션 써서 유효성 검증하는 것 말곤 방법이 없나요?
-
미해결스프링 시큐리티 OAuth2
프론트엔드 + 서버 oauth2 연동
안녕하세요, 좋은 강의 감사합니다. 현재 제가 개발중인 react 로 된 SPA 어플리케이션이 있는데요, 프론트엔드에서 직접 authorization server 로 access token 을 가져오자니 페이지가 새로고침 될때 날라가는 현상이 발생합니다. 이를 localStorage, sessionStorage, cookie 등에 저장하는것도 안전하지 않아서 (혹시 안전하게 하는 방법이 있나요?)아예 "로그인"만 서버쪽에서 수행하고 access token, refresh token 을 프론트로 전달해줘서 refresh token 만 httpOnly Cookie 에 넣으려고 합니다. 이제 새로고침 될때마다 서버에 access token 요청을 refresh token 으로 한다음, 그 access token 을 사용하려고 합니다. 혹시 이 같은 방식이 쓰이는지 알 수 있을까요? 아니면 추천해 주시고 싶은 방식이 있으신가요? 2. 서버 사이드 view 를 통해 로그인만 oauth2Login 으로 수행하고, 로그인 후 나머지는 SPA 프론트엔드로 리다이렉트 가 가능한가요? 혹은 이렇게 쓰기도 하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
java.lang.NumberFormatException: Cannot parse null string
강의를 듣다가 2024-08-07T11:08:47.538+09:00 ERROR 9788 --- [servlet] [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[memberSaveServlet] : Servlet.service() for servlet [memberSaveServlet] in context with path [] threw exceptionjava.lang.NumberFormatException: Cannot parse null string at java.base/java.lang.Integer.parseInt(Integer.java:624) ~[na:na] at java.base/java.lang.Integer.parseInt(Integer.java:778) ~[na:na] at hello.servlet.basic.domain.web.servlet.MemberSaveServlet.service(MemberSaveServlet.java:25) ~[classes/:na] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.11.jar:6.1.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.11.jar:6.1.11] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.11.jar:6.1.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.11.jar:6.1.11] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.11.jar:6.1.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.11.jar:6.1.11] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.26.jar:10.1.26] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]2024-08-07T11:08:47.559+09:00 DEBUG 9788 --- [servlet] [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@330cc8fe:org.apache.tomcat.util.net.NioChannel@37334a47:java.nio.channels.SocketChannel[connected local=/[0:0:0:0:0:0:0:1]:8080 remote=/[0:0:0:0:0:0:0:1]:60555]], Status in: [OPEN_READ], State out: [CLOSED] 이라는 에러가 떴는데 int age = Integer.parseInt(request.getParameter("age"));에서 문제가 있다는것 같은데 아무리 확인해도 왜 오류가 뜨는건지 모르겠습니다...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
붙여넣기 후 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 순수 JDBC영상 7분30초 쯤 파일참고해서 붙여넣기를 했더니 빨간줄이 어마무시하게 많이 그였습니다.원인좀 알려주실 수 있을까요https://drive.google.com/file/d/16hfb328rA7fdLiE6oxILNIjL-gpDYSPL/view?usp=sharing
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Controller를 통한 페이지 화면이 안 보입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]정적 페이지는 잘 랜딩되는데, Controller를 통해 랜딩하는 페이지들은 에러 페이지라고 뜹니다.8080/ 페이지만 잘 나오고, 나머지 controller를 통한건 다 안 나옵니다.
-
해결됨스프링 핵심 원리 - 기본편
컴포넌트 스캔 필터 옵션과 @SpringBootApplication 어노테이
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.강의 내용 중이런식으로 컴포넌트 스캔 필터 옵션을 @Configuration을 스캔 대상으로 제외 하더라도@SpringBootApplication 이 붙은 CoreApplication을 실행시키면 교안의 AppConfig가 적용되는 것 같은데 이는 @SpringBootApplication 내부에 @ComponentScan이 따로 선언되어 있기 때문이 라고 생각되는데 맞을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트가 제공하는 임베디드 DB DataSource 스프링 빈 자동 등록 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.H2 DB는 자바로 만들어져 있고, 덕분에 JVM 내부에서 동작하는 임베디드 모드를 지원한다고 이해했습니다.스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용(제공)한다고 하는데..질문: 그렇다면 스프링 부트가 DataSource를 스프링 빈으로 자동 등록 시 라이브러리(의존 관계)에서 H2가 있는지를 먼저 확인하고, 별도의 설정(application.properties 내 url, username 등)이 없으면 임베디드 모드로 DataSource를 생성하여 빈으로 등록하는 건가요? 아니면 application.properties를 먼저 확인하고 url이 없으면 -> 라이브러리에 H2가 있는지 확인 후 메모리 DB를 사용하는 DataSource를 생성하여 빈으로 등록하는 건가요? 만약 후자라면 왜 그렇게 설계했을지(이점?)도 궁금합니다.. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult Whitelabel Error Page질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 수량이나 가격에서 qqq 로 했을경우 따로 에러를 BindingResult 에 검증 오류를 안넣어도 알아서 만들어 준다고 되어있는데 저는 저렇게 했을경우 Whitelabel Error Page 가 생겨서 질문드립니다 @PostMapping("/add") public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes , Model model) { if(!StringUtils.hasText(item.getItemName())){ bindingResult.addError(new FieldError("item","itemName","상품 이름은 필수입니다")); } if(item.getPrice()==null || item.getPrice()<1000 | item.getPrice()>1000000){ bindingResult.addError(new FieldError("item","price","가격은 1000~1,000,000 까지 허용합니다")); } if(item.getQuantity()==null || item.getQuantity()>=9999){ bindingResult.addError(new FieldError("item","quantity","수량운 9999 이상이어야합니다")); } if(item.getQuantity() != null || item.getPrice()!=null){ int resultPrice=item.getPrice()*item.getQuantity(); if(resultPrice<10000){ bindingResult.addError(new ObjectError("item","가격 * 수량의 합은 10000원 이상이어야합니다 .현재값 = "+resultPrice)); } } if(bindingResult.hasErrors()){ log.info("errors={}",bindingResult); System.out.println("zzzzzzzzzzzzzzzzzzzzzzzzzzzz"); return "validation/v2/addForm"; } Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/validation/v2/items/{itemId}"; }
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
강의자료에서 수정되어야 될 부분이 있네요.
강의자료 DelegatingPasswordEncoder 빈 정의에서알고리즘 지정생성에서@Bean public PasswordEncoder passwordEncoder() { String encodingId = "pbkdf2"; Map encoders = new HashMap<>(); encoders.put(encodingId, Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8()); DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders); return delegatingPasswordEncoder;} 에서 String encodingId = "pbkdf2"; 가 String encodingId = "pbkdf2@SpringSecurity_v5_8""; 로 수정되어야 되거나 아님 encoder 할때 버전을 5_5로 바꾸어야 하네요.한참 헤메이다 저처럼 헤메이지 말라구 올려봅니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
서비스 네이밍
서비스는 join, 메모리에서는 save 이런 식으로 표현을 한다면, 서비스 즉 비즈니스 관점은 다른 말로 “유저입장“ 이라고 생각하면 될까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HandlerAdapter마다 상속이 다른 것에 대하여
강의를 보면서 소스코드를 보니까, 다음과 같은 차이점이 있었습니다.- `SimpleControllerHandlerAdapter`, `HttpRequestHandlerAdapter`: HandlerAdapter를 상속- `RequestHandlerAdapter`: AbstractHandlerMethodAdapter를 상속 이런 이유가 RequestHandlerAdapter 는 @RequestMapping이 붙은 메서드 단위로 실행해야 되기 때문에 위의 2가지 어댑터랑은 적용 범위가 달라서 따로 뺀건가요? 정확하지가 않아 여쭈어 봅니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원목록 404 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.회원 웹 기능 - 조회 영상을 따라하다 회원 목록을 누르니#이름 이 아닌 화이트라벨404 오류가 떠서 질문드립니다. 영상38초쯤에 작성하신 findmembers를 입력하면 영상에선 좌측에 List<Member> members =가 자동완성이 되던데 저는 안되길래 직접 타이핑하여 문제가 된건지 다른 이유가 있는것인지 알고싶습니다. 아래 링크입니다.https://drive.google.com/file/d/1Gx9K-pAn1YogtFvby-9sfCVsmB8WiHUg/view?usp=sharing
-
미해결
스프링 알림 1:N 발송 어떻게 구현해야할까요?
안녕하세요. 스프링으로 알림 서비스 API 만들어보고 있습니다.여기서 알림이라 하면, 인프런에서 '종 아이콘' 누르면 나오는 사이트 내부에 있는 알림입니다. 현재 Notification 테이블은 Member 테이블이 @ManyToOne으로 매핑되어있는 상태입니다.즉, 한 유저는 여러개의 알림을 가질 수 있습니다. 'OO님이 본인 게시글에 답글을 달았습니다'와 같은 1:1 알림 전송은 Notification insert가 댓글 달때 한번만 일어나므로 상관없지만, '스프링 핵심 원리 -기본편 강의에 새소식이 있어요!!'와 같은 1:N 알림을 보내려면, 스프링 핵심원리를 듣는 모든 수강생한테 알림을 보내야하니까, 수강생수만큼 Notification Insert가 나가야하잖아요??그러면 수강생 수가 100만명이면 Insert가 100만명 나가는건데, 너무 '비효율적'이고 'DB 공간 낭비'라고 생각되서요. 대규모 서비스에서 사용되는 좋은 방법 추천해주실 분 계신가요?인프런에서 1:N 알림은 어떤 방법을 쓰고 있을까요~?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
섹션2의 정적 컨텐츠 부분에 질문이 있습니다
강의를 한번 돌리고 복습중입니다 섹션2. 정적 컨텐츠 강의에서 위와 같이 /hello-static.html을 입력하여 요청하면 우선 1번과 같이 hello-static관련 controller에서 있는지 확인하고 없으면 2번과 같이 정적 컨텐츠를 내려준다고 설명하셨습니다.이와 관련하여 궁금증이 uri요청 자체가 hello-static.html로 요청자체에 .html을 요청하였기 때문에 .html을 찾아야 하는게 흐름상 맞지 않나라는 생각이 듭니다. gpt를 통해 알아보니 .html을 처리하는 controller가 있을 수 있기 때문이라고 하는데, 그렇다면 hello-static.html을 요청할 경우 스프링 컨테이너에서 찾는 controller의 이름이 어떻게 되나요??dispatcher servlet처럼 논리 이름만을 생각하여 .html을 제외한 hello-static이라는 controller의 이름을 찾을 것 같은데 맞는지 궁금하네요질문 요점: /hello-static.html로 요청했을 경우 1번 경우의 스프링 컨테이너에서 controller를 찾을때 찾는 이름의 기준이 무엇인지에 대한 질문.