묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
자식요소List Lazy loading으로 가져와서 삭제하는 방법 알려주시면 감사하겠습니다.
@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Enumeration { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private UUID id; @Column(nullable = false) private Integer sequence; @Column private String description; @ManyToOne @JoinColumn(name = "enumeration_group_id") private Enumeration parentEnumeration; @OneToMany(mappedBy = "enumerationGroup", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Enumeration> childEnumerationList; }이런식으로 짜여진 entity에서@Service @Transactional public class EnumerationCommandService { private final EnumerationQueryRepository enumerationQueryRepository; private final EnumerationCommandRepository enumerationCommandRepository; public void deleteChild(UUID id) { Enumeration enumeration = this.enumerationQueryRepository.findById(id).orElseThrow(EnumerationRollbackException::byNotFound); List<Enumeration> enumerationList = enumeration.getEnumerationList(); enumerationCommandRepository.deleteAll(enumerationList); } }LAZY 로딩으로 가져온 List<Enumeration> 을 가져와서 deleteAll을 사용해서 삭제하려는데 삭제가 되지 안더라고요ㅠㅠ부모요소는 삭제하지 않고 자식요소들만 삭제하는 좋을 방법 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스에 엔터티를 만들지도 않았는데 왜 ORDERS_ORDER_ITEMS 테이블이 생성되었는지 잘 모르겠습니다.
<Order 클래스>package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") // PK private Long id; @ManyToOne // 주문의 입장에서는 다대일 관계 @JoinColumn(name = "member_id") // FK private Member member; @OneToMany private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne //todo 일대일관계에서는 FK를 아무대나 매핑해도 상관없는데, 주로 엑세스를 많이 하는 엔터티에 사용한다고 함 @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; // 주문시간(hibernate가 알아서 매핑해줌) @Enumerated(EnumType.STRING) private OrderStatus status; } <Item 클래스>package jpabook.jpashop.domain.item; import jpabook.jpashop.domain.Category; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 한 테이블에 다 떄려박음 @DiscriminatorColumn(name = "dtype") @Getter @Setter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<>(); } <OrderItem 클래스>package jpabook.jpashop.domain; import jpabook.jpashop.domain.item.Item; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne @JoinColumn(name = "item_id") private Item item; @ManyToOne @JoinColumn(name = "order_id") private Order order; private int orderPrice; // 주문 가격 private int count; // 주문 수량 }참고로, 다른 엔터티 테이블의 속성들은 설계에 있는 그대로 정상적으로 잘 만들어졌습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1:N 계층구조 테이블들 간에 Fetch 조인 사용 질문 드립니다.
안녕하세요. 열심히 강의를 듣고 있는 수강생입니다!궁금한게 있습니다.현재 실무에서 사용하고 있는 구조를 좀더 개선시키고 싶어서 열심히 노력중인데요.현재 상황을 말씀 드리겠습니다.A, B, C, D 테이블이 있습니다.각 entitiy 클래스 별로 OneToMany로 A-B, B-C, C-D 이런식으로 Relation이 걸려 있습니다.현재 기준으로는 각 OneToMany 별로 BatchSize=1000 & FetchType=Eager로 적용이 되어있는데요.이렇다 보니, A 테이블 조회시 조회된 ID 기준으로 하위 테이블들에 대해서 IN쿼리가 몇개씩 불려지게 됩니다. 그래서 Fetch 조인을 통해서 한번에 가져오는 방식으로 바꿔보려고 개선을 하려고 했는데요.예를 들면select a.* from A aleft fetch join a.B bleft fetch join b.C cleft fecth join c.D d이런식으로 하려고했더니 컴파일 단계에서 MultipleBagFetchException이 발생 하였습니다.그래서 찾아보니 fecth 조인 사용할 경우에는 oneToMany로 걸리는 대상이 2개 이상이면위와같은 Exception을 떨군다고 하더라구요..(카티션 곱 이슈로 인한 하이버네이트에서 사전에 미리 막는..) 그래서 결국에는 A-B까지만 Fetch로 빼고 나머지 B-C, C-D는 기존 그대로 Eager 전략으로기존과 동일하게 조회되도록 조금이나마 개선은 했는데요..B-C, C-D를 lazy로 바꾸니 N+1이 발생했구요.. N+1해소 하는 방법으로 Fecth조인을 쓰자니위와같은 Exception이 발생을 하구요..어떻게 하면 좋을까요.. 도와주세요!
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
커뮤니티 버전에서 스프링 부트를 선택할수 없습니다.
이경우에는https://start.spring.io/ 에서 생성해서 파일을 올리면되나요??동일하게 수업을 따라갈 수 있을까요?처음부터 막히네요 ㅠㅠ 도와주세요
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
통합테스트와 단위 테스트
강사님은 통합테스트랑 단위테스트 둘다 빡시게 하시는 편이신가요? 아니면 강약 조절 하시나요? 어느 쪽에 좀더 중요도를 두시는지도 궁금합니다.
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
socialLoginApiService map 주입
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. @Servicepublic class SocialLoginApiServiceFactory {private static Map<String,SocialLoginApiService> socialLoginApiServices;public SocialLoginApiServiceFactory(Map<String,SocialLoginApiService> socialLoginApiServices) {SocialLoginApiServiceFactory.socialLoginApiServices = socialLoginApiServices;}public static SocialLoginApiService getSocialLoginApiService(MemberType memberType){String socialLoginApiServiceBeanName = "";if(MemberType.KAKAO.equals(memberType)){socialLoginApiServiceBeanName = "kakaoLoginApiServiceImpl";}return socialLoginApiServices.get(socialLoginApiServiceBeanName);}} 여기서 생성자로 socialLoginApiServices 를 주입해서 사용 하는 것 같은데 주입하는 부분이 보이지 않아서 질문 드립니다 어디서 주입 되는 것일까요?
-
해결됨스프링 시큐리티 OAuth2
PasswordOAuth2AuthorizedClientProvider @Deprecated
안녕하세요 선생님.최신 시큐리티 6.x 버전에서는 PasswordOAuth2AuthorizedClientProvider 클래스에 "The latest OAuth 2.0 Security Best Current Practice disallows the use of the Resource Owner Password Credentials grant" 라고 적혀있는데 그럼 더이상 Resource Owner Password Flow 방식을 사용하면 안되는건가요?
-
미해결실습으로 배우는 선착순 이벤트 시스템
안녕하세요. 죄송한데 노션이나 pdf파일은 어디 있나요?
찾아봐도 안 나오는 것 같아서 질문 남깁니다ㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
api 엔드포인트 관련 질문
안녕하세요 강의를 수강한 뒤 프로젝트를 진행해보는 와중에 의문이 생겨서 질문 드립니다.api 엔드포인트 설정할 때 "/resume" 이런식으로 설정했습니다. 어떤 사용자의 이력서인지에 대해서는 토큰에서 토큰 안에 저장되어 있는 uId(userId)를 받아서 인식하게 했습니다. 근데 팀원이 엔드 포인트에 "/resume/{uId}" 이렇게 노출 시켜야하는거 아니냐고 질문을 했습니다. 제가 jwt 토큰 공부할 때 클라이언트가 토큰을 가지고 서버에 보내면 서버 측에서 토큰을 통해 사용자를 인증해주는 거라고 이해했기 때문에 uId를 엔드포인트에 노출 시킬 필요가 없다고 생각했고 보안상 문제에도 좋다고 생각했습니다.만약 다른 사용자의 이력서를 조회하고 싶은 것이라면 엔드포인트에 uId를 노출시키는 것이 맞지만 본인의 이력서에는 필요가 없다고 생각합니다."/resume" 과 "/resume/{uId}" 어떻게 하는게 맞나요?
-
해결됨실전! 스프링 데이터 JPA
JPQL로 페이징을 제공하지 않는 이유.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]방언때문에 그런건가요? DB마다 메커니즘이나 사용 방법이 너무 상이해서 추상화 하기 어려운 건가요?근데 JPQL은 다 방언 참고해서 나가지 않나요?
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
의존성 및 설계? 부분 질문드립니다.
상품 주문 API 개발POJO로 상품 주문 구현하기 강의에서OrderService 구현 시 OrderPort를 주입받고,OrderAdapter에서 ProductRepository를 이용하여 Product를 Read해오는데,OrderService에서 ProductPort를 주입받은후,productPort.getProduct(productId)로 Product를 Read해온 후에 Order를 Create하는 방식은 문제가 있는 방식인지 궁금합니다.또 강사님이 구현하신 코드와 설계 부분에서 어떤 차이가 있을지 궁금해서 질문드립니다.
-
해결됨스프링 시큐리티 OAuth2
addFilterBefore 관련 질문이 있어요!
안녕하세요 선생님. spring security 그리고 spring security oauth 강의 잘 듣고있습니다.이전 security 기본 강의에서는 formlogin API를 호출해서 UsernamePasswordAuthenticationFilter가 존재하였는데, 지금은 formlogin API를 호출하지 않아서 UsernamePasswordAuthenticationFilter가 존재하지 않는데 왜 addFilterBefore에 UsernamePasswordAuthenticationFilter.class를 적는지 궁금해요!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew 빌드가 안됩니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 자바 19버전인데 스프링부트 3.0.0이상에서는 17버전 이상으로 사용하래서 자바 19버전인데 왜 빌드가 안되는지 궁금합니다..
-
미해결예제로 배우는 스프링부트 입문
26강, springboot 3.1.5에서는 에러
'org.springframework.boot' version '3.1.5'으로 실행하면 에러가 나는데요. 버전에 차이가 많이 있는 건가요?
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
테스트 더블
덕분에 테스트에 대해 흥미를 가지고 공부중에 있습니다.테스트 공부하면서 한가지 궁금한 점이 있습니다. 혹시, Mock, Stub, Fake 등 상황에 따라 구분해서 사용하고 계신가요?
-
미해결스프링 부트 - 핵심 원리와 활용
build.gradle 변경
강의를 듣던 중 프로젝트 설정이 사진처럼 바뀌면서 실행이 되지 않습니다 이 문제는 어떻게 해결할 수 있을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
github에서 파일을 받고 다시 커밋을 하려면
제가 컴퓨터를 포맷할 일이 생겨서 포맷 후 진도를 이어서 따라 가려고github에 올려둔 파일을 다운 받아서 이어서 하고 있었습니다. 그러다가 aws에 비밀번호를 바꾸고 두 번째 커밋을 할 때 막혔는데요.. 다시 git 등록하는 강의도 듣고 이것저것 해보았지만 push할 때 막혀서 그냥 github에 새로운 library2-app 레포지터리를 만들고 처음 저장한 것처럼 저장했습니다. 일단 이렇게 해결하긴 했는데 위에 상황처럼 만약 github에서 파일을 다시 받고 이어서 커밋 하려면 어떻게 해야 하나요?? 그리고 방법들을 찾다가 pull이라는 명령어도 찾았었는데pull 명령어를 입력할 때 origin과 master는 무엇을 의미하나요? origin은 library-app을 입력했었고 master는 제 github 닉네임인지 이게 맞는 건지도 알고 싶습니다!!
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
DTO 생성 과정에서 궁금한 점이 있어요!!
DTO를 생성할 때 코드가 너무 많이 생성되는데 더 간편하고 쉽게 벨리데이션 처리할 수 있는 방법은 없을까요?
-
미해결스프링 부트 - 핵심 원리와 활용
spring boot 강의
스프링부트 강의를 먼저 듣는게 좋을까요스프링 고급편 먼저 듣는게 좋을까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberFrom의 setname설정방법
궁금한게 있는데요! createMemberForm.html에서 name="name"으로 된 부분이 MemberForm의 setname이 된다고 이해를 했는데 그 연결고리가 어디인지 궁금합니다. 제가 보는데 도대체 어디서 이 name이 MemberForm의 setname이 되는지 모르겠습니다ㅠㅠ. setname으로 된 이유를 알면 MemberController에서 public String create(MemberForm form){ Member member = new Member(); member.setName(form.getName());이렇게 되는거는 이해가 되거든요... 근데 setname이 어디서 어떻게 설정되었는지 모르니 답답하네요ㅠ