묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Spring Boot JWT Tutorial
포스트맨 결과 500 서버 에러 뜨시는 분!
application.yml 에서 jwt.secret 값이 64바이트 이상이여야 합니다...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
member table inset 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. MEMBERS 에 insert 하려고하는데 아래와 같은 오류가 발생합니다. 실행하고자 하는 코드 : insert into member(name) values("spring") 오류 코드 Column "spring" not found; SQL statement:insert into member(name) values("spring") [42122-200] 42S22/42122 (도움말)org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "spring" not found; SQL statement:insert into member(name) values("spring") [42122-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) 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.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:163) at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:145) at org.h2.command.dml.Insert.prepare(Insert.java:327) at org.h2.command.Parser.prepareCommand(Parser.java:744) at org.h2.engine.Session.prepareLocal(Session.java:657) at org.h2.engine.Session.prepareCommand(Session.java:595) at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235) at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:212) at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201) at org.h2.server.web.WebApp.getResult(WebApp.java:1459) at org.h2.server.web.WebApp.query(WebApp.java:1116) at org.h2.server.web.WebApp$1.next(WebApp.java:1078) at org.h2.server.web.WebApp$1.next(WebApp.java:1065) at org.h2.server.web.WebThread.process(WebThread.java:178) at org.h2.server.web.WebThread.run(WebThread.java:94) at java.base/java.lang.Thread.run(Thread.java:834) test.mv도 읽기전용이 아닌것을 확인했습니다. 왜 이런 오류가 발생하고.. insert가 안될까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Result 클래스 관련 질문입니다.
Result 클래스를 만들어서 response 데이터를 보냈습니다. 이때 제너릭으로 설정하신 이유가 있나요? 현재 아래 코드가 이런식입니다. static class Result<T> { private T data; } 그런데 제너릭을 쓰지 않는 반환용 DTO를 만들어서 static class ResultDto{ private List<OrderDto> orderDtos } 이렇게 하지 않는 이유가 있나요? 보통 실무에서는 어떤 방식을 주로 사용하시나요? 감사합니다.
-
미해결Spring Boot JWT Tutorial
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
안녕하세요? 이 강의를 보고, 이 강의를 토대로 토이 프로젝트를 진행하고 있습니다. 근데 계속 아래와 같은 Exception이 터지고 있습니다. 다수 회원을 생성 합니다! Hibernate: insert into member (member_id, modify_date, register_date, about_me, activated, email, name, nickname, password, phone) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into member_authority (member_id, authority_name) values (?, ?) 2022-02-09 23:42:57.821 WARN 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23506, SQLState: 23506 2022-02-09 23:42:57.821 ERROR 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-200] 2022-02-09 23:42:57.823 INFO 11871 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:276) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy142.save(Unknown Source) at org.comunity.hongga.repository.MemberRepositoryTest.lambda$회원_100명_생성_상세_조회$0(MemberRepositoryTest.java:76) at java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104) at java.base/java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:593) at org.comunity.hongga.repository.MemberRepositoryTest.회원_100명_생성_상세_조회(MemberRepositoryTest.java:57) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) 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:1541) 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:1541) 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: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 com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) 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.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1352) at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1402) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:493) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3285) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2420) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ... 87 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-204] at org.h2.message.DbException.getJdbcSQLException(DbException.java:527) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.get(DbException.java:227) at org.h2.message.DbException.get(DbException.java:203) at org.h2.constraint.ConstraintReferential.checkRowOwnTable(ConstraintReferential.java:311) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:252) at org.h2.table.Table.fireConstraints(Table.java:1163) at org.h2.table.Table.fireAfterRow(Table.java:1181) at org.h2.command.dml.Insert.insertRows(Insert.java:188) at org.h2.command.dml.Insert.update(Insert.java:135) at org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:61) at org.h2.command.CommandContainer.update(CommandContainer.java:173) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:831) at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 107 more @Test public void 회원_100명_생성_상세_조회() { // given System.out.println("다수 회원을 생성 합니다!"); // 50번까지 FAMILY // 100번까지 GUEST IntStream.rangeClosed(1, 100).forEach(i -> { if (i <= 50) { Authority authority = Authority.builder() .authorityName("ROLE_FAMILY") .build(); Member memberMany = Member.builder() .email("whoami"+i+"@hongga.com") .password(passwordEncoder.encode("1234")) .name("손님" + i) .nickname("손님이에영" + i) .phoneNumber("010-3948-4934") .activated(true) .authorities(Collections.singleton(authority)) .build(); // when Member saveManyFamily = memberRepository.save(memberMany); // then System.out.println(assertThat(memberMany).isEqualTo(saveManyFamily)); } else { Authority authority = Authority.builder() .authorityName("ROLE_GUEST") .build(); Member memberMany = Member.builder() .email("whoami"+i+"@hongga.com") .password(passwordEncoder.encode("1234")) .name("손님" + i) .nickname("손님이에영" + i) .phoneNumber("010-3948-4934") .activated(true) .authorities(Collections.singleton(authority)) .build(); // when Member saveManyGuest = memberRepository.save(memberMany); // then System.out.println(assertThat(memberMany).isEqualTo(saveManyGuest)); } // if-else 끝 }); System.out.println("==============================================================="); System.out.println("회원 조회를 시작 합니다!"); //given IntStream.rangeClosed(1, 100).forEach(i -> { String email = "whoami"+i+"@hongga.com"; // when Member byEmail = memberRepository.findByEmail(email); // then System.out.println(assertThat(email).isEqualTo(byEmail)); });} // 회원_상세_조회() 끝 이렇게 TEST 코드를 작성해서 여러 회원을 검색하고, 비교 해 보려고 하는데 안 됩니다. 의심 가는 건 저는 회원 등급을 GUEST, FAMILY, ADMIN으로 사용하고 싶은데, 혹시 이걸 Check하거나 뭐 그러는 곳이 있나요?? 조언 부탁 드리겠습니다! https://github.com/junyharang-personal-project/hongga-community-server
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
정적컨텐츠 관련 질문이요!
@Controllerpublic class HelloController { @GetMapping("hello-static") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; }} 위와 같이 컨트롤러를 만들었습니다. 따라서, localhost:8080/hello-static 을 입력하면template/hello.html로 이동되게 설정했습니다. 하지만, localhost:8080/hello-static.html을 입력하면 template/hello.html로 이동되지 않고 static/hello-static.html로 이동이 됩니다. 강의 내용에 따르면 localhost:8080/hello-static.html을 입력했을 때 hello-static 관련 컨트롤러가 없는 경우에 static/hello-static.html로 이동된다고 하신것으로 기억합니다. 그런데 hello-static 컨트롤러가 있는데도 왜 static으로 가게 되는지 궁금합니다!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Cause: invalid source release: 11
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Cause: invalid source release: 11 에러가 뜨는데 어떻게 해야하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
4섹션 5번째 영상에서 @BeforEach로 감싸주는 이유가 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 이렇게 작성해도 테스트 정상적으로 실행되는데 어떤 이유가 있어서 BeforeEach에서 매번 new로 객체를 만들어주신건지 궁금합니다!
-
미해결스프링 시큐리티
6분20초쯤에
부모클래스의 onAuthenticationFailure를 호출한 이유가 이해가 가질 않는데..왜그런거죠..?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
여태껏 들었던 강의 중 가장 불친절 한 강의
이 분은 진짜 글을 남겨야겠네요. 기본 적으로 강의 할 때 목소리 톤이 최소한의 겸손이 안되어 있는 느낌. "이건 당연히 아셔야 해요", "찾아보셔야 해요" <-- 이런 말투들도 최대한 이해하려고 노력 했음. 근데 가관은 bootstrap 코드를 자기가 copy&paste 해서 옮기는데 화면에 보여주지도 않음. 그거 하나하나 보면서 sign-up.html 파일 내용 기입하고 있어서 힘들었는데... 질문 게시판 답변 보니...그제서야 거기서 자기 git의 commit check out해서 옮기라네...참... 아니 강의를 하면서 그 때 그 때 말을 해주든가.. 불친절하고, 내용도 그냥 다 알아야 하는 것들 혼자 한 번 적용해보는 느낌. 새로운 내용이 나오면 그 내용을 친절하게 알려주면서 강의 노트에 있는 것도 아니고.... 그냥 말로 대충 지나가듯이 설명.... 좀 겸손하지 않으신 듯 해요. 강사 자체가...
-
미해결스프링 시큐리티
여기서 왜 401 ERROR 가 발생하는지 잘 모르겠습니다.
안녕하세요. 강의 매우 잘 듣고 있습니다. 다름이 아니라 질문이 있는데요. 시큐리티 설정은 이렇게 해주고, ajax.http 실행시켜주면 HTTP/1.1 401 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Frame-Options: DENY Content-Length: 0 Date: Sat, 05 Feb 2022 13:50:25 GMT Keep-Alive: timeout=60 Connection: keep-alive <Response body is empty> Response code: 401; Time: 4ms; Content length: 0 bytes 401 에러가 발생하는데 어디쪽을 확인하면 좋을까요..? AjaxSecurityConfig @Order(0)@Configurationpublic class AjaxSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(ajaxAuthenticationProvider()); } @Bean public AuthenticationProvider ajaxAuthenticationProvider() { return new AjaxAuthenticationProvider(); } @Bean public AuthenticationSuccessHandler ajaxAuthenticationSuccessHandler() { return new AjaxAuthenticationSuccessHandler(); } @Bean public AuthenticationFailureHandler ajaxAuthenticationFailureHandler() { return new AjaxAuthenticationFailureHandler(); } @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .authorizeRequests() .antMatchers("/api/messages").hasRole("MANAGER") .anyRequest().authenticated() .and() .addFilterBefore(ajaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class) ; http .exceptionHandling() .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) .accessDeniedHandler(ajaxAccessDeniedHandler()) ; http.csrf().disable(); } @Bean public AccessDeniedHandler ajaxAccessDeniedHandler() { return new AjaxAccessDeniedHandler(); } @Bean public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { AjaxLoginProcessingFilter filter = new AjaxLoginProcessingFilter(); filter.setAuthenticationManager(authenticationManagerBean()); filter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); filter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); return filter; }}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
인텔리제이가 css, js 파일을 인식하지 못합니다
인텔리제이에 sync 버튼도 없는데 어떡하죠? mvc 편에서 out 디렉토리에서 어떻게 해주시면 된다고 말씀하셨던 걸로 기억하는데 기억이 잘 안나네요ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트래픽이 많은 상황에 대해 질문입니다
안녕하세요. 여태 배운걸 토대로 트래픽이 많은 상황에 대해서 생각해보고 있는데요. 클라이언트에서 order를 생성/변경하는 요청이 계속 들어온다고 생각해봤습니다. 각각의 요청에 대해서 결국 insert, 또는 update SQL이 생성될텐데요. 1. 그러면 클라이언트 1, 2, 3,,, 1000 이렇게 1000명이 동시에 요청해서 insert 또는 update를 하면, 1000개의 SQL이 각각 생성돼서 실행된다고 이해했는데 맞나요? 2. 위의 상황에서 제가 이해한 대로 1000개의 SQL이 각각 생성돼서 실행된다고하면, DB로 가는 네트워크에 부하가 생길수도 있을 것 같은데요. 이런게 문제되지는 않나요?? 혹시 이런 상황에 대해서 따로 처리하는 방법이 있는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO질문입니다.
DTO에대해서 말씀해주셨는데 해당강의에서는 createMemberForm을 DTO라고 생각하면 될까요??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
secretkey의 용도, 토큰의 위,변조 검증, userId검증로직 질문드립니다.
강사님 안녕하세요. 좋은 강의 잘 듣고 있습니다. 강의 중 궁금점이 생겨 질문드립니다. 1. secret key의 용도 강의 중 언급해주신 jwt.io 사이트에서는 secret key값 없이 token을 복호화 할 수 있음을 확인했습니다. 즉, 데이터(payload)의 검증 과정에서는 secret key가 필요하지 않아도 가능하다.로 받아들여지는데요.. 그렇다면 secret key의 용도는 token에 내포된 데이터(payload)를 보호하기 위함이 아니라, "application내에서 복호화가 가능한 token인지 확인하는 용도" 가 맞을까요 ?? 2. 토큰의 위변조 검증 다른 질문을 참조하였을 때, 토큰의 위변조 확인 위해 request header의 userId와 token에서 얻은 userId를 비교하는 방법을 취했다고 이해하였습니다. 하지만 jwt.io에서 sercret key 없이도 userId를 얻을 수 있기 때문에 위,변조에 있어 취약하지 않을까? 라는 생각이 듭니다.. 실제 상용되는 서비스라면, token의 위,변조를 일반적으로 어떻게 검증하는지 궁금합니다.. ! 3. userId의 검증 강의에서 요구하신 userId를 검증하는 로직을 추가한다고 하면. 아래와 같이 작성하면 될까요 ? 위,변조 검증을 위한 조건을 "request header에 userId 필드가 존재해야 한다"로 가정하고 코드를 작성해보았습니다. 1. header에서 userId 필드를 검증하고, userId를 추출하여 isJwtValid를 호출할 때 인자로 함께 전달. 2. expire date를 검증 3. token에서 추출한 userId와 header의 userId를 비교 이런 식으로 진행하는게 강의에서 구현하라고 의도하신 바가 맞을까요 ??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
MSA와 사가 패턴을 찾아보면서 궁금했던 부분이 있어서 질문 남겨봅니다.
모든 자료가 그런 것은 아니지만 많은 MSA 관련 자료가 EDA (Event-Driven Architecture)를 이야기하고 있고, 카프카를 도입하면서 느슨하게 연결되어있고 원하는 메시지만 수신할 수 있도록 하는 구조로 설명을 하는 것 같습니다. (메시지 큐를 도입했을 때의 문제점에 대한 이야기는 별로 없고, 그 이상의 무언가를 찾거나 노하우를 구하기 쉽지 않은 듯 하네요.) 디커플링 자체는 상당히 좋은 장점 중 하나이지만, 개별 시스템으로 분리되면서 트랜잭션 관련해서도 고민이 많이 필요하고 연결하는 고리가 많아지는 만큼 신경써야 할 부분도 많을 것으로 보입니다. 그래서 들었던 질문이 몇 가지 있는데 마땅히 답을 구할만한 곳이 없었는데 이 쪽에서 관련된 질문에 답을 해주실 것 같아 달아봅니다. 1. 이벤트 소싱에 대해 맞게 이해한 것인지 ? 우선 이벤트 소싱이 CQRS, 비동기 처리와 많이 엮여서 나오는 주제이긴 하지만 이벤트 소싱 자체만을 두고 봤을 때에는 1) 이벤트의 모든 이력을 남기고 2) 핸들러가 이를 처리하는 것이 전부라고 이해해도 될까요 ?CQRS는 표면적으로는 변경과 질의를 분리하는 개념이지만, 이벤트 기록을 모두 재생해서 조회하는 것이 어려워서 질의와 변경을 분리하는 아이디어 때문에 이벤트 소싱에서 함께 언급되는 패턴으로 이해했고, 비동기 처리는 이벤트 소싱이 비동기 처리를 편하게 할 수 있는 환경 정도로만 이해했습니다. 제가 이해한게 맞는지 모르겠어서 잘 이해했는지 질문을 드리고 싶구요 ㅎㅎ 2. 짧은 시간 안에 처리되어야 하는 API도 MSA에 적합한가 ? 위에 제가 이해한 것이 맞다는 가정하에 말씀드리는 거긴 한데요. 예를 들면 만약에 OTT에서의 유료 영상 결제, 문서 파일 결제, 웹툰 등에서 결제하자마자 결과를 검증하고 사용해야 하는 과업이 있고, 이 과업을 단일 API로 처리하던 것을 MSA로 전환할 경우에 1) API, gRPC 등 네트워크 통신을 사용하는 MSA의 경우 : 코드나 개념적인 분리를 통해 서비스를 작게 쪼갤 수 있는 장점은 있지만 네트워크 이슈, 롤백 등 신경써야 할 문제가 많아진다 2) 카프카 등의 메시지 큐를 통한 MSA일 경우 : 카프카 자체의 문제 혹은 처리하는 개별 마이크로 서비스에 병목이 생기면 처리가 지연되며, 단일 API로 주고받던 경우에는 앱 수정이 불가피하다 (카프카를 사용하면 더더욱 이벤트 소싱을 고려할 수밖에 없고 PENDING 상태가 기존 앱에서 정의되지 않았기 때문에) 는 문제가 있을 것 같습니다. 아무래도 제가 카프카를 넣는 것이 우려가 되는 이유는 1) 각 서비스에서 발행한 카프카 메시지를 어떻게 추적하는지 쉽지 않다고 생각했고,2) 장애 포인트가 쪼개지는 서비스와 개념적으로 발생하는 연결의 갯수에 비례해서 많아지기 때문이라 생각했고,3) 또한 카프카를 통해서 처리하는 속도가 API로 처리하는 지금 속도 대비 느리게 세팅된 상태라 과하게 생각하는건가 싶기도 하고, 4) 앱에서 '서버의 아키텍쳐 변경을 위해 생긴 PENDING 상태에 대해 알고 있어야 하는가'에 대해서 고민이 많아서 그런 것 같습니다. 제가 MSA 관련해서는 경험이 없다보니 의견을 좀 들어보고 싶습니다. 3. 보상 트랜잭션과 관련하여각자의 로컬 트랜잭션만 보장하고 문제가 생기면 그게 반하는 트랜잭션을 새로 발행해서 상태를 상쇄시키는 형식인 것 같습니다. 상태 머신이 명확하게 구분된다면 보상 트랜잭션 구현이 용이하겠지만, 그렇지 않을 경우나 모호한 경우가 있을 것이라 생각됩니다. 또한 보상 트랜잭션이 실패하는 경우 더더욱 현상 파악이 쉽지 않을 것 같기도 하고, 구현하는 서비스마다 제각각이라 노하우를 구하기 쉽지 않을 것으로 보여서 구현 난이도가 꽤 올라갈 것으로 보이는데, 이런 부분을 보완할 수 있는 방법이 있을지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderITemDto 클래스 생성 위치
안녕하세요 좋은 영상 감사합니다. 다름이 아니라 OrderItemDto 는 OrderDto 안에서 사용하는 클래스이므로 OrderItemDto(내부 클래스) 의 다시 내부 클래스로 생성하는 것이 맞지 않나요? 영상에서는 OrderDto 와 동등한 레벨로 생성하셔서 궁금증이 들었습니다. 감사합니다^^
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
SpringBoot 버전 변경 후 매핑 문제
안녕하세요 강의를 보여 따라하던중 @NotEmpty 어노테이션이 안되는걸보고 질문을 검색하니 SpringBoot 버전을 변경해야 한다고 하셔서 build.gradle 파일을 교재에 나와있는데로 복붙하였습니다. 근데 그 이후부터 localhost:8080을 들어갈때 마다 아래와 같은 에러가 나면서 들어가지지를 않습니다. 코드에 문제가 있는건지 궁금합니다. 그리고 main밑에 생긴 generated 폴더도 무엇인지 궁금합니다. 2022-02-02 11:43:18.412 ERROR 12428 --- [nio-8080-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-3] Exception processing template "home": Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) at org.thymeleaf.standard.expression.FragmentExpression.resolveExecutedFragmentExpression(FragmentExpression.java:619) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.computeFragment(AbstractStandardFragmentInsertionTagProcessor.java:379) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.doProcess(AbstractStandardFragmentInsertionTagProcessor.java:110) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:592) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1139) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] 2022-02-02 11:43:18.413 ERROR 12428 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10)] with root cause org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) at org.thymeleaf.standard.expression.FragmentExpression.resolveExecutedFragmentExpression(FragmentExpression.java:619) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.computeFragment(AbstractStandardFragmentInsertionTagProcessor.java:379) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.doProcess(AbstractStandardFragmentInsertionTagProcessor.java:110) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:592) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1139) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요! MSA에 대해서
안녕하세요! 궁금한게 있습니다. 저희회사에서는 프로젝트가 멀티모듈로 되어있습니다. 그리고 CMS(운영관리 모듈), API, COMMENT 모듈 이렇게 3개의 애플리케이션 모듈을 사내 도커레지스트리에 도커 이미지로 올리고 AWS에 각각 3개의 모듈을 띄우는데요! 이게 음.. 데이터베이스는 한개로 씁니다. 그러니까 각 3개의 데이터베이스가 따로 한개씩 있는 것이아닌 마스터 하나에 슬래이브 1개의 레플리카로 구성되어있습니다. 이것또한 MSA라고 할수있을까요? 신입이라 아직 정확하게는 모르겠지만 저는 DB도 각 애플리케이션 마다있어야한다고 보고 그게 MSA라고 생각하고 있거든요.! 선생님의 의견이 궁금합니다! 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
update 메소드가 void 인것과 관련된 질문 드립니다.
안녕하세요. update 메소드는 커맨드 쿼리 분리 원칙에 따라서 member 객체를 반환하지 말고 void로 반환값이 없게 하거나 id정도만 반환하라고 하셨습니다. 1. 커맨드가 수정이니 쿼리로 member를 찾지 말아야 한다고 하셨는데 findOne 메소드에서 어차피 member를 찾아야 하는 것 아닌가요? 2. update 메소드 외에도 사실 모든 메소드에서 void나 id만 반환해야 하는 것인가요? 다른 메소드도 등록, 수정, 삭제 등등 멤버를 조회하는 것이 커맨드가 아닌 것 같은데, 그렇다면 일반적으로 반환을 id만 해주는 것이 좋은가요? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님 강의를 벗어난 주제 이긴한대 궁금한게 생겨서 질문드립니다.
유저와 팔로우 팔로잉 Entity 를 구현하려고 하는데 이렇게 하는게 맞는건지 잘 모르겠어서 질문드립니다.. 조금이라도 힌트를 주신다면 정말 감사할것 같네요!!