묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔 관련 질문
@Component 를 붙인 것들은 모두 @ComponentScan의 자동 빈 등록의 대상이 됩니다. 그런데 basePackageClasses 의 범위가 있다면 해당 패키지 내부에서만 빈 등록 대상을 찾게됩니다. 1. @SpringBootApplication 에는 이미 @ComponentScan이 있습니다. 해당 부트의 basePackageClass 를 변경하지 않는 한 임의의 Configration 내부에 Bin 을 쓰든 Component 안에 Bin을 주입하든 사실상 이미 부트가 모든 Component 를 관리하고 있어서 위 시점에서는 수동 주입한다는 개념이 없는것이 맞는건가요. 2. 위 질문과 비슷한 질문인데요.. 제가 임의의 스프링부트에 Aconfig 와 Bconfig 를 만들었다고합시다. 그리고 동일하게 컴포넌트 스캔을 이용하여 각각 다른 패키지를 basePackageClass 를 지정했다고 한다면 이게 어떤 의미가 있는걸까요? @SpringBootApplication 에는 디펄트로 하위 모든 컴포넌트를 찾아서 자동등록을 하는데..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Mockito 를 사용하여 테스트할 때, 테스트 요구사항의 반영 질문
이번 강의의 1분 30초 쯤, 현재 작성하는 테스트 방법이 그다지 좋은 방법은 아니다라는 말을 들었습니다. 그래서 좋은 테스트 방법은 무엇인지 찾아보게 되었고 돌아돌아 Mockito 같은 테스트 프레임워크를 알게되었습니다. 좋은건 일단 맛은 봐야하는 성격이라, 강의를 듣다말고 Mockito 를 사용하여 단위 테스트 하는 방법 알아보는 길로 한참 새버렸습니다 ㅎㅎㅎ Mockito 를 사용해서 OrderService 의 주문 성공에 대한 테스트 코드를 작성해보았습니다. 근데 영한 선생님이 강의에서 작성할 때의 assertEquals 이나 그런 요구사항들에 대해선 테스트를 못해서 제가 테스트 코드 작성을 잘못한건가 하는 생각이 들었습니다. 코드는 다음과 같이 간단하게 작성했습니다. @ExtendWith(MockitoExtension.class) class OrderServiceTest { @Mock MemberRepository memberRepository; @Mock ItemRepository itemRepository; @Mock OrderRepository orderRepository; @InjectMocks OrderService orderService; @Test @DisplayName("주문 성공") void order() { Member member = new Member( 1L, "irostub", new Address("seoul", "street", "10000"), new ArrayList<>()); Item item = new Book( 1L, "itemName", 15000, 2021, new ArrayList<>(), "5pg", "isbn5100"); //given given(memberRepository.findOne(anyLong())) .willReturn(member); given(itemRepository.findOne(anyLong())) .willReturn(item); //when orderService.order(1L, 1L, 100); //then ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class); then(orderRepository).should(times(1)).save(captor.capture()); } } 코드는 위와 같습니다. 뭔가 많이 허전합니다. 강의에서 처럼 assertEqual()에 인자로 넣을 객체를 받아올 방법이 없어서 , orderRepository.save(...) 는 void를 반환하고 orderService.order(...) 은 Long 을 반환하지만 영속성 컨텍스트도 없으므로 null 을 반환합니다. 그래서 결국 테스트 한 것이라곤, Mock 을 통해 적당한 맴버, 상품을 정해놓고 orderService.order(...) 메서드를 실행중에 orderRepository.save(...) 을 잘 호출했는가? 뿐입니다. 이렇게 하는게 맞는걸까요..? (테스트에 대한 강의가 아님에도 이런 질문을 하는게 죄송스러울 따름입니다..ㅠㅠ 근데 어디다 물어볼 곳도 없어서 심란한 마음에 글을 씁니다)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
REST API 방식으로 이미지를 보여주는 방법
저장을 하는것은 구현을 하였는데, 사용자가 상품 이미지를 보고싶어 하면, 프론트엔드에서 먼저 서버에, 원하는 상품의 id 값으로 요청을 하면, 서버는 그 상품이 서버에 저장된 이름을 반환해주고, 프론트엔드에서 그 이미지를 가지고, 서버에 저장되어 있는 이미지를 보여주는 방식을 사용하면 될까요..?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello-mvc?name 값으로 hello null 만 나옵니다.
required request parameter 'name' for method parameter type string is not present 라는 오류가 떠서 구글링 해본 결과 required = false 를 넣어주면 된다고 하여 value = "name", required = false 이렇게 수정해주었는데 쿼리값을 넣었을때 null 로 나옵니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ControllerAdvice 사용 시 메시지와, 국제화 사용 방법
@ControllerAdivce를 사용할 때, 사용자 정의 에러를 ENUM으로 만들고, message라는 값을 가지게 했습니다. @ControllerAdivce가 붙은 컨트롤러에서는 MessageSource를 Autowired 하였고, 각각의 @exceptionHandler가 붙은 메소드에 대해, Locale을 매개변수로 받아왔습니다. 그리고 오류가 발생하였을 때 Enum의 message 값에 해당하는 메시지 소스를 읽어와서, locale을 넣어 국제화를 시켜보았는데요. @ControllerAdivce 에서 MessageSource를 Autowired 하고, Locale을 마음대로 가져와서 사용해도 문제가 없나요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔관련 질문드립니다 ㅎㅎ
안녕하세요~~ 강의 잘 보고있습니다. 최고의 강사!! 궁금증이 생겨서 질문 드립니다 ㅎㅎ @SpringBootApplication이 붙은 CoreApplication을 통해 동작하면 ComponentScan을 하는데 AppConfig와 AutoAppConfig의 @Configuration이 붙어있잖아요,, @Configuration을 따라 들어가니까 @Component가 있어서 아 그럼 얘도 컴포넌트 스캔 대상이구나 라고 생각했어요. 그래서 여기서 더 나아가서 생각해보니까 복잡해졌는데요,,, AppConfig와 AutoAppConfig 둘 중 컨테이너에 등록하는 순서가 있나요??? 왜이런 질문이 나왔냐면,,, 강의내용 코딩따라했을 때 코드 기준으로 AppConfig는 excludeFilters가 없고 AutoAppConfig에는 excludeFilters로 @Configuration 애노테이션 등록된것을 제외하였는데 먼저 등록하는 순서라는게 존재한다면 순서에 따라 먼가 다를것 같습니다... AppConfig먼저 1. AppConfig의 빈등록절차 진행 2. AutoAppConfig의 빈등록절차를 진행하려고 보니까 @Configuration이 붙은애들을 제외 시켰네? 이미 @Configuration이 붙은 AppConfig빈등록 다 해놨는데 어쩌지 가 될 것 같아서요,,,, AutoAppConfig먼저 1. AutoAppConfig의 exclude로 Configuration했으니 "@Configuration붙은애들 진행시키지마" 가 되겠고 2. 컴포넌트 스캔으로 @Component붙은것들(@Repository, @Controller, @Component 등) 빈등록진행, AutoAppConfig에 @Bean이 붙은 애들 빈등록 3. AppConfig 빈등록 제외 이렇게되면 깔끔하게 너 하지마 이것만 한다 라는 먼가 질서가 생기는데 제가 너무 깊이 생각했나 싶어요,, 죄송합니다 헷갈림으로 인해 헷갈리고 헷갈려서 헷갈려요,,,
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
선생님! 질문이 있습니다.
안녕하세요! 현재 컴공 2학년을 마치고 군대를 다녀온 학부생입니다. 질문 남기기 전에 먼저 좋은 강의 남겨주셔서 감사합니다^^ 패x트캠퍼스 강의도 들어보고 여러가지 글도 읽었는데도 스프링 개념에 대해 잘 몰랐는데 강의를 신청하고 들어보니 너무 쉽게 순차적으로 잘 설명해주셔서 어느정도 감이 잡히고 흥미가 생겼습니다. 제가 질문드릴 것은 다음과 같습니다. 로드맵을 따라서 수강을 하고 있는데, mvc2편까지 듣고는 제 개인 프로젝트를 할 수 있는 수준이 될까요? 물론 강의를 다 듣고 복습을 한다는 가정하에서요.. 지금 상태는 강의듣고 복습하고 있는데, 이론적인 부분은 어느정도 이해가 되는데 실무에서는 어떤식으로 사용하고, 실제 프로젝트를 할 때에는 어떤 상황에서 어떤 걸 써야할지는 아직 감이 잘 안 잡힙니다! 혹시 강의를 듣고 추후에는 어떤 식으로 공부해야지 프로젝트도 잘 할 수 있고, 더 바람직한 방법일까요? 물론 공부에 방법은 없다고 다들 그러시지만, 프론트엔드만 공부했던 저로서 어떻게 해야할지 방법이 안 잡힙니다.
-
미해결스프링 핵심 원리 - 기본편
리텐션, requiredArgsConstructor 질문 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 강사님~! 롬복 어노테이션인 requiredArgsConstructor 가 있으면 컴파일 시점에서 생성자를 자동 생성해 주잖아요. 근데 해당 어노테이션 선언을 들어가 보면 Retention policy가 Source 로 돼 있어요. 제 생각으론 Compile 로 돼 있어야 컴파일 시점에 해당 어노테이션이 메모리에 남아있어 해당 어노테이션을 보고 생성자를 생성할 것 같은데 말이죠. requiredArgsConstructor 의 Retention policy가 Source 로 돼 있어도 컴파일 시점에 생성자를 생성할 수 있나요? 감사합니다 ^0^
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
REST API 방식에서 국제화 처리
안녕하세요 선생님 항상 강의 잘 보고 있습니다.! 타임리프에서의 국제화 적용은 잘 이해했습니다. 저는 현재 친구들과, 간단한 프로젝트를 진행중인데, 그 프로젝트는 백엔드와 프론트엔드를 나누어서 REST API 방식으로 데이터를 주고받습니다. 공부 목적으로 진행하는 프로젝트라, 국제화 기능을 넣어보려고 하는데 REST API 방식에서는 국제화를 어떻게 적용시켜야 하는지에 대해서는 언급이 없으셔서 혼자 코드를 작성해 보았습니다. 혹시 부족한 부분이 있거나, 잘못된 부분이 있으면 지적해주시면 감사하겠습니다. @Controller@Slf4j@RequiredArgsConstructorpublic class MessageController { private final MessageSource messageSource; @GetMapping("/message") public ResponseEntity<?> message(Locale locale){ String result = messageSource.getMessage("hello",null, checkLocale(locale)); log.info("message = {}" ,result); return new ResponseEntity<>(result, HttpStatus.OK); } private Locale checkLocale(Locale locale){ Locale result = switch (locale.getLanguage()){ case "en" -> Locale.ENGLISH; case "ko" -> Locale.KOREA; default -> Locale.ENGLISH; }; return result; }}
-
미해결스프링 핵심 원리 - 기본편
AppConfig만 사용해도 DI 잘 됐던 거 같은데
AppConfig만 사용해도 DI는 잘 됐던 거 같은데, MemberApp(스프링 컨테이너)까지 만들어서 사용하는 이유는 'DI 외에 다른 스프링 기능을 활용하기 위해서'가 맞는 거죠?
-
미해결스프링 핵심 원리 - 기본편
스프링 빈의 라이프사이클 내에서
안녕하세요, 다른 분들의 질문을 참고해봐도 혼자서 이해하는게 너무 버거워서 질문을 남깁니다. 여기저기 출력문을 찍어보니 ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); 에서 "스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백" 까지 한번에 된다는 사실을 알았습니다. public class BeanLifeCycleTest { @Test public void lifeCycleTest() { System.out.println("rmfjadjswptodtjdeh;a??1"); ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); System.out.println("rmfjadjswptodtjdeh;a??2"); NetworkClient client = ac.getBean(NetworkClient.class); ac.close(); } @Configuration static class LifeCycleConfig { @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); //networkClient.setUrl("http://hello-spring.dev"); System.out.println("stestesatestasetasetaset"); return networkClient; } } } 1. setUrl은 생성자 주입처럼 동시에 의존관계가 주입되는게 맞을까요?? 2. 여기서 setUrl은 다른 분들의 질문을 보니 값 주입이라고 하던데 의존관계 주입이나 값 주입이나 비슷하다고 이해하고 넘어가면 될까요?? 3. afterPropertiesSet() 은 따로 호출을 하지 않았는데, 어떻게 호출을 하는건가요?? 4. 초기화 콜백은 '무조건' 호출이 되는 걸까요? 실제로 setUrl을 주석 처리해도 콜백함수가 호출이 됩니다. 질문이 조금 많지만 답변 부탁드립니다 ㅠㅠ 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
파라미터 질문
@Configurationstatic class SameBeanConfig { @Bean public MemberRepository memberRepository1() { return new MemoryMemberRepository("10"); } @Bean public MemberRepository memberRepository2() { return new MemoryMemberRepository("1000"); }} 2분59초 경에 MemoryMemberRepository("10") 이렇게 파라미터 값을 넘겨줄 수 있다고 하셨는데 MemoryMemberRepository 클래스에는 파라미터 1개를 받는 생성자가 없는데 어떻게 쓸 수 있는건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
다운캐스팅에 대해서 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]무지한 질문을 드려서 정말 죄송합니다. 다운캐스팅 하실때에 원래 업캐스팅을 진행하고 다운캐스팅이 가능한것으로 알고있는데 구글링을 해봐도 RequestServlet -> HttpServletRequest로 다운캐스팅 가능한 이유를 모르겠습니다.. 답변 해주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
카테고리 다대다 매핑 => 다대일, 일대다로 매핑
@ManyToMany를 다대일 일대다 관계로 바꿔보았는데 이렇게 바꾸는 게 맞을까요?? <CategoryItem.java> package jpabook.jpashop.domain;import jpabook.jpashop.domain.item.Item;import lombok.Getter;import lombok.Setter;import javax.persistence.*;@Entity@Getter @Setterpublic class CategoryItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_item_id") private Long id; @ManyToOne @JoinColumn(name = "category_id") private Category category; @ManyToOne @JoinColumn(name = "item_id") private Item item;} <Category.java> package jpabook.jpashop.domain;import jpabook.jpashop.domain.item.Item;import lombok.Getter;import lombok.Setter;import javax.persistence.*;import java.util.ArrayList;import java.util.List;import static javax.persistence.FetchType.*;@Entity@Getter @Setterpublic class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Long id; private String name; @ManyToOne(fetch = LAZY) @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>();} <Item.java> package jpabook.jpashop.domain.item;import jpabook.jpashop.domain.Category;import jpabook.jpashop.domain.CategoryItem;import lombok.Getter;import lombok.Setter;import javax.persistence.*;import java.util.ArrayList;import java.util.List;@Entity@Getter @Setter@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name = "DTYPE")public abstract class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "item_id") private Long id; private String name; private int price; // 가격 private int stockQuantity; // 재고수량 @OneToMany(mappedBy = "item") private List<CategoryItem> categoryItems = new ArrayList<>();}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
객체지향에 대해 궁금한 점
안녕하십니까 강사님 객체지향에 대해 궁금한 점이 생겨 질문드립니다. 17:05에서 order라는 메서드 안에 createOrderItem, createOrder 메서드들이 있습니다. 이 두 메서드는 OrderService 입장에서 OrderItem과 Order한테 "니네가 무슨 일은 하는지는 모르겠지만, 나는 이 두 개를 받아서 주문을 생성한다"라는 말이잖아요? OrderService가 하는 일은 OrderItem과 Order에서 받은 것들을 이용하여 주문 생성 OrderItem이 하는 일은 주문 상품 생성 Order가 하는 일은 주문 생성 그렇다면 이게 객체지향성을 나타내는 것일까요? 감사합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
assertThat 오류
이번 강의에서 회원 서비스 테스트 클래스에서 assertThat 오류가 발생합니다. 다른 클래스에서 assertThat를 이용할 때는 잘 사용이 되었지만 이번 클래스에서는 오류가 뜨네요 오류 내용 The method assertThat(String, T, Matcher<? super T>) in the type Assert is not applicable for the arguments (String) 임포트 내용 구글링을 해서 많은 방법을 써봤지만 해결이 되지 않았습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
addItemV1 메소드 파라미터 타입 질문 드립니다.
addItemV1 메서드에서 @RequestParam으로 요청 파라미터 변수를 받을 때 price는 int 타입이고, quantity는 Integer 타입으로 선언하신 이유가 무엇인지 궁금합니다. @PostMapping("/add")public String addItemV1(@RequestParam String itemName, @RequestParam int price, @RequestParam Integer quantity, Model model) { Item item = new Item(); item.setItemName(itemName); item.setPrice(price); item.setQuantity(quantity); itemRepository.save(item); model.addAttribute("item",item); return "basic/item";}
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSON 형식으로 파싱하는 이유?..
json도 문자라서 객체로 변환시켜주어야 된다고하셨는데 그이유가 궁금합니다.{"username":"jeong","age":"24"}
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
4분 20초에 동시성에 문제가 있을수 있다고 말씀해주셨는데요.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]4분 20초에 실무에서는 동시성을 고려해야 할수 있다고 말씀해주셨는데요. 저코드에서 동시성에 관련된 문제가 어떻게 발생이 되는지 알려주시면 감사하게습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member_Id, item_id,order_id 가 공유되는거 같은데 따로 할려면 어떻게 해야하나요?
4:33에 order 하나 만들었는데 #3이 되어있어서 확인해보니까 멤버 하나 만들면member_id=1 아이템 하나 만들면 item_id=2 주문 하나 만들면 order_id=3 이런식으로 id가 공유되는거 같은데 @GeneratedValue 때문인가요? 각각 따로 id를 만들어줄려면 어떻게 해야하나요?