묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
앱 배포시 jar 질문
앱을 배포하는 도중 계속 에러가 나 질문 올립니다. plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' implementation 'com.auth0:java-jwt:3.19.2' } tasks.named('test') { useJUnitPlatform() } 위와 같이 build.gradle 파일을 설정하였는데 ./gradlew build 시 아래와 같은 오류가 계속 뜹니다. * What went wrong:Execution failed for task ':bootJar'.> Entry META-INF/MANIFEST.MF is a duplicate but no duplicate handling strategy has been set. Please refer to https://docs.gradle.org/7.6.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy for details.해결방법이 있을가요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
에러문의 합니다
package com.example.spring.repository;import com.example.spring.domain.Member;import org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.Test;import java.util.List;import static org.assertj.core.api.Assertions.assertThat;class MemoryMemberRepositoryTest {MemoryMemberRepository repository = new MemoryMemberRepository(); @AfterEach public void afterEach() {repository.clearStore(); }@Test public void save() {Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); assertThat(member).isEqualTo(result); }@Test public void findByName() {Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); Member result = repository.findByName("spring1").get(); assertThat(result).isEqualTo(member1); }@Test public void findAll() {Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result = repository.findAll(); assertThat(result.size()).isEqualTo(2); }}---------------------------------------------------------package com.example.spring.repository;import com.example.spring.domain.Member;import java.util.*;public class MemoryMemberRepository implements MemberRepository {private static Map<Long, Member> store =new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) {member.setId(++sequence); store.put(member.getId(), member); return member; }@Override public Optional<Member> findById(Long id) {return Optional.ofNullable(store.get(id)); }@Override public Optional<Member> findByName(String name) {return store.values().stream().filter(member -> member.getName().equals(name)).findAny(); }@Override public List<Member> findAll() {return new ArrayList<>(store.values()); }public void clearStore() {store.clear(); }}Starting Gradle Daemon...Gradle Daemon started in 448 ms> Task :compileJava UP-TO-DATE> Task :processResources UP-TO-DATE> Task :classes UP-TO-DATE> Task :compileTestJava UP-TO-DATE> Task :processTestResources NO-SOURCE> Task :testClasses UP-TO-DATE> Task :test FAILEDCannot invoke "String.equals(Object)" because the return value of "com.example.spring.domain.Member.getName()" is nulljava.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "com.example.spring.domain.Member.getName()" is null at com.example.spring.repository.MemoryMemberRepository.lambda$findByName$0(MemoryMemberRepository.java:25) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) at java.base/java.util.HashMap$ValueSpliterator.tryAdvance(HashMap.java:1800) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:652) at com.example.spring.repository.MemoryMemberRepository.findByName(MemoryMemberRepository.java:26) at com.example.spring.repository.MemoryMemberRepositoryTest.findByName(MemoryMemberRepositoryTest.java:43) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727) 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:156) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93) 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.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) 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: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: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.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:110) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:90) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:85) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) 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 jdk.proxy1/jdk.proxy1.$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:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)MemoryMemberRepositoryTest > findByName() FAILED java.lang.NullPointerException at MemoryMemberRepositoryTest.java:433 tests completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///Users/sunyeong/Downloads/spring/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.org BUILD FAILED in 3s4 actionable tasks: 1 executed, 3 up-to-date왜 이 에러가 발생하는지 도저히 모르겠습니다 findByName에서 에러가 뜨는데 왜 이런 걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
EntityManagerFactory랑 EntityManager 생성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 프로젝트에서 Spring Data JPA 프레임워크를 활용할 때랑 그냥 JPA를 활용할 때 두가지 경우 모두EntityManagerFactory랑 EntityManager는 스프링 내부에서 자동으로 Bean으로 등록되는 건가요? 그리고 자동으로 등록되는게 맞다면 JPA 강의에서는 어떻게 아래 코드로도 주입이 되는걸까요?private EntityManager em;(생성자 메서드를 통한 주입 코드 생략)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
에러 문의합니다.
일단 영상은 다 따라가면서 했는데 계속 저런 에러가 뜨고 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향,단방향 및 방향에 관해서 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]저희 예제에서는 없었지만 A라는 엔티티가 있고 B라는 엔티티가 있는데 A와 B는 1대N관계라고 할때 A를 통해 B를 사용하지만 그렇다고 B로 A를 찾아가진 않습니다.(즉 A에서 B로 단방향 연관관계를 맺고 싶은 상황입니다)그런데 다 쪽(B)에 항상 외래키가 있어야하므로 @ManyToOne(JoinColumn...을 쓰면 B에서 A로 가는 방향도 자동으로 설정되는 것아닌가요?그렇게 되면 어쩔수 없이 양방향 연관관계로 사용할 수 밖에 없나요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
N+1문제
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]저번 챕터에서 나왔던 X to one 에서 n+1문제가 있어서 패치조인으로 최적화를 했었는데 이번에 X to many 문제에서 발생하는 데이터 뻥튀기 문제도 n+1문제라고 할 수 있나요?
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AbstractAuthenticationProcessingFilter내에서 HttpServletResponse값이 안들어갑니다
@Bean public SecurityFilterChain httpSecurity(HttpSecurity http) throws Exception { return http.cors().disable() .csrf().disable() .httpBasic().disable() .formLogin().disable() .authorizeRequests().anyRequest().authenticated() .and() .addFilterAt(authFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterAt(jwtFilter(), UsernamePasswordAuthenticationFilter.class) .build(); } @Bean public WebSecurityCustomizer webSecurityCustomizer() { return web -> { web.ignoring().requestMatchers().antMatchers("/h2/**"); }; } @Bean public AuthFilter authFilter() throws Exception { var authFilter = new AuthFilter(); authFilter.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); authFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("/")); authFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/error")); return authFilter; }설정은 위와 같이 했습니다.@Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { super.successfulAuthentication(request, response, chain, authResult); String SECRET = "secrsdkfjhjh4243j234jh2SDdsfjhgsdfhjgjFQQQQdasd1et"; Claims claims = Jwts.claims(); claims.put("username", SecurityContextHolder.getContext().getAuthentication().getName()); String compact = Jwts.builder() .setClaims(claims) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 1시간 .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); response.addHeader("Authorization", compact); response.addCookie(new Cookie("token", compact)); }위와 같이 설정을 했는데 http 요청 테스트를 해보면 설정한 값이 하나도 들어가 있지않습니다.컨트롤러나 OncePerRequestFilter에서 값을 넣어보면 잘 적용됩니다..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
500 화이트라벨 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]JdbcMemberRepository를 강의pdf에있는 코드 그대로 복사붙여기해서 모든걸 다 import 했는데 500화이트라벨 에러가 뜨네요..어디 부분에서 잘못된걸까요 ?import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class JdbcMemberRepository implements MemberRepository { private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8080포트 이미 사용 중
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HelloSpringApplication을 실행하였을 때 이미 8080번 포트를 사용 중이라는 오류 문구를 출력하길래 cmd에서 8080번 포트를 사용중인 프로세스를 강제 종료하는 방식으로 해결하여서 실행하여 실습을 완료하였습니다. 그런데 컴퓨터를 재부팅 시에 다시 HelloSpringApplication을 실행하게 되었을 때 또 다시 8080번 포트를 사용 중이라고 에러를 띄우는데 매번 실행마다 8080번 포트를 사용 중인 프로세스를 찾아서 강제종료 하는 것은 번거로울 것 같은데 혹시 다른 해결방안을 알 수 있을까요?
-
미해결스프링 시큐리티 OAuth2
안녕하세요! 소셜로그인 관련 질문입니다!
프로젝트MSA 환경에서 프론트는 외부 서버에서 별도로 배포합니다.프론트는 APIGateway 로만 데이터를 교환하고자 합니다.현재 카카오 로그인 기능만 구현하고자 하는데 이를 JWT + Redis 를 활용하여 JWT 토큰을 검증하고 Gateway 에서 검증하고 각 서비스를 호출 하는방식으로 구현하고자 합니다. 제가 이해한게 맞다면 자체 포함타입일거같습니다.플로우는 다음과 같습니다Front kakao click -> kakao 검증 -> 프로젝트 서비스의 회원(member) 별도 저장 이때 Front 요청-> gateway(Auth-client) 로드밸런싱-> Authorization Server(Auth-Server) kakao인증후 User권한 인가 jwt -> Front 요청 -> gateway(redis 에 세션,jwt 저장) 이렇게 될것이라고 생각하고 있었는데 강의를 보다보니 Kakao login 과 jwt 는 client 쪽인 apigateway 에서 구현을 해야하는건가요? 또한 개념적으로 접근하게 된다면 카카오로그인으로 회원을 인증하고 제가 만든 프로젝트의 권한을 인가개념을 분리해야하는건지 어렵더라구요 ㅠㅠ 기존에 모놀리식으로 할땐 검색하며 예제를 복붙하면서 따라하다보니 막상 인증/인가를 분리하려니 어려움을 겪고있습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
controller 에러 입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이런식으로 나오고 타이핑이 안됍니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cmd 로 다시 또 빌드하는이유가 뭔가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]cmd 로 다시 빌드하는 이유가 그냥 cmd 로도 실행할수 있다는 방법을 소개해주시는 건가요?그리고 cmd 로 빌드를 하면 기존에 인텔리제이로 만든 스프링부트 프로젝트 파일 외 에 build 안에 또 같은게 있는거같은데 중복 파일 이 있어도 돼는건가요? 뭔가 이상해서요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DB가 제공하는 클라이언트라는 말이 잘 이해가 안갑니다.
[질문 내용]강의 1분 24초쯤에 말씀하신com.h2database:h2 - 데이터베이스가 제공하는 클라이언트이 부분이 잘 이해가 안가서 질문 드립니다. 1) 우선 제가 클라이언트-서버 개념만 알고 있는데,클라이언트가 서버에 있는 데이터베이스에 접근해서 데이터들을 요청해서 가져가는 걸로 알고 있는데"데이터베이스가 제공하는 클라이언트"라는 말이 1차적으로 이해가 가지 않습니다. 2) 두 번째로는 이 구문 자체가 의미하는 거 자체가 뭔지 궁금합니다. runtimeOnly 'com.h2database:h2'
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AWS 과금 조심!
질문글은 아니지만 혹시 저처럼 AWS랑 안 친하신 분들을 위해 과금 조심하시라고 올립니다. 강의 내용에도 설명 해주시지만, 고정IP(아마존에서는 Elastic IP Addresses, 탄력적 IP라고 부르네요)를 생성하고 인스턴스를 연결 안 하거나, 연결된 인스턴스가 running상태가 아니면 하루에 0.12USD정도 나가는 것 같네요.(저는 인스턴스에 연결만 해두면 되는 줄 알고 연결된 인스턴스 꺼놨다가 요금 나갔네요ㅜ.. 수업료가 그나마 싸서 다행입니다. )AWS 강의까지 진행하시는 분들은 참고하셔서 진행하시면 좋을 것 같아요!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1편 까지 완성된 소스코드를 받을 방법이 있을까요?
2편부터 강의를 보기 시작했는데, 코드를 쳐보면서 따라가고 싶어요. 혹시 2편 내용은 없고 1편 내용까지만 완성된 코드는 어디서 받을 수 있을까요?
-
해결됨쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS
H2외의 DB를 사용할 때도 AWS에 올리는 것은 똑같은 방식으로 하나요?
강의에서는 H2를 사용하였는데 DB로 MySql, PostgreSql같이 다른 RDBMS를 사용해보려고 합니다. AWS에 올릴 경우 application.properties에 작성한 DB설정 내용과 gradle이 가져오는 라이브러리를 제외하고는 모든 것이 똑같이 하면 되는 걸까요?
-
해결됨토비의 스프링 부트 - 이해와 원리
intellij CE 버전 run configurations 질문있습니다
토비님 안녕하세요. intellij CE 버전에서 spring initializr 로 생성한 프로젝트 실행 시 궁금한게 있습니다. ultimate 버전은 영상에서처럼 run 할 때 우상단에 spring 아이콘이 있고 springboot 플러그인이 적용되어있는데, CE 버전은 그렇지 않고 따로 Run Configurations 가 설정되어있지 않아 아주 동일한 방법으로 실행할 수는 없었습니다. (영상의 "HellobootApplication" 대신 "Current File"로 표시되어있고 실행버튼이 비활성화 되어있습니다.) 일단 main 메소드가 있는 Application.java 파일에서 코드 왼쪽의 실행버튼으로 실행했는데 이렇게 해도 상관 없는건가요? Ultimate 버전과 달리 CE 버전에서 놓치고 가는게 있는지 궁금해서 여쭙니다. 좋은 강의 해주셔서 감사합니다 ~
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 프로그램 설정
강사님이랑 똑같이 다 설정했는데 왜 이렇게 뜰까요 ?
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
@Transactional 애너테이션을 적용해도 매번 session을 맺어서 처리하는 이유
@Transactional(rollbackFor = Exception.class) public int testTran(DatasetList dsList) { Dataset dsParam = DatasetUtil.getGdsParam(dsList); // Dataset을 SQL에 적용할 변수형인 Map으로 변환하면서 사용자 정보 입력 Map mapParam = DatasetUtil.getMap(dsParam, DatasetUtil.UPPER_CASE); int iRes1 = codemap.updateTran1(mapParam); log.info("==================== ||||||22222222222222||||||| ===================="); int iRes2 = codemap.updateTran2(mapParam); //미존재테이블로 에러 발생 log.info("==================== |||||||3333333333333|||||| ===================="); return iRes2; }[2023-06-28 16:07:47:67472] [http-nio-8808-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - POST "/web/common/CodeAction?mode=testTran", parameters={masked}[2023-06-28 16:07:47:67473] [http-nio-8808-exec-3] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.skcc.nxcus_spring.usrcode.action.codecontroller#testTran(HttpServletRequest, HttpServletResponse)[2023-06-28 16:07:47:67473] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession[2023-06-28 16:07:47:67473] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@628385f5] was not registered for synchronization because synchronization is not active[2023-06-28 16:07:47:67473] [http-nio-8808-exec-3] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource[2023-06-28 16:07:47:67474] [http-nio-8808-exec-3] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [HikariProxyConnection@1752952453 wrapping net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@4499b10a] will not be managed by Spring[2023-06-28 16:07:47:67474] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran1 - ==> Preparing: UPDATE COM_COMMON_COD SET COMM_NM = 'Transactional111' WHERE COMM_GRP_CD = 'MEMSTS' AND COMM_CD = 'A'[2023-06-28 16:07:47:67474] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran1 - ==> Parameters: [2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG jdbc.sqltiming - com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)1. UPDATE COM_COMMON_COD SET COMM_NM = 'Transactional111' WHERE COMM_GRP_CD = 'MEMSTS' AND COMM_CD = 'A' {executed in 3 msec}[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran1 - <== Updates: 1[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@628385f5][2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] INFO c.s.n.usrcode.biz.codeservice - ==================== ||||||22222222222222||||||| ====================[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@532be999] was not registered for synchronization because synchronization is not active[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [HikariProxyConnection@471746278 wrapping net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@4499b10a] will not be managed by Spring[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran2 - ==> Preparing: UPDATE COM_COMMON_COD SET COMM_NM = 'Transactional2222' WHERE COMM_GRP_CD = 'MEMSTS' AND COMM_CD = 'D'[2023-06-28 16:07:47:67477] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran2 - ==> Parameters: [2023-06-28 16:07:47:67478] [http-nio-8808-exec-3] DEBUG jdbc.sqltiming - com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)1. UPDATE COM_COMMON_COD SET COMM_NM = 'Transactional2222' WHERE COMM_GRP_CD = 'MEMSTS' AND COMM_CD = 'D' {executed in 1 msec}[2023-06-28 16:07:47:67478] [http-nio-8808-exec-3] DEBUG c.s.n.m.nxmdb.CodeMapper.updateTran2 - <== Updates: 1[2023-06-28 16:07:47:67478] [http-nio-8808-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@532be999][2023-06-28 16:07:47:67478] [http-nio-8808-exec-3] INFO c.s.n.usrcode.biz.codeservice - ==================== |||||||3333333333333|||||| ====================[2023-06-28 16:07:47:67478] [http-nio-8808-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - Completed 200 OK @Transactional 애너테이션을 적용해도 각각의 sql 마다 매번 session을 맺어서 처리하는데요. 이유를 잘 모르겠습니다. 설정문제일까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
테스트(Matchers.is) 질문드립니다.
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(Matchers.is(2)))위 코드와 아래코드 모두 정상적으로 통과하는걸 확인하였는데요.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2))수업에서는 Matchers.is()를 사용하셨는데 위 코드 문맥에서 is()를 굳이 왜 사용하셨는지 궁금해서 질문드립니다.