묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA 개발 관련 질문입니다
19:00 시간에 보고 궁금한게 있습니다. JPA 실행해서 나온 sql 스크립트를 보고 수정할 부분이 있으면 수정해서 ddl 을 직접 작성하신다고 하셨는데, 수정된 ddl 에 맞게 JPA 에서도 코드를 수정해야하는걸까요?아래 방식으로 개발이 진행되는 것이 맞는지 궁금하네요 JPA 코드작성 -> DDL 스크립트 확인 및 수정 -> DDL 직접 작성하여 DB에 반영 -> 수정된 ddl에 맞게 다시 JPA 코드 수정 -> 애플리케이션 실행 (뭔가 질문이 이상한 것 같기도한데; 이해가 어려운 부분은 편하게 말씀 부탁드립니다)
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional(readOnly=true) 설정에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요, 최근 부하테스트를 진행하며 성능개선을 해보려하고 있습니다. 그 중 단순 DB 조회 API에 대해 테스트를 진행하고 있는데, 스레드 덤프를 확인한 결과 SessionImpl.doFlush()가 호출되는 것을 보고 트랜잭션이 끝나는 시점에 자동으로 flush가 호출되는 것을 발견했고, 때문에 readOnly 설정이란 것을 찾아서 설정하고 다시 테스트를 진행했습니다. 반복해서 테스트를 진행해 봤는데, readOnly를 설정하지 않았을때가 TPS가 높게 측정이 됩니다. 왜 그런지 알 수 있을까요.. 그림은 순서대로 readOnly를 설정하지 않았을 때와 설정했을 때 입니다. 테스트 대상 API의 코드는 아래 링크의 getMovieList() 입니다. https://github.com/hapHollys/booook/blob/main/src/main/kotlin/com/haphollys/booook/presentation/controller/MovieController.kt
-
미해결스프링 핵심 원리 - 기본편
필드 주입의 문제점에 대해 궁금한게있습니다.
20:20 정도부터 나오는 필드주입에서 궁금한점이 있습니다. 김영한님 말씀중에선 강의예제중, @Autowired private MemberRepository memberRepository;@Autowired private DiscountPolicy discountPolicy; 위처럼 필드주입을 하게되면 memberRepository 나discountPolicy 의 값을 변경할수없고 테스트코드에서 순수한 자바로 테스트할수있는 방법이 없다고 하셨습니다. 그런데 제 생각으로는 그렇게 생각하면 기본방법인 생성자 주입도 결국 생성되고나면 변경할수없고 순수한 자바로 테스트할수있는 방법이 없는것 같다고 생각이 되었습니다. 왜냐면 둘다 현재 수동설정이 아닌 어노테이션을 통한 자동설정으로 이루어지고있으므로 무얼 넣어줄지는 해당 구현체의 어노테이션을 추가,삭제해주지않는이상 바꿀수 없다고 생각했기 때문입니다. 이부분에대해서 설명주시면 감사하겠습니다!
-
해결됨스프링 핵심 원리 - 고급편
스레드 로컬과 request 스코프
이번 강의도 잘 듣고 있습니다! 스레드 로컬 사용한 것과 Configuration에서 ThreadLocalLogTrace 을 request 스코프로 설정한 방법 모두 스레드 동시성 문제 해결한다는 점에서 같은 효과일 것 같은데 두 방식을 비교했을때 스레드 로컬의 장점이 무엇인지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
싱글톤컨테이너의 싱글톤 방식에 대해 질문있습니다!
싱글톤 컨테이너의 방식에 궁금한점이 있어 질문드립니다 스프링 컨테이너를 통해 수많은 회원들의 요청이 들어와도 같은 빈객체를 주게된다고 들었습니다. 그렇다면 똑같은 객체를 사용하게되면 모든 회원들이 처음 등록된 빈의 같은 회원정보를 사용하게되어 내 회원정보가 이상하다거나 계산내역이 기존사람의것이 되는등등 문제가 발생되는것이 아닌가요?
-
미해결스프링 핵심 원리 - 기본편
@RequiredArgsConstructor , @Primary 질문있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님 항상 좋은강의 감사합니다 다름이아니라 질문이있는데 @Component를 FixDisCountPolicy와 RateDisCountPolicy 둘다 주어졌을때 오류가 발생하는데 이때 OrderServiceImpl에는 @RequiredArgsConstructor를 붙이고 DiscountPolicy중 우선순위를 가질것에 @Primary를 붙이는 즉@RequiredArgsConstructor,@Primary 두가지만 사용하면 코드의 수정없이 가장 효율적이라고 생각되는데 제 생각이 맞는지 궁금합니다
-
미해결[NarP Series] MVC 프레임워크는 내 손에 [나프2탄]
파일 이름 인코딩 관련해서 질문 드립니다.
MemberFrontController 에서 맨 처음 request.setCharacterEncoding("UTF-8"); 이렇게 넘어오는 데이터를 utf-8로 인코딩 해주는 거는 POJO에서 하는 filename = URLEncoder.encode(filename, "UTF-8"); 이거 랑 별개인 건가요? 궁금해서 질문 드립니다.
-
미해결실전! 스프링 데이터 JPA
jpa 여러개 repository findById
안녕하세요... 토이프로젝트를 하다가 궁금한것이 있어서 문의드립니다... 제가 원하는건 결론적으로 이렇습니다. if(){ Test1Repository.findById(Long Id); }else if(){ Test2Repository.findById(Long Id); } else { Test3Repository.findById(Long Id); } 이런식으로 계속 분기처리하기보단 레포지토리를 하나의 값으로 findById를 할수 있는지가 궁금합니다..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
객체 vs map
안녕하세요 항상 좋은 강의 감사합니다. 결국에는 ItemSaveForm가 ItemUpdateForm 을 분리하라는 것을 잘 이해했습니다. 그런데 궁금한 점이 있습니다. 실무에서는 이런 객체들(dto)을 사용하지 않고 map하나로 사용하는 경우가 있습니다. 이런 경우에는 @Validated 를 어떻게 적용할 수 있나요? 추가질문) 객체 vs map에서는 결국 객체가 맞을까요? 그럼 그 이유는요? 객체 vs map 에 대한 글을 예전부터 궁금해서 많이 찾아봤었습니다. map은 작업, 유지보수적인 면에서 상대적으로 많이 수월한 장점이 있다고 느꼈고(현직에서 senior 분들과 그렇게 작업하고 있습니다.( @RequestBody Map<String, Object> params, ...) 로 모든 것을 컨트롤러에서 받습니다. 그렇다면 왜 객체를 써야하며 장단점, map은 왜 지양해야 하는지 궁금합니다. 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
URI 구조 질문
안녕하세요 영한님 야생형코스를 듣고 토이프로젝트를 하던 도중 URI를 어떤 식으로 정해야 할지 감이 안잡혀서 활용1편에 있는 컨트롤러들의 URI를 참고하는 도중 궁금한점이 생겨서 여쭈어보게 되었습니다. MemberController와 ItemController의 등록과 관련된 URI에서는 /members/new , /items/new와 같이 복수단어를 사용하였지만 OrderController에서는 /order와 같이 URI가 단수로 되어있었습니다. HTTP 강의 중 비슷한 내용이 있던게 기억나서 찾아보았더니 HTTP 메서드 부분에서는 "계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장(member -> members)" 이라고 설명해 주셨지만 혹시나 order의 경우 다른 뜻이 있으셔서 URI를 단수로 작성한건지 궁금해서 여쭈어 보게 되었습니다!
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔 관련 질문
@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 외에 다른 스프링 기능을 활용하기 위해서'가 맞는 거죠?