묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨예제로 배우는 스프링 입문 (개정판)
2022.01.07 의존성 주입 관련 제보
2022.01.07 기점 수업을 수강 중 강의에서 사용하시는 소스와 현재 소스 차이가 있어 안내드립니다. 기존에 PetRepository가 존재했지만, 01/05 기점으로 PetRepository가 제거된 상태입니다. 당황하지 마시고, 새로 샘플Repository 생성해서 주입하는걸 테스트 진행하면 될 것 같습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
이러한 경우가 쓰레드 풀 대기에 해당한다고 할 수 있을까요?
안녕하세요 좋은 강의 감사드립니다 쓰레드 풀을 설정하고 일정 스레드 개수 이상의 요청이 들어오는 경우 거절하거나 대기할 수 있다... 라고 말씀하셨는데 항상 수강신청할때마다 조마조마하게 바라보던 창이 있었는데 아래 그림의 창이였습니다 혹시 이런 창 또한 스레드 풀에서 스레드 제한을 통해, 대기를 거는 예시에 해당한다고 볼 수 있을까요? 물론 학교 홈페이지 코드를 뜯어보지는 못해서 질문이 추상적일 수 있겠지만 말씀하신 쓰레드 풀의 제한을 통해 저런 기능이 구현이 가능한지 호기심에 여쭤보고자 합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
itemValidator.supports(item) 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 선생님!강의 5:20~ 27쯤에 나오는 내용입니다! if(itemValidator.supports(item)) 형태로 supports 로 한번 타입 검증을 하고 코드 진행 하고 싶은데, 선생님 영상에는 오류가 없는데, 저는 타입 미스매치가 나와서요.. <질문> item 위치에 Class<?> 타입이 필요하다는데, (item)이 아닌 다른 값을 넣어줘야하는건가요? 참고로 ItemValidator 쪽의 supports 쪽에는 영상과 동일하게 public boolean supports(Class<?> clazz) { return Item.class.isAssignableFrom(clazz); } 로 오버라이딩했습니다! 시간되실 때 천천히 답변 부탁드리겠습니다 감사합니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Lombok @Data 사용 관련
Lombok @Data 어노테이션은 예측하지 못하게 동작할 수 있기 때문에 핵심 도메인 모델에서 사용하기 위험하다고 하셨지만 단순하게 data 왔다갔다할 때 사용하는 DTO일 경우에는 확인해보고 사용해도 괜찮다고 수업 시간에 언급하셨잖아요. 그래서 되도록이면 @Data 어노테이션 사용은 자제해야겠다고 생각했는데 수업 시간에 예제 코드 작성하실 때는 자주 사용하시더라고요. @Data 어노테이션을 사용해도 되는지 안 되는지 혼란스러운데 이 부분에 대해서 풀어서 설명해주실 수 있나요?
-
미해결스프링 핵심 원리 - 고급편
리턴 타입이 void 인 메서드를 테스트 하는 방법이 있나요?
안녕하세요 해당 강의 마지막 부분에서 테스트 코드를 작성하신 부분에서 궁금증이 생겼습니다. 강의에서는 콘솔에 출력하는 방식으로 대략적인 테스트를 진행하셨습니다. (이게 진짜 테스트가 아니라는 점도 이해했습니다) 제 스스로 검증 코드를 만들어 테스트해보고 싶어 시도했는데, trace.end() 나 trace.exception() 의 리턴 타입이 void 라 어떻게 assertThat() 의 인자로 넣어야 할지 모르겠더라구요,, 혹시 이렇게 리턴타입이 없는 메소드를 테스트할 수 있는 방법은 무엇이 있을까요? 좋은 강의 늘 감사합니다. :))
-
미해결스프링 핵심 원리 - 기본편
.class 가 정확히 뭔가요?
getBean 함수를 호출할때 name과 xxxService.class를 인자로 넘기는데 여기서 .class는 정확히 뭔지 알 수 있을까요? 객체 인스턴스인가요 아니면 클래스 타입인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HttpSession 과정을 문의드립니다.
안녕하세요! 항상 좋은 답글 달아주셔서 감사합니다! 이번 질문 글에서는 HttpSession의 동작 방식에 대해 어려운 부분이 있어 문의드리고 싶어 글을 적습니다. HttpSession session = request.getSession(); session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);log.info("RESPONSE COOKIE = {} ",response.getHeader("JSESSIONID") );log.info("RESPONSE COOKIE = {} ",response.getHeaders("JSESSIONID") );return "redirect:/"; 제가 궁금한 것은 위의 코드와 관련된 부분입니다. 위의 코드에서는 HttpServletRequest에서 session 값을 얻어서, 그곳에 loginMember를 저장하면서 Session과 Member를 Mapping 해주는 것으로 이해하고 있습니다. 그런데 특이한 점은 Response에 만들어진 Session이 쿠키 형태로 포함되지 않고 나간다는 점입니다. 위 코드를 실행하면 위의 콘솔창에서 볼 수 있듯이, Response에는 어떤 쿠키도 포함되어 나가지 않습니다. 개발자 도구에서도 POST /login에서는 Response에 JESSIONID가 쿠키로 포함되어 오지 않는 것으로 확인이 됩니다. 그렇지만 Redirect를 할 때는 JSSESIONID라는 쿠키가 포함되어 Request 되는 것을 볼 수 있습니다. 내용을 상세히 정리하면 위와 같습니다. 질문을 간단히 정리하면 다음과 같습니다. 1. Request를 통해 얻은 HttpSession은 response가 나갈 때, 쿠키로 클라이언트에 전달되나요? 2. Response로 전달된다면 제가 어떻게 그 부분을 확인할 수 있는지 알려주실 수 있으실까요? 3. Response로 전달되지 않는다면 어떤 형태로 클라이언트에 전달되는지 알려주실 수 있으실까요? 번외 질문 : session.setAttribute("loginMember", loginMember)를 하면 마치 ConcurrentHashMap처럼 저장되는 것으로 이해를 하고 있습니다. "loginMember"만을 저장해둔 ConcurrentHashMap에 session.getId를 key로 value는 loginMember가 저장된다고 이해하면 될까요? 항상 좋은 답변 주셔서 너무 감사합니다. 새해 복 많이 받으세요!
-
미해결실전! 스프링 데이터 JPA
Cannot cast java.lang.String to java.time.LocalDateTime
@CreatedBy나 @LastModifedBy 설정에서 문제가 생기는 것 같습니다. @Entity@Getter@NoArgsConstructor@ToString(of = {"id", "name", "price"})public class Item extends BaseEntity { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private String title; private String filePath; public Item(String name, int price) { this(name, price, null, null); } public Item(String name, int price, String title, String filePath) { this.name = name; this.price = price; this.title = title; this.filePath = filePath; }} @Profile("local")@Component@RequiredArgsConstructorpublic class InitItem { private final InitItemService initItemService; @PostConstruct public void init() { initItemService.init(); } @Component @RequiredArgsConstructor static class InitItemService { private final ItemRepository itemRepository; @Transactional public void init() { for (int i = 0; i < 10; i++) { itemRepository.save( new Item("cat's tower" + i, (i + 1) * 50, "Cat's Tower v." + i, "img/catTower" + i + ".jpg")); } } } @EntityListeners(AuditingEntityListener.class)@MappedSuperclass@Getter@ToString(of = {"createdDate", "lastModifiedDate"})public class BaseTimeEntity { @CreatedDate @Column(updatable = false) private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModifiedDate;} @EntityListeners(AuditingEntityListener.class)@MappedSuperclass@Getter@ToString(of = {"createdBy", "lastModifiedBy"}, callSuper = true)public class BaseEntity extends BaseTimeEntity { @CreatedBy @Column(updatable = false) private LocalDateTime createdBy; @LastModifiedBy private LocalDateTime lastModifiedBy;} @SpringBootApplication@EnableJpaAuditingpublic class ShoppingmallApplication { public static void main(String[] args) { SpringApplication.run(ShoppingmallApplication.class, args); } @Bean public AuditorAware<String> auditorAware() { return () -> Optional.of(UUID.randomUUID().toString()); }} public class Item extends BaseTimeEntity를 하면 즉 @CreatedDate, @LastModifiedDate까지는 잘 작동하는데 @Bean을 설정 후 public class Item extends BaseEntity로 바꾸면 Cannot cast java.lang.String to java.time.LocalDateTime 오류가 터져서 검색으로 조금 알아봤더니 , mysql사용시 liquibase-core v.3.10.3에서 발생하는 문제이고 v.4.3.1로 변경하면 된다는 글을 찾았는데 프로젝트 내에서 liquibase는 없고 또, 다른 글에서는 number타입을 String타입으로 형변환 할 때 나타나는 오류라고 하는데 허접한 시도들을 해보았으나, 결국 저 코드에서 어떻게 손대야 될 지 모르겠어서 질문올립니다 :[ 아래는 오류코드 입니다. ㅡㅡㅡㅡㅡㅡㅡ오류코드 시작ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-01-02 18:31:31.498 ERROR 6928 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initItem': Invocation of init method failed; nested exception is java.lang.ClassCastException: Cannot cast java.lang.String to java.time.LocalDateTime at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.2.jar:2.6.2] at com.example.shoppingmall.ShoppingmallApplication.main(ShoppingmallApplication.java:17) ~[classes/:na] Caused by: java.lang.ClassCastException: Cannot cast java.lang.String to java.time.LocalDateTime at java.base/java.lang.Class.cast(Class.java:3605) ~[na:na] at com.example.shoppingmall.entity.Item_Accessor_12rl31.setProperty(Unknown Source) ~[classes/:na] at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePropertyAccessor.java:104) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.mapping.model.SimplePersistentPropertyPathAccessor.setProperty(SimplePersistentPropertyPathAccessor.java:127) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.mapping.model.SimplePersistentPropertyPathAccessor.setProperty(SimplePersistentPropertyPathAccessor.java:171) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.lambda$setProperty$0(MappingAuditableBeanWrapperFactory.java:259) ~[spring-data-commons-2.6.0.jar:2.6.0] at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setProperty(MappingAuditableBeanWrapperFactory.java:259) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setCreatedBy(MappingAuditableBeanWrapperFactory.java:204) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.touchAuditor(AuditingHandlerSupport.java:169) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.lambda$touch$0(AuditingHandlerSupport.java:136) ~[spring-data-commons-2.6.0.jar:2.6.0] at java.base/java.util.Optional.map(Optional.java:265) ~[na:na] at org.springframework.data.auditing.AuditingHandlerSupport.touch(AuditingHandlerSupport.java:134) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.markCreated(AuditingHandlerSupport.java:114) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandler.markCreated(AuditingHandler.java:92) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.jpa.domain.support.AuditingEntityListener.touchForCreate(AuditingEntityListener.java:92) ~[spring-data-jpa-2.6.0.jar:2.6.0] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.hibernate.jpa.event.internal.ListenerCallback.performCallback(ListenerCallback.java:55) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.jpa.event.internal.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:97) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.jpa.event.internal.CallbackRegistryImpl.preCreate(CallbackRegistryImpl.java:57) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:760) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.14.jar:5.3.14] at com.sun.proxy.$Proxy121.persist(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:624) ~[spring-data-jpa-2.6.0.jar:2.6.0] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:638) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.14.jar:5.3.14] at com.sun.proxy.$Proxy124.save(Unknown Source) ~[na:na] at com.example.shoppingmall.controller.InitItem$InitItemService.init(InitItem.java:34) ~[classes/:na] at com.example.shoppingmall.controller.InitItem$InitItemService$$FastClassBySpringCGLIB$$681abf02.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.14.jar:5.3.14] at com.example.shoppingmall.controller.InitItem$InitItemService$$EnhancerBySpringCGLIB$$a2f07708.init(<generated>) ~[classes/:na] at com.example.shoppingmall.controller.InitItem.init(InitItem.java:22) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.14.jar:5.3.14] ... 18 common frames omitted Process finished with exit code 1 ㅡㅡㅡㅡㅡㅡㅡ오류코드 끝ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
부트스트랩 CSS 적용 안됨
안녕하세요 부트스트랩 css 적용이 계속 안되서 에러가 발생하는데 영상에서 하신 방법들(Resources 우클릭 - Reload from disk 등) 그대로 하더라도 적용이 안되네요!ㅠㅠ 미리 감사드립니다.
-
해결됨스프링 핵심 원리 - 기본편
생성자 주입에 관하여 질문드립니다!
좋은 강의 항상 감사드립니다! ^^다양한 의존관계 주입 방법 부분의 강의를 듣던 중 궁금한 점이 있어 질문 드립니다. OrderServiceImpl 객체를 생성하여 스프링 빈으로 등록하는 과정에서 궁금한 점이 있습니다. 우선 OrderServiceImpl을 스프링 빈으로 등록하기 전 OrderServiceImpl 객체를 생성하기 위해 아래와 같이 생성자를 호출하게 되고 -> new OrderServiceImpl(memberRepository, discountPolicy); 이 과정에서 생성자의 파라미터로 들어온 객체의 스프링 빈을 찾아와 OrderServiceImpl을 생성한다고 하셨습니다. 강의의 12:40 부분에서 memberRepository와 discountPolicy가 생성이 되어 있지 않다면 스프링이 생성을 한 후 가져온다고 하셨습니다. 저는 위 말씀을 생성자 주입 시 생성자의 파라미터로 들어온 객체가 스프링 빈으로 등록되어 있지 않다면 스프링이 그 객체도 자동으로 스프링 빈으로 등록한다고 이해를 하였습니다. 따라서 new OrderServiceImpl(memberRepository, discountPolicy); 코드 실행 시 만약 memberRepository와 discountPolicy가 스프링 빈으로 등록되어 있지 않아도 1. 먼저 스프링이 memberRepository와 discountPolicy를 스프링 빈으로 등록한 후2. OrderServiceImpl의 스프링 빈 등록과 의존 관계 주입이 동시에 일어난다고 이해하였습니다. 하지만 생성자 주입 사용 시 생성자의 파라미터로 들어오는 객체가 스프링 빈으로 등록되어 있지 않을 경우 NoSuchBeanDefinitionException 예외와 UnsatisfiedDependencyException 예외가 발생하였고, 제가 이해한 부분이 틀린 건지 헷갈려서 질문을 남기게 되었습니다. Q1. 12:40 부분에서 하신 말씀에서 memberRepository와 discountPolicy가 생성이 되어 있지 않다는 뜻이 '스프링 빈으로 등록되어 있지 않다'는 뜻이 아닌 건가요? Q2. memberRepository와 discountPolicy가 생성이 되어 있지 않아 스프링이 생성을 한 후 가져온다는 뜻이 '생성자의 파라미터로 들어온 객체를 스프링 빈으로 생성하여 가져온다'는 뜻이 아닌 건가요?
-
미해결스프링 핵심 원리 - 고급편
this 질문드립니다.
안녕하세요. 강의를 듣다가 궁금증이 생겨 질문드립니다. 이전 강의에서 프록시가 생성되는 과정을 보면 1. @Aspect 애노테이션을 클래스에 선언하고 클래스 안에 @Around로 포인트컷 표현식을 정의하고, @Around가 붙은 메서드로 이제 어드바이스를 정의 2. 스프링 애플리케이션이 초기화 될 때 자동프록시생성기가 @Aspect가 붙은 클래스를 다 찾아서 어드바이저생성 3. 이제 스프링 빈으로 등록될 객체들을 하나씩 불러와서 어드바이저의 포인트컷을 통해 프록시 대상인지 아닌지 확인해서 프록시를 생성하여 스프링 빈으로 등록 으로 이해를 하였는데요. 이번 강의에서 @Aspect 클래스 안에 메서드에 @Around("this(hello.aop.member.MemberService)") 이런식으로 this에 타입을 정의하는데, 초기화 시점에 스프링 빈 대상 객체들을 this 포인트컷 표현식으로 프록시 대상 객체인지 아닌지 확인할 수가 없지 않나요? 왜냐하면 아직 프록시가 생성되기 전인데 어떻게 this(프록시 객체)을 판단할수가 있는건가요? 아니면 모든 빈을 일단 프록시로 만들고 실행시점에 판단하는 방식인가요? 감사합니다.
-
미해결스프링부트 시큐리티 & JWT 강의
JWT를 굳이 사용하는 이유가 뭘까요?
무료로 이렇게 좋은 강의영상 올려주셔서 정말 감사합니다. 너무 많은 도움이 되네요. 전부터 JWT 토큰을 왜 사용하는지에 대해서 의문을 가지고 있었는데, 명확한 답이 나오지 않아 질문드립니다. 세션에 대한 문제점 (서버 확장시, 스티키 세션을 사용하거나, 세션 클러스터링을 해야하는 문제)를 해결하기 위해 사용된다는 것은 알겠습니다만, JWT를 사용하는 예제들 보면 리프레시토큰도 함께 사용하여, 어세스토큰을 제발급하는 용도로 사용하더군요. 그럼 리프레시토큰은 결국 세션과 마찬가지로 DB(혹은 레디스 등의 메모리 DB)등에 저장이 되어 관리되어질텐데, 그렇게 된다면 세션과 결국 별 차이점이 없지 않을까요? 이 문제를 가지고, 여러 사람들에게 물어보았으나, 딱히 세션에 비해 가지는 장점이 없어지는 것 같더라고요. 물론 리프레시토큰을 사용하지 않고 AccessToken만 사용하는 경우에는 장점이 있다는 것을 알겠습니다. 1. 정리하자면, RefreshToken을 사용하는 경우 세션에 비해 가지는 장점이 있는가? 2. 없다면 굳이 JWT는 왜 사용하는가? 입니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요 영한님 강의를보다 궁금한점이 생겨 질문 남겨봅니다.
서블릿 프로그램에서 스프링을 도입하는 과정을 학습하면서 궁금한점이 생겼는데요 기존 서블릿 프로그램의 경우, 웹서버의 요청을 서블릿 컨테이너가 받아서 해당하는 서블릿을 통해 응답을 했다면 스프링 MVC의 경우 모든 요청을 받는 디스패처 서블릿을 통해 요청을 받는데요, 이때도 마찬가지로 웹서버의 요청은 서블릿 컨테이너가 받게되고 요청에 해당하는 서블릿(디스패처 서블릿)을 싱글톤으로 띄워 관리하고 이 디스패처 서블릿에 대한 삭제라던지 권한은 서블릿 컨테이너가 관리하는게 맞을까요? 그리고 디스패처 서블릿은 컨트롤러를 호출해 일을 수행하는데 이때 컨트롤러는 서블릿이 아닌 기존 서블릿이 하던 역할을 하는 그냥 클래스일뿐인게 맞나요? 요약 1. 스프링을 도입하더라도 웹 서버에 요청은 서블릿 컨테이너를 통해 받는게 맞나요? 2. 이때 서블릿 컨테이너에 존재하는 서블릿은 디스패처 서블릿 단 1개 로 처리되는게 맞나요? 3. 그럼 컨트롤러라고 불리는 클래스는 서블릿의 역할을 할뿐 실제 서블릿이 아니기에 서블릿 컨테이너에 등록이 되지 않나요? 긴 질문 읽어주셔서 감사합니다 (_ _)
-
미해결스프링 핵심 원리 - 기본편
intellij grandle 오류가 납니다.
spring 강의를 듣다가 실습때 intellij 를 설치하는 과정에서 오류가 발생했습니다. 처음 사용해봤는데 프로젝트를 open한 시점부터 저 오류때문에 아무것도 하지 못하고 있습니다 ㅠㅠ 구글링도 여러번 해보고 타 질문에서의 답변도 참고해보았지만 해결이 되지 않습니다.. 오류사진과 intellij 설정 상태를 첨부합니다. 답변 기다리겠습니다ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
createOrderItem 메소드에서 setOrder를 하지 않은 이유가 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요.OrderItem의 생성 메소드 (createOrderItem)에서 setOrder를 하지 않은 이유가OrderItem을 Order가 관리하는 형태여서 그런건가요? 이유가 무엇인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합테스트에서 @Autowired
안녕하세요! 강의 너무 잘 듣고 있습니다. 듣다가 잘 모르겠는 점이 있어서 질문을 드립니다. 기존 서비스 테스트코드에서는 @BeforeEach로 의존주입을 했는데, 통합테스트에서는 아래와 같이 @Autowired로 끌어온다고 하셨습니다. 테스트코드인데도 SpringConfig코드에서 아래의 서비스와 레포지토리 객체를 실제로 끌어오는 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8:30 에 윈도우 버전으로 어떻게 바로 템플릿위치로 넘어가나요?
8:30 에 윈도우 버전으로 어떻게 바로 템플릿위치로 넘어가나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
회원가입 질문 있습니다!!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 보통 사이트들 회원가입할때 비밀번호 재확인란을 만들어서 비밀번호 기입란과 다를 때 실시간으로 오류문구가 뜨는데 이런건 js없이 스프링과 타임리프만으로는 불가능할까요?
-
미해결스프링 핵심 원리 - 고급편
Pointcuts 클래스를 빈으로 등록 안한 이유
Pointcust 클래스를 빈으로 등록하니깐 @Around("Pointcuts.allOrder()") 이렇게 해도 되는데 왜 강의에서는 경로를 지정해서 한건가요? 둘이 어떤 차이점이 있는건가요?
-
미해결스프링 핵심 원리 - 기본편
흐름이 이렇게 흘러가는게 맞나요?
1.컨테이너 생성 2.스프링 빈 생성 3.의존관계 주입 4.초기화 콜백 이렇게 완료가 되는걸로 알고있습니다. @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; } 이때 LifeCycleConfig.class에 있는 빈 정보들을 바탕으로 빈 생성하고 의존관계주입등을 하는걸로 알고있는데 여기서 질문이 스프링 컨테이너에 있는 빈은 return networkClient; 즉 리턴된 객체를 뜻하는건가요? 다음 질문은 NetworkClient networkClient = new NetworkClient(); 했을때 생성자가 호출이 되고 public NetworkClient() { System.out.println("생성자 호출, url = " + url); } 값주입?? 이 일어난후 networkClient.setUrl("http://hello-spring.dev"); 초기화 콜백이 일어나는거 같은데 맞나요?? @PostConstruct public void init() { System.out.println("NetworkClient.init"); connect(); call("초기화 연결 메시지"); }