묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
PKIX path building failed
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Spring Initilizr 을 통해 project generating 한 후 Intellij 에서 실행하니 초기 빌드 과정에서 아래와 같이 에러가 뜨는데요, 찾아보니 제가 지금 사내 pc 및 네트워크를 사용 중이어서 뜨는 인증서 오류인 것 같습니다. 혹시 관련하여 해결책을 주실 수 있으실까요?PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
index.html 사이트 연결할 수 없음
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.webapp 아래 index.html 파일 잘 위치해 있습니다.http://localhost:8080/index.html 주소로 들어가면 사이트 연결할 수 없음이라고 뜨고IDE에서 run하면 뜨는 브라우저 아이콘 4개 중 크롬을 누르게 되면 http://localhost:63342/servlet/servlet.main/webapp/index.html?_ijt=gol0djjmpsd9cm9s9v6ag90urr&_ij_reload=RELOAD_ON_SAVE위 주소로 index.html 파일이 잘 열립니다.혹시 어떤 문제 때문에 이러는 건가요?이와 연관된 문제인 건지는 모르겠으나 위에 긴 주소로 열린 index.html 파일에서 jsp 회원가입, 회원목록을 눌렀을 때도 404에러만 납니다.알려주신 위치에 디렉토리 생성하고 파일 제대로 만들었음에두요.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DI 적용해보기
안녕하세요. 항상 좋은 강의 감사합니다.FrontController에서 어댑터들을 DI로 적용할 수 있다고 하셔서 이를 구현해보고자 하였습니다.@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { ... @Autowired private Map<String, Object> handlerMappingMap; ... }처음에 컬렉션 객체들을 Bean으로 등록하여 주입받고자 HandlerMappingConfig클래스를 만들었습니다.@Configuration public class HandlerMappingConfig { @Bean public Map<String, Object> handlerMappingMap() { Map<String, Object> handlerMappingMap = new HashMap<>(); // V2 Controller handlerMappingMap.put("/front-controller/v5/v2/members/new-form", new MemberFormControllerV2()); handlerMappingMap.put("/front-controller/v5/v2/members/save", new MemberSaveControllerV2()); handlerMappingMap.put("/front-controller/v5/v2/members", new MemberListControllerV2()); // V3 Controller & V4 Controller ... return handlerMappingMap; } }그리고 제대로 주입을 받았는지 테스트하기 위해 FrontControllerServletV5 클래스의 service() 메소드에서 handlerMappingMap을 출력하도록 작성하였습니다.@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { ... @Autowired private Map<String, Object> handlerMappingMap; ... @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 정상적으로 주입되었는지 테스트하기 위해 출력 System.out.println("handlerMappingMap = " + handlerMappingMap); ... } }서버를 실행시켜 확인해보니 아래 그림과 같이 handlerMappingMap에 마치 컨테이너의 빈들이 다 들어온 것처럼 출력된 것을 확인할 수 있었습니다.왜 이런 현상이 나타나는지 모르겠습니다. 혹시 타입이 Map<String, Object>라 그런걸까요?감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터의 호출 순서 질문입니다.
강의를 따라가다 문득 preHandle, postHandle, afterCompletion 의 순서를 알고 싶어서 LoginCheckInterceptor 에 해당 메서드를 추가하여 로그를 찍어보았습니다.질문은 맨 밑에 있으며, 코드는 이해를 돕기 위해 첨부했습니다.LogInterceptor@Slf4j public class LogInterceptor implements HandlerInterceptor { public static final String LOG_ID = "logId"; @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception { String requestURI = request.getRequestURI(); String uuid = UUID.randomUUID().toString(); request.setAttribute(LOG_ID, uuid); // @RequestMapping: HandlerMethod // 정적 리소스: ResourceHttpRequestMethod if (handler instanceof HandlerMethod) { // 호출할 컨트롤러 메서드의 모든 정보가 포함되어 있다. HandlerMethod hm = (HandlerMethod) handler; } log.info("[{}][{}] LogInterceptor preHandle", requestURI, uuid); return true; } @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView ) throws Exception { String requestURI = request.getRequestURI(); String uuid = (String) request.getAttribute(LOG_ID); log.info("[{}][{}] LogInterceptor postHandle", requestURI, uuid); } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex ) throws Exception { String requestURI = request.getRequestURI(); String uuid = (String) request.getAttribute(LOG_ID); log.info("[{}][{}] LogInterceptor afterComplete", requestURI, uuid); if (ex != null) { log.error("LogInterceptor afterComplete Error: ", ex); ex.printStackTrace(); } } }LoginCheckInterceptor@Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception { String requestURI = request.getRequestURI(); String uuid = (String) request.getAttribute(LogInterceptor.LOG_ID); log.info("[{}][{}] LoginCheckInterceptor preHandle", requestURI, uuid); HttpSession session = request.getSession(); if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) { log.info("미인증 사용자 요청 {}", requestURI); response.sendRedirect("/login?redirectURL=" + requestURI); return false; } return true; } @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView ) throws Exception { String requestURI = request.getRequestURI(); String uuid = (String) request.getAttribute(LogInterceptor.LOG_ID); log.info("[{}][{}] LoginCheckInterceptor postHandle", requestURI, uuid); } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex ) throws Exception { String requestURI = request.getRequestURI(); String uuid = (String) request.getAttribute(LogInterceptor.LOG_ID); log.info("[{}][{}] LoginCheckInterceptor afterCompletion", requestURI, uuid); } }InterceptorConfig@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .order(1) .addPathPatterns("/**") // 모두 허용 .excludePathPatterns("/css/**", "/*.ico", "/error"); // BlackList registry.addInterceptor(new LoginCheckInterceptor()) .order(2) .addPathPatterns("/**") .excludePathPatterns( "/", "/members/css", "/login", "/logout", "/css/**", "*.ico", "/error" ); } }결과 1 - 미인증 사용자 요청// /items 요청 [/items][45e50a37-57a0-4298-b50e-e42141005426] LogInterceptor preHandle [/items][45e50a37-57a0-4298-b50e-e42141005426] LoginCheckInterceptor preHandle 미인증 사용자 요청 /items [/items][45e50a37-57a0-4298-b50e-e42141005426] LogInterceptor afterComplete // Redirect - /login [/login][18f052ab-b849-4690-83ec-43866660f570] LogInterceptor preHandle [/login][18f052ab-b849-4690-83ec-43866660f570] LogInterceptor postHandle [/login][18f052ab-b849-4690-83ec-43866660f570] LogInterceptor afterComplete로그상으로 LoginCheckInterceptor의 afterComplete가 누락되었습니다.결과2 - 정상 처리// /login 요청 [/login][19bad338-e02d-4bbe-8b3a-5dfc55ad4428] LogInterceptor preHandle LoginService: 'test', 'test!' login? Member(id=1, loginId=test, name=테스터, password=test!) [/login][19bad338-e02d-4bbe-8b3a-5dfc55ad4428] LogInterceptor postHandle [/login][19bad338-e02d-4bbe-8b3a-5dfc55ad4428] LogInterceptor afterComplete // Redirect - /items [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LogInterceptor preHandle [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LoginCheckInterceptor preHandle [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LoginCheckInterceptor postHandle [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LogInterceptor postHandle [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LoginCheckInterceptor afterCompletion [/items][679dc279-ff3a-4ee3-a424-26b18ac8dbbd] LogInterceptor afterCompletepreHandle은 order의 순위대로 로그가 찍히는데, postHandle과 afterCompletion의 경우 order의 순위와 반대로 호출이 됩니다. 혹시 위 2개의 결과에 대한 이유를 설명해주실 수 있을까요..? 그냥 로직때문에 그런 것인지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]엔티티 클래스 개발 1 강의에서 1:10분 쯤 Member, MemberRepository를 삭제 후 회원 레포지토리 개발 강의에서 MemberRepository를 새로 개발하셨습니다.이때 MemberRepositoryTest에는 그 전에 작성한 MemberRepository 기준으로 되어 있어 리턴 값이나 필드 값이 (UserName > name) 맞지 않아 오류가 발생하고 있습니다.그런데, 강사님은 MemberRepository를 새로 작성할 때 오류가 뜨지 않고 관련해서 언급을 하신 것이 없는 것(돌려봤는데 찾지 못한 것일 수도 있습니다.)으로 간주되는데 MemberRepositoryTest를 어떻게 처리하신 것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 폼 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]https://drive.google.com/file/d/1nMMxLmSaPSEIpUd17iJ9VjbdbC_Elybx/view?usp=sharingnull point Exception이 일어나는데 어디서 문제가 있는지 도저히 못 찾겠습니다..jap로 올렸습니다ㅜ
-
미해결스프링 핵심 원리 - 기본편
주입할 스프링 빈이 없을 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]주입할 스프링 빈이 없을 경우가 어떤 것이 있는지 예시가 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
맥북과 윈도우
안녕하세요 영한님강의 잘 듣고 있습니다!강의와 완전 직접적으로 관련 있는 내용은 아니지만궁금해서 여쭤봅니다 저번에 20만 기념 라이브 때누군가 mac vs 윈도우 라는 댓글에당연히 맥 써야죠~~ 여러분 맥 쓰셔야 합니다!라고 답변 주시고 넘어가셨는데이유가 궁금해서 여쭤보고 싶습니다! 검색도 많이 해봤는데 의견이 분분해서요 ㅜ 근데 영한님께서 당연히 맥이죠~! 라고 하신 순간부터엄청나게 맥북을 사용하고 싶어졌습니다..! 현재 회사로 이직할 때 맥북을 사용할 기회가 있었는데맥북을 써본 적이 없는지라 적응하는데 어려움을 겪을까봐레노버 게이밍 노트북을 받았는데 좀 답답할 때가 많아서요..ㅎㅎ 회사에 맥북으로 바꿔달라고 요청하고 싶은데 아직 사용연한이 다 차지 않아서임원분을 설득할 논리도 필요한데 혹시 힌트를 얻을까하여..근데 꼭 그게 아니더라도 궁금해서 질문 드립니다!
-
미해결스프링 핵심 원리 - 기본편
@Configuration 사용이유
@Configuration을 지워도 테스트가 통과되는데 @Configuration사용하는게 어떤 차이를 만드나요??
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서버 단에서 input 태그의 type 속성을 확인하는법
서버는 http요청을 통해 form 태그를 이용한 데이터가 들어올 때, form 태그 내부에 있는 input 태그의 type 속성 값을 어떻게 알 수 있나요? 인코딩되는 과정에서 type 속성 값이 어딘가 저장되는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
존경하는 김영한님 pdf에 오타가 있어 조심스레 말해봅니다
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 v2023-01-03 파일입니다.22페이지 맨 마지막 줄에 엔티티에가 -> 엔티티가 이렇게 되어야 할 거 같습니다.완벽한 강의가 더 완벽해지면 하는 마음에 조심스레 남겨봅니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
7:50 api 호출시 exception이 발생하면 WebServerCustomer 클래스 호출하는 이유
안녕하세요 선생님~단순한 질문이 하나 있는데요!컨트롤러에서 Exception이 발생하면 반대로인터셉터 -> 서블릿 -> 필터 -> WAS로 예외를 넘겨주고 WAS에서 에러 페이지를 찾는다는 것에 대해서는 이해를 했는데, WebServerCustomizer 클래스를 호출한건 WebServerFactoryCustomizer라는 인터페이스를 구현했기 때문에 해당 클래스를 스프링 컨테이너가 인지하고 호출한건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@autowired 질문입니다!..
이렇게 빈으로 등록해준뒤다른 클래스에서 의존성 추가를 해줄때@autowired 를 써야하나요?검색했는데도 이해가 잘 가지않네요 ㅠㅠ어느 상황에 따라 쓰는지도 답변 부탁드립니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티 직접 사용 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 강의를 복습하다가 질문이 생겨서요"select new jpabook.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count) " + " from OrderItem oi " + " join oi.item i " + " where oi.order.id = :orderId", OrderItemQueryDto.class)다음 소스를 보면 oi.order.id = :orderId 부분에서예전 강의 내용에서 jpql에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다는 내용이 생각나서 oi.order = :orderId로 수정했더니 정상적으로 동작하지 않더라구요. 혹시 다른 내용인걸까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
*.jsp 주소로 이동하면 jsp파일 다운로드가 됩니다
안녕하세요./jsp/members/new-form.jsp 경로로 이동하면 페이지 이동이 안되고 new-form.jsp 파일을 다운로드 하는 창이 나타납니다.영한님이 작성하신 코드를 복붙했는데도 이런 현상이 나타 납니다.왜 이러는지 이유를 모르겠습니다 ㅠㅠ
-
미해결실전! 스프링 데이터 JPA
application.yml 질문드립니다.
[질문 내용]여기에 질문 내용을 남겨주세요. spring: datasource: url에 datajpa 부분이 오타났다고 뜨는데 왜 그렇게 되는 건가요? db 명은 datajpa로 했습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Spring boot 없이 thymeleaf 사용못하나요?
스프링 부트없이 Spring 사용하려하는데 jsp로 작업했던 파일을 thymeleaf로 변경하기 위해 html파일도 만들고 suffix도 변경해주었는데 아래와 같은 에러가 나옵니다.No mapping for GET /WEB-INF/view/register.htmljsp로 바꿔서 하면 잘되는데 suffix만 html로 바꾸면 페이지를 찾지를 못하네요ㅠㅠ 원래 thymeleaf가 spring boot에서만 사용가능한 것 일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 연결시 JDBC URL
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. H2 연결할때jdbc:h2:~/test (최초 한번)이렇게 해서 ~/test.mv.db 파일 생성 되는지 확인을 했습니다.접속도 됩니다.근데, 이후부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속 하라고하는데, jdbc:h2:~/test 은 접속이 가능한데, jdbc:h2:tcp://localhost/~/test 이렇게 쓰면 Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-200] 90067/90067 (도움말)이 에러가 뜨면서 들어가지지 않습니다.어떻게 해야할까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔터티 설게시 주의점 setter 리팩토링
안녕하세요! 영한님 강의 질 좋은 강의 너무 감사하게 보고 배우고 있습니다!다름이 아니라, 엔터티 설계시 주의점 강의에서setter를 사용하지 않기위해서 엔터티 설정을 아래와 같이 코드 수정을 해보았는데 이렇게 하는 게 더 안전한 방법인가요?? 실무에서도 이렇게 사용하는지 매우 궁금합니다..!Order 엔터티public class Order{ ... public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); // orderItem.setOrder(this); OrderItem.builder() .order(this) .build(); } public void setDelivery(Delivery delivery){ this.delivery = delivery; // delivery.setOrder(this); Delivery.builder() .order(this) .build(); } } OrderItem 엔터티... @NoArgsConstructor public class OrderItem { ... @Builder public OrderItem(Order order){ this.order = order; } }
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@Controller 사용시 HTTP 요청 과정 질문 / 핸들러 어댑터 과정
1. 클라이언트가 HTTP 요청을 한다( http://localhost:8080/springmvc/v1/members/new-form ) 2. DispatcherServlet 에서 핸들러를 조회를 한다 @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } } 서버에 등록되어 있는 핸들러(컨트롤러) @Controller : 핸들러 등록하기 @RequestMapping : 클라이언트가 요청한 URL 과 매핑 후 메서드를 실행한다. 3. 이 조회한 핸들러를 처리할 수 있는 핸들러어댑터를 조회하고 이 어댑터를 통해서 핸들러(컨트롤러)를 호출한다. 전 시간에는 핸들러 어댑터 리스트들을 다 만들어서 iter 돌려서 핸들러를 처리할 수 있는 어댑터를 찾고 그 핸들러 어댑터가 핸들러를 호출하도록 하였습니다 이번시간에 이 과정들은스프링 내부에서 다 해준다는 말인가요 ? 이 내부 과정들을 이해했다면 저는 @RequestMapping 으로 클라이언트의 요청과 처리할 메서드를 매핑하고 @Controller 로 핸들러를 등록하기만 하면 되는건가요?