묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
return과 return-redirect에 관한 질문
이제까지 'url에 @RequestMapping과 @GetMapping로 조합된 주소를 입력하면 return값에 있는 html을 보여준다' 와 같이 이해하였습니다. @RequestMapping("/basic/items") @GetMapping("/{itemId}/edit") public String 메서드명(){ 코드 실행 return "basic/editForm";}url에 "/basic/items/1/edit"을 입력하여 상품수정 페이지를 호출하면 templates/basic/editForm.html와 같이 <해당 경로에 있는 html 파일>화면을 뿌려준다(렌더링한다?) 와 같이요. 그런데 이번에 리다이렉트를 보면return "redirect:basic/items/{itemId}";<해당 경로에 있는 html 파일>을 뿌려주는것이 아니라 해당 url을 입력한 것처럼 해서 @GetMapping("/{itemId}") public String item(@PathVariable long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; }이 코드가 실행되는것으로 보입니다.1.우선 제가 올바르게 이해하고 있는것이 맞는지 궁금합니다.2.return값에 redirect가 붙으면 html 파일의 절대경로가 아니라 url로 인식을 해서 매핑을 알아서 해주는지 궁금합니다.
-
미해결스프링 시큐리티 OAuth2
JwtDecoder 문제
org.springframework.boot:spring-boot-starter-oauth2-resource-server:2.7.3 버전에서 jwtDecoder 생성 문제가 있는 것으로 보입니다.jwt-set-uri 설정일때는 되지 않고 issuer-uri 설정일때만 문제가 발생하지 않습니다.혹시 제가 설정 문제인지 확인 차 질문드립니다.url 확인도 해봤습니다. https://github.com/okta/samples-java-spring/issues/77여기서 문제가 있다며, 일부분을 인정을 하였습니다.같은 상황으로 보입니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
스프링부트로 실제 쇼핑몰을 제작해보고싶은데요..
스프링부트로 실제 쇼핑몰을 제작해보고싶은데요 혹시 결제기능관련이나 쪽지관련기능 로직짜는거 추가로 보강즘 해주실수없나요? 파이썬이나 자바스크립트 백엔드 관련강의들보면 결제기능 탑재나 쪽지기능 구현등 강의가 더러 널려있는데 유독 스프링부트관련해서는 이런기능을 구현하는 강의가 없는것같습니다
-
미해결3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]
7강 프로시저 호출하기 부분에서 Oracle의 경우 resultMap을 어떻게 받을 수 있을까요?
안녕하세요EA 강의를 시작으로 열심히 들어보려 하고 있습니다. 사정 상 MariaDB 대신 Oracle을 사용하여실습을 진행하고 있는데요 7강에서 문제가 발생했습니다. 오라클은 Procedure를 생성할 때SELECT절이 있으면 반드시 INTO를 적어야 하는 것 같습니다. SQL> editWrote file afiedt.buf1 CREATE OR REPLACE procedure JHBAEK.sp_myproc (2 in_userid tbl_user.userid%type,3 in_userpw tbl_user.userpw%type,4 out_state out number5 )6 is7 begin8 update tbl_user9 set userpw = in_userpw10 ;11 select userid, userpw12 from tbl_user13 where userid = in_userid14 ;15 out_state := 0;16 end sp_myproc17* ;SQL> /Warning: Procedure created with compilation errors.SQL> show errorsErrors for PROCEDURE JHBAEK.SP_MYPROC:LINE/COL ERROR-------- -----------------------------------------------------------------11/2 PLS-00428: an INTO clause is expected in this SELECT statementSQL> 오라클의 경우 프로시저에서 SELECT 한 결과를mybatis 통해 HashMap으로 받는 것이 불가능한걸까요? 강의에서 앞으로도 프로시저를 계속 사용할 것이라고 말씀하셨는데 이것 때문에 실습 따라가기에 불편함이 있을까봐 걱정입니다. 친절하고 자세한 답변 기대하며미리 감사드립니다.
-
해결됨Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
StepVerifier를 이용한 Testing (1) 의 StepVerifiter 질문
안녕하세요 강사님StepVerifiter 관련된 내용 중에 해당 2개의 메서드 사용법이 어떻게 다른지 잘 이해가 가지 않아서 질문을 드리게 됐습니다..then(() -> VirtualTimeScheduler.get().advanceTimeBy(Duration.ofHours(12))).thenAwait(Duration.ofHours(12))1번의 경우 시간을 당겨서 테스트를 진행하고, 2번의 경우 시간을 기다려서 테스트를 진행하다는 것으로 이해를 했습니다.그런데 2개의 메서드 모두 동일한 테스트 결과를 얻을 수 있는데, 굳이 해당 메서드들을 구분해서 사용해야 할까요? 아니면 각각의 메서드가 유용한 케이스가 따로 있는 걸까요 ?혹시 각각의 메서드를 따로 사용해야 하는 케이스가 있다면, 어떤 경우에 어떤 메서드가 더 유용한지 조금 더 자세한 예시를 알려주신다면 정말 큰 도움이 될 것 같습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
test.mv.db 삭제 후 오류
강의 영상에서test.mv.db를 삭제하라 하셔서 rm으로 지웠는데요 다시 시작하라 하셔서 jdbc:h2:~/test 이거로 입력하니 Database "C:/Users/(사용자명)/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) 로 뜹니다... 결정적으로 이전에는 만들어졌던test.mv.db 파일이 안 만들어집니다..
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
빌드 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요?예[질문 내용]안녕하세요~자바 21 로 선택 후 아래와 같이 프로젝트를 받았는데 빌드오류가 계속 진행돼서 질문합니다.혹시 어떤 부분이 문제인지 알 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
Bean 어노테이션을 통해 생성된 인스턴스에 관하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요, @Bean을 통해 컨테이너에 빈을 등록할 때 생성되는 인스턴스에 대한 궁금점이 있습니다.강의 코드에서는 다음과 같이 AppConfig.java에서 MemberRepository를 new MemoryMemberRepository()를 통해 매번 생성하여 반환하고, 이를 memberService() 그리고 orderService()에서 생성하여 호출하고 있습니다.@Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); }여기서 제가 궁금한 점은 memberRepository()를 통해 매번 새롭게 생성되는 MemoryMemberRepository를 호출하는 것으로 예상하고 실제 메모리 참조를 확인해보니 모두 동일한 값을 가지는 것을 확인했습니다. 아래는 코드 중 일부입니다.MemberService, OrderService에 다음을 추가MemberRepository getMemberRepository();아래는 위 메소드를 각 Impl에서 구현한 코드입니다.@Override public MemberRepository getMemberRepository() { return this.memberRepository; }public static void main(String[] args)의 일부 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); OrderService orderService = applicationContext.getBean("orderService", OrderService.class); MemberRepository repo = applicationContext.getBean("memberRepository", MemoryMemberRepository.class); System.out.println("member Service Repository = " + memberService.getMemberRepository()); System.out.println("order Service Repository = " + orderService.getMemberRepository()); System.out.println("member repository bean = " + repo);실행 결과member Service Repository = hello.core.member.MemoryMemberRepository@5552768b order Service Repository = hello.core.member.MemoryMemberRepository@5552768b member repository bean = hello.core.member.MemoryMemberRepository@5552768b이에 대해 다음과 같은 두 가지 질문이 있습니다.memberRepository는 new를 통해 매번 새롭게 생성하지만 같은 주소를 가지는 이유가 스프링 컨테이너 내부에 빈으로 등록되었기 때문인지 궁금합니다.만약 인스턴스마다 다른 값을 가지고 있어야 하는 경우가 있다면, 필요에 따라 @Bean을 통해 생성 해야 하는건지 궁금합니다. 감사합니다.제가 강의 도중 궁금증이 생겨 확인, 질문했었는데 내용 후반부에 싱글톤과 관련된 설명이 있군요... 머쓱..
-
미해결실전! 스프링 데이터 JPA
save 메서드와 변경감지 질문입니다.
안녕하세요.강의 항상 잘 보고 있습니다. SimpleJpaRepository 구현 클래스의 save 메서드 안에em.merge가 있습니다. 결국 엔티티를 변경할 일이 있으면 save 메서드를 사용하지 말고 변경 감지를 사용하라는 말씀이 맞으신가요? save 메서드는 새로운 엔티티를 저장할 때만 사용하라는 것으로 이해하면 될까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
status 의 의미
1:57 부터 status의 속성이 의미하는게 무엇인지 궁금합니다.저장이 성공했다는 의미로 값을 true 로 설정하신 걸까요?강사님께서 "남는애들은 쿼리파라미터 형식으로 들어가게 된다." 라고 하시는데남는 애들 -> 속성들 인 것 같고근데 그게 왜 true로 리턴되는지 모르겠습니당....왜 굳이 추가하신 건가요?
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
검색기능이 안됩니다
코드를 맞게 쳤는데 메뉴 이름중 일부만 검색했을때 나오질 않네요<!-- 검색에 의한 쿼리 --> <select id="doSearch" resultType="hello.sailing.v2.vo.Order_list"> SELECT no, coffee_no, coffee, price, cust_id, name, DATE_FORMAT(reg_day,'%Y.%m.%d') AS reg_day FROM order_list WHERE 1=1 AND reg_day >= DATE_FORMAT( #{strStartDate},'%Y%m%d') AND reg_day < DATE_ADD(DATE_FORMAT(#{strEndDate},'%Y%m%d'), INTERVAL +1 DAY) <if test="strCoffee != 'ALL'"> AND coffee like CONCAT(#{strCoffee},'%') </if> <if test="strName != 'ALL'"> AND name like CONCAT(#{strName},'%') </if>
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
검색기능이 안됩니다
@PostMapping("/order_search") public String doSearch( @RequestParam("start_date") String strStartDate, @RequestParam("end_date") String strEndDate, @RequestParam(value = "coffee", defaultValue = "ALL") String strCoffee, @RequestParam("name") String strName, Model model ){ log.info("strStartDate :"+strStartDate); List<Order_list> list = orderSvcV2.doSearch(strStartDate,strEndDate, strCoffee,strName ); model.addAttribute("list", list); return "/v2/order/order"; }/* 조회하기 */ public List<Order_list> doSearch(String strStartDate, String strEndDate, String strCoffee, String strName) { List<Order_list> list = orderDao.doSearch(strStartDate,strEndDate, strCoffee,strName ); return list; }package hello.sailing.v2.dao; import hello.sailing.v2.vo.Order_list; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface OrderDaoV2 { List<Order_list> doList(); List<Order_list> doSearch(String strStartDate, String strEndDate, String strCoffee, String strName); }package hello.sailing.v2.vo; import lombok.Data; @Data public class Order_list { private String no; private String coffee_no; private String coffee; private String price; private String cust_id; private String name; private String reg_day; } <!-- 검색에 의한 쿼리 --> <select id="doSearch" resultType="hello.sailing.v2.vo.Order_list"> SELECT no, coffee_no, coffee, price, cust_id, name, DATE_FORMAT(reg_day,'%Y.%m.%d') AS reg_day FROM order_list WHERE 1=1 AND reg_day >= DATE_FORMAT( #{strStartDate},'%Y%m%d') AND reg_day < DATE_ADD(DATE_FORMAT(#{strEndDate},'%Y%m%d'), INTERVAL +1 DAY) <if test="strCoffee != 'ALL'"> AND coffee like CONCAT(#{strCoffee},'%') </if> <if test="strName != 'ALL'"> AND name like CONCAT(#{strName},'%') </if> </select>화면에서는 조회버튼을 누르면 검색이 안됩니다...코드는 틀린게 없는데 왜 그런거죠?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
(3:56) 현재도 V3,V4가 작동되는지 질문드립니다
코드를 똑같이 작성하였음에도 V3,V4가 작동되지 않습니다버전이 바뀜에 따라 기능이 작동하지 않는건지 아니면 다른 문제인건지 확인해주시면 감사하겠습니다! @Slf4j @Controller public class RequestParamController { @ResponseBody @RequestMapping("request-param-v3") public String requestParamV3( @RequestParam String username, @RequestParam int age) { log.info("username={},age={}", username, age); return "OK"; } } @ResponseBody @RequestMapping("request-param-v4") public String requestParamV4(String username,int age) { log.info("usernameV4={},ageV4={}", username, age); return "OK V4"; // <- @ResponseBody }
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터 예외처리
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)log.error("afterCompletion error!!", ex); 여기서 왜 ex에 대한 정보는 출력이 되지 않나요?[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의보고 응용하다가 테스트코드 부분 질문이 있습니다.
WebMvcTest를 이용한 테스트코드 작성하는데 원하는 대로 값이 안나와요... @Test void store_canNotAccess1() throws Exception { //given //when //then mockMvc.perform(post("/store/somePoint") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect( result -> { String content = result.getResponse().getContentAsString(); System.out.println(content); }); }@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(false); if (session == null || session.getAttribute(SessionConst.LOGIN_PARTNER) == null) { throw new CustomException(ErrorCode.PARTNER_ONLY_ACCESS); } return true; }session에 null이 들어가는 거 까진 디버깅으로 확인을 했는데jakarta.servlet.ServletException: Request processing failed: reservation.hmw.exception.CustomException: 파트너 회원만 접근할 수 있습니다.이런식으로 테스트가 실패를 하네요...어떻게 하면 예외를 잡아서 성공 테스트코드를 짤 수 있을까요?
-
해결됨스프링 부트 웹 개발 입문 - 따라하며 배우기
500에러
<!DOCTYPE html> <html lang="ko"> <head> <title>Coffee Order List</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="/css/comm.css"> <link rel="stylesheet" type="text/css" href="/css/coffee.css"> </head> <body> <!-- 헤더 위치 --> <div class="topnav"> <a href="/v2/home">Home</a> <a href="/v2/menu">커피메뉴</a> <a href="/v2/order">주문내역</a> <a href="/v2/member">고객정보</a> </div> <div id="main" style="font-size:large; text-align: center; "> <div id="search" style="height: 150px;padding: 15px; font-size: small; width: 90%; margin-left: auto; margin-right: auto;"> <h3>[ Coffee Order List <span style="font-size:30px;">🛒</span> ]</h3> <form name="fm_order" autocomplete="on"> <fieldset> <legend> [검색조건] </legend> <label>등록기간</label><input type="date" id="start_date" name="start_date" min="2020-01-01" max="2023-12-31"> - <input type="date" id="end_date" name="end_date" min="2020-01-01" max="2023-12-31"> <label>메뉴명</label> <input type="text" id="menu" name="menu"> <label>고객명</label> <input type="text" id="name" name="name"> </select> <input type="submit" value="조회" style="width: 80px;height: 30px;font-weight: bold; font-size: medium"> <!-- <a href="javascript:loadDocArray()">test</a> --> <!-- <label>CheckBox : </label><span id="idCheckBox"></span>--> </fieldset> </form> </div> <table class="table"> <thead> <tr class="tr_td"> <th>Chk</th> <th>주문번호</th> <th>커피No</th> <th>메뉴명</th> <th>가격</th> <th>고객ID</th> <th>고객명</th> <th>주문일자</th> </tr> </thead> <tbody id="t_body"> <!--- 데이타 출력 부분 --> <tr th:each="prod : ${list}"> <td><input type="checkbox" name="chkOrderNo" th:value="${prod.getNo()}"></td> <td th:text="${prod.getNo()}">주문번호</td> <td th:text="${prod.getCoffee_no()}">커피No</td> <td th:text="${prod.getCoffee()}">메뉴명</td> <td th:text="${prod.getCust_id()}">고객ID</td> <td th:text="${prod.getName()}">고객명</td> <td th:text="${prod.getReg_day()}">주문일자</td> </tr> </tbody> </table> </div> <!-- 푸터 위치 --> <div class="footer"> <!-- https://www.w3schools.com/html/html_emojis.asp --> <h4>[Footer] <span style="font-size:30px;">⛵</span> Spring boot 항해 ~ with Me</h4> </div> </body> </html> 계속 오류가 There was an unexpected error (type=Internal Server Error, status=500).An error happened during template parsing (template: "class path resource [templates/v2/order/order.html]")org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/v2/order/order.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241)이렇게 떠요ㅠㅠ
-
미해결토비의 스프링 6 - 이해와 원리
PaymentConfig에 대해 궁금한게있습니다
@Bean public ApiTemplate apiTemplate() { return new ApiTemplate(new HttpClientApiExecutor(), new ErApiExRateExtractor()); }위 코드에서 new HttpClientApiExecutor(), new ErApiExRateExtractor()를 new 하지않고 exRateProvider()에서 apiTemplate()를 bean으로 만든것처럼 bean으로 생성해서 넣어도 괜찮은건가요???
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
패키지 질문 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]SpringConfig를 만들 때 service 패키지에 만든 이유가 있나요? 메인 클래스와 같은 패키지 및 아래 패키지에 존재하면 상관 없나요?
-
미해결스프링 시큐리티 OAuth2
authenticationEntryPoint 질문입니다.
강의 10분22초 강의자료 그림에서 인증이 실패하면 DaoAuthenticationProvider가 BasicAuthenticationEntryPoint를 호출한다고 돼있는데, AuthenticationEntryPoint는 이 과정에서의 실패가 아니라 해당 필터를 지나서 AuthorizationFilter에서 인증이 안된 사용자가 권한으로 인해 예외가 발생했을 경우 호출되는거 아닌가요? UsernameAuthenticationFilter에선 이런식이였던거 같은데 제가 잘못 이해한걸까요? DaoAuthenticationProvider에서 인증이 실패하면 BasicAuthenticationEntryPoint가 아니라 해당 필터에 등록된 FailureHandler가 호출되야할거 같은데 설명 부탁드립니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
응용해볼려고 세션을 이용한 테스트코드 작성중인데 잘모르겠습니다.
강의를 보다 혼자 응용해봤는데@Mock private HttpServletRequest request; @Mock private HttpSession session; @Test void store_canAccess() throws Exception { // given given(request.getSession(false)).willReturn(session); given(session.getAttribute(SessionConst.LOGIN_PARTNER)) .willReturn(1L); // when // then mockMvc.perform(post("/store/somePoint") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); }@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(false); if (session == null || session.getAttribute(SessionConst.LOGIN_PARTNER) == null) { throw new CustomException(ErrorCode.PARTNER_ONLY_ACCESS); } return true; }채찍피티의 도움과 함께 이렇게 짰는데 CustomException이 터져요...혹시 잘못된 부분이 있을까요