묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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시간째 붙잡고 있습니다..프로그램 흐름의 순서와 그 각각 하는 일들이 어떤 일들이 펼쳐지는지를 이해하고 코딩을 하고싶습니다…
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
첨부pdf 코드블럭 글자 수 넘어가면 짤리는 것 같아요
학습중 궁금한 것은 언제든 문의 하세요.질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다.추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 첫 pdf 에서docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 이부분 뒤에 짤렸고짤린 부분 다른 파일도 더 있는 것 같아요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
Run | Debug 표시 자체가 안떠서, MallApplication.java 파일을 실행조차 못시키겠는데, 도움말 좀 부탁드리겠습니다.
MallApplication.java 파일을, vsc에서 어떻게 실행시키는지 자세하게 좀 알려 주세요.
-
미해결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" 라고 뜨는데 이유가 뭘까요..ㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계와 기본키 전략
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 연관관계 양방향에 값을 입력해주는 부분에 대해서 이해한 것 같습니다. 아직 1차 캐시에만 존재하고 영속성 엔티티에 반영이 되지 않았기 때문에 객체로는 조회가 되지 않는 것으로 이해했습니다. 다만 궁금한 점이 기본키 전략을 auto_increment 같은 방식으로 한 경우에는 미리 한번 쿼리가 나간다고 이전 강의에서 배운 것이 생각났습니다. 강의에서도 기본키 전략은 동일한 것 같습니다. 기본키 전략 때문에 나간 쿼리가 반영이 안되는 이유가 따로 있을가요?
-
해결됨스프링 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 테스트 코드 작성한 것 기반으로 적용하면 되나요?
-
미해결실전! 스프링 부트와 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를 켜는 것의 차이가 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy 로그가 안찍힙니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 p6spy를 적용을 시도했는데 로그 출력이 되지 않아서 해결해보려다 실패하고 도움을 요청드립니다. 아래와 같이 코드들을 작성했습니다. > Task :compileJava UP-TO-DATE> Task :processResources> Task :classes> Task :compileTestJava UP-TO-DATE> Task :processTestResources NO-SOURCE> Task :testClasses UP-TO-DATE19:25:53.967 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [jpabook.jpashop.MemberRepositoryTest]: MemberRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.19:25:54.333 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration jpabook.jpashop.JpashopApplication for test class jpabook.jpashop.MemberRepositoryTest19:25:55.119 [Test worker] INFO org.springframework.boot.devtools.restart.RestartApplicationListener -- Restart disabled due to context in which it is running. ____ _ __ _ _/\\ / ___'_ __ _ ()_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v3.3.7)2025-01-26T19:25:55.869+09:00 INFO 18332 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Starting MemberRepositoryTest using Java 21.0.2 with PID 18332 (started by dldbs in C:\Users\dldbs\Desktop\Spring강의\spring boot, jpa활용\jpashop)2025-01-26T19:25:55.874+09:00 INFO 18332 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : No active profile set, falling back to 1 default profile: "default"2025-01-26T19:25:57.515+09:00 INFO 18332 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.2025-01-26T19:25:57.570+09:00 INFO 18332 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 33 ms. Found 0 JPA repository interfaces.2025-01-26T19:25:58.728+09:00 INFO 18332 --- [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]2025-01-26T19:25:58.896+09:00 INFO 18332 --- [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final2025-01-26T19:25:58.990+09:00 INFO 18332 --- [ Test worker] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled2025-01-26T19:25:59.885+09:00 INFO 18332 --- [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer2025-01-26T19:25:59.974+09:00 INFO 18332 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2025-01-26T19:26:00.168+09:00 INFO 18332 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/jpashop user=SA2025-01-26T19:26:00.172+09:00 INFO 18332 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.2025-01-26T19:26:02.325+09:00 INFO 18332 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)2025-01-26T19:26:02.369+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :drop table if exists member cascade2025-01-26T19:26:02.383+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :drop sequence if exists member_seq2025-01-26T19:26:02.395+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :create sequence member_seq start with 1 increment by 502025-01-26T19:26:02.401+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :create table member (id bigint not null,username varchar(255),primary key (id))2025-01-26T19:26:02.413+09:00 INFO 18332 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'2025-01-26T19:26:02.844+09:00 WARN 18332 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning2025-01-26T19:26:02.911+09:00 INFO 18332 --- [ Test worker] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]2025-01-26T19:26:03.730+09:00 INFO 18332 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Started MemberRepositoryTest in 8.647 seconds (process running for 12.331)WARNING: A Java agent has been loaded dynamically (C:\Users\dldbs\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.19\154da3a65b4f4a909d3e5bdec55d1b2b4cbb6ce1\byte-buddy-agent-1.14.19.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 release2025-01-26T19:26:04.981+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :selectnext value for member_seq2025-01-26T19:26:05.235+09:00 DEBUG 18332 --- [ Test worker] org.hibernate.SQL :insertintomember(username, id)values(?, ?)2025-01-26T19:26:05.243+09:00 TRACE 18332 --- [ Test worker] org.hibernate.orm.jdbc.bind : binding parameter (1:VARCHAR) <- [memberA]2025-01-26T19:26:05.244+09:00 TRACE 18332 --- [ Test worker] org.hibernate.orm.jdbc.bind : binding parameter (2:BIGINT) <- [1]OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended2025-01-26T19:26:05.291+09:00 INFO 18332 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2025-01-26T19:26:05.298+09:00 INFO 18332 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2025-01-26T19:26:05.322+09:00 INFO 18332 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.> Task :testBUILD SUCCESSFUL in 15s4 actionable tasks: 2 executed, 2 up-to-date오후 7:26:05: Execution finished ':test --tests "jpabook.jpashop.MemberRepositoryTest.testMember"'.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
사이드 이펙트 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MemberRepository에서 return member.getId();사이드 이펙트로 멤버를 저장하는 메서드이기 때문에 리턴값은 안 만들어도 되고다만, 나중에 멤버 조회할 때 ID 정도 있으면 간단하게 조회할 수 있기 때문에 리턴값 설정해둔 것으로 이해하면 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
이강의만 보고 구현은 가능할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]혹시 이강의를 보고 게시판하나 만들까하는데 MyBatis대신JPA를 써볼까 합니다...너무 방대한 걸 알지만 혹시 이 한시간짜리 섹션강의를 보고 간단한 게시판정도는 해볼 수 있을까요?저는 취준을 시작한 비전공자입니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
response의 위치에 대한 질문이 있습니다
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요현재 프로젝트에서는 service쪽에서 response로 변환을 해주고 있어서, response 객체의 위치가 service쪽에 있는데 response 변환을 controller 쪽에서 해주고 response의 위치도 controller쪽으로 옮기는 것에 대해서는 어떻게 생각하시나요?? service에서는 domain과 관련된 것들만 있는 게 좋지 않나? ( domain entity와 jpa entity를 구분하지 않고 있기는 하지만요.. ) 라는 생각이 있고, response는 api의 응답이라서 아무래도 controller쪽에 있는 게 좋을 것 같다고 생각을 해서 여쭤보게 됐습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Configuration과 @Transactional
안녕하세요 항상 강의를 잘 보고 있습니다.@Configuration과 @Transactional 둘 다 상속을 이용한 proxy기법(CGLIB, AOP)을 사용하는 것으로 확인하였습니다.만약 저가 MemberService라는 class에 @Service, @Transactional를 부여한 후 ComponentScan을 하면 MemberService의 프록시 객체가 빈으로써 생성되어 스프링 컨테이너에 반환되는 것을 확인하였는데 궁금한 것은 @Configuration과 @Transactional 이 둘이 각각 프록시를 생성하는 것인지 혹은 하나만 생성하는 것인지가 궁금합니다.두 번째로 궁금한 것은 프록시는 싱글톤으로 관리가 될 텐데, 프록시가 아닌 target이 가르키는 실제 객체 MemberService는 매 request마다 객체가 새로 생성되어지는 것인지 혹은 최초로 서버가 로드할 때 한 번만 생성이 되는 것인지 궁금합니다. (제 생각에는 @Configuration으로 인하여 후자이지 않을까 생각합니다.)
-
미해결Practical Testing: 실용적인 테스트 가이드
repostory 테스트 코드 작성 이유 관련 질문
제가 테스트 코드 작성이 처음이라 잘 이해하지 못한 것 같은데요repository에서 테스트 코드를 작성하는 이유를 잘 모르겠습니다.. given에서 Product를 삽입하는 과정은 DB의 product에 레코드를 삽입하는 과정으로 대체해서 수행할 수 있을 것 같아서요. DB를 통해 확인하지 않고 리포지토리에 대해 테스트 코드를 작성하는 이유가 무엇일까요?혹시 수동 검증 시 콘솔에서 확인하는 것과 동일하게 직접 사람이 테스트 과정에 개입해야 해서 그러한 것일까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 코드에서 data.sql 사용 없이 Product를 직접 생성한 이유
테스트 코드 작성 시에 data.sql을 활용하지 않으신 이유가 궁금합니다. @Test 메서드 내에서 Product를 생성하는 것보다 이미 작성된 data.sql을 활용하는 것이 더 편해보이는데 Product 인스턴스를 직접 생성하신 이유가 무엇인가요?혹시 테스트마다 필요로 하는 데이터가 다르기 때문인 것일까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
한탄스럽네여
분명 다 똑같이 따라왔는데 JdbcTemplate - 이름 지정 파라미터3 에서 코드를 돌렸더니 작동을 안하네요... 이전강좌까지 다 잘됐는데 아..............................................혹시나해서완성코드 받아서 복붙해도 작동 안하네요 Ai답변이 딴소리 해주겠지만오류때문에 미칠 노릇이네요 풀이자꾸 꺾입니다...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService의 order() 내에서 Delivery 생성메서드가 아닌 생성자 호출 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]OrderService의 주문 생성 코드에서 Order와 OrderItem은 생성메서드를 통해 객체를 생성하여 저장하도록 하셨는데, Delivery 객체에 대해서는 따로 생성 메서드를 만들지 않고 직접 생성자 호출을 통해 만든 이유가 있을까요?
-
해결됨실전! Querydsl
DTO 반환 시 JOIN과 FETCH JOIN의 차이점 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]jpa에서 join과 fetch join에 차이점join은 from절에 있는 주체 엔티티만 영속화 fetch join은 연관 엔티티와 주체가 되는 엔티티 모두 영속화한다. 이라고 이해 했습니다그런데 공부하던 중 엔티티 반환이 아닌 DTO을 반환하면 join과 fetch join은 어떻게 영속화 하는지 궁금합니다.