묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 Database 초기 설정 문제
안녕하세요! 강의 섹션1 h2 데이터베이스 설치 관련해서 따라하던중 오류가 발생해 문의글남깁니다.지난 입문편 강의를 들을때 h2 데이터베이스를 잘 활용했고 이번에 jpa강의를 들으며 h2 데이터베이스를 생성하고 있는데 연결이 안되는 문제가 발생했습니다.우선, 저는 스프링부트 3버전으로 진행을 하고 있어 입문편 강의록에서 안내해주신대로 h2 2.1.214버전으로 진행중입니다.윈도우 사용자라 h2.bat파일을 실행하고, h2 console이 열린 다음에url을 localhost로 변경하고 JDBC URL에 jdbc:h2:~/jpashop을 입력하고 연결하기를 눌렀더니 아래와 같은 에러가 발생합니다.관련 디렉토리를 찾지 못해서 발생하는 에러라고 생각되어 해당 경로인 C:/Users/user에 jpashop이라는 폴더를 만들어 다시 실행해봐도 결과는 똑같았습니다. 또한, 해당 jpashop 폴더가 저희 프로젝트 폴더의 경로와 동일해야하나하는 의문이 들어 제 프로젝트 파일은 E드라이브에 있는데, 프로젝트 폴더를 옮겨야하나.. 하는 의문이 들기도 합니다. 경로 설정 문제인듯한데 적절한 해결책을 알려주시면 대단히 감사하겠습니다 .. 저는 환경설정이 너무 어려워요 ㅠ.ㅠ 하하...https://abcdefgh123123.tistory.com/331 이글 보고 해결했습니당 참고하세요 다들!
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
1편과 2편의 차이점?
2편을 먼저 구매하여 수강중입니다. 1편과 겹치는 내용이 많다고 하셨는데, 1편을 보면 2편과는 다른 무언가를 얻을 수 있나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DB 락 획득 설정
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)아니오[질문 내용]안녕하세요. 트랜잭션을 시작한 후 CUD 쿼리를 사용하는 경우 자동으로 DB 락을 획득하게 되는걸까요? 혹시 원한다면 락을 걸지 않고 사용하는 설정도 있을 지 궁금합니다. 스프링을 사용할 때 @Lock 과 같은 애노테이션으로 락을 설정하는 것으로 기억하는데 설정을 하지 않아도 CUD 에서는 자동으로 락을 획득하게 되는걸까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
첨부 파일 코드자체 에러발생합니다. Test시에
Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/kimta/Desktop/김영한%20강의자료/mvc2/message/build/reports/tests/test/index.html* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
-
미해결토비의 스프링 부트 - 이해와 원리
갑자기 에러가 나는데 부탁드려보겠습니다.
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed어제까지도 잘 돌아가던게 갑자기 이 에러가 나는데 왜 그러는건가요 ?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
findByName에서 npe 오류 여쭤봅니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.findByName에서 자꾸 오류가 뜹니다 ㅠㅠ 근데 그게 정확한 이유가 뭔지 모르겠어요Member.javapackage hwang.hwangspring.domain; public class Member { private Long id; //시스템이 정해줌 private String name; //고객이 회원가입할 때 적는 이름 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }MemoryMemberRepository.javapackage hwang.hwangspring.repository; import hwang.hwangspring.domain.Member; import java.util.*; public class MemoryMemberRepository implements MemberRepository{ private static Map<Long,Member> store = new HashMap<>(); private static long sequence= 0L; //0,1,2 키값을 생성 @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { //실무에서 List 많이 씀 return new ArrayList<>(store.values()); } } package hwang.hwangspring.repository; import hwang.hwangspring.domain.Member; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; class MemoryMemberRepositoryTest { //굳이 public x, 따른데서 갖다쓸게 아니니까.. MemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Member(); //멤버 생성 member.setName("Hwang"); repository.save(member); Member result = repository.findById(member.getId()).get(); //System.out.println("result = "+(result==member)); //Assertions.assertEquals(member,result); //expected, actual assertThat(result).isEqualTo(member); } @Test public void findByName(){ Member member1 = new Member(); member1.setName("seo"); repository.save(member1); Member member2 = new Member(); member1.setName("hyun"); repository.save(member2); Member result= repository.findByName("seo").get(); assertThat(result).isEqualTo(member1); } }
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
컴파일 오류
csrf 강의 들으면서 실행중에 No bean named 'springSecurityFilterChain' available이라고 에러가 떳습니다. 어떻게 해결해야하나요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
run 실행 안 됨
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요 안녕하세요. 구글링을 해봤는데도 딱히 답을 찾지 못해 질문 남깁니다.run을 실행하면 계속 이렇게만 뜨는데 뭐가 문제인지 저 사이트 두 개를 다 참고해도 이해가 되질 않아 질문 남깁니다. gradle task를 어떻게 실행해야지 run이 될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
수업자료 웹 애플리케이션 이해 ppt에 내용이 없어요...
이렇게만있고 나머지 내용이없어요 추가 부탁드립니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
addForm의 멀티 체크박스에서 질문이 있습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]<div> <div>등록 지역</div> <div th:each="region : ${regions}" class="form-check form-check-inline"> <input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input"> <label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label> </div> </div>이런 코드였는데 궁금한점은th:field="*{regions}" th:value="${region.key}" 이렇게하면 체크박스를 만약 선택하면 th:value="${region.key} 이렇게 설정한 value의 값이 th:field="*{regions}" item의 regions라는 리스트에 알아서 매핑이 되는건가요??? 또<div> <div>배송방식</div> <select th:field="*{deliveryCode}" class="form-select"> <option value="">==배송 방식 선택==</option> <option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}" th:text="${deliveryCode.displayName}">FAST</option> </select> </div>여기서 th:value="${deliveryCode.code}" 여기서 선택한 value가 th:field="*{deliveryCode}" 이것에 의해 타임리프에서 알아서 매핑이 되는건가요?? 알아서 매핑이 되는 것이라면 deliveryCode라는 객체에 code와 displayName이 있는데 여기서 code에 알아서 매핑이 되는건지 궁금합니다,,!
-
해결됨스프링 부트 웹 개발 입문 - 따라하며 배우기
7장insert 테스트에 404오류
Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Tue Jul 04 23:39:24 KST 2023There was an unexpected error (type=Not Found, status=404).No message available404 애매합니다.소스를 보내도록 하겠습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
RestAssured를 사용한 테스트에서는 Transactional이 동작하지 않는데 어떻게 데이터를 롤백할 수 있을까요?
RestAssured를 사용한 테스트에서는 Transactional이 동작하지 않는데 어떻게 데이터를 롤백할 수 있을까요? 현재 사용하고 있는 방법은 테스트 데이터베이스와 프로덕션 데이터베이스를 확실히 분리하고각 테스트 메서드 실행 이전, 혹은 이후에 'DELETE FROM item'과 같이 테이블의 모든 데이터를 삭제하는 쿼리를 날리는 방식을 사용하고 있습니다. 질문드리고 싶은 것은RestAssured를 사용하는 경우 @Transactional이 잘 작동하지 않는 이유에 대해 찾아봤지만 잘 이해가 되지 않습니다.위에서 제시한 방법 외에 더 좋은 방법은 없을까요..? (참고: 위에 설명드린 방법은 아래 다른 분의 포스팅에 자세히 나와 있더라고요..!)https://mangkyu.tistory.com/264
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
view 환경설정 오류 왜 이러는지 궁금합니다
cannot find symbol이라고 뜨는데 처음 프로그램 설치 자체에서 문제가 있던 걸까요??
-
미해결Practical Testing: 실용적인 테스트 가이드
Fixture 사용에 있어서...
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 이렇게 사용해도, 하나의 도메인에 여러 Builder Fixture가 생기게 될까요? public class Fixture { public static ProductBuilder aProduct() { return Product.builder() .productNumber("001") .name("아메리카노") .price(1000) .type(ProductType.HANDMADE) .sellingStatus(ProductSellingStatus.SELLING); }} final LocalDateTime registeredDate = LocalDateTime.now();final Product product1 = createProduct(ProductType.HANDMADE, "001", 1000);final Product product2 = createProduct(ProductType.HANDMADE, "002", 3000);final Product product3 = createProduct(ProductType.HANDMADE, "003", 5000);final Product product4 = Fixture.aProduct().productNumber("004").price(7000).build();
-
해결됨스프링 핵심 원리 - 기본편
빌드가 안됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]project에 강의 영상과 달리 Gradle 이 두개가 있길래 첫번째 선택후 영상과 동일한 방법으로 파일을 열었는데 이런 에러가 뜹니다. 뭐가 문제 일까요??
-
해결됨스프링 핵심 원리 - 기본편
초기 설정 sync 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요3. 질문 잘하기 메뉴얼을 읽어보셨나요? 넵[질문 내용] No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.1.1 was foundsync에서 이 문구가 계속 뜹니다ㅠㅠ- Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11이거랑 같이 여러개가 뜨는데 뭐가 문제일까요? 17 설치해놨었는데 11 사용한다고 하셔서 11 다시 설치하고 환경변수까지 바꿔놨는데 계속 뜨네요...
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http요청 데이터 부분
강의를 듣던 중에 http 요청 데이터 부분에 총 3가지 방법이 있다고 들었습니다. 그런데 그냥 http api를 사용해서 get,post,put 등등 http message body 방법만으로 웹 애플리케이션을 구현하면 문제가 있을까요? 굳이 get-쿼리파라미터/ post-html form 이 두가지 방법도 알아야하는지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
생성자 주입 문의
[질문 내용]안녕하세요. 생성자 주입을 권장한다는 말씀을 듣고 의문이 생겨 문의드립니다.만약 개발 도중 생성자 필드가 추가가 된다면 해당 생성자 부분 코드를 건드리게 될텐데, 그에 따라 해당 생성자를 사용했던 코드들이 전부 오류가 날 것이고 변경이 필요할 것 같습니다.해당 사항이 발생하더라도 생성자 주입 방식을 제일 권장하시는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
지연 로딩 관련 에러 발생합니다.
기존 강의에다가 JWT token + security 를 적용하여 프로젝트를 하고 있는데 , failed to lazily initialize a collection of role: study.wonyshop.user.entity.User.orders, could not initialize proxy - no Session 오류가 발생합니다. 원인을 찾아보니 이 오류는 지연로딩된 컬렉션을 사용하는 도중에 세션이 종료되어서 발생하는 문제입니다. User 엔티티에서 orders 컬렉션을 지연로딩으로 설정하였기 때문에 실제로 컬렉션에 접근할 때 데이터베이스 연결이 필요하며 세션이 닫힌 상태에서는 접근할 수 없습니다.package study.wonyshop.user.entity; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import study.wonyshop.common.TimeStamped; import study.wonyshop.delivery.Address; import study.wonyshop.order.entity.Order; //import study.wonyshop.order.entity.Order; @Entity @Table(name = "USERS") //테이블 user 예약어 있어서 사용할 수 없음) @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id", nullable = false) private Long id; @Column(nullable = false, unique = true) private String email; @Column(nullable = false, unique = true) private String nickname; @Column(nullable = false) private String password; @Column(nullable = false) private Address address; @Setter private String profileImage; @Column(nullable = false) @Enumerated(value = EnumType.STRING) private UserRoleEnum role; @Column(nullable = false, unique = true) private String phoneNumber; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Order> orders = new ArrayList<>(); //todo 즉시로딩 필요함 -> fetch 조인 생각 할것 /** * 결제 수단은 포인트로 가능 ! 하다는 가정 */ @Column(nullable = false) private int point = 1000; // 기본 가입 포인트 private Boolean inUser; // 추후 휴면계정 관리 할때 사용 하기 위함 @Builder public User(String email, String nickname, String password, Address address, String profileImage, UserRoleEnum role, String phoneNumber) { this.email = email; this.nickname = nickname; this.password = password; this.address = address; this.profileImage = profileImage; this.role = role; this.phoneNumber = phoneNumber; } // admin , seller 용 @Builder public User(String email, String nickname, String password, Address address, String profileImage, UserRoleEnum role, String phoneNumber, int point) { this.email = email; this.nickname = nickname; this.password = password; this.address = address; this.profileImage = profileImage; this.role = role; this.phoneNumber = phoneNumber; this.point = point; } /** * 소비자가 -> 셀러 에게 지불 * * @param totalPrice */ public void payForOrder(int totalPrice) { int restPoint = this.point - totalPrice; if (restPoint < 0) { throw new IllegalArgumentException("포인트가 부족합니다. 포인트 충전 후 다시 이용해 주세요."); } this.point = restPoint; } /** * 셀러가 판매해서 받은 돈 * @param totalPrice */ public void receivePayment(int totalPrice) { this.point += totalPrice; } /** * 취소 시 환불 * @param refundPayment */ public void refundPayment(int refundPayment){ this.point -= refundPayment; } }package study.wonyshop.order.entity; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import study.wonyshop.common.TimeStamped; import study.wonyshop.delivery.Delivery; import study.wonyshop.delivery.DeliveryStatus; import study.wonyshop.orderItem.OrderItem; import study.wonyshop.user.entity.User; @Entity @Table(name = "ORDERS") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id", nullable = false) private Long id; @ManyToOne(fetch = FetchType.LAZY) //연관관계 주인 @JoinColumn(name = "user_id") private User user; // 주문자 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 @Enumerated(EnumType.STRING) private OrderStatus status; //ORDER, CANCEL private LocalDateTime orderDate;// 주문 날짜 @Builder public Order(User user, Delivery delivery, OrderStatus status, LocalDateTime orderDate) { this.user = user; this.delivery = delivery; this.status = status; this.orderDate = orderDate; } //--- 양방향 연관관계 편의 메서드 ------// 편의메서드는 컨트롤 하는 쪽에 만들어주면 됨 // 다 쪽이 연관관계 주인으로 값 의 변경사항은 주인쪽에서 함 // 다 쪽 : 일의 값은 set 으로 저장 // 일 쪽 : 리스트(다) 를 조회하여 add // order : user = m :1 public void setUser(User user) { this.user = user; user.getOrders().add(this); } //이때 이것을 호출 하기전에 세션이 종료되어 에러 발생 //order : orderItem = 1: m public void addOrderItem(OrderItem orderItem) { this.orderItems.add(orderItem); orderItem.setOrder(this); } // order : delivery = 1: 1 public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } public void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } public void setStatus(OrderStatus status) { this.status = status; } //===== 생성 메서드 =====// //OrderItem... orderItems에서 ...은 가변 인자를 선언하는 부분입니다. 이는 OrderItem 타입의 인자를 0개 이상 받을 수 있다는 의미입니다. //Order order = createOrder(user, delivery, item1, item2); public static Order createOrder(User user, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setUser(user); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //--- 비지니스 로직 -------// /** * 주문취소 */ public void cancel(){ if(delivery.getDeliveryStatus() == DeliveryStatus.COMP ) { throw new IllegalStateException(" 이미 배송이 완료된 상품은 취소가 불가능 합니다. "); //Non-cancellable product } this.setStatus(OrderStatus.CANCEL); // 주문 상품을 다 취소 시켜야함 for(OrderItem orderItem : orderItems){ orderItem.cancel(); } } //=== 조회 로직 =====// /** * 전체 주문 가격 조회 */ public int getTotalPrice(){ int totalPrice = 0; for(OrderItem orderItem :orderItems){ totalPrice += orderItem.getTotalPrice(); } return totalPrice; } } @PostMapping("") public OrderResponse orderItem(@AuthenticationPrincipal UserDetailsImpl userDetails , @RequestBody OrderRequest orderRequest) { Long itemId = orderRequest.getItemId(); int quantity = orderRequest.getQuantity(); return orderService.orderItem(userDetails.getUser(), itemId, quantity); }@Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; private final ItemRepository itemRepository; private final UserRepository userRepository; private final DeliveryRepository deliveryRepository; @Transactional public OrderResponse orderItem(User user, Long itemId, int quantity) { Item findItem = itemRepository.findById(itemId).orElseThrow( () -> new CustomException(ExceptionStatus.NOT_EXIST) ); //userRepository.findByIdWithOrders(user.getId()); //배송 생성 Delivery delivery = new Delivery(user.getAddress(), DeliveryStatus.READY); // 주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(findItem, findItem.getPrice(), quantity); // 주문생성 Order order = Order.createOrder(user, delivery, orderItem); deliveryRepository.save(delivery); userRepository.save(user); orderRepository.save(order); return new OrderResponse(order); }}이 상태에서 //userRepository.findByIdWithOrders(user.getId());이 주석 된 부분에 이처럼 user 객체를 가져올때 오더와 함께 가져오는 페치조인을 사용해봤지만 이번 엔 user가 null 값이라는 에러가 납니다. ㅠㅠㅠ 아무리 머리를 굴려도 ㅠㅠㅠㅠㅠ 해결이 안되네용 ㅠㅠㅠ 페치조인 코드 는 아래와 같이 작성했습니다. public interface OrderRepository extends JpaRepository<Order,Long> { @Query("select u from User u join fetch u.orders WHERE u.id = :userId") User findByIdWithOrders(@Param("userId")Long id); } 해결방법은 FetchType.EAGER이걸 적용하면 되는데 eager 적용하지 않고 하는 방법 없을까요 ㅠㅠ @OneToMany(mappedBy = "user", cascade = CascadeType.ALL,Fetch = FetchType.EAGER orphanRemoval = true) private List<Order> orders = new ArrayList<>();
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
annotation 강의
현재 로드맵을 따라 mvc1편을 절반정도 수강했는데 뒤로 가면@, annotation에 대한 설명해주시는 강의도 있나요??