묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
Naver Login시 권한에 대해 질문이 있습니다
CustomAuthorityMapper 클래스에서강사님과 코드는 동일하나authorities가 넘어올시에 위와 같이 넘어옵니다.그래서 강사님 영상과 다르게ROLE_USER만이 authority에 대해서 담기게 되고위의 사진은 hasRole 권한을 해제하여 찍어본것입니다. /api/user에 진입이 불가합니다 코드는 동일한데 뭐가 문제일까요,,,? 강사님의 네이버 로그인시는 response를 안벗기고도 진입이 가능해서 질문드립니다 package io.security.oauth2.sociallogin; import lombok.RequiredArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class CustomAuthorityMapper implements GrantedAuthoritiesMapper { private String prefix = "ROLE_"; @Override public Set<GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) { HashSet<GrantedAuthority> mapped = new HashSet<>(authorities.size()); for (GrantedAuthority authority : authorities) { mapped.add(mapAuthority(authority.getAuthority())); } return mapped; } private GrantedAuthority mapAuthority(String name) { if(name.lastIndexOf(".") > 0){ int index = name.lastIndexOf("."); name = "SCOPE_" + name.substring(index+1); } if (!this.prefix.isEmpty() && !name.startsWith(this.prefix)) { name = this.prefix + name; } return new SimpleGrantedAuthority(name); } }
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ResponseStatusException
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ResponseStatusException 예외에서 3번째 파라미터에 illeagalArgumentException 예외를 넣어주셧는데 그말은 IlleaglArgumentException 이 컨트롤러에서 터지면 500 에러인데 ResponseStatusException 에 담아줬기 떄문에 404 에러로 바뀌는건가요 ?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
일대다 패치 조인 사용 시, 뻥튀기가 되지 않는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]아래 처럼 print를 찍었을 때, 저는 id 1과 2가 두 개가 나오지 않습니다. 관련 코드는 아래 첨부하겠습니다. 강의대로 똑같이 했는데, 왜 1개씩만 나오는지 모르겠습니다.. distinct를 넣었을 때와 안넣었을때의 결과가 같습니다. DB에서는 4개로 나오는데 Postman이랑 콘솔에서는 2개로 난오네요..[v3 적용 시] package jpabook.jpashop2.api;import jpabook.jpashop2.domain.Address;import jpabook.jpashop2.domain.Order;import jpabook.jpashop2.domain.OrderItem;import jpabook.jpashop2.domain.OrderStatus;import jpabook.jpashop2.repository.OrderRepository;import jpabook.jpashop2.repository.OrderSearch;import lombok.Data;import lombok.Getter;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;import java.util.List;import java.util.stream.Collectors;import static java.util.stream.Collectors.toList;@RestController@RequiredArgsConstructorpublic class OrderApiController {private final OrderRepository orderRepository;@GetMapping("/api/v1/orders")public List<Order> ordersV1(){List<Order> all = orderRepository.findAllByString(new OrderSearch());for (Order order : all) {order.getMember().getName(); // 프록시 객체 초기화order.getDelivery().getAddress();List<OrderItem> orderItems = order.getOrderItems();orderItems.stream().forEach(o -> o.getItem().getName());}return all;}@GetMapping("/api/v2/orders")public List<OrderDto> ordersV2(){List<Order> orders = orderRepository.findAllByString(new OrderSearch());List<OrderDto> collect = orders.stream().map(o -> new OrderDto(o)).collect(toList());return collect;}@GetMapping("/api/v3/orders")public List<OrderDto> ordersV3(){List<Order> orders = orderRepository.findAllWithItem();for (Order order : orders) {System.out.println("order ref= " + order + " id=" + order.getId());}List<OrderDto> collect = orders.stream().map(o -> new OrderDto(o)).collect(toList());return collect;}@Datastatic class OrderDto{private Long orderId;private String name;private LocalDateTime orderDate;private OrderStatus orderStatus;private Address address; // VO는 그대로 사용해도 되지만, (VO는 객체이기 때문에, 안에 값이 변하면 다른 객체로 판단)private List<OrderItemDto> orderItems; // 엔티티는 DTO로 다시 한번 래핑이 필요하다.public OrderDto(Order order) {orderId = order.getId();name = order.getMember().getName();orderDate = order.getOrderDate();orderStatus = order.getStatus();address = order.getDelivery().getAddress();orderItems = order.getOrderItems().stream().map(orderItem -> new OrderItemDto(orderItem)).collect(toList());}}@Datastatic class OrderItemDto { // OrderItem에서 필요한 값만 다시 추출private String itemName; // 상품명private int orderPrice; // 주문 가격private int count; // 주문 수량public OrderItemDto(OrderItem orderItem) {itemName = orderItem.getItem().getName();orderPrice = orderItem.getOrderPrice();count = orderItem.getCount();}}} public List<Order> findAllWithItem() {return em.createQuery("select o from Order o" +" join fetch o.member m" +" join fetch o.delivery d" +" join fetch o.orderItems oi" +" join fetch oi.item i", Order.class).getResultList();}
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
결과 쿼리 개수가 맞지 않아서 문의 드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용][간단한 주문 조회 V3: 엔티티를 DTO로 변환 -패치 조인 최적화] 강의에서 5분 50초 쯤에 v2를 돌려봤을 때, 강사님은 쿼리가 5번 나오는데,저는 계속 7번이 나오더라구요...order가 처음에 주문 2개를 만들어서 이미 영속성 상태라 그 다음에는 1차 캐시에서 가져오는 것으로 보여 쿼리는 생성이 안되어야 한다고 생각이 드는데, 왜 계속 order 쿼리가 2번 더 나오는 걸까요...? [Query]2023-10-25T21:54:33.448+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selecto1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.statusfromorders o1_0joinmember m1_0on m1_0.member_id=o1_0.member_idfetchfirst ? rows only2023-10-25T21:54:33.449+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473449 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows onlyselect o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first 1000 rows only;2023-10-25T21:54:33.450+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selectm1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.namefrommember m1_0wherem1_0.member_id=?2023-10-25T21:54:33.451+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473451 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=?select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=1;2023-10-25T21:54:33.451+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selectd1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.statusfromdelivery d1_0whered1_0.delivery_id=?2023-10-25T21:54:33.451+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473451 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=?select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=1;2023-10-25T21:54:33.452+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selecto1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.statusfromorders o1_0whereo1_0.deliver_id=?2023-10-25T21:54:33.452+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473452 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=?select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=1;2023-10-25T21:54:33.453+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selectm1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.namefrommember m1_0wherem1_0.member_id=?2023-10-25T21:54:33.453+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473453 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=?select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=2;2023-10-25T21:54:33.453+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selectd1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.statusfromdelivery d1_0whered1_0.delivery_id=?2023-10-25T21:54:33.454+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473454 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=?select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=2;2023-10-25T21:54:33.454+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL :selecto1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.statusfromorders o1_0whereo1_0.deliver_id=?2023-10-25T21:54:33.454+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473454 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=?select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=2; [OrderSimpleApiController]package jpabook.jpashop2.api;import jpabook.jpashop2.Repository.OrderRepository;import jpabook.jpashop2.Repository.OrderSearch;import jpabook.jpashop2.domain.Address;import jpabook.jpashop2.domain.Order;import jpabook.jpashop2.domain.OrderStatus;import lombok.Data;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;import java.util.List;import java.util.stream.Collectors;/*** X To One (컬렉션 X)* Order* Order -> Member* Order -> Delivery*/@RestController@RequiredArgsConstructorpublic class OrderSimpleApiController {private final OrderRepository orderRepository;@GetMapping("/api/v1/simple-orders")public List<Order> ordersV1(){List<Order> all = orderRepository.findAllByString(new OrderSearch());for (Order order : all) {order.getMember().getName(); // Lazy 강제 초기화order.getDelivery().getAddress(); // Lazy 강제 초기화}return all;}@GetMapping("/api/v2/simple-orders")public List<SimpleOrderDto> ordersV2(){// Order 2개List<Order> orders = orderRepository.findAllByString(new OrderSearch());List<SimpleOrderDto> result = orders.stream().map(o -> new SimpleOrderDto(o)) // map : a -> b로 치환.collect(Collectors.toList());return result;}@GetMapping("/api/v3/simple-orders")public List<SimpleOrderDto> ordersV3() {List<Order> orders = orderRepository.findAllWithMemberDelivery();List<SimpleOrderDto> result = orders.stream().map(o -> new SimpleOrderDto(o)).collect(Collectors.toList());return result;}@Datastatic class SimpleOrderDto{ // API 명세서private Long orderId;private String name;private LocalDateTime orderDate;private OrderStatus orderStatus;private Address address;public SimpleOrderDto(Order order) {orderId = order.getId();name = order.getMember().getName();orderDate = order.getOrderDate();orderStatus = order.getStatus();address = order.getDelivery().getAddress();}}} [OrderRepository]... public List<Order> findAllWithMemberDelivery() {return em.createQuery("select o from Order o" +" join fetch o.member m" +" join fetch o.delivery d", Order.class).getResultList();}
-
미해결
스프링 사용 중 생기는 오류
안녕하세요spring tools4를 설치하였고 돌아가는지 확인하고 싶어 확인하는 도중에 오류가 걸려서 글 올립니다.java는 11로 사용하였고demo1는 local로 실행했을 때 Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0오류가 떠서 java버전이 다르다는 것을 알기는 알아냈지만 인터넷으로 검색한 방법을 다 써봐도 해결이 안됐습니다.사용한 방법은 build path에서 jre system library로 해보았고 installed jres도 제대로 해두었습니다.compiler에도 11로 표시하였는데 혹시 다른 추가적이 방법이 있을까요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
내용정리 화면은 어디서 볼수있나요?
화면에서 보여주시는 내용정리된 노트?는 어디서 볼수있나요?
-
해결됨스프링 핵심 원리 - 기본편
프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]학습 자료의 생성자 주입을 선택하라는 내용에서 '누락' 설명하는 부분에 써진 내용을 보고 질문 드립니다. 아래는 학습 자료에 있는 내용 복붙한 거입니다.프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에 다음과 같이 수정자 의존 관계인 경우 @Autowired가 프레임워크 안에서 동작할 때는 의존 관계가 없으면 오류가 발생하지만, 지금은 프레임워크 없이 순수한 자바 코드로만 단위 테스트를 수행하고 있다. 이렇게 테스트를 수행하면 실행은 된다. 그런데 막상 실행 결과는 NPE(Null Point Exception)이 발생하는데, memberRepository, discountPolicy 모두 의존 관계 주입이 누락되었기 때문이다 여기서 말하고자 하는 바는"프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우엔 수정자 주입 방법의 경우 문제가 생긴다."가 아니라"수정자 주입을 하면 만일 개발자의 실수로 뭔가를 누락할 경우 발견하기 어려울 수 있다. 그러므로 수정자 주입을 안 하는 게 좋다."라는 게 맞나요? 즉 수정자 주입으로 해도 테스트할 수는 있지만 여러모로를 따졌을 때 생성자 주입이 실수할 확률이 적어서 낫기 때문인지 궁금합니다. 단위 테스트할 때 set 메서드를 직접 호출하면 수정자 주입의 경우에도 자바로 단위 테스트 할 수는 있는 거죠? 제가 코드를 짰을 땐 되는 것 같은데 제가 제대로 코드를 짠 게 아닐 수 있어서 검증이 제대로 된 건지 모르겠어서 질문드립니다.
-
해결됨스프링 핵심 원리 - 기본편
setter와 생성자 모두에 @Autowired를 하면 주입이 중복해서 되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]수정자 주입 설명하시는 강의 내용 중9:55 부분부터 setter에 있는 @Autowired 2개를 지우고 실행했더니 아무 것도 출력이 안 되었는데, 생성자 부분에서 soutv를 다시 추가하고 실행해 보니 생성자 주입은 정상적으로 되는 것 같더라고요. 그런데 setter에 @Autowired를 붙이고,soutv는 setter와 생성자 모두에 넣고 AutoAppConfigTest를 실행하면setter의 soutv와 생성자의 soutv 모두 실행되고 다음과 같이 출력됩니다.memberRepository = hello.core.member.MemoryMemberRepository@4e70a728discountPolicy = hello.core.discount.RateDiscountPolicy@b7838a9memberRepository = hello.core.member.MemoryMemberRepository@4e70a728discountPolicy = hello.core.discount.RateDiscountPolicy@b7838a9 그럼 setter 주입도 되고, 생성자 주입도 된 건가요? 불필요하게 또 주입을 하게 되었다는 뜻인가요? @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; @Autowired public void setMemberRepository(MemberRepository memberRepository) { System.out.println("memberRepository = " + memberRepository); this.memberRepository = memberRepository; } @Autowired public void setDiscountPolicy(DiscountPolicy discountPolicy) { System.out.println("discountPolicy = " + discountPolicy); this.discountPolicy = discountPolicy; } @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { System.out.println("memberRepository = " + memberRepository); System.out.println("discountPolicy = " + discountPolicy); this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 이름을 같게 해도 에러가 뜨지 않아요 ㅠ (자동)
MemberServiceImpl, OrderServiceImpl 이름을둘다 service로 이름을 설정했는데AutoAppConfigTest 에서 돌려봐도 테스트가 통과하고에러가 뜨질 않네요왜 이럴까요? 영한님 강의 너무 잘 듣고 있습니다 좋은 강의 찍어주셔서 감사합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
정적 팩터리 메서드 사용 기준?
제목 그대로 언제 사용하시는지에 대해 얘기를 나눠보고 싶어 질문 남깁니다.제 경우는 영속성 계층에 새로운 객체가 추가될 때 (RDB에 레코드를 추가할 때) new 키워드를 사용하여 id 값을 생성자로 받지 않는 생성자를 열어두고,존재하는 도메인 엔티티 혹은 영속성 엔티티를 영속성 계층으로부터 불러올 때는 정적 팩터리 메서드를 사용하는데강의를 진행하시면서 습관적으로 생성자 대신 static 메서드를 통해 생성 하시더라구요, 강사님만의 명확한 기준이 있으신지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
ProductNumberFactory 클래스는 어떤 Layer 객체로 봐야 할까요?
안녕하세요! 먼저 항상 좋은 강의 감사드립니다! 저도 작은 경험 이지만 개발을 하면서 서비스 단의 로직을 분리 (강의에서 말씀 해주신 것 처럼 책임을 분리할 정도)해야 하는 상황인 경우, 이렇게 하는게 맞는지는 모르겠으나, Point1. ServiceUtil 클래스를 정의하여 컴포넌트로 주입받아 사용하거나 (실무에선 이렇게 사용)Point2. 학습시에는 Facade 패턴을 이용하여 서로 다른 서비스들의 상위 퍼사드 객체를 만들어서 사용한 적이 있습니다.(물론 퍼사드 패턴의 경우, 두 로직이 완전히 다른 맥락인 경우에 사용하는 것 같습니다.. 강의 예제와 같이 결합도가 높은 경우가 아니라..)그런데, 강의에서는 Factory 객체를 만들어서 (마치 제가 ServiceUtil을 만들어서 사용하는 것 처럼 - 사실 이름만 다르지 같습니다)사용하시는 모습을 보여주셨는데, Q1. 강사님께서는 실무에서 서비스의 책임을 분리할 때 주로 이런식으로 Factory 클래스를 분리하여 사용하시는지 궁금하고, Q2.그렇게 Factory 클래스로 책임을 분리했을 때, 이 Factory 클래스는 Controller / Service/ Repository 그 어느것도 아니게 되는데, Spring WEB mvc 레이어 아키텍쳐 상으로 어떤 Layer의 어떤 입장의 객체로 인지하고 사용해야 하는지 여쭙고 싶습니다. 감사합니다.
-
미해결실전! 스프링 데이터 JPA
실무에서 @DynamicInsert, @DynamicUpdate 사용하나요?
안녕하세요!좋은 강의 잘 들었습니다! 실무에서 JPA를 사용하면서 궁금한점이 있어서요실무에서는 @DynamicInsert, @DynamicUpdate 사용하고 있는데영한님은 한번도 안쓰시더라구요..!실무에서는 어떻게 사용하시는지 궁금합니다!@DynamicInsert, @DynamicUpdate 사용하지 않으면 어떻게 사용하는지도 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
private method 테스트문의
안녕하세요. 좋은 강의 잘 듣고 있습니다 ^^ 강의에서 private method 테스트를 해야되는 상황이라면객체를 분리해야되는 상황이라고 말씀을 주셨는데실무에서는 꼭 분리를 해야되는 상황이 아닐수도 있을텐데1)실무에서는 private method 에 대한 테스트는 거의 작성안하나요? 2)레거시 프로젝트를 맡았을때 public method 에 대한 테스트를 작성하기에는 많은 작업이 필요하다면 private method 라도 테스트 코드를 작성하는게 좋을거 같은데 이런 경우도 작성을 안하나요?3) private 함수를 변경하는경우 해당함수만 테스트하고 싶을거 같은데 이런경우는 어떻게하나요?
-
해결됨스프링 핵심 원리 - 기본편
Test 코드 작성 시에는 왜 import 문이 없나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의 잘 보고 있습니다.문득 코딩하다 궁금한 점이 컨트롤러, 서비스, 레포지토리 등을 작성할 땐 import 문을 사용하여 클래스를 사용하는데TEST 코드를 작성할 땐 왜 import 문을 작성하지 않아도 클래스를 사용할 수 있는 건가요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
EntityManager를 쓰는데, DB가 다르면 EntityManager도 2개 주입받아야 해요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예를 들면 좀 회사의 기존 서비스에서 아예 새로운 서비스말고 기존의 서비스를 활용해서 뭔가 고객에게 제공해 주고 싶다, 하면 기존DB랑 새로 추가 해야 할 DB랑 다를 수 있잖아요.근데 EntityManager는 우리 눈에는 안보이지만, 자동으로 DataSource 주입 받잖아요.DataSource가 제가 기억하기로 말 그대로 데이터의 근원, h2 이런 것 들에 대한 연결할 수 있는 정보? 들을 얻어오는 걸로 기억을 해서, DB가 다르면 저것도 다를 수 있잖아요. 또 DB의 계정마다도 다를 것 같고.. 그러면 EntityManager가 2개 생기나요? 이번엔 같은 DB에 테이블만 다른거니 JPA 내부적으로 sql만 좀 다르게 짤거니까 상관 없어 보이지만..
-
미해결스프링부트 시큐리티 & JWT 강의
Facebook 로그인 버튼만든 후 error(Sorry...) 발생시
인증 및 계정 만들기 > 수정 에서 Email 권한 추가해주어야 오류 안나네요.
-
해결됨스프링 핵심 원리 - 기본편
래퍼 객체 Long 타입을 쓰는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. member 도메인을 만들 때 왜 기본형 long 이 아닌 Long 래퍼 객체 타입을 사용하는지 궁금합니다.감사합니다.
-
미해결
sprign webflux와 main 쓰레드 수
제가spring webflux를 공부하다가 궁금한게 있어서 이렇게 질문 남깁니다.webflux는 비동기 프로그래밍을 지원하기 때문에 적은 쓰레드 수로도 대량의 트래픽을 처리할 수 있다고 알고 있는데요. [실제로 사용자 요청을 받는 main 쓰레드는 한 개만 생성되는지 궁금합니다.]webflux는 블로그를 보다가 default값으로 core 당 한개의 쓰레드가 생성한다고 본거 같은데.. 이게 main 쓰레드는 한개 인데 sub 쓰레드(block 상태 풀린 쓰레드 요청 처리 용, event loop 처리 용 등)들이 core 갯수까지 추가적으로 생성된다는건지(main + sub == core수), 아니면 main 쓰레드가 실제로 코어 수만큼 생성이 된다는 의미인지 잘 모르겠네요..마지막으로, 후자가 맞다면 webflux는 소수의 main 쓰레드로 멀티 쓰레딩 지원과 비동기 프로그래밍을 지원한다고 보면되는걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 버전
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]start.spring.io에서 spring boot를 설치하고 h2 버전도 1.4.199로 설치하였습니다.그러나 아래의 사진과 같이 라이브러리 내에 h2:1.4.199가 아닌 h2:2.1.214가 설치되어 있습니다.이 부분 때문에 다음 강의에서 제대로 실행이 되지 않는 것 같습니다 .. (MEMBER 테이블 생성이 되지 않음)왜 이러는 걸까요 ..? 해결 방법도 알려주시면 감사하겠습니다 ㅜ ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MEMBER 테이블 생성이 안 됩니다.
안녕하세요. 강의를 듣고 강의자료까지 참고하며 코드를 작성하였습니다.그러나 실행창에 create와 drop이 뜨지도 않고 MEMBER 테이블 또한 생성되지 않습니다.관련 질의를 지금 6시간 넘게 다 찾아보며 (띄어쓰기, @Rollback(false) 추가 등) 해결 시도를 했지만 끝까지 되지 않아 질문 남깁니다 ..[yml 코드]감사합니다 ..