inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

DB저장관련 질문입니다

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 하이버네이트는 변경되는 값을 캐쉬에 저장해놨다가 persist나 flush신호가 있을때 db에 값을 업데이트한다고 알고있는데요, 따로 flush를 주지않으신거같은데 addStock등을 활용해서 값을 변경했을때 DB에서 자동으로 플러쉬가 나가는건가요?

  • JPA
  • java
  • spring-boot
  • spring
  • 웹앱
안준석 댓글 1 좋아요 0 조회수 147

JPA에서는 Insert into select는 사용할수 없는건가요?

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

안녕하세요 강사님 jpa 강의를 들으면서 insert into select을 하고 싶은데, 구글링을 해도 정보가 없는데, jpa에서는 무조건 insert만 할수 있는 건가요 ?

  • JPA
  • spring-boot
  • spring
  • java
도연김 댓글 1 좋아요 0 조회수 2219

OrderItem 클래스 비즈니스 로직 & 조회로직 질문

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 복습하면서 궁금한 점이 생겼는데요 OrderItem 클래스에서 만든 비즈니스 로직과 조회로직에서 getItem, getOrderPrice 그리고 getCount 사용하셨는데 get없이 그냥 해도 같은 결과를 얻었습니다. 혹시 get을 사용하신 이유가 있으신가요 ?

  • spring-boot
  • spring
  • 웹앱
  • java
  • JPA
달콤한 알파카 댓글 1 좋아요 0 조회수 370

DB가 mysql일때는 @SelectKey 와 addContentInfo의 @Insert문은 어떻게 구성하나요

미해결

윤재성의 만들면서 배우는 Spring MVC 5

안녕하세요? 23분 부터의 내용입니다. DB가 mysql일때는 @SelectKey 와 addContentInfo의 @Insert문은 어떻게 구성하나요? 구글링해도 잘 모르겠습니다...ㅠㅜ @selectkey 쿼리내용을 SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "databaseName" AND TABLE_NAME = "tableName" 로 수정하는게 맞는지 궁금합니다.. 양질의 강의 감사히 보고있습니다!

  • java
  • spring
  • MVC
  • XML
JG 댓글 1 좋아요 0 조회수 363

리포지토리 반환값을 List 에서 Stream 으로 바꿔 받는 과정에 문제가 생겨 남겨보아요

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 김영한강사님. 알찬 강의 열심히 응용중에 문제가 생겼습니다. 다음처럼 Repository 반환값을 List<엔티티> 에서 Stream<엔티티> 로 했을 경우 Controller 에서 엔티티를 받아오지 못하더라구요 MemberRepository . findAll() ---> Stream<Member> 반환 em . createQuery ( "select m from Member m" , Member . class ) . getResultStream () // MemberController 의 addAttr 직전 Stream을 List변환 memberService . findMembers () . collect ( Collectors . toList ()) ; error1 : The object is already closed [90007-199] error2 : could not advance using next() 직감으로는, 닫혔다는것이.. Stream 이라 불변객체여서 변경이 안된다는 이야기로 보이는데 List<Member> 로 싹 바꿔야 되나 고민하고 있습니다. -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- LIst<엔티티> 로 바꾸니 문제없이 출력이 되었습니다. 원인이 createQeury().getResultStream() 이었는데 결국 Proxy 를 Stream 에 담은 상태로 불변성이 보장되어서 하이버네이트가 내부에 RealEntity 값을 심어야 되는데 이작업을 할 수 없으니 애러가 나는것이 맞는건가요? 맞다면, Stream은 어느시점에 사용하는것이 좋은가요..?

  • spring
  • JPA
  • java
  • 웹앱
  • spring-boot
Truestar 댓글 6 좋아요 13 조회수 1788

repository랑 service 개념 질문입니다.

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

1. 제가 DAO라는 방식으로 먼저 배워서 repository를 DAO라고 생각하고 이해하고 있는데요. 이게 맞는건가요? 2. repository로 바로 비즈니스로직을 수행을 해도 되는데 service로 나눠준 이유는 사용자들이 동시에 사용할 수 있게 하기 위한거라고 알고 있는데 이게 맞는건가요?

  • JPA
  • spring-boot
  • spring
  • 웹앱
  • java
Jong Hee Park 댓글 6 좋아요 3 조회수 282

빌드가 안되요

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

기존 JDK버전을 11버전으로 바꿔서 빌드했는데 정확한 원인을 모르겠습니다.

  • MVC
  • java
  • spring-boot
  • spring
얄라차개발자 댓글 3 좋아요 5 조회수 417

Exception 오류 확인 요청

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

선생님께서 하신 것과 똑같이 하였는데, 아래와 같이 오류가 나는데 어디를 손봐야 할까요? main 에서 아래 한줄만 딱 추가했습니다. Persistence. createEntityManagerFactory ( "hello" ) ; Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43) at org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:86) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:212) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:174) at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:76) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:171) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:119) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:10)

  • java
  • JPA
moonseok.shin 댓글 8 좋아요 9 조회수 1328

Member와 Order간의 양방향 관련 질문입니다

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

강의 후반부에 실무에선 Member와 Order가 양방향이 되는건 잘못된 설계이고 단방향으로 끊어내는게 맞다고 하셨는데, '내 주문내역' 이런 경우는 Member를 통해서 Order를 보는게 아닌가요? 어떻게 풀 수 있는건가요?

  • JPA
  • java
탁형 댓글 4 좋아요 16 조회수 552

JPA

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

Member m1= em.getReference(Member.class,member1.getId()); System.out.println("m1.getClass() = " + m1.getClass()); Member m2= em.find(Member.class,member1.getId()); System.out.println("m2.getClass() = " + m2.getClass()); System.out.println("m1==m2"+(m1.getClass() == m2.getClass())); System.out.println(" =============== "); 1. 제가 예상한것은 영속성 컨텍스트에 프록시 객체가 담길것이고, 2. find 해서 가져오려 했으나 영속성 컨텍스트에 Member객체가 있기에 db로 안가고 프록시 객체를 그냥 가져와서 true가 나온다... 가 예상이었슴다. 근데 결과는 2번이 약간 달랐죠 일단 db로 쿼리는 select 때린다. 근데 가져온것은 프록시 객체. ㅡㅡ.... 아니 DB왜 간거지... DB까지 간것이 맞고 그 내용까지 JPA 자기 눈으로 직접 보았으나 일단 영속성 컨텍스트에 이미 있으니 DB에서 가지고 온것을 '버리자!!!' 하고 그냥 앞의 프록시 객체를 사용을 하는건가요? 제가 이해한게 맞나여? 강사님

  • java
  • JPA
윽이럴뚜가 댓글 1 좋아요 1 조회수 589

SecurityContextHolder 관련해서

미해결

스프링 시큐리티

안녕하세요. 강의보면서 질문이 있어 문의 드립니다. (섹션 4. 실전프로젝트 - 인증 프로세스 Ajax 인증 구현) ------------------------------------------------------------------------------------------------------ SecurityConfig 구현은 http.csrf().disable(); 이렇게 설정하고 임의로 CustomUserDetails details = (CustomUserDetails) userDetailsService.loadUserByUsername("userId"); SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(details.getUserInfo(), null, details.getAuthorities())); 사용자 정보를 넣어 (디버깅으로 사용자 조회하여 데이터 들어가는것까지 확인했습니다. authorities 는 ROLE_USER) ------------------------------------------------------------------------------------------------------ 사용하고자 하는 서비스에서 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 호출하여 사용자 정보를 가져오려고 하는데 anonymous_user 라고 나오네요. SecurityConfig 에서 넣은 사용자 정보도 없고요. 강제로 인증되어 사용자 정보까지 가져오려면 어떻게 해야 할까요? ------------------------------------------------------------------------------------------------------ 이렇게 하는 이유는 개발환경에서만 security를 풀어 SecurityContextHolder 를 사용하는 다른 곳에서 security 를 동작했을때와 같은 환경으로 사용하고자 합니다.

  • spring-boot
  • Spring Security
  • java
전정환 댓글 1 좋아요 0 조회수 1200

테스트 exception 관련 질문 입니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하십니까 선생님의 강의 정말 유익하게 잘 보고 있습니다. 다름이아니라 상품주문 test 를 하게되면 ==== 오류 org.springframework.dao.InvalidDataAccessApiUsageException: id to load is required for loading; nested exception is java.lang.IllegalArgumentException: id to load is required for loading 이런식으로 납니다.그래서 id가 자동으로 생성이 안되는내용이라서 @GenereatedValue 가 이미 Item 에 id 에 선언되어있고 혹시나 해서 setId로 id 값 지정후 해보니 그다음으로는 == 오류 전문 java.lang.NullPointerException at jpabook.jpashoop.service.OrderService.order(OrderService.java:41) at jpabook.jpashoop.service.OrderService$$FastClassBySpringCGLIB$$f6e85b24.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at jpabook.jpashoop.service.OrderService$$EnhancerBySpringCGLIB$$ac50f3a2.order(<generated>) at jpabook.jpashoop.service.OrderServiceTest.상품주문(OrderServiceTest.java:44) 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:686) 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$6(TestMethodTestDescriptor.java:212) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) 이런식으로 NullPointEception 이 일어납니다. 혹시 이렇게 되면 item class가 문제인지 또는 service 와 repository 문제인지 혹시 알고싶습니다.

  • JPA
  • spring
  • java
  • spring-boot
  • 웹앱
민경재 댓글 4 좋아요 2 조회수 1387

team에서 member를 add할 이유가 이해가안갑니다.

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

어차피 조회만 가능하고, add 해봤자 무반응일텐데 왜 주인이 아닌쪽에서 regist가 아닌 add 작업을 꼭 해서 양방향성을 유지하는지....ㅠㅠ

  • JPA
  • java
윽이럴뚜가 댓글 2 좋아요 5 조회수 328

라이브러리 인식 오류

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

이클립스 환경인데요, build과정에서 오류가나서 프로젝트를 지우고 다시 불러왔는데 아예 gradle 라이브러리 인식을 못합니다.. ㅠㅠ 구글링을 엄청했는데도 못고쳐서 진도를 못나가고 있어요 The import org.springframework cannot be resolved 오류이름은 이거에요

  • MVC
  • java
  • spring-boot
  • spring
hyun 댓글 3 좋아요 0 조회수 591

@Transactional 애노테이션 질문

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@Transactional 애노테이션만 붙이면 jpa기본편에서 배웠던 대로 해당 메소드를 아래와 같이 감싸서 실행하게 되는건가요? tx.begin() try { --- 메소드 실행 --- tx.commit() } catch (Exception e) { tx.rollback() } finally { em.close() } emf.close()

  • JPA
  • 웹앱
  • java
  • spring
  • spring-boot
E mergency 댓글 2 좋아요 3 조회수 259

(해결완료) 코드 변경사항 있습니다. 참고들 하세요!

미해결

스프링 시큐리티

package io.security.basicsecurity.security.provider; import io.security.basicsecurity.security.common.FormWebAuthenticationDetails; import io.security.basicsecurity.security.service.AccountContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.Transactional; @Slf4j public class FormAuthenticationProvider implements AuthenticationProvider { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; public FormAuthenticationProvider(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } @Override @Transactional public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = (String) authentication.getCredentials(); AccountContext accountContext = (AccountContext) userDetailsService.loadUserByUsername(username); if(!passwordEncoder.matches(password, accountContext.getAccount().getPassword())) { throw new BadCredentialsException("Invalid Password"); // throw new BadCredentialsException("BadCredentialsException"); } String secretKey = ( (FormWebAuthenticationDetails) authentication.getDetails() ).getSecretKey(); // FormWebAuthenticationDetails formWebAuthenticationDetails = (FormWebAuthenticationDetails) authentication.getDetails(); // String secretKey = formWebAuthenticationDetails.getSecretKey(); if(secretKey == null || ! secretKey.equals("secret")) { // if(secretKey == null || !"secret".equals(secretKey)) { throw new IllegalArgumentException("invalid Secret"); // throw new InsufficientAuthenticationException("InsufficientAuthenticationException"); } return new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities()); // UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities()); // return authenticationToken; } @Override public boolean supports(Class<?> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); // return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } }

  • spring-boot
  • Spring Security
  • java
강프로그래머 댓글 1 좋아요 5 조회수 721

안녕하십니까? 도메인 설계시 인터페이스, 추상클래스 에 대한 의견을 듣고 싶습니다.

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하십니까? 강의 영상 모두 결제해서 잘 보고 있습니다. 바로 본론부터 말씀 드리면, 회사에서 여러개의 프로젝트를 준비하고 있고 그중 자주 쓰이는 공통적인 기능을 ( 회원, 게시판 등 ) 만들어 놓고 프로젝트마다 재활용하여 시간을 단축하자는 의견이 나왔습니다. 그래서 JPA 에서 사용하는 entity 도 인터페이스와 추상클래스를 사용해서 설계를 해보라고 해서 진행중에 있습니다. 들어가기 앞서, 스프링 프로젝트의 코드를 살펴보면 인터페이스를 잘 사용해서 설계를 잘 했다고 생각하고 있습니다.그러나 데이터베이스와 직접적인 연관이 없는 코드라서 자유롭게 쓸수 있었던것 같은데요. JPA 를 쓰고 있는 입장에서 인터페이스와 추상클래스를 사용해서 다형성을 구현할려고 할때마다 한계에 자꾸 봉착하는 느낌이 듭니다. 결국 도메인 클래스는 CRUD 가 중요한데, 인터페이스로는 실제 구현된 클래스가 뭔지 알수 없어 사용하기가 난감합니다. Item 과 Book 과 같이 강하게 결합 하는것에 대해서는 어느정도 수긍이 갑니다만, 거의 대부분은 그렇게 강하게 연결되는 경우가 잘 없는거 같아서요. 인터페이스를 쓰는경우도 잘 못본거 같습니다. 실무에서는 인터페이스와 추상클래스를 어느 정도 까지 사용하는지궁금합니다.

  • java
  • JPA
  • 웹앱
  • spring-boot
  • spring
구본수 댓글 3 좋아요 15 조회수 1903

(해결완료) FormAuthenticationProvider 클래스가 이전에 작성했던 CustomAuthenticationProvider 클래스였네요;

해결됨

스프링 시큐리티

1. 클래스명 CustomAuthenticationProvider -> FormAuthenticationProvider 변경되었습니다. 2. class 위에 @Slf4j 애노테이션이 추가되었습니다. 3. public FormAuthenticationProvider 생성자가 추가되었습니다. 4. authenticate 메서드 위에 @Transactional이 추가되었습니다. 다른분들은 저처럼 혼란스러워서 저번 강의 다시 보시지 않기를.. ---------------------------------------------------------- 5. SecurityConfig 클래스에 authenticationProvider 메서드에 passwordEncoder() 매개변수가 추가되었습니다.

  • Spring Security
  • spring-boot
  • java
강프로그래머 댓글 1 좋아요 11 조회수 405

인기 태그

인프런 TOP Writers

주간 인기글