묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
컬럼명
db에서의 컬럼명을 warehousingDate로 정의하고 자바에서 warehousingDate로 필드를 선언하여 테스트했을 때 매핑되지 않아 테스트에 실패합니다.db는 스네이크 케이스를 사용해서 jpa가 warehousingDate를 warehousing_date로 매핑시키려고 해서 그런 것 같은데 @Column(name = "warehousingDate")로 해도 안 되고 db의 컬럼명을 warehousing_date로 수정해야 정상 작동하는데 db에서 warehousingDate를 그대로 사용하고 정상적으로 매핑이 되게 하려면 어떻게 해야 하나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
로그에 values(?, ?, ?, ?, ?) 궁금증
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 쿼리 날라갈 때 로그를 보면 폼에 입력한 데이터가 로그에 다 뜨는데제 스프링 로그를 보면 insert into member (city, street, zipcode, name, member_id) values (?, ?, ?, ?, ?)이 로그밖에 안 뜨는데 최신버전 스프링에서는 보안상 로그에서 필터링을 해주는 건가요?아니면 따로 영한님께서 설정을 해주신건가요?
-
미해결견고한 결제 시스템 구축
docker Mysql 설정 문의
강의 초반 [5. 실습준비] 환경 설정과정에서docker mysql 설치환경이 어떻게 되는지 궁금합니다.1) vm 환경에서 linux 띄우고 그 vm 환경에서 docker mysql 실행ex) lima 등 서드파티 설정 후, 리눅스 환경에서 docker 설정 또는 macOS 에 그냥 도커 설치 후, 로컬 환경에서 컨테이너 실행? macOS 가 docker 랑 직접 호환되는건 아니라서 다른 vm 을 쓰는건 마찬가지긴한 것 같네요.[참고]`docker desktop` 의 유료 라이센스화로 실습환경(회사 PC 등) 에 따라 라이센스 이슈로 사용이 불가한 경우가 있어서테스트 구축 환경이나 참고할 레퍼런스가 있을지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderSearch에서 사용된 JPQL 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]OrderRepository 안에 JPQL로 다음과 같이 쿼리를 날리고 있는데em.createQuery("select o from Order o join o.member m", Order.class)여기서 사실 모든 주문이 회원하고 같이 매핑되어 있으면 join 하위에 문장은 필요 없는 문장 아닌가여?? 그냥 단순히 select o from Order o만 해도 될 것 같은데 왜 저렇게 한걸까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA : 페치 조인과 준영속 상태
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요! 영한님 스프링 관련 강의를 사서 항상 잘 보고 있습니다! 그리고 JPA 관련 공부는 영한님이 쓰신 JPA 책으로 공부하고 있습니다. JPA 관련 질문을 드리고 싶은데 JPA 강의는 사지 않아 질문을 올리지 못하게 되어 부득이하게 여기에 질문하게 되었습니다 죄송합니다 ㅜㅜ 다름이 아니라 JPA 책의 375 페이지, 10장 객체지향 쿼리 언어 파트에서 다음과 같이 페치 조인 전략 사용시 멤버가 준영속 상태가 되어도 나중에 팀을 별도의 쿼리를 날리지 않고 조회가 가능함을 확인했습니다. 책에서도 그렇게 말씀해주셨습니다! 그리고 그 다음에 페치 조인을 사용하지 않은 경우를 적용해보았습니다.String query = "SELECT m FROM Member m"; Member member = em.createQuery(query, Member.class).getResultList().get(0); em.detach(member); System.out.println("Class Type: " + member.getTeam().getClass().getName()); // 프록시 객체임을 확인 System.out.println("Is initialized: " + Hibernate.isInitialized(member.getTeam())); // 초기화 안된 상태 System.out.println("member.getTeam() = " + member.getTeam().getName()); // 별도로 쿼리가 날아감제 예상으로는 member.getTeam() 시 프록시 팀 객체가 형성되고, 물론 초기화는 되지 않은 상태이며 이때 멤버 객체가 준영속 상태이기 때문에 getTeam().getName()에서 예외가 발생할 것이라 생각했습니다. 왜냐하면 member - team은 lazy fetch로 되어있기 때문에 member에서 연결된 team을 조회할 때 추가적인 쿼리를 한번 더 날려야 하는데, 준영속 상태가 되면서 이것이 불가능해질 것이라 생각했기 때문입니다. 그런데 실제로는 추가쿼리를 날려서 값을 가져오는 것을 확인했습니다. 혹시 왜 이런 것인지 알수 있을까요?? 감사합니다. 항상 강의 잘 보고 있습니다!
-
미해결견고한 결제 시스템 구축
allOpen 설정이 잘못된 거 같습니다.
3.x 로 import 는 jakarta.* 로 되어있는데gradle 설정은 2.x 인 javax.* 로 되어있네요.
-
미해결스프링 핵심 원리 - 기본편
빈 등록 초기화, 소멸 메서드 지정 질문
안녕하세요. 섹션 9의 빈 등록 초기화, 소멸 메서드편에서 질문 드립니다.인터페이스(InitializingBean, DisposableBean)설정 정보에 초기화 메서드, 종료 메서드 지정@PostConstruct, @PreDestroy 애노테이션 지원위 3가지 방법 중 2번째 방법에서요. init, close 같은 초기화, 소멸 메서드가 미리 구현이 되어있으면 그걸 @Bean 설정할 때 지정함으로써 초기화가 가능한 것은 이해했습니다. 그런데 만약 init, close같은 초기화, 소멸 메서드가 외부 라이브러리 클래스 내에 미리 구현되어있지 않다면 해당 클래스를 수정할 수는 없으므로 초기화가 불가능한게 맞나요?
-
미해결실전! 스프링 데이터 JPA
스프링 데이터 JPA save()할때 OneToMany 엔티티의 필드가 null값이 저장되요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]특정 리포지토리에서 save()할때만 연관관계에 있는 엔티티의 필드가 null로 저장됩니다. 대체 어디가 문제일까요? cascade도 persist로 맞췄고 save 바로 직전에 로그를 띄웠을때도 정상적으로 값이 들어가있었는데 save()할때만 값이 null값으로 insert되네요
-
해결됨실무 환경 그대로 주문게시판 만들기 웹개발 기초 마스터
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" 라고 뜨는데 이유가 뭘까요..ㅠㅠ