묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Vue.js 완벽 가이드 - 실습과 리팩토링으로 배우는 실전 개념
Module not found: Error: 발생합니다. 도와주세요ㅠ
npm run serve 시, Module not found: Error: Can't resolve '@vue/composition-api' in~~ 오류가 뜹니다.어떻게 해결하면 될 지 알려주실 수 있을까요..
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestMapping("..") 실행 순서
그럼 @RequestMapping(”..”)의 컨트롤러는 스프링 MVC중에서 4의 과정에서 호출이 되는 것인가요?RequestMappingHandlerAdapter 클래스에서 handle()이라는 메서드는 없었는데, 제가 잘못 이해한 것인가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
풀이 질문
public int getNumber(int num, int sumResult, int[] arr) { int answer = 0; int sum = 0; int pi = 0; int i = 0; while(pi < num) { sum += arr[pi]; if(sum > sumResult) { pi = i++; sum = 0; } else if (sum == sumResult) { answer++; } pi++; } return answer; } 채점은 정답으로 나왔는데,,혹시 다른 예외상황이 있을까요...?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
NumberFormatException 에러
FrontController - v1에서 회원목록 조회가 안됩니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 오류
spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: #show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug제가 application.yml에 작성한 코드입니다. 현재 아래와 같은 에러가 나고 있습니다.could not prepare statement; SQL [call next value for hibernate_sequence]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statementorg.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [call next value for hibernate_sequence]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259) at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551) at app//org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at app//org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at app//org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at app//org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at app//jpabook.jpashop.MemberRepository$$EnhancerBySpringCGLIB$$473a0eb7.save(<generated>) at app//jpabook.jpashop.MemberRepositoryTest.testMember(MemberRepositoryTest.java:24) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.15/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.15/java.lang.reflect.Method.invoke(Method.java:566) at app//org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at app//org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@11.0.15/java.util.ArrayList.forEach(ArrayList.java:1541) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@11.0.15/java.util.ArrayList.forEach(ArrayList.java:1541) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) 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 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.15/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.15/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement at app//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) at app//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at app//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:75) at app//org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:105) at app//org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) at app//org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:534) at app//org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:115) at app//org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) at app//org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at app//org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:756) at app//org.hibernate.internal.SessionImpl.persist(SessionImpl.java:742) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.15/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.15/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.15/java.lang.reflect.Method.invoke(Method.java:566) at app//org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) at app//com.sun.proxy.$Proxy96.persist(Unknown Source) at app//jpabook.jpashop.MemberRepository.save(MemberRepository.java:16) at app//jpabook.jpashop.MemberRepository$$FastClassBySpringCGLIB$$a3e1a60b.invoke(<generated>) at app//org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at app//org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ... 90 moreCaused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "HIBERNATE_SEQUENCE" not found; SQL statement:call next value for hibernate_sequence [90036-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:576) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.command.Parser.readSequence(Parser.java:7678) at org.h2.command.Parser.readTermWithIdentifier(Parser.java:4593) at org.h2.command.Parser.readTerm(Parser.java:4311) at org.h2.command.Parser.readFactor(Parser.java:3343) at org.h2.command.Parser.readSum(Parser.java:3330) at org.h2.command.Parser.readConcat(Parser.java:3305) at org.h2.command.Parser.readCondition(Parser.java:3108) at org.h2.command.Parser.readExpression(Parser.java:3059) at org.h2.command.Parser.parseCall(Parser.java:6480) at org.h2.command.Parser.parsePrepared(Parser.java:905) at org.h2.command.Parser.parse(Parser.java:843) at org.h2.command.Parser.parse(Parser.java:815) at org.h2.command.Parser.prepareCommand(Parser.java:738) at org.h2.engine.Session.prepareLocal(Session.java:657) at org.h2.server.TcpServerThread.process(TcpServerThread.java:278) at org.h2.server.TcpServerThread.run(TcpServerThread.java:183) at java.base/java.lang.Thread.run(Thread.java:829) at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:632) at app//org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at app//org.h2.engine.SessionRemote.done(SessionRemote.java:606) at app//org.h2.command.CommandRemote.prepare(CommandRemote.java:78) at app//org.h2.command.CommandRemote.<init>(CommandRemote.java:50) at app//org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:480) at app//org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) at app//org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92) at app//org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) at app//com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) at app//com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:90) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176) ... 114 moreMemberRepositoryTest > testMember() FAILED org.springframework.dao.InvalidDataAccessResourceUsageException at MemberRepositoryTest.java:24 Caused by: org.hibernate.exception.SQLGrammarException at MemberRepositoryTest.java:24 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at MemberRepositoryTest.java:242022-08-31 23:43:24.667 INFO 10712 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2022-08-31 23:43:24.671 INFO 10712 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2022-08-31 23:43:24.699 INFO 10712 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.1 test completed, 1 failed> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/XNOTE/Desktop/TIL/Spring/jpashop/build/reports/tests/test/index.html* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 12s4 actionable tasks: 2 executed, 2 up-to-date
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
const float PI =3.14159265; 로 선언하고 원의 넓이를 구할 때 궁금한 것이 있습니다.
int r = 3이라고 하고 원의 넓이를 구하면 28.2743만 출력이 되어 나오는데, float형은 소숫점 6자리까지 출력이 가능하지 않나요? C언어와 C++에서 출력되는 자료형이 다른건가요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[POST] updateItem에서 @ModelAttribute쓴 이유
안녕하세요, 상품수정 post controller의 코드를 보다가 궁금한 점이 생겨 질문드립니다.@PostMapping("/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") BookForm form) { itemService.updateItem(form.getId(), form.getName(), form.getPrice(), form.getStockQuantity()); return "redirect:/items"; }해당 메소드의 parameter인 BookForm 앞에 왜 ModelAttribute가 붙었는지 궁금합니다. return "redirect:/items"로 url요청을 할 때 Model을 전달하기 위함인가요? 그런데 [GET]/items 메소드는 form에 대한 data를 필요로 하지 않는 것 같습니다. @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "items/itemList"; }
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
console에 아이디 value 비밀번호 value값을 입력해도 출력이 안되는데 어떤게 문제인지 알수 있을까요?
import React, { useCallback, useState } from 'react'; import { Form, Input, Button } from 'antd'; import Link from 'next/dist/client/link'; import styled from 'styled-components' import { useDispatch } from 'react-redux'; import { loginAction } from '../reducers'; const LoginForm = () => { const dispatch = useDispatch() const [id, setId] = useState("") const [password, setPassword] = useState("") const onChangeId = useCallback((e) => { setId(e.target.value); }, []); const onChangePw = useCallback((e) => { setPassword(e.target.value); }, []); const onSubmitForm = useCallback(() => { console.log(`id: ${id}, pw: ${password}`); dispatch(loginAction({ id, password })) }, []) return ( <Form onFinish={onSubmitForm}> <div> <label htmlFor="user-id">아이디</label> <br /> <Input type="text" name='user-id' value={id} onChange={onChangeId} /> </div> <div> <label htmlFor="user-id">비밀번호</label> <br /> <Input type="password" name='user-id' value={password} onChange={onChangePw} required /> </div> <ButtonWrapper> <Button type="primary" htmlType="submit" loading={false}>로그인</Button> <Link href="/signup"><Button>회원가입</Button></Link> </ButtonWrapper> </Form> ) } const ButtonWrapper = styled.div` margin-top: 10px; ` export default LoginForm
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
리덕스와 리듀서 콘솔에는 찍히는데 값이 변경이 안됩니다 ㅠ
//reducers/index.js export const loginAction = (data) => { console.log(data) return { type: 'LOG_IN', data, } } export const logOutAction = () => { return { type: 'LOG_OUT', } } const initialState = { user : { isLoggenIn: false, user: null, signUpData: {}, loginData: {}, }, post: { mainPost: [] } }; // ( 이전상태, 액션 ) => 다음상태 const rootReducer = (state = initialState, action) => { console.log(action.type) switch (action.type) { case 'LOG_IN': return { ...state, user: { ...state.user, isLoggedIn: true, user: action.data } } case 'LOG_OUT': return { ...state, user: { ...state.user, isLoggedIn: false, user: null, } } default: return state } } export default rootReducer//스토어 import { createWrapper } from 'next-redux-wrapper' import { legacy_createStore as createStore } from "redux"; import reducer from '../reducers/index' const configureStore = () => { const store = createStore(reducer); return store; } const wrapper = createWrapper(configureStore, { debug: process.env.NODE_ENV === 'devlopment', }); export default wrapperaction에 type으로는 콘솔이 찍히는데 isLoggedin이 안바뀌네요... 어디가 잘못됬을까요 state값이 변경이 안됩니다. ture에서 false로 바뀌어야 하는데 설명 부탁드립니다.import React, { useState } from 'react' import Link from 'next/link' import LoginForm from './LoginForm' import UserProfile from './UserProfile' import { Menu, Input, Row, Col } from 'antd' import styled from 'styled-components' import { useSelector } from 'react-redux' const SearchInput = styled(Input.Search)` vertical-align: middle; `; const AppLayout = ({ children }) => { const { isLoggenIn } = useSelector((state) => state.user) console.log(isLoggenIn) return ( <div> <Menu mode='horizontal'> <Menu.Item> <Link href="/">노드버드</Link> </Menu.Item> <Menu.Item> <Link href="/profile">프로필</Link> </Menu.Item> <Menu.Item> <SearchInput enterButton /> </Menu.Item> <Menu.Item> <Link href="/signup">회원가입</Link> </Menu.Item> </Menu> <Row gutter={8}> <Col xs={24} md={6}> {isLoggenIn ? <UserProfile /> : <LoginForm />} </Col> <Col xs={24} md={12}> {children} </Col> <Col xs={24} md={6}> <a href="http://www.naver.com" target={'_blank'} rel="noreferre noopener">향훈</a> </Col> </Row> </div> ) } export default AppLayoutimport React, { useCallback, useState } from 'react'; import { Form, Input, Button } from 'antd'; import Link from 'next/dist/client/link'; import styled from 'styled-components' import { useDispatch } from 'react-redux'; import { loginAction } from '../reducers'; const LoginForm = () => { const dispatch = useDispatch() const [id, setId] = useState("") const [password, setPassword] = useState("") const onChangeId = useCallback((e) => { setId(e.target.value); }, []); const onChangePw = useCallback((e) => { setPassword(e.target.value); }, []); const onSubmitForm = useCallback(() => { console.log(`id: ${id}, pw: ${password}`); dispatch(loginAction({ id, password })) }, []) return ( <Form onFinish={onSubmitForm}> <div> <label htmlFor="user-id">아이디</label> <br /> <Input type="text" name='user-id' value={id} onChange={onChangeId} /> </div> <div> <label htmlFor="user-id">비밀번호</label> <br /> <Input type="password" name='user-id' value={password} onChange={onChangePw} required /> </div> <ButtonWrapper> <Button type="primary" htmlType="submit" loading={false}>로그인</Button> <Link href="/signup"><Button>회원가입</Button></Link> </ButtonWrapper> </Form> ) } const ButtonWrapper = styled.div` margin-top: 10px; ` export default LoginForm
-
미해결초보를 위한 도커 안내서
윈도우로 할 때랑 맥북으로 할 때랑 차이가 있는지 궁금합니다
윈도우 10 pro 환경에서 Windows PowerShell로 따라해보고 있는 학생입니다. 강의 보면서 공부 중인데 Ctrl+C로 컨테이너 종료시키는 명령어부터 telnet localhost 1234 명령어도 듣질 않습니다ㅠ 강의를 들으려면 맥북이 필요한건가요ㅠ
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
안녕하세요 원영님. 강의 외적인 내용일 수 있지만 aws kinesis에 대해 질문드립니다.
안녕하세요 원영님. aws kinesis data stream이 serverless kafka broker인가? 에 대해서 질문드리려고 합니다. (혹시 kinesis가 kafka와는 상관없는 별도의 서비스라면 강의 내용과 완전히 벗어나는 내용이라 죄송합니다!!)현재 업무에서 aws kinesis data stream을 사용하고 있습니다. 토픽, 파티션, 레코드, 오프셋 등 데이터를 실시간으로 받아 저장 및 처리하는 형태가 kafka와 비슷해 kinesis data stream 또한 다른 서버리스 서비스들과 유사하게 서버리스 카프카 브로커라고 생각했습니다.그런데 강의를 듣다보니 kafka와 kinesis data stream은 차이가 있습니다. 예를 들면 kafka의 파티션은 줄일 수 없지만 kinesis data stream의 shard는 줄일 수 있습니다. 서버리스 kafka라면 불가능한 일입니다.이 둘은 아예 다른 서비스라고 보는게 맞을까요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
JSTL if문 문자열 비교 질문있습니다.
JSTL if문은 어떻게 비교를 해야되나요?member.id는 세션의 아이디고 vo.id는 테이블의 아이디 입니다. ${member.id} 이거와 ${vo.id}이렇게 각각 적으면 같은 값을 가지고 오는 것을 확인 할 수있었습니다.하지만 <c:if test="${member.id eq '${vo.id}'}"> <td><a href="boardDelete.do?num=${vo.num}">삭제</a></td> </c:if>이렇게 작성시 삭제 버튼이 보이고 있지 않으며 eq를 ne로 바꿔서 작성시 모든 테이블에서 삭제버튼이 보이고 있습니다. 어떻게 작성해야 될까요..
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
matplotlib, pandas_profiling, pandas 버전을 알 수 있을까요?
강사님 안녕하세요.현재 아래 페이지와 유사한 증상입니다.'matplotlib.font_manager' has no attribute '_rebuild' - 인프런 | 질문 & 답변 (inflearn.com)처음에 pandas_profiling을 최신 버전으로 설치했는데 설명과 달리 visualization/context.py 파일이 없어서, 기존 pandas_profiling을 지우고 버전(2.8.0, 3.1.0)에 맞춰서 설치했는데 그랬더니 matplotlib.font_manager.rebuild가 실행이 안되고, matplotlib를 지우고 설치하니 pandas_profiling이 안되고 뭔가 이런식의 반복입니다. ㅠㅠ혹시 package별로 버전이 표시된 requirements.txt 있는지 알려주시면 감사드리겠습니다.감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
error
수업듣고 잘 따라하고 있는데 잘 되던것이 갑자기 클래스 낫 파운드 익셉션이 납니다..왜그런지 모르겠어요 ㅠ/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=56469:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/songhan/Desktop/스프링 MVC 1편/servlet/out/production/classes:/Users/songhan/Desktop/스프링 MVC 1편/servlet/out/production/resources:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-web/2.7.3/9e36c7517c4f872b69d0665e1dd46bd6d83c43b7/spring-boot-starter-web-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-json/2.7.3/38c88404d68926aaf6c0914199e8c5e766946de2/spring-boot-starter-json-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/2.7.3/6b0c093af667bf645cd5f49372e2a2540ae2855f/spring-boot-starter-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-webmvc/5.3.22/519d86b7ac9b8b6bb54739eb4eb73dc13a263b28/spring-webmvc-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/5.3.22/fdab9b8d8df2e6a8fb90f2481c361bcf2c129567/spring-web-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.13.3/ad2f4c61aeb9e2a8bb5e4a3ed782cfddec52d972/jackson-datatype-jsr310-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-parameter-names/2.13.3/f71c4ecc1a403787c963f68bc619b78ce1d2687b/jackson-module-parameter-names-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.13.3/d4884595d5aab5babdb00ddbd693b8fd36b5ec3c/jackson-datatype-jdk8-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.13.3/56deb9ea2c93a7a556b3afbedd616d342963464e/jackson-databind-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.7.3/4c96169e8d71c9c41f07a40d011dbd41898180ac/spring-boot-autoconfigure-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.7.3/3a8d641077565b7eaec3b2f91d5b83a6800f5895/spring-boot-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/2.7.3/a1e4a13b656182ba10b4c0c7848f91cd6f854fdf/spring-boot-starter-logging-2.7.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.22/661fc01832716c7eedebf995c6841b2f7117c63d/spring-core-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.30/8fde7fe2586328ac3c68db92045e1c8759125000/snakeyaml-1.30.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.22/fdd59bb4795c7a399e95ec4a5c8b91103e3189fd/spring-context-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.22/c056f9e9994b18c95deead695f9471952d1f21d1/spring-expression-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.22/2f9f00efbff8432f145ccffeb93e6a1819bac362/spring-aop-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.22/866c2022b5fef05b1702f4a07cfa5598660ce08a/spring-beans-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.13.3/7198b3aac15285a49e218e08441c5f70af00fc51/jackson-annotations-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.13.3/a27014716e4421684416e5fa83d896ddb87002da/jackson-core-2.13.3.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.11/4741689214e9d1e8408b206506cbe76d1c6a7d60/logback-classic-1.2.11.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-to-slf4j/2.17.2/17dd0fae2747d9a28c67bc9534108823d2376b46/log4j-to-slf4j-2.17.2.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.36/ed46d81cef9c412a88caef405b58f93a678ff2ca/jul-to-slf4j-1.7.36.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.22/811ace5e5eb379654ed96fd7844809db51af74a5/spring-jcl-5.3.22.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.11/a01230df5ca5c34540cdaa3ad5efb012f1f1f792/logback-core-1.2.11.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar:/Users/songhan/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.2/f42d6afa111b4dec5d2aea0fe2197240749a4ea6/log4j-api-2.17.2.jar hello.servlet.ServletApplication . ____ _ /\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.3)2022-08-31 22:35:59.819 INFO 17322 --- [ main] hello.servlet.ServletApplication : Starting ServletApplication using Java 11 on Songui-MacBookPro.local with PID 17322 (/Users/songhan/Desktop/스프링 MVC 1편/servlet/out/production/classes started by songhan in /Users/songhan/Desktop/스프링 MVC 1편/servlet)2022-08-31 22:35:59.827 INFO 17322 --- [ main] hello.servlet.ServletApplication : No active profile set, falling back to 1 default profile: "default"2022-08-31 22:36:00.753 WARN 17322 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet2022-08-31 22:36:00.767 INFO 17322 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2022-08-31 22:36:00.792 ERROR 17322 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:196) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3] at hello.servlet.ServletApplication.main(ServletApplication.java:12) ~[classes/:na]Caused by: java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet at org.springframework.boot.web.servlet.WebServletHandler.<init>(WebServletHandler.java:39) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.web.servlet.ServletComponentRegisteringPostProcessor.<clinit>(ServletComponentRegisteringPostProcessor.java:49) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.web.servlet.ServletComponentScanRegistrar$ServletComponentRegisteringPostProcessorBeanDefinition.lambda$getInstanceSupplier$0(ServletComponentScanRegistrar.java:94) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1249) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] ... 13 common frames omittedCaused by: java.lang.ClassNotFoundException: javax.servlet.annotation.WebServlet at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] ... 20 common frames omitted종료 코드 1(으)로 완료된 프로세스
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
댓글 입력시 바로 반영되는 기능은 어떻게 추가할 수 있을까요?
여태까지 구현한 것으로는 댓글을 입력하고나서 새로고침을 해야 작성한 댓글이 띄워지는데, 혹시 submit을 하자마자 바로 해당 포스팅에 댓글이 추가되도록 하려면 어떻게 해야하는지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Repository
Repository 관련 질문입니다. public Item save(Item item) { item.setId(++sequence); store.put(item.getId(), item); return item; }여기서 save(Item item)인데 따로 Item item = new Item()을 하지 않은 상태에서 저렇게 코드를 작성해도 되는 건가요?그리고 아래의 코드에서 Member.class가 무엇을 의미하나요?? public Member find(Long id) { return em.find(Member.class, id); }
-
미해결ERC20 깨부수기 (+ truffle, 프론트엔드)
expect 테스트가 정상적으로 동작하지 않습니다
const Simple2 = artifacts.require("Simple2"); const { chai, BN } = require("./setUp"); const { expect } = chai; contract.only("Test7", (accounts) => { let simpleInstance; before(async () => { simpleInstance = await Simple2.deployed(); }); it("Should have 0 ether", async () => { expect( web3.eth.getBalance(simpleInstance.address) ).to.eventually.be.bignumber.equal( new BN(web3.utils.toWei("50000", "ether")) ); }); });await을 없애고 eventually를 사용하면서 테스트값에50000 이더를 넣어도 테스트가 정상적으로 통과합니다 let balance = await web3.eth.getBalance(simpleInstance.address); expect(balance).to.be.bignumber.equal( new BN(web3.utils.toWei("50000", "ether"))eventually 이전 강의에 썼던 await을 다시 사용하면테스트에서 50000 이더가 없다고 에러가 나옵니다수정해야 할 부분이 있을까요?
-
미해결15일간의 빅데이터 파일럿 프로젝트
로그 시뮬레이터 만드는 법
안녕하세요강의를 듣고 나중에 토이 플젝을 진행해볼 계획을 가지고 있습니다. 강사님께서 활용하신 로그 시뮬레이터는 직접 만드신걸까요?로그시뮬레이터를 만들어서 활용해보고 싶은데 어떤 식으로 만드는게 좋을지 여쭤봐도 될까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Collection Bean 검증 질문입니다
안녕하세요! 영한님! 항상 강의 잘 보고 있습니다. 사실은 영한님 팬이기도 해요.아무튼 제가 며칠 계속 고민하던 부분이 있어요.제 목표는 컬렉션 타입과 상관 없이 컬렉션 안에 선언되어 있는 객체의 Bean Validation을 수행하고 싶어요.@RequestBody @Validated List<ItemSaveForm> 를 사용하게 되면 ItemSaveForm에 대한 검증이 아닌 List에 대한 검증 처리가 되더라고요. 그렇다고 List<@Validated ItemSaveForm> 는 컴파일 에러가 납니다.물론 저 스스로 해결하고자 많은 곳을 돌아 다녀 보았고 찾아낸 방법은 Validator를 구현한 객체(CollectionValidator)를 만들어서 validate 메서드 구현 을 했습니다. 이후 ItemController에서 CollectionValidation 를 주입 받아 collectionValidator.validate(itemList, bindingResult);를 통해서 검증 처리를 하는 법을 알아냈습니다.하지만 모든 Collection 마다 주입과 collectionValidator.validate 코드를 넣는게 비효율적이라 생각해서 어노테이션으로 만들거나 인터셉터에서 처리하고 싶었습니다.인터셉터에서 처리하고 싶었지만 CollectionValidation의 validate 메서드는 Errors 객체를 인자로 받는데 HandlerMethodArgumentResolver의 resolveArgument인자에서 errors 객체를 뽑아낼 방법이 안보이네요.어노테이션으로 만들고자 한 부분은 어노테이션 안에 Errors 객체를 선한 할 수가 없어서 CollectionValidator를 불러낼 수가 없었습니다.다른 해결 책이 있을 까요? 아니면 제가 보지 못한 부분이 있었던 걸까요?혹시 결국 스프링 입문때 잠시 다루었던 AOP를 통해서만 해결할 수 있는 걸까요? 어노테이션 만들기를 검색하다보니 AOP를 결국 다뤄야 하더라고요 ㅜㅜ아래 제 코드와 함께 올리겠습니다.@Data public class PatternDto { //이 어노테이션에게 검증을 맡기고자 합니다. @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message ="잘못된 번호 형식입니다.") private String phoneNumber; }@RestController public class ValidationItemApiController { //private final CollectionValidator validator; @PostMapping("/list") public Object addList(@RequestBody List<PatternDto> request, BindingResult bindingResult){ //validator.validate(request, bindingResult); -> 이 부분을 어노테이션이나 인터셉터로 처리하고 싶어요. log.info("list valid"); if(bindingResult.hasErrors()){ log.error("검증 오류 발생 {}", bindingResult); return bindingResult.getAllErrors(); } log.info("성공 로직 실행"); return request; } }@Component @Slf4j public class CollectionValidator implements Validator { private SpringValidatorAdapter validator; public CollectionValidator() { this.validator = new SpringValidatorAdapter( Validation.buildDefaultValidatorFactory().getValidator() ); } @Override public boolean supports(Class<?> clazz) { return true; } @Override public void validate(Object target, Errors errors) { if(target instanceof Collection){ Collection collection = (Collection) target; for (Object o : collection) { validator.validate(o,errors); } } else validator.validate(target,errors); } }//이 검증기를 통해 List<@Valid PatternDto>와 같이 검증하고 싶었지만 //validtor.validate에게 검증을 위임하려고 할때(많은 검증 로직들이 간소화 되기 때문에) validate메서드의 두번째 인자인 errors //에 넣을 값을 찾지 못한게 문제였습니다. //ArgumentResolver를 통해 해결하고자 했지만 이때도 validate의 errors 인자를 넣을 값을 못찾았습니다. @Component @Slf4j @RequiredArgsConstructor public class CustomValidator implements ConstraintValidator<CustomValid, List<PatternDto>> { private final CollectionValidator validator; @Override public void initialize(CustomValid constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(List<PatternDto> values, ConstraintValidatorContext context) { log.info("validator 로직 실행"); validator.validate(values,null); //null 대신에 어떤 값을 넣어야 할까요? 이 부분만 해결 되어도 문제가 해결 될거 같아요. return true; } }
-
미해결파이널 코딩테스트 : 프론트엔드
좋아요 기능 만드는 강의가 완전하지 않아요!
현재 강의를 듣고 있는데, 갑자기 좋아요 기능이 완성되있네요.로컬스토리지에다 추가하는 강의가 사라진 것 같아요.올려주시면 감사하겠습니다.