묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
섹션 8 생명주기 강의 질문입니다.
1.빈 생명주기 콜백 시작 9분에서 아래와 같은 3개 단어가 나오는데요.ConfigurableApplicationContext가 최상위 인터페이스고ApplicationContextAnnotationConfigApplicationContext이런 순으로 자식관계가 형성되어있는건가요? 빈 생명주기 콜백 시작 13분에서 스프링빈은 객체 생성후 의존관계주입이 되는데 생성자는 예외라고 하셨는데요. 생성자가 스프링빈을 이미 생성해서 스프링 빈이 같이 들어와야 되기 때문에 파라미터의 예외라고 하셨는데요. 혹시 코드로 예시좀 보여주실 수 있나요? 3.인터페이스 InitializingBean, DisposableBean 3분에서 위와 같은 코드가 나오는데요. 위코드가 의존관계 주입이라는건가요?
-
미해결스프링 핵심 원리 - 기본편
조회한 빈이 모두 필요할 때, List, Map 강의 질문있습니다.
package hello.core.autowaried; import hello.core.AutoAppconfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; public class AllBeanTest { @Test void findAllbean(){ ApplicationContext ac= new AnnotationConfigApplicationContext(AutoAppconfig.class,DiscountService.class); DiscountService DiscountService=ac.getBean(DiscountService.class); Member member=new Member(1l,"userA", Grade.VIP); int dinscountPrice=DiscountService.discount(member,10000,"fixDiscountPlicy"); Assertions.assertThat(DiscountService).isInstanceOf(DiscountService.class); Assertions.assertThat(dinscountPrice).isEqualTo(1000); } static class DiscountService{ private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy=policyMap.get(discountCode); return discountPolicy.discount(member,price); } } } 해당강의에서 8분 52초를 따라하고 있는데 아래같은 에러가 나옵니다. 근데 강의 초반부에 나오는policyMap,policies는 제대로 출력이 됬는데 어디가 잘못된걸까요? 강의와 다르게 discountService를 DiscountService로 등록했는데 왜 에러 없이 잘 되나요? DiscountService DiscountService <=보통 DiscountService discountService 이렇게 선언되어야 하지 않나요?@Test void findAllbean(){ ApplicationContext ac= new AnnotationConfigApplicationContext(AutoAppconfig.class,DiscountService.class); DiscountService DiscountService=ac.getBean(DiscountService.class); Member member=new Member(1l,"userA", Grade.VIP); int dinscountPrice=DiscountService.discount(member,10000,"fixDiscountPlicy"); Assertions.assertThat(DiscountService).isInstanceOf(DiscountService.class); Assertions.assertThat(dinscountPrice).isEqualTo(1000); }
-
미해결실전! 스프링 데이터 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을 사용해서 삭제하려는데 삭제가 되지 안더라고요ㅠㅠ부모요소는 삭제하지 않고 자식요소들만 삭제하는 좋을 방법 알려주시면 감사하겠습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 질문
체크 예외를 throws Exception으로 던지면 다른 체크 예외를 체크할 수 있는 기능이 무효화 된다고 하셨습니다.if문으로 필요로 하는 체크 예외를 따로 처리하면 될 것 같은데 안되나요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
강의보고 토이프로젝트로 재고감소 낙관적락 기법 적용 질문
안녕하세요 강사님 강의를 보고 토이 프로젝트에서 주문 시 재고 감소 및 메뉴 주문량 증가 로직에서 낙관적락 기법을 적용해 보았는데요, 강의에서 해주신 내용 그대로 파사드 패턴 까지 적용을 해보면서 시도했는데 무한 루프가 돌았습니다.hikariCP pool을 40으로 설정해주니 그제서야 해결이 되었는데요, 강의에선 네임드락에서 커넥션풀을 지정해주었는데요 저는 낙관적락인데도 해당 설정을 해서 해결된 이유가 있을까요?@Service @RequiredArgsConstructor public class OrderService { @Transactional public Order orderWithOptimisticLock(Long memberId, LocalDateTime now) { Cart cart = cartRepository.findByMember(memberId); List<CartItem> cartItems = cart.getCartItems(); cartItems.stream() .map(CartItem::getMenu) .forEach(menu -> { decreaseStockWithOptimisticLock(menu.getId(), 1); increaseMenuOrderCountWithOptimisticLock(menu.getId(), 1); }); Money money = calculator.calculateMenus(cart.getMember(), cart.convertToMenus()); Order order = Order.createOrder(cart, money, now); return orderRepository.save(order); } public void decreaseStockWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.decrease(quantity); } public void increaseMenuOrderCountWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.increaseOrderCount(quantity); } } ``` @Component @RequiredArgsConstructor public class OptimisticLockStockFacade { private final OrderService orderService; public Order order(Long memberId, LocalDateTime localDateTime) throws InterruptedException { while (true) { try { return orderService.orderWithOptimisticLock(memberId, localDateTime); } catch (Exception e) { Thread.sleep(50); } } } } ``` public interface JpaMenuRepository extends JpaRepository<Menu, Long> { @NotNull @Lock(LockModeType.OPTIMISTIC) @Query("select m from Menu m where m.id = :id") Optional<Menu> findByIdForOptimisticLock(@NotNull @Param("id") Long id); }
-
미해결실전! 스프링 부트와 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/ 에서 생성해서 파일을 올리면되나요??동일하게 수업을 따라갈 수 있을까요?처음부터 막히네요 ㅠㅠ 도와주세요
-
미해결스프링 핵심 원리 - 기본편
Extract Method 저는 다른 단축키였군요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. Geforce Experience 앱 삭제해봐도 안되고 별 검색 다 해보다가 오른쪽 마우스 클릭하니 refactor 가 떡하니 있었어요 alt + shift + m 이었네요 왜 저만 다른걸까요? 설정을 해야하는건가요?
-
해결됨스프링 시큐리티 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 방식을 사용하면 안되는건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
api 엔드포인트 관련 질문
안녕하세요 강의를 수강한 뒤 프로젝트를 진행해보는 와중에 의문이 생겨서 질문 드립니다.api 엔드포인트 설정할 때 "/resume" 이런식으로 설정했습니다. 어떤 사용자의 이력서인지에 대해서는 토큰에서 토큰 안에 저장되어 있는 uId(userId)를 받아서 인식하게 했습니다. 근데 팀원이 엔드 포인트에 "/resume/{uId}" 이렇게 노출 시켜야하는거 아니냐고 질문을 했습니다. 제가 jwt 토큰 공부할 때 클라이언트가 토큰을 가지고 서버에 보내면 서버 측에서 토큰을 통해 사용자를 인증해주는 거라고 이해했기 때문에 uId를 엔드포인트에 노출 시킬 필요가 없다고 생각했고 보안상 문제에도 좋다고 생각했습니다.만약 다른 사용자의 이력서를 조회하고 싶은 것이라면 엔드포인트에 uId를 노출시키는 것이 맞지만 본인의 이력서에는 필요가 없다고 생각합니다."/resume" 과 "/resume/{uId}" 어떻게 하는게 맞나요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
class active 관련 질문
현재 강의를 보면 Home에만 계속 active가 적용되어 있는데Home을 클릭하면 Home에만 active,게시판을 클릭하면 게시판에만 active 설정은 어떻게 하는 건가요?
-
미해결스프링 핵심 원리 - 기본편
Bean 등록시 궁금한점이 생겼습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]위 코드상황만 봤을때bean 등록시 memberService를 호출하는 동시에 memberRepository를 호출하면서 의존관계도 설정이 된다고 이해했습니다.그렇다면@Bean public MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); }위의 메서드에 bean어노테이션이 없어도 memberRepository는 bean객체로 관리가 되나여 ???또한 위의 메서드를 지우고@Bean //각메서드에 bean이라 적으면 각 메서드가 스프링컨테이너에 등록이 된다. public MemberService memberService(){ return new MemberServiceImpl(new MemoryMemberRepository()); }위와 같이 수정해도 bean으로 관리가 되나요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강사님 폰트가 궁금합니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오...2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의자료의 강사님의 폰트가 궁금합니다!이것도 JetBrains Mono 인가요?
-
해결됨실전! 스프링 데이터 JPA
JPQL로 페이징을 제공하지 않는 이유.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]방언때문에 그런건가요? DB마다 메커니즘이나 사용 방법이 너무 상이해서 추상화 하기 어려운 건가요?근데 JPQL은 다 방언 참고해서 나가지 않나요?
-
해결됨스프링 시큐리티 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버전인데 왜 빌드가 안되는지 궁금합니다..
-
미해결스프링 부트 - 핵심 원리와 활용
build.gradle 변경
강의를 듣던 중 프로젝트 설정이 사진처럼 바뀌면서 실행이 되지 않습니다 이 문제는 어떻게 해결할 수 있을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
DB질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] Mybatis 강의에서 수업을 쭉 따라가다보면-의존성 추가-@Mapper 인터페이스 생성-xml 파일 생성;이후에 바로 테스트를 실행하시는데이 과정에는 H2 DB의 url, id, pw를 넣어주는 설정 작업이 없는것 같은데 dataSource랑 connection은 어떻게 얻어오고 mybatis는 어떻게 db와 연결이 되는건가요???
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서버에서 진행한다는 뜻은 뭘까요?
검증을 서버에서 진행한다는게 인텔리제이에서 Validation 코드로 검증한다는것이 서버에서 진행한다는게 맞을까요?