묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실무 환경 그대로 주문게시판 만들기 웹개발 기초 마스터
spring web 개발환경 세팅 아키타입 다운로드 안 되는 오류
1.5 spring web 개발환경 세팅 강의에서메이븐 프로젝트를 생성하려고 하는데, 계속 아래와 같은 오류가 나면서 메이븐 프로젝트 자체가 생성되지 않습니다. Could not resolve archetype com.nexacro.archetype:uiadapter-spring-sample-archetype:1.0.1-20220603.053230-4 from any of the configured repositories. Could not resolve artifact com.nexacro.archetype:uiadapter-spring-sample-archetype:jar:1.0.1-SNAPSHOT com.nexacro.archetype:uiadapter-spring-sample-archetype:jar:1.0.1-20220603.053230-4 failed to transfer from http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of uiadapter-spring-sample-archetype-repo has elapsed or updates are forced. Original error: Could not transfer artifact com.nexacro.archetype:uiadapter-spring-sample-archetype:jar:1.0.1-20220603.053230-4 from/to uiadapter-spring-sample-archetype-repo (http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots): The operation was cancelled. com.nexacro.archetype:uiadapter-spring-sample-archetype:jar:1.0.1-20220603.053230-4 failed to transfer from http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of uiadapter-spring-sample-archetype-repo has elapsed or updates are forced. Original error: Could not transfer artifact com.nexacro.archetype:uiadapter-spring-sample-archetype:jar:1.0.1-20220603.053230-4 from/to uiadapter-spring-sample-archetype-repo (http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots): The operation was cancelled.메이븐 아키타입이 다운로드되지 않아서 생기는 문제같은데, 저는 분명히 아래와 같은 url로 메이븐의 아키타입을 설정하였습니다.http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots/archetype-catalog.xml몇 번을 시도해 봐도 되지 않아서 답답하네요..ㅠㅠ 그리고 cmd 에서 mvn archetype:generate -DarchetypeCatalog=remote로 사용가능한 메이븐 아키타입 목록을 불러 온 후 "nexacro"를 검색했는데, 목록에서 찾을 수 없었습니다.이상한 점은http://mangosteen.tobesoft.co.kr/nexus/repository/tobesoft-snapshots/archetype-catalog.xml위 url을 브라우저로 접근하면 잘 접근이 된다는 점입니다...어떤 문제 때문일까요.ㅠㅠㅠㅠㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
(재질문)토이프로젝트에서 spring data jpa 기반으로 페이징 처리 중 궁금한 점 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]저번에도 같은 질문을 올렸다가 질문이 두서가 없다보니 여쭤보려고 한 것을 잘못 물어본거같아서 다시 질문드립니다. Spring Data JPA를 바탕으로 토이프로젝트를 개발하고있고 Pageable 인터페이스를 활용하고 있습니다. 프로젝트에서 Item(품목)의 하위 개념으로 Product(제품)을 가지고 있습니다.(1:N - 품목 하나에 대해 여러개의 제품을 등록 할 수 있음)예를 들어 핸드폰이라는 Item(품목) 정보를 등록하고, 그 품목에 대한 Product(제품) ( 이를테면 아이폰10, 갤럭시S25, 샤오미)의 정보들을 등록합니다.이때 특정 품목(itemId)을 클릭하면 해당 품목에 대한 정보와 내가 등록한 product 리스트가 띄어지도록 하는 api 기능을 구현하려 했습니다. 처음에는 요청이 item컨트롤러로 디스패치하고, product와 itemId를 기준으로 패치조인하여 데이터를 받아오는 식으로 구현을 했는데.. product리스트를 불러오는 과정에서 페이징을 하고자 기존의 로직을 수정하니, 메인i 테이블인 item을 기준으로 페이징이 되는 문제가 발생했습니다. // page처리 시 문제가 발생하는 respository method@Query(value = "SELECT DISTINCT i FROM Item i LEFT JOIN FETCH i.productList WHERE i.id = :itemId",countQuery = "SELECT COUNT(p) FROM Product p WHERE p.item.id = :itemId")Page<Item> findWithProductsByItemId(@Param("itemId") long itemId, Pageable pageable); 그래서 제가 생각한 두가지 안이 있는데 이중에 어떤 것으로 개발해야할지 판단이 잘 서지않아 질문드립니다. 1) 응용계층에서 item에 대한 정보를 불러오는 item서비스 호출 + 위 item에 해당되는 product 리스트 정보들을 paging 하여 불러오는 페이징하여 불러오는 product서비스 호출 2) product를 메인으로 item과 n:1 패치조인하는 메소드를 productRepository에서 생성. 1번 방법이 맞는 것 같지만,, paging으로 데이터를 불러올 때마다 item쿼리를 한번씩 날려야하는게 비효율적인거 같기도하고,, 2번으로 하자니... 구현하고자 하는 기능은 item을 메인으로 product 목록을 불러오는 것인데,, 실제 동작은 Product가 메인으로(Product컨트롤러로 디스패치) 처리가 되다보니 이렇게 해도 될까 하는 의문이 들었습니다.이런 상황에서는 어떤 식으로 구현을 하는게 좋을지요. 고견을 여쭙니다 ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
OncePerRequestFilter
OncePerRequestFilter는 요청당 한번만 호출된다고 하는데..수업중에 만드신 LogFilter는 Filter를 상속 받았습니다Filter도 DispatcherType.REQUEST가 기본이면 요청당 한번만 필터가 호출되지않나요?2가지 필터의 차이점을 알고싶습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
NotEnoughStockException 커스텀 Exception을 만든 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 [질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의에서 NotEnoughStockException 을 새로 만드셨는데, IllegalArgumentException을 사용하는 것은 어색한가요? 처음엔 도메인에서 exception 처리 때문에 별도로 생성한 것이겠지하고, 넘어갔는데 주문 취소의 배송완료된 상태에서는 IllegalStateException 을 사용하셔서, 어떻게 구분하여 사용하는 것이 좋을지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원가입 테스트 오류메세지
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]회원가입 테스트 진행하는데 테스트 자체는 강의와 똑같이 잘 진행됩니다. 오류메세지가 계속 뜨는데 해결을 어떻게 해야되는지는 모르겠네요.--------------오류메세지------------Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3WARNING: A Java agent has been loaded dynamically (C:\Users\hyozz\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.15.11\a38b16385e867f59a641330f0362ebe742788ed8\byte-buddy-agent-1.15.11.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future releaseOpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended--------------오류메세지------------
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HandlerAdapter의 응답 형태
HTTP응답을 사용하는 경우, 핸들러어댑터는 DispatcherServlet에게 ModelAndView가 아닌 null을 반환하나요?뷰 템플릿을 사용하는 경우, 핸들러어댑터는 항상 ModelAndView 형식을 반환하나요? 컨트롤러에서 반환값이 ModelAndView라면, returnValueHandler에서 그대로 ModlAndView 형태로 반환컨트롤러 반환값이 viewName이라면, returnValueHandler에서 ModelAndView로 변환해서 반환Spring MVC의 다양한 핸들러 어댑터는항상 ModelAndView 형식또는 null만 반환하나요?제가 이해한 것이 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
토이프로젝트에서 spring data jpa 기반으로 페이징 처리 중 궁금한 점 있습니다.
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]먼저 강의 설명과 일맥상통한 부분일 것 같지만, Spring Data JPA를 바탕으로 토이프로젝트를 개발하고있고 Pageable 인터페이스를 활용하고 있습니다. 프로젝트에서 Item(품목)의 하위 개념으로 Product(제품)을 가지고 있습니다.(1:N - 품목 하나에 대해 여러개의 제품을 등록 할 수 있음)처음에는 특정 item을 클릭했을 때, 해당 item의 정보와 item에 등록된 하위 Product 리스트(목록을 보여주기 위한 일부 정보들만)를 보여주기 위해 item에 접급하는 Repository에 다음 메소드를 만들었습니다.@Query(value = "SELECT DISTINCT i FROM Item i LEFT JOIN FETCH i.productList WHERE i.id = :itemId", countQuery = "SELECT COUNT(p) FROM Product p WHERE p.item.id = :itemId") Page<Item> findWithProductsByItemId(@Param("itemId") long itemId, Pageable pageable);그런데 이렇게 하다보니 product가 아닌 item으로 페이징이 되는 것을 알았습니다. 이에 두 가지로 대책을 세웠는데 어떻게 해야할지 모르겠습니다. 1) 응용계층에서 item에 대한 정보를 불러오는 item서비스 호출 + 위 item에 해당되는 product 리스트 정보들을 paging 하여 불러오는 페이징하여 불러오는 product서비스 호출 2) product를 메인으로 item과 n:1 패치조인하는 메소드를 productRepository에서 생성. 1번 방법이 맞는 것 같지만,, paging으로 데이터를 불러올 때마다 item쿼리를 한번씩 날려야하는게 비효율적인거 같기도하고,, 2번으로 하자니... 제가 구현하고자 하는 기능과는 뭔가 다르게 개발하는거 같아 꺼림직 합니다.(item 중심의 조회 기능이 아닌 product기준의 조회) 긴글 읽어주셔서 감사합니다... 어떤식으로 구현하는게 맞는 방법일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository 인터페이스 설계 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]입문이나 기본편에서는 인터페이스를 만들어서 확장을 염두에 두었는데 JPA는 인터페이스 기반 설계를 못하는 건가요?? 아니면 일부로 안 하신건가여
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
10분 14초경 templates/basic/items.html이 css가 제대로 적용이안됨
static폴더에 있는 html파일들은 부트스트랩이 강사님의 화면처처럼 잘나오나 templates/basic/items.html이 부트스트랩 css가 제대로 로 적용이안됩니다.templates/basic/items.htm의 코드입니다다른 파일들도 css가 제대로 적용이 안됩니다. <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> ` <link th:href="@{/css/bootstrap.min.css}" href="../css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container" style="max-width: 600px"> <div class="py-5 text-center"> <h2>상품 목록</h2> </div> <div class="row"> <div class="col"> <button class="btn btn-primary float-end" onclick="location.href='addForm.html'" th:onclick="|location.href='@{/basic/items/add}'|" type="button">상품 등록 </button> </div> </div> <hr class="my-4"> <div> <table class="table"> <thead> <tr> <th>ID</th> <th>상품명</th> <th>가격</th> <th>수량</th> </tr> </thead> <tbody> <tr> <td><a href="item.html">1</a></td> <td><a href="item.html">테스트 상품1</a></td> <td>10000</td> <td>10</td> </tr> <tr> <td><a href="item.html">2</a></td> <td><a href="item.html">테스트 상품2</a></td> <td>20000</td> <td>20</td> </tr> </tbody> </table> </div> </div> <!-- /container --> </body> </html>
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
게시판 mybatis 적용문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요mybatis를 체득하고 싶어서 게시판 프로젝트를 한번 해보려고 했는데 잘 안되네요https://drive.google.com/file/d/1ku2NtUWjeSi1OJ2Z7SLsuqqG7Y471BHv/view?usp=sharing파일은 여기있습니다.강의보고 따라하긴 했는데 제가 제대로 이해를 못한건가 싶습니다제가 생각하는 (공부해서 알게 된) 순서는 이렇습니다client의 request요청 - JSON배열로{ "id": 1, "title": "게시글 제목", "content": "게시글 내용" } 이렇게 온다고 가정 Controller에서 request를 @RequestBody 받고 service로 전송Service에서 dto를 param으로 변환하고 param을 mapper 인터페이스의 메서드로 감싸기Mapper 인터페이스에서 전달받은 메서드 이름과 id가 같은 mapper.xml로 보내서 CRUD 실행service Mapper.saveBoard(param)으로 → client에 넘겨줄 responseDto로 param을 보냄create table member( id bigint auto_increment primary key, board_writer varchar(20) not null, board_passwd varchar(20) not null ); create table board( id bigint auto_increment primary key, writer_id bigint not null, title varchar(50) not null, board_contents text not null, board_count int default 0, created_at timestamp default current_timestamp, constraint fk_board foreign key(writer_id) references member(id) on delete cascade ); 테이블은 이렇고클라이언트 실행하면 오류가 납니다;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): Jay.Board.repository.mybatis.BoardMapper.saveBoard at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:229) ~[mybatis-3.5.14.jar:3.5.14] at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.14.jar:3.5.14] at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:96) ~[mybatis-3.5.14.jar:3.5.14] at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na] at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36) ~[mybatis-3.5.14.jar:3.5.14] at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94) ~[mybatis-3.5.14.jar:3.5.14] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) ~[mybatis-3.5.14.jar:3.5.14] at jdk.proxy2/jdk.proxy2.$Proxy63.saveBoard(Unknown Source) ~[na:na] at Jay.Board.service.BoardService.saveBoard(BoardService.java:27) ~[main/:na] at Jay.Board.controller.HomeController.saveBoard(HomeController.java:37) ~[main/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:257) ~[spring-web-6.2.2.jar:6.2.2] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[spring-web-6.2.2.jar:6.2.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.2.jar:6.2.2] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.2.2.jar:6.2.2] ..... 이 이상은 제가 모르겠습니다….mapper.xml이 반환되지 않는게 문제 같은데 어느부분이 문제가 되서 이러는지 도통 알 수 없네요.. 오늘 이것만 6시간째 붙잡고 있습니다..프로그램 흐름의 순서와 그 각각 하는 일들이 어떤 일들이 펼쳐지는지를 이해하고 코딩을 하고싶습니다…
-
미해결Practical Testing: 실용적인 테스트 가이드
Spring Rest Docs request에 List 타입이 포함된 경우
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 강의 너무 잘 듣고 있습니다! 현재까지 진행해온 프로젝트의 OrderController에도 Spring Rest Docs를 적용해보는 와중에 몇가지 질문이 생겼습니다!public class OrderControllerDocsTest extends RestDocsSupport { private final OrderService orderService = mock(OrderService.class); private static List<ProductResponse> productResponses; @Override protected Object initController() { return new OrderController(orderService); } @BeforeEach void init() throws Exception { ProductResponse productResponse1 = ProductResponse.builder() .id(1L) .price(1000) .sellingStatus(SELLING) .productNumber("001") .type(HANDMADE) .name("상품명1") .build(); ProductResponse productResponse2 = ProductResponse.builder() .id(2L) .price(3000) .sellingStatus(SELLING) .productNumber("002") .type(HANDMADE) .name("상품명2") .build(); productResponses = List.of(productResponse1, productResponse2); } @DisplayName("새로운 주문을 생성한다.") @Test void createOrder() throws Exception { //given LocalDateTime now = LocalDateTime.of(2025, 1, 28, 0, 50); List<String> productNumbers = List.of("001", "002"); OrderCreateRequest request = OrderCreateRequest.builder() .productNumbers(productNumbers) .build(); int totalPrice = productResponses.stream().mapToInt(ProductResponse::getPrice).sum(); OrderResponse orderResponse = OrderResponse.builder() .id(1L) .registeredDateTime(now) .products(productResponses) .totalPrice(totalPrice) .build(); given(orderService.createOrder(any(OrderCreateServiceRequest.class), any(LocalDateTime.class))) .willReturn(orderResponse); //when mockMvc.perform(post("/api/v1/orders/new") .content(mapper.writeValueAsString(request)) .contentType(MediaType.APPLICATION_JSON)) .andDo(print()) .andExpect(status().isOk()) .andDo(document("order-create", preprocessRequest(prettyPrint()), // adoc에서 json 형태를 보기 좋게 만들어줌 preprocessResponse(prettyPrint()), requestFields( fieldWithPath("productNumbers").type(JsonFieldType.ARRAY) .description("상품 리스트") ), responseFields( fieldWithPath("code").type(JsonFieldType.NUMBER) .description("코드"), fieldWithPath("status").type(JsonFieldType.STRING) .description("상태"), fieldWithPath("message").type(JsonFieldType.STRING) .description("메시지"), fieldWithPath("data").type(JsonFieldType.OBJECT) .description("응답 데이터"), fieldWithPath("data.id").type(JsonFieldType.NUMBER) .description("주문 ID"), fieldWithPath("data.totalPrice").type(JsonFieldType.NUMBER) .description("총 주문 가격"), fieldWithPath("data.registeredDateTime").type(JsonFieldType.ARRAY) // 반환타입 ARRAY ? .description("주문 시간"), fieldWithPath("data.products").type(JsonFieldType.ARRAY) .description("주문 상품 리스트"), fieldWithPath("data.products[].id").type(JsonFieldType.NUMBER) .description("주문 상품 ID"), fieldWithPath("data.products[].productNumber").type(JsonFieldType.STRING) .description("주문 상품 번호"), fieldWithPath("data.products[].type").type(JsonFieldType.STRING) .description("주문 상품 타입"), fieldWithPath("data.products[].sellingStatus").type(JsonFieldType.STRING) .description("주문 상품 상태"), fieldWithPath("data.products[].name").type(JsonFieldType.STRING) .description("주문 상품명"), fieldWithPath("data.products[].price").type(JsonFieldType.NUMBER) .description("주문 상품 가격") )) ); } }OrderService.createOrder() 메서드 반환 값 OrderResponse를 생성하기 위해선 ProductResponse 객체가 필요합니다. 이러한 경우가 강사님이 말씀하신 @BeforeEach의 적용시점인가? 라는 생각이 들어 위와 같이 작성해봤습니다. 제가 이해한 바가 맞을까요?? requestFields( fieldWithPath("productNumbers").type(JsonFieldType.ARRAY) .description("상품 리스트") ),위 코드에서 productNumbers에 있는 각 원소의 타입이 String 인것을 API 문서에 나타내고 싶어 fieldWithPath("productNumbers[]").type(JsonFieldType.STRING과 같이 작성해봤지만 타입 미스매칭 오류가 발생했습니다. responseFields에는 동일한 방법으로 List 순회에 성공했지만 requestFields 순회 문제는 해결하지 못했습니다.혹시 방법이 있다면 알려주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Hibernate5JakartaModule 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle에 Hibernate5JakartaModule을 잘 등록하여 라이브러리 목록도 확인했습니다. 그런데 이렇게 오류가 뜹니다ㅠㅠ빨간 줄에는 "Cannot return a value from a method with void result type" 라고 뜨는데 이유가 뭘까요..ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
테스트 두개를 동시에 돌렸을 경우 왜 밸류값이 달라지는 건가요??
public class ApplicationContextInfoTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " Object = " + bean); } } @Test @DisplayName("모든 빈 출력하기") void findApplicationAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " Object = " + bean); } } } }테스트 코드를 이렇게 짠 후 같이 돌리면 오브젝트로 나오는 애들 코드가 각각 다르게 나옵니다.스프링 컨테이너는 초기에 한 번만 생성/등록되고 각각의 테스트에서 같은 것을 가져오는 건줄 알았는데 아닌가요..??
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
물리 트랜잭션과 논리 트랙잭션
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]물리 트랜잭션과 논리 트랜잭션 중 물리 트랜잭션 만이 데이터베이스에 직접 커밋과 롤백 같은 영향력을 행사할 수 있음을 이해했습니다.그렇다면 만약 아래와 같은 코드가 존재할 때, 트랜잭션 동작 방식에 대해서 제가 이해한 것이 맞는 지 질문 드리고 싶습니다.// AuthPacade 클래스의 메서드 public void withdraw(final long userId, final String code) { User user = userFinder.getUser(userId); externalService.revoke(user.getPlatform(), code, user.getSerialId()); authService.deleteUser(user); }위의 코드는 userFinder.getUser() 메서드에서 @Transactional 이 걸려있고 authService.deleteUser() 메서드에서 @Transactional 이 걸려있는 상태입니다. 두 함수 모두 외부 호출이며 externalService.revoke 역시 외부 호출이지만 @Transactional이 적용되지 않는 상태입니다.그렇다면 이 경우에는 userFinder.getUser() 을 실행할 때, 하나의 물리 트랜잭션이 실행되어 종료(커밋)된 후 revoke()를 수행한 후에 다시 authService.deleteUser() 를 실행하면서 또 다른 물리 트랜잭션이 실행되는 것으로 저는 이해했습니다.즉, externalService.revoke() 메서드를 호출할 때는 트랜잭션이 적용되지 않고 그 외의 다른 2개의 메서드에는 서로 다른 물리 트랜잭션이 적용되는게 맞는지 궁금합니다!!공부를 해보니 외부 네트워크와 통신하는 것은 트랜잭션 범위에서 제거하는 것이 좋다는 것을 깨달아서 배운 바를 토대로 개인 프로젝트에 적용해보는 중인데, 맞는 지 궁금합니다.. 특히, 실무에서는 어떤 방식으로 처리하는 지도 함께 궁금합니다!감사합니다:)
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
H2 콘솔에 접속했을 때 테이블
강의따라서 H2접속하면 자동으로 BOOK, FRUIT, PERSON, USER, USER_LOAN_HISTORY 테이블이 있는데 어떻게 자동으로 만들어져 있는 건가요.?? mysql에서 테이블 만들었는데 h2는 mysql과 다른거 아닌가요..? 기존의 자바 entity 코드를 다 읽어서 얘네가 알고있는건가요???ps. 강의 너무 잘듣고 있습니다! 이때까지 완강해본 강의가 손에꼽는데 완강을 앞두고 있어서 너무 설레는 맘입니다..! 좋은 강의 만들어주셔서 감사합니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
JPA가 아닌 Mapper 아키텍처 기반 테스트 코드 작성
안녕하세요, 수업 강의는 JPA 기반으로 설명해 주고 계신데 만약 Mapper 아키텍처 기반도 해당 강의 repository 테스트 코드 작성한 것 기반으로 적용하면 되나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
save-result.jsp import
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 이 부분에서 제가 오류가 나서 1회독을 할 때 그냥 진행하기도 했었는데 다시 복습하면서 해결했습니다선생님께서는 이대로 하셨는데도 페이지가 그대로 뜨셨거든요저는 항상 전혀 뜨지,않아서 너무 답답했었습니다뭐가 오류일까 똑같이 했는데 뭐가 문제일까....그런데 어쩌다 gpt와 검색을 해보다가 이렇게 2번째 줄에 import 경로를 넣어줬더니 드디어 되네요 그래도 저도 조금씩은 나아지나봅니다너무 감사드립니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hibernate 라이브러리 추가 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]여기에 질문 내용을 남겨주세요.spring.datasource.username=sa를 추가하였고, javax를 jakarta로 변경하였는데도 오류가 납니다.external libraries에 hibernate를 검색해도 나오지 않습니다.틀린부분 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 console 실행, cmd 실행 차이
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 윈도우로 h2 console을 진행해서 h2를 켜는 것과, cmd를 이용해서 h2.bat으로 h2를 켜는 것의 차이가 있을까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew build 오류 해결완료!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]저는 윈도우10이고 인텔리제이 터미널에서가 아닌 윈도우 cmd에서 오류가 발생했을 때 해결했습니다!gradlew까진 됐는데, gradlew build 했을 때 저랑 같은 오류인 경우 참고하심 좋을 것 같아요1. 프로젝트 생성 할 때 OneDrive 말고 내 PC -> 사용자 -> 내 계정이름(공용x) -> 여기에 study폴더 생성 후 압축 여기에 풀기C:\Users\사용자이름\OneDrive\바탕 화면\study <- 가 아니라C:\Users\사용자이름 에 study폴더를 만들어서, C:\Users\사용자이름\study 여기 안에 hello-spring 넣기----물론 사용자이름은 영어로 설정----2. build.gradle 잘 선택했는지 확인 (<- 저는 gradle 잘못 선택했었어요)여기서도 경로가 OneDrive인지 확인!3. 윈도우 cmd보시는 것처럼 onedrive가 아닌 저 경로에서 cd study -> cd spring-hello를 하고, (강의에서 ll은 윈도우에선 dir)hello-spring 안에 들어가셔서 gradlew를 진행했고, 그 후 gradlew build를 했더니 드디어 성공,,! (윈도우는./ gradlew build가 아닌, 그냥 gradlew, gradlew build)4. java -jar 오류!저기 hello-spring 파일이 2개가 있는데 그 중에서 -plain말고 밑에 걸 선택하시면 됩니다.gradlew build 후에 libs에 가셔서java -jar hello-spring-0.0.1-SNAPSHOT.jar을 진행했는데오류가 떠서 gpt에 물어봤더니 현재 쓰고 있는 자바 버전이 너무 낮아서 안된다고 하네요.cmd에서 java -version해서 봤더니 1.8로 돼있었음... 다른 강의에서 1.8로 설정한 거라 몰랐네요ㅜㅜ그래서 환경변수에 시스템 변수에 있는 Path를 1.8로 되있는 걸 삭제하고 jdk 21이 경로로 설정해주고 가장 위로 올려줬습니다.그 후에 cmd 껏다 키고, libs파일까지 들어간 후에 java -jar hello-spring-0.0.1-SNAPSHOT.jar 을 해주면?Spring 너무 반갑쓰,,,ㅠㅠ (종료하실 땐 컨트롤 + C)정리하자면1. OneDrive 안에 있는지 확인.2. build.gradle 잘 선택했는지 확인.3. 환경변수 Path 자바 버전 확인!이 글을 쓰는 것까지 8시간에 걸쳐 오류 해결과 해결 과정 작성을 마무리 합니다ㅠ너무 두서없이 썼을 수도 있지만 같은 상황이시라면 최대한 도움 되셨음 좋겠네요. 다들 열공하십쇼!