묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
ModelMapper에 대해 질문드립니다 !!
안녕하세요!엔티티 -> DTO, DTO -> 엔티티 변환 모두 STRICT 전략을 사용하는 modelMapper.map을 사용하고있습니다.DTO를 쓰는 이유 -> 엔티티가 바뀌어도, dto는 그대로이므로 api 스펙이 바뀌지않음.그런데 STRICT 전략을 쓰는 modelMapper를 사용하면,dto와 엔티티 필드이름이 정확하게 일치해야하므로엔티티가 바뀌면 dto 필드도 바뀌어야함. 이렇게 되면 엔티티 변경 시에 api 스펙이 바뀌지않는다는 장점이 없어지게됨이런 생각이 들었는데, 그럼 STRICT 전략은 지양해야하나요, 아님 다른 방법이 있는 것인가요?
-
해결됨실전! 스프링 데이터 JPA
이런 상황에선 어떻게 구현 하시는 지 궁금합니다.
안녕하세요. 좋은 강의 항상 감사합니다.JPA 와 디비를 배우면서 적용 하는 과정에서 궁금한게 생겼습니다. @Transactional public Post getPostDetail(Long postId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new CustomException(ErrorCode.POST_NOT_FOUND)); post.incrementViewCount(); // 조회수 증가 return post; }상세글 조회 시 조회수가 +1 되는 간단한 로직을 가정하겠습니다.트래픽이 크다고 가정 할 시 해당 로직 대로 하면 조회 시 마다 DB에 부하가 예상되서 질문 드립니다. 해당 로직대로 해도 DB에 크게 부하를 주지 않는 수준인가요?Redis를 써서 조회수 만 따로 캐시로 저장을 한다면 DB랑 데이터가 정합하지 않을 것으로 예상됩니다. 만약 조회수가 중요한 서비스라면 db 락을 이용하여 성능 저하를 감안 하고 하시는지..실무에선 어떻게 처리하시는 지 궁금합니다
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper가 자동으로 빈으로 등록되는 이유
[질문 내용]ItemMapper가 자동으로 빈으로 등록되는 이유가 뭔가요?
-
미해결스프링 프레임워크 입문자를 위한 따라하기
https://localhost:8080 접속 불가
접속하면 아래와 같이 브라우저와 콘솔에서 에러가 발생하고 접속이 되지 않습니다. 브라우저사이트에 보안 연결할 수 없음localhost에서 잘못된 응답을 전송했습니다.ERR_SSL_PROTOCOL_ERROR 콘솔11월 15, 2024 11:47:08 오전 org.apache.coyote.http11.Http11Processor service정보: HTTP 요청 헤더를 파싱하는 중 오류 발생 비고: HTTP 요청 파싱 오류들이 더 발생하는 경우 DEBUG 레벨 로그로 기록될 것입니다.java.lang.IllegalArgumentException: 메소드 이름에 유효하지 않은 문자가 발견되었습니다. HTTP 메소드 이름은 유효한 토큰이어야 합니다. at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:407) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:269) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:937) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.lang.Thread.run(Unknown Source)
-
미해결실전! 스프링 데이터 JPA
Controller에서 Repository 참조
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 잘 보고 있습니다.컨트롤러에서 Repository에 바로 의존성이 있는 방식으로 사용하는 예제를 알려주셨는데 간단한 예시를 들어주시느라 사용하신 패턴이신가요? 아니면 어차피 페이징 기능은 레포지토리 단의 간단한 메서드로 충분히 수행되므로 서비스 레이어를 통한 매핑이 불필요해서 그러신건가요??
-
미해결스프링 핵심 원리 - 기본편
만약 할인 정책 변경 시
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.7분쯤부터 말씀해주신 객체 지향 설계가 잘 돼있다라는 말이 만약 할인 정책이 정률로 바뀌는 경우 RateDiscountPolicy라는 구현체를 구현해서 OrderService에서 생성하기만 하면 다른 것들을 바꿀 필요가 없다는 말씀이신가요?? 제가 이해한게 맞는지 궁금해요
-
미해결스프링 시큐리티 OAuth2
인증 코드를 통해 발급 받은 토큰의 관리
안녕하세요 강사님 OAuth2 로그인을 구현하고 회원 탈퇴를 위해 구글과 카카오의 unlink API를 호출하려는데, 소셜 로그인 과정을 시큐리티가 자동으로 처리해주고 있어서 API 호출에 필요한 토큰이 관리되고 있지 않은 상황입니다. 이럴 때 어떤 방식으로 토큰을 받아야 하는지 궁금합니다.제가 생각해본 방법은 다음 두가지가 있습니다.첫 번째 방법 : 인증 코드를 직접 요청하고, 반환 받은 인증 코드로 토큰 또한 직접 요청두 번째 방법 : 설정해둔 리다이렉트 URI에 대한 처리를 직접 구현 후, 인증 코드를 받고, 해당 인증 코드로 토큰을 직접 요청혹시 이중에 맞는 방법이 있는지, 아니면 시큐리티의 자연스러운 흐름안에서 토큰을 받을 방법이 있을까요?보통 어떤식으로 토큰 값을 받는지 궁금합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestMapping을 class 레벨에 사용하는 경우
안녕하세요 @Component @RequestMapping public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } }@RequestMapping을 클래스 레벨에 사용하는 경우@Component + @RequestMapping 은 @Controller와 동일하게 동작하고, 해당 클래스를 컨트롤러로 등록한다고 하셨는데저렇게 해보니까 컨트롤러로 등록하지도 않고, 제대로 동작도 하지 않네요..@RequestMapping + @Component@Controller브레이크 포인트를 저기다 저기다 거는게 맞는지는 모르겠는데 handler랑 method 정보가 두 개가 다르게 나오네요 ㅜ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
레포지토리가 트랙잭션 동기화매니저에서 커넥션을 가져오는 부분에 대한 질문이 있습니다.
레포지토리의 update, find.. 등의 메서드를 실행할 때 getConnection 의 DataSourceUtils 메서드를 통해 커넥션을 가져오는데요. 여기서 트랜잭션 동기화 매니저에 커넥션이 있으면 해당 커넥션을 가져오는 설명을 잘 들었습니다.그런데 트랜잭션 매니저는 DataSourceTransactionManager 의 인스턴스고 DataSourceUtils 는 static util 클래스인데 이 사이에 트랙잭션 동기화 매니저가 어느 위치에 있는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
메시지국제화 챕터 질문
package hello.config; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.FixedLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; @Configuration public class LocalConfig implements WebMvcConfigurer { @Bean public LocaleResolver localeResolver() { return new SessionLocaleResolver(); } @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setDefaultEncoding("UTF-8"); messageSource.setBasenames("messages", "error"); return messageSource; } @Override public void addInterceptors(InterceptorRegistry registry) { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("locale"); registry.addInterceptor(localeChangeInterceptor); } }따로 LocalConfig 클래스를 구현했고<a href="?locale=ko">한국어</a> | <a href="?locale=en">English</a><br/>각 폼마다 한국어랑 영어를 선택할수 있게했는데 언어가 변경이안됩니다.messages 프로퍼티스도 다 적용했고 form에서 타임리프로 적용도했습니다. 크롬설정으로 언어 우선순위를 바뀌면 바뀌는데 . 이방식으로는 변하지않아서요
-
미해결[인프런 X VMware Tanzu] Spring Boot 밋업 with Josh Long
한국어 더빙이 안되는것 같네요~
한국어 더빙이 안되는것 같은데요~ 다른 언어는 다 되는데 한국어를 선택하면 영어로 나오네요~
-
미해결스프링 핵심 원리 - 고급편
proxyFactory cglib 자동적용 관련 질문
@Bean public Advisor logTraceAdvisor(LogTrace logTrace) { LogTraceAdvice logTraceAdvice = new LogTraceAdvice(logTrace); DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut(), logTraceAdvice); return advisor; } @Bean public Pointcut pointcut() { NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut(); pointcut.setMappedNames("request*", "order*", "save*"); return pointcut; } @Bean public OrderControllerV2 orderControllerV2(LogTrace logTrace) { OrderControllerV2 target = new OrderControllerV2(orderServiceV2(logTrace)); ProxyFactory proxyFactory = new ProxyFactory(target); // 이걸 넣었더니 되네요 proxyFactory.setProxyTargetClass(true); // proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderControllerV2) proxyFactory.getProxy(); } @Bean public OrderServiceV2 orderServiceV2(LogTrace logTrace) { OrderServiceV2 target = new OrderServiceV2(orderRepositoryV2(logTrace)); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderServiceV2) proxyFactory.getProxy(); } @Bean public OrderRepositoryV2 orderRepositoryV2(LogTrace logTrace) { OrderRepositoryV2 target = new OrderRepositoryV2(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderRepositoryV2) proxyFactory.getProxy(); }proxyFactory.setProxyTargetClass(true); 이 없더라도 자동으로 ProxyFactory가 인터페이스 기반이 아닐경우 cglib으로 프록시를 생성해야하는데 위의 주석사이의 코드가 없을 경우 다음과 같은 에러가 뜹니다.(jdk로 하려다가 실패하는 모양인데 이 말은 자동으로 cglib으로 proxyfactory가 돌리지 못했다... Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [hello.proxy.app.v2.OrderControllerV2]: Factory method 'orderControllerV2' threw exception; nested exception is java.lang.ClassCastException: class jdk.proxy2.$Proxy50 cannot be cast to class hello.proxy.app.v2.OrderControllerV2 (jdk.proxy2.$Proxy50 is in module jdk.proxy2 of loader 'app'; hello.proxy.app.v2.OrderControllerV2 is in unnamed module of loader 'app')강제로 setProxyTargetClass(true)로 하여금 설정해준다면 자동 설정기능을 사용하지 않은 것이라.. 왜 이런지 궁금하네요.제 코드가 실습 실제 코드와 약간 달라 실습 코드를 복사해서 쳐봐도 동일한 증상이 나타났어요.또한 setPorxyTargetClass를 지정해줘야 한다면 왜 컨트롤러에서만 해도 다 되는지도 의문입니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@WebMvcTest
@WebMvcTest(StudentResgisterController.class) class StudentResgisterControllerTest { private MockMvc mockMvc; @MockBean private StudentRepositoryImpl studentRepository; private Student testStudent; @BeforeEach void setUp() { mockMvc = MockMvcBuilders.standaloneSetup(new StudentResgisterController(studentRepository)).build(); testStudent = new Student( "student1", "student1password", "student1", "student1@gmail.com", 10, "student1comment"); } @Test void studentRegisterForm_ShouldReturnStudentRegisterView() throws Exception { mockMvc.perform(get("/student/register")) .andExpect(status().isOk()) .andExpect(view().name("studentRegister")) .andExpect(model().attributeExists("student")); } 이런식으로 테스트코드랑 관련된 학습은 따로 강의가없을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
입력바 경고메시지 ??? ??? 로 나오는 에러발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.utf-8 설정 다 했고 여러 시도를 해봤는데 안바뀝니다. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 핵심 원리 - 기본편
좋은 객체 지향 프로그래밍이란?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! 좋은 강의 감사드립니다 !공부를 하면 할 수록, 왜? 에대해 의문을 품게 되니 질문이 끝도 없는 것 같습니다 ㅠㅠㅋㅋㅋ하지만 알아가는 재미가 있네요 ! 왜?에 대한 질문을 해보면서, 면접 때 어떻게 간결하고 임팩트 있게 말할 수 있을까? 하며 고민을 해보게 됩니다. "좋은 객체 지향 프로그래밍이란?"이라는 주제가 흥미로웠습니다. 이걸 의식의 흐름대로 생각해보았을 때 아래와 같은 답을 내보았어요. 좋은 객체 지향 프로그래밍이란 우선 객체지향의 특징을 살릴 수 있어야 한다.추상화, 캡슐화, 상속, 다형성 이 네가지가 프로그램을 유연하고 변경이 용이하게 만든다. 변경이 용이하다는 것은, 레고 블럭을 조립하듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발하는 것을 말하는데이것은 다형성의 본질에 해당한다. 다형성의 본질은 역할과 구현으로 구분한다는 것이다.역할과 구현으로 구분을 하게 되면 실행 시점에 유연하게 변경할 수 있고, 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다. 이 장점을 극대화 할 수 있도록 도와주는 것이 스프링이다.스프링에서 제공해주는 IoC, DI 기술로 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 도와준다.스프링을 사용하지 않았을 때, OCP, DIP 원칙에 위배되었던 코드들을 해결할 수 있도록 도와준다. 결론: 객체지향의 특징을 살리고, 스프링을 사용해서 OCP, DIP 원칙도 지켜서 프로그램을 유연하고 변경이 용이하게 만드는 것이 좋은 객체지향 프로그래밍이라고 할 수 있다. 면접에서는 결론을 말하고 이전의 내용을 말하는 방식으로 설명한다면 충분한 답이 될지 궁금합니다. 혹은 "좋은 객체 지향 프로그래밍이란 무엇인가요?"에 좋은 답변이 될 수 있는, 3문장으로 간결하게 말할 수 있는 문장이 있다면 조언 부탁드리겠습니다 !
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문의 질 문의
전에 질문 드린바와 같이(아래 링크 참조)https://www.inflearn.com/community/questions/1427027?focusComment=380094private Date deliveryPlanDate; @Column(name = "delivery_plan_date") private Date planDate;개발하는데 있어서 이런거에 너무 집착하는게 아닐까 걱정됩니다.제가 경력이 4년(php만 사용)이어도 자바 백엔드 개발자로 농담삼아서 신분세탁하러 이직한다고 퇴사하고 자바, 스프링 공부 한답시고 직접 개발하면서 부족한 부분이 무엇인지 파악하고 복습하는 식으로 하는데, 저런 네이밍 규칙때문에 너무 발목을 잡고 있는거 같아 자괴감이 듭니다. 너무 쓸데 없는거에 집착하는건지 현실적으로 피드백 주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
db컬럼 명과 class 멤버 명 통일성
class Delivery { private Date deliveryPlanDate; @Column(name = "delivery_plan_date") private Date planDate; } 이럴땐 둘 중 어떤게 더 효율적인가요:?
-
미해결스프링 핵심 원리 - 기본편
스프링 기술을 만든 이유와 핵심 컨셉
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 !스프링이란? 챕터를 공부하고 있습니다 !이 강의를 듣고 스프링이 무엇인지이 기술을 왜 만들었는지이 기술의 핵심 컨셉이 무엇인지 이 3가지에 대한 답을 정의하고 싶었는데, 제가 잘 이해한것인지 확인하고 싶어서 글을 남깁니다 ! 스프링이란?객체지향 언어가 가진 강력한 특징을 살려내는 프레임워크다. 이 기술을 왜 만들었는지.좋은 객체지향 애플리케이션을 개발할 수 있게 도와주기 위해서. 이 기술의 핵심 컨셉이 무엇인지이 부분에 대한 해답을 얻지 못해서 검색을 통해 찾아보았는데, DI(DependencyInjection)과 AOP라고 합니다.의존성 주입: 객체 간의 관계를 외부에서 주입하여, 코드 간 결합을 줄이는 방식으로, 이로 인해 테스트가 용이해지고 유지보수가 쉬워집니다.AOP: 공통적인 기능(예: 로깅, 보안)을 특정 코드에서 분리하여, 여러 클래스에서 사용 가능한 방식으로 적용할 수 있습니다. 제가 이해한 게 맞는지 궁금합니다.부족한 답변이었다면, 추가적인 조언 부탁드리겠습니다 !
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
로그인 후 리다이렉트
인증제공자 2에서 커스텀한 필터 적용하고 마지막으로 서버 가동후에 테스트 하는데 해당 화면이 뜹니다.주소창에 localhost:8080 입력후 접근하면 제대로 뜨는 것을 보면 리다이렉트 문제라고 생각되는데쿼리스트링으로 인증 후에 다시 루트로 리다이렉트를 어떻게 해야 하나요?다 옮겨 적은 거 같은데 혹시 제가 놓친 설명이나 코드가 있다면 죄송합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
제가 제대로 이해한 건지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Import(JpaConfig.class) @SpringBootApplication(scanBasePackages = "hello.itemservice.web") public class ItemServiceApplication { }스캔 대상을 web 디렉터리로 한정했기 때문에 @Slf4j @Repository @Transactional public class JpaItemRepository implements ItemRepository { private final EntityManager em; public JpaItemRepository(EntityManager em) { this.em = em; } . . }여기에 @Repository가 있다고 하더라도 자동으로 스캔되지 않고, 그래서 생성자에 em이 @Autowired로 주입되는 게 아니라 @Configuration public class JpaConfig { private final EntityManager em; public JpaConfig(EntityManager em) { this.em = em; } @Bean public ItemService itemService() { return new ItemServiceV1(itemRepository()); } @Bean public ItemRepository itemRepository() { return new JpaItemRepository(em); } }JpaConfig의 생성자에서 em을 @Autowired를 통해 자동으로 주입받은 다음, 그 em을 JpaItemRepository에 수동으로 주입했다 이렇게 이해하면 될까요?