묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Invalid bound statement
mybatis 작성을 다하고 test를 돌리는데 에러가 발생합니다. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): hello.itemservice.repository.mybatis.ItemMapper.save 제가 작성한 코드에 문제가 있는지하고 pdf를 복사해서 돌려보아도 계속 에러가 발생합니다..
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 강사님 /login 질문입니다.
제가 수업을 놓쳤는지 모르겠는데...시큐리티가 기본으로 /login을 캐치한다고 들었는데이 기본값을 바꿀 수 있는 방법이 존재하나요?/login으로 Post 요청을 보내면attemptAuthentication 메서드를 실행해서 로그인 하는 걸로 알고있는데/login 값을 제가 원하는 /api/login 처럼 변경할 수 있는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Data를 작성한 이유가 무엇일까요?
강의 내에서 User 클래스를 작성할때, @Data를 작성한 이유가 무엇일까요? 타임리프 문법 내에서 getter, setter메소드를 사용해서 프로퍼티 접근을 하기위해 @Data를 적은것이라고 이해해도 될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
캐스팅을 하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ControllerV3 controller = (ControllerV3) handler; 와 같이 캐스팅을 하는 이유가 인자인 object가 더 포괄적(부모)이기 떄문인가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
시간대에 따라서 변화하는 로직 테스트 하는 가이드
안녕하세요. 우빈님 시간대에 따라 다른 결과를 주는 로직을 테스트 하는 과정에서 고민이 있어 질문을 드립니다. 우빈님이 강의에서도 언급하셨지만, 시간과 같이 관측할 때마다 달라지는 영역은 외부로 분리하면 테스트하기 쉬워진다고 말씀하셨습니다.!하지만, 현재 서비스 레이어 까지만 분리가 가능하고 컨트롤러에서 LocalDateTime을 파라미터로 받지 못하는 상황입니다. 그래서 컨트롤러를 테스트할 때 어떻게 해야할까 고민을 좀 해봤는데요. 저의 결론은 TimeProvider라는 클래스를 하나 만들어서컨트롤러를 테스트할 때는 이를 mocking하는 방식으로 테스트 코드를 작성했습니다. TimeProvider/** * 시간을 고정하여 테스트하기 위해 사용 */ @Component public class TimeProvider { public LocalDateTime getCurrentLocalDateTime() { return LocalDateTime.now(); } } ControllerGET을 사용하고 싶은데, 외부와 연동해야해서 POST를 사용할 수 밖에 없습니다. ㅠㅠ/** * 인기 메뉴 조회 * 현재 시간대의 식사종류와 일치하는 가장 조회수가 많은 금일 식사 메뉴 조회 */ @PostMapping("/menu/top1-view") public ResponseEntity<SkillResponse> getTop1RestaurantMenuByView(@RequestBody SkillPayload payload, @PageableDefault(size = 1) Pageable pageable) { log.info("request={}", payload); Page<RestaurantMenuResponse> top1RestaurantMenuByView = restaurantService.findTop1RestaurantMenuByView(pageable, timeProvider.getCurrentLocalDateTime()); RestaurantsMenuResponse response = new RestaurantsMenuResponse(top1RestaurantMenuByView.getContent()); return new ResponseEntity<>(response.toSkillResponseUseTextCard(apiVersion), HttpStatus.OK); } Test Code@Test @DisplayName("추천수 가장 많은 메뉴를 1개 조회한다.") void getTop1UosRestaurantMenuByView() throws Exception { // given // 현재 시간을 고정할 시간 생성 LocalDateTime fixedDateTime = LocalDateTime.of(2023, 8, 16, 10, 59, 59); when(timeProvider.getCurrentLocalDateTime()).thenReturn(fixedDateTime); String date = CrawlingUtils.toDateString(fixedDateTime); restaurant restaurant1 = createUosRestaurant(date, STUDENT_HALL, MealType.BREAKFAST, "라면", 0, 0); restaurant restaurant2 = createUosRestaurant(date, MAIN_BUILDING, MealType.BREAKFAST, "김밥", 1, 0); restaurant restaurant3 = createUosRestaurant(date, WESTERN_RESTAURANT, MealType.BREAKFAST, "돈까스", 2, 0); restaurant restaurant4 = createUosRestaurant(date, MUSEUM_OF_NATURAL_SCIENCE, MealType.BREAKFAST, "제육", 2, 1); restaurantRepository.saveAll(List.of(restaurant1, restaurant2, restaurant3, restaurant4)); SkillPayload skillPayload = createSkillPayload(RestaurantName.STUDENT_HALL.name(), MealType.BREAKFAST.name()); // when // then mockMvc.perform(post("/api/v1/text-card/restaurant/menu/top1-view") .contentType(MediaType.APPLICATION_JSON) .content(om.writeValueAsBytes(skillPayload)) .content(om.writeValueAsString(PageRequest.of(0, 1)))) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.version").value(SkillResponse.apiVersion)) .andExpect(jsonPath("$.template").isNotEmpty()) .andExpect(jsonPath("$.template.outputs").isArray()) .andExpect(jsonPath("$.template.outputs[0].textCard").isNotEmpty()) .andExpect(jsonPath("$.template.outputs[0].textCard.text").isString()); } 이런식으로 작성하는 것이 최선일까요?LocalDateTime fixedDateTime = LocalDateTime.of(2023, 8, 16, 10, 59, 59); when(timeProvider.getCurrentLocalDateTime()).thenReturn(fixedDateTime);TimeProvider 클래스를 만들어서 mocking 하는 방법이 최선일까요?혹시 더 좋은 방법을 말씀주시면 감사하겠습니다.! 좋은 강의 만들어 주셔서 감사합니다.^^
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
java.lang.IllegalStateException: Failed to load ApplicationContext
안녕하십니까 영한님!!!잘만 되던 테스트코드가 어느 순간 아래와 같은 오류가 발생합니다. 해결방법들을 찾아보고 시도해보았지만 해결되지 않아 맨 아래에 구글 드라이브 코드 링크 남겨드립니다. java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@6bc25ac2 testClass = spring.lectureA.service.MemberServiceTest, locations = [], classes = [spring.lectureA.LectureAApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@6c130c45, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@20f5239f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2fd1433e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3c73951, org.springframework.boot.test.context.SpringBootTestAnnotation@6788e070], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:143)at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:127)at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191)at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130)at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:241)at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:377)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:382)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:377)at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:376)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:289)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:288)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:278)at java.base/java.util.Optional.orElseGet(Optional.java:364)at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:277)at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:105)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value : create-droat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1155)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436)at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137)at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58)at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46)at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1406)at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:545)at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137)at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108)at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:187)at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:119)... 72 moreCaused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value : create-droat org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766)... 93 moreCaused by: java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value : create-droat org.hibernate.tool.schema.Action.interpretHbm2ddlSetting(Action.java:230)at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator$ActionGrouping.determineAutoSettingImpliedAction(SchemaManagementToolCoordinator.java:725)at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator$ActionGrouping.interpret(SchemaManagementToolCoordinator.java:733)at org.hibernate.boot.internal.MetadataImpl.shouldOrderTableColumns(MetadataImpl.java:480)at org.hibernate.boot.internal.MetadataImpl.orderColumns(MetadataImpl.java:400)at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:250)at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:431)at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1455)at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)... 97 more [수정]create-drop으로 바꾸어도 해결되지 않습니다구글드라이브 링크 남겨드립니다. 감사합니다.https://drive.google.com/file/d/1ZboNJYtcy5yXo5WNBIcKVaWVlfnxAEu4/view?usp=drive_link
-
미해결토비의 스프링 부트 - 이해와 원리
왜 Servlet을 써야 하나요?
섹션 3 독립 실행형 서블릿 애플리케이션 > 서블릿 컨테이너 띄우기 강의를 듣고나서 든 생각입니다! 왜 Servlet을 써야만할까요? (왜 Spring은 Servlet을 선택한걸까요?)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션과 쿠키 생명주기
세션과 쿠키의 생명주기가 헷갈려서 질문드립니다.어떨때는 브라우저를 닫으면 쿠키와 세션이 종료되고 어떨때는 세션만종료되고 생각해보면 기준이 총 4개1.쿠키(생명주기 미설정)2.쿠키(생명주기 설정)3.세션(생명주기 미설정)4.세션(생명주기 설정) 이렇게 4가지 경우가 있는것 같은데 여기서 추가적으로 세션이 사라져도 쿠키가 살아있는 경우도 있나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
플러그인 롬복 설치하는 이유
안녕하세요스프링부트와 JPA 활용1 중 섹션1. 프로젝트 생성 강의를 듣고 있는데요.13:04 부분에 플러그인 롬복을 설치하시는데 앞쪽에서 스프링부트 스타터에서 롬복을 받고 빌드를 했는데 플러그인을 따로 설치해주어야 하는 이유가 뭔가요?빌드한 롬복과 플러그인에서 설치하는 롬복은 무슨 차이인지 어떻게 활용되는지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션에 여러 데이터를 저장할 수 있다.
@PostMapping("/login") public String loginFormV3(@Validated LoginForm loginForm, BindingResult bindingResult, HttpServletRequest request){ if(bindingResult.hasErrors()){ return "login/loginForm"; } Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword()); if(loginMember == null){ bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } // 로그인 처리 TODO 쿠키를 만들어서 브라우저로 전송하면 브라우저에서 요청시마다 쿠키를 함께 전달함 // 스프링에서 제공하는 HTTP 세션 매니저 사용 HttpSession session = request.getSession(); // 세션이 있으면 있는 세션 반환 없으면 새로 만들어서 반환함 // 세션에 로그인 회원 정보를 보관한다. session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); // 기본적으로 다 메모리에 저장됨 // 세션 생성하려면 .getSession에 파라미터를 true(근데 디폴트라 생략가능) // false라고 하면 새로운 세션을 반환하지 않고 null로 반환한다. //sessionManager.createSession(loginMember, response); return "redirect:/"; } 이 코드에서 session.setAttribute()을 통해 하나의 세션의 여러 값을 저장할 수 있다는 말이 잘 이해가 가지 않아서 질문드립니다 여기서 여러 값을 저장할 수 있다는 말은 하나의 key에 여러가지 value를 저장하는 MultiValueHashMap처럼 사용할 수 있다는 뜻인가요? 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 서블릿 response 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강사님께서 강의에서 작성하시는 이 부분은response를 사용하고 싶을 때 마다, 이런 기능을 다 직접 코드를 작성해야하나요?request를 요청하면 response 관련 정보가 들어있는 객체가 따로 자동 생성되는 것 아닌가요??
-
해결됨Java/Spring 주니어 개발자를 위한 오답노트
강의와 크게 상관은 없지만 공부의 방향성에 대해서 질문합니다.
저는 올해 4월에 입사해서 이제 막 4개월차 주니어 개발자 입니다.퇴근 후에 공부를 하려고 하다가 매번 생각이 많아지는 주제인데요.저의 주요 업무는 전자정부프레임워크 기반의 jsp사이트를 ui유지보수하는 업무입니다.더 좋은 회사를 합격하지 못해서 아쉽긴하지만 그래도 신입받아주는 회사들이 많이 없어서 일단은 기분좋게 다니려고 하고 있습니다. 그런데 회사 업무를 하는 데 앞서서 공부를 하려고 하다보면 자꾸만 그런생각이 들더라구요. jsp/mybatis 를 이렇게 까지 공부해야하나? 전자정부프레임워크 어차피 다른 서비스 기업으로 이직하게 되면 안쓸텐데 굳이 이렇게 공부해야할까 하고요.그래서 회사기술스택에 맞춰서 해야할지 지금듣고 있는 김영한님 스프링강의를 들으면서 개인 포트폴리오를 보강하는 것이 나은지 둘다 하면 되지않냐고도 할수 있지만 그게 정말 맞는 방법인지 하는 의구심이 듭니다.최우선적으로 뭘 중점적으로 해야하는지 우선순위를 명확하게 알고싶습니다!!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db1 - 스프링과 문제해결 예외처리,반복 강의 관련
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링 예외 추상화 이해 파트 부분 강의에서 스프링이 제공하는 예외 변환기 부분에서 test 코드 짜실때 DataSource dataSource;@BeforeEachvoid init(){ datasource = new DriverManager~();}이런 식으로 작성하셨는데 @BeforeEach 안쓰고 @Test 코드 작성하기 전에 테스트 클래스 상위에 DataSource dataSource = new DriverManager~();이런식으로 작성하는건 안되나요??
-
해결됨Practical Testing: 실용적인 테스트 가이드
예외 처리에 대한 rest doc 작성하기
안녕하세요!강사님 덕분에 테스트에 많은 관심이 생겨 개인 프로젝트에도 적용을 해보고 있습니다! Rest doc 작성 중 궁금한 점이 생겨 질문드립니다.API의 정상 응답이 아닌 예외 발생 시의 응답도 Rest doc으로 작성하고자 합니다.예를 들어 인증, 인가 관련하여 예외가 발생하는 경우가 있을 때 다음과 같이 생각했습니다.예외 케이스 별로 에러 코드를 상세하게 나누어 세밀한 응답을 전달하기 (ex. 아이디가 틀렸을 때 - 401A, 비밀번호가 틀렸을 때 - 401B, 아이디가 존재하지 않을 때 - 401C 등등..)공통 예외코드로 처리하기 (ex. 인증 실패 시 어떤 경우라도 401 코드 반환)위의 2가지 경우에 어떤 식으로 rest doc을 작성하는 것이 좋을까요? 1번 케이스의 경우는 특정 API 문서마다 함께 적는 것이 좋을 것 같긴 한데 2번 케이스의 경우는 프로젝트 전반적인 공통 예외처리라 별도의 문서 항목으로 1개만 작성하는 게 좋을 지 고민이 됩니다. 혹시 현업에서는 예외 발생 시 응답에 대한 문서도 작성하시는 지 궁금하고 1번, 2번 케이스에 대하여 어떻게 rest doc을 작성하는 것이 다른 인원과 소통하기 편할지 의견 부탁드리겠습니다! 감사합니다.
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
29강. boardInsert 메서드 @ResponseBody 붙이는 이유
안녕하세요. boardInsert 메서드에 @ResponseBody를 붙이는 이유가 궁금합니다. insert 후에 리턴 값이 없는데 왜 @ResponseBody를 붙이는 건가요? callback 함수인 loadList 때문인가요? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto vo 개념이 너무 헷갈립니다.
회원생성 부분에서 @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); }CreateMemberRequest 가 dto라고 설명하셨는데회원가입시 json값은 값 변경이 없는데 vo가 아닌가요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
updatName 메소드 질문입니다.
안녕하세요 강사님, 강의 잘 듣고있습니다.강의에서 updateName 메소드를 domain에 작성하였는데 그 이유가 궁금합니다. 다른 기능은 userrepository의 메소드를 활용하는 것 같은데 수정 기능은 다른 이유가 궁금합니다.감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
finditems() 에러
'테스트 - 스프링 부트와 임베디드 모드' 수강 중에 ItemRepositoryTest를 h2를 모두 끄고 동작시켰는데강사님처럼 모두 성공을 뜨지 않고 finditems()에서 에러가 납니다.강의자료 초반에 데이터베이스에서 데이터가 보관되어 있어서 그렇다고 들었는데어떻게 해결해야하나요?? h2는 접속 종료한 상태입니다.
-
미해결스프링 핵심 원리 - 고급편
request 스코프 활용
스프링 핵심 원리 기본편에서 설명해주신 request 스코프를 사용하면 uuid가 유지되는 객체를 컨트롤러, 서비스, 레퍼지토리 로직에서 공유할 수 있을 것 같은데 이를 활용해서는 level 까지 포함한 로깅을 구현하긴 어려운걸까요? 지금 내용처럼 TraceId를 파라미터로 넘겨 받는 방식으로만 가능한건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 테이블 생성이 안됩니다ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요! h2접속하면 저렇게 member 테이블만 뜨고 생성이 안되어있습니다..ㅠ