묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
BeforeEach 질문이요
[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 김영한 개발자님.강의를 들으며 공부하다가 궁금점이 생겨서 질문 남깁니다.13:00 부분부터 MemoryMemberRepository memberRepository = new MemoryMemberRepository(); 부분에서 매번 다른 객체를 생성하기 때문에 beforEach 함수를 생성하고, 그 안에서 memberRepository = new MemoryMemberRepository();로 생성후에 memberService에 DI 해준다고 말씀하셨는데, 이 부분이 잘 이해가 안가요... new로 MemoryMemberRepository를 생성하는것은 전과 후가 동일한데 왜 전역으로 작성한 것과 beforeEach 문 안에 작성한 것과 차이가 있나요? 좋은 강의 늘 감사합니다.해당 글에 답변 남겨주신거 보았는데요 이해를 못하겠어서요 동일한 Repository를 사용하게 함으로 다른 DB를 사용하게 되는 부작용을 막는다는 이야기는 이해를 하겠는데요결국 @BeforeEach 에서 테스트를 진행하기전에 new로 새로운 Repository를 생성하는데 같은 Repository를 쓰게된다는 말이랑 무슨 연관이 있나요?
-
해결됨토비의 스프링 부트 - 이해와 원리
@Configuration 과 @ComponentScan
@Configuration @ComponentScan public class HelloApplication { public static void main(String[] args) { AnnotationConfigServletWebApplicationContext applicationContext = new AnnotationConfigServletWebApplicationContext(){ @Override protected void onRefresh() { super.onRefresh(); ServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(); WebServer webServer = webServerFactory.getWebServer( servletContext -> { servletContext.addServlet("dispatcherServlet", new DispatcherServlet(this) ).addMapping("/*"); } ); webServer.start(); } }; // applicationContext.register(HelloController.class); // applicationContext.register(SimpleHelloService.class); applicationContext.register(HelloApplication.class); applicationContext.refresh(); } }강사님 안녕하세요, 강의를 복습하다보니 @ComponentScan을 사용할 때 @Configuration이 필요한지 의문이 들더라구요 처음에 @Configuration javaDoc를 보면 @ConponentScan 부분에 @Configuration 클래스는 구성 요소 스캐닝(component scanning)을 통해 부트스트랩될 뿐만 아니라, @ComponentScan 주석을 사용하여 스스로 구성 요소 스캐닝을 설정할 수도 있습니다.라고 작성이 되었더라구요 @ComponentScan public class HelloApplication {}이 상태로 register에 등록을 해도 컴포넌트 스캔이 동작합니다. Creating shared instance of singleton bean 'helloApplication' Creating shared instance of singleton bean 'helloController' Creating shared instance of singleton bean 'simpleHelloService'@Configuration이 없어도 직접 register에 등록하면 애노테이션을 읽어서 컴포넌트 스캔이 동작합니다. 그러면 register에 @Configuration을 붙이지 않고 직접 등록한다면 @ComponentScan만 있어도 되는데 붙이는 이유가 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
도서 관리 애플리케이션 화면 질문
안녕하세요! 강의 완강하고 복습을 하고있는 수강생입니다.복습을 하는 과정에서 궁금한 점이 있어서 질문이 있는데요 선생님께서 도서관리 애플리케이션 화면은 제공해주셨는데 사용자 등록란에 이름과 나이를 입력하고 저장을 누르면 POST 메소드가 연결되고 목록에 들어가면 GET, 수정을 누르면 UPDATE, 삭제를 누르면 DELETE 메소드가 연결되는 것은 프론트엔드 작업 과정에서 어떠한 설정을 해주셔서 자연스럽게 되는건가요? 그 과정도 공부하고싶은데 자바스크립트와 리액트까지 공부하면 될까요? 강의 공부를 끝내고 나면 제 프로젝트를 한번 만들어보고싶은데 어느정도 공부해야 할지 감이 잘오지 않아서요 화면 구성부터 서버 동작하는 처음부터 끝까지 해보고싶어서 질문드립니다!
-
미해결스프링 배치
PagingQueryProvider에서 join 관련 질문 드립니다.
제 소스코드 공유 드립니다. 위 provider를 실행하면 select 절에 ot.tank_seq가 존재함에도 불구하고 order by 절에서 sortKeys로 설정한 ot.tank_seq를 인식하지 못하는 오류가 발생합니다.제가 검색해본 결과 join절을 사용해서 가져온 필드를 order by 하려면 alias를 붙여 사용하라고 하던데요. 그래서 위 코드처럼 alias를 붙여 실행하면 이와 같은 제가 설정한 적 없는 WHERE 절이 실행되게 되는데 혹시 왜 그럴까요?
-
미해결실전! 스프링 데이터 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 변경
강의를 듣던 중 프로젝트 설정이 사진처럼 바뀌면서 실행이 되지 않습니다 이 문제는 어떻게 해결할 수 있을까요?