안녕하세요, 강의 잘 듣고 있습니다. 다름이 아니라 '애플리케이션 아키텍처' 강의를 듣다가 평소에 별 의식없이 해왔던 계층(컨트롤러, 서비스, 리포지토리)간 참조에 대해 궁금증이 생겨 질문드립니다. 일반적인 설계방식인 컨트롤러, 서비스, 리포지토리 계층으로 이어지는 아키텍처는 단방향으로 참조하는 것이 바람직한가요? 컨트롤러 -> 서비스 -> 리포지토리 // 단방향으로만 참조하도록 해야하나요
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 수업시간에 선생님께서 보시는 베어 정리본은 어디서 볼 수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] start.spring.io 에서 강의 와 다른 스프링부트 버전 3.2.3 으로 했고 packaging = jar ,java 버전 21 로 설정을 했습니다. 인텔리 제이에서 실행 결과 id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' 두개의 플러그인을 찾을수 없다고 뜨는데 무슨 문제 일까요?
안녕하세요. password grant type 으로 인증서버를 구현하고 싶은데 oauth2 authorization server 최신 버전인 1.1.5 에서는 deprecated 되어있어서 영상과 같이 0.3.1 버전으로 했는데 unsupported grant type 이라고 나옵니다. 쓸 수 있는 방법이 있을까요? 다른 질문에서 답변으로 TokenEndpointConfigurer 에 있는 api 를 다루면 password 타입을 다룰 수 있다고 하신거같은데 맞을까요?! 아니면 authorize_code 방식에서 로그인 페이지를 리다이렉트를 하지 않고 바로 처리할 수 있는 방법이 있을까요? 혹시 사내 서비스 여러개가 있을 때 로그인 기능만 빼서 로그인해주는 로그인 서버를 구축하려고 하는데 더 좋은 방법이있을까요? oauth2 방식 말구요!
안녕하세요! 수업 강의 내용은 아니지만 연관이 있는 질문입니다! OAuth Client와 Resource server가 하나의 서버에 있어도 되나요? 제가 토이 프로젝트를 구성하고 있습니다. 소셜 로그인 기능을 넣으려고 이것저것 설계하다 보니까 백엔드 서버에 OAuth2 Client와 Resource server 설정이 같이 있어야 하겠더라고요. Resource server 설정이 필요한 이유는, jwt 검증 때문입니다. 예를 들어 구글에서 발급받은 액세스 토큰을 프론트엔드로 반환해줄 거고, 프론트엔드(Nextjs)는 헤더에 access token과 함께 요청을 보내겠죠. 이때 백엔드 서버는 jwt 검증을 해야할 것입니다. 수업에 이런 부분을 구두로 말씀하신 건 잘 모르겠는데, 저희 실습에서는 OAuth2 Client에서 Resource server로 요청해보는 건 있었지만 그 둘이 하나의 application.yml에 있는 실습을 하지 않았던 것 같아서요. chat gpt 유료 결제해서 쓰고 있어서 이 부분 가능하다고 답변을 듣긴 했는데 강사님이 맞다고 해주셔야 안심할 수 있을 것 같습니다. 만약..아니라고 하면 사실 많이 혼란스러울 것 같지만 간단한 가이드라도 부탁드려도 될까요..흐름이라도.. 문득 드는 생각은 하나의 application.yml에 OAuth2 Client와 Resource 서버 설정을 다 넣는다 OAuth2Client와 Resource 서버를 모듈을 분리한다. 이 경우에는 프론트에서 요청이 들어왔을 때 OAuth2 Client모듈이 Resource server 모듈에 자원을 요청한다(리소스 서버에서 검증까지) 둘 다 가능하다고 하면 지금 시간이 그리 여유있지 않아 1번으로 가고 싶긴 한데 이게 일반적인 방법인지 궁금합니다. p.s. 새로운 security 6 강의는 언제 올라오나요? 목이 빠졌습니다..ㅋㅋㅋ
[질문 내용] 현재상황 OrderServiceTest에서 상품주문()을 테스트 중입니다. 테스트 중 에러가 나서 코드를 검토해보았는데, @Rollback(false) Annotation이 있었습니다. Rollback(false)자체가 테스트 결과에 직접적인 영향을 줄 수는 없다고 생각하여 무시했었습니다. 그러나 Rollback(false) 어노테이션을 지웠더니 테스트가 정상적으로 작동하였습니다. 궁금한 점 구글링도 해보고, 강의도 다시 들어보았지만 Rollback(false) 어노테이션이 상품주문 테스트 성공/실패에 어떠한 영향을 미치는지 궁금합니다.
안녕하세요 영한님, 정말 좋은강의 잘 듣고있습니다. Merge관련해서 질문이 하나있는데요..! 아래 두 method 모두 시작할때 persistence context가 비어있고 찾는 entity가 db에 있다고 가정할때 비슷한 (혹은 같은) flow로 진행될까요? 여기서 method parameter, Entity e,는 업데이트될 (id가 set되어있고 field가 업데이트 되어있는)객체입니다. @Transactional public void updateEntity(Entity e){ Entity foundEntity = em.find(Entity.class, e.getid()); foundEntity.setFieldOne("New Data"); } @Transactional public void updateEntity(Entity e){ em.merge(e); } Merge를 꼭 써야하는건 아니지만, 그냥 동작 메커니즘이 궁금해서 질문드립니다. Merge를 쓰는게 Update전에 항상 Select query로 db에서 객체를 조회하기때문에 쓰기를 지양하라고 하시는건가요, 아니면 merge를 쓸때 또 다른 downside가 있나요?
안녕하세요. 수업 관련 질의드립니다. 커서와 페이징 처리방식 전제: 커서 기반 리더는 SQL을 한번 실행해 해당 커넥션을 이용해 스트림 처리를 하고, 페이징 기반 리더는 청크 단위로 SQL을 여러번 실행해 데이터를 페이징 단위로 처리합니다. 문제: 그러면 커서기반으로 처리되는 리더는 doRead() 를 호출할 때, 데이터를 하나가져오고, 매핑하고, 다시 iterate해서 데이터를 하나 가져오고 매핑하는 것인가요? 아니면 일단 청크사이즈만큼 가져오고 그 다음 iterate해서 매핑을 하는 것인가요? 질문이유: 저는 전자를 커서방식 후자를 페이징 방식이라고 생각하였는데, 수업 시간에 커서도 데이터를 청크사이즈만큼 가져온다음 Iterate한다고 이해하여 제 인식에 잘못된 것이 있는지, 파악에 오류가 있는지 질의드립니다. 감사합니다.
loadUserByUsername 메서드에서 username 으로 조회잘되고 조회된 MemberDto는 log 출력도 잘되는데 다음 단계에서 "Encoded password does not look like BCrypt" 라는 warn 과 함꼐 "Failed to process authentication request" 로 자격증명에 실패했다고 합니다. DB의 패스워드는 암호화 되어 잘 저장된거 확인됩니다 제가 무언가를 잘못 작성한건지 파라미터로 보낸 password 는 어디서 encode해야 하는건지 아니면 다른 문제가 있는건가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] https://drive.google.com/file/d/1a7F2dfdI4MolHCpjYJRXUYxV1CsSjlsU/view?usp=sharing 위와 같은 코드를 가지고 있었고, 아래와 같은 에러메세지가 나왔습니다. 어떻게 작업을 해야할 지 잘 모르겠어요 java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@46bb0bdf testClass = com.inflearn.hellospring.service.MemberServiceIntegrationTest, locations = [], classes = [com.inflearn.hellospring.HelloSpringApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@23c30a20, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@67f639d3, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@82de64a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@506ae4d4, org.springframework.boot.test.context.SpringBootTestAnnotation@8acbd854], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.Optional.orElseGet(Optional.java:364) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1231) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:949) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1454) at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ... 17 more Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:223) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:191) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:170) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1432) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:388) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:364) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1833) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ... 38 more Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:143) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:348) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:107) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 53 more
@JoinColumn한 쪽이 연관관계의 주인이 되듯 다대다인 상황에서는 @JoinTable이 붙은 엔티티의 속성이 연관관계의 주인이 되는 것으로 이해했습니다. 이해한 것이 맞을까요? 강의에서는 Category를 연관관계의 주인으로 설정하셨는데, 다대다 관계에서도 일대일 관계처럼 연관관계의 주인이 어느쪽이든 상관 없나요? JPA 기본편을 수강하고 와서 다대다를 피해야한다는 것을 알고 있지만 궁금증이 생겨 질문드립니다.
[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
아무리 찾아도 나오질 않아서 여기에 글 남깁니다. 스웨거 ui 에 파라미터 전달 방법에 page integer ($int64) (query) 이렇게 정의되어 있는건 이해가 되는데 cond[addr::LIKE] string ($string) (query) 이렇게 정의되어 있는건 query parameter를 어떤식으로 전달을 해야 하는가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. http://localhost:8080/hello 에 들어가면 에러페이지가 뜹니다. 코드 아무리 봐도 어디가 잘못된 건지 모르겠네요. ㅠㅅㅠ
안녕하세요 강사님 좋은 강의 정말 감사드립니다. user service에서 어떤 요청이 들어오든 AuthenticationFilter 를 거치게 되는 것으로 알고 있는데 login 요청을 제외한 다른 요청들은(ex: health-check, welcome 등) AuthenticationFilter 에 존재하는 attemptAuthentication과 loadUserByUsername 메소드는 실행되지 않고 바로 필터가 통과되는 것인가요? 해당 질문은 msa 라기보다 시큐리티 관련 내용인 것 같아 여기에 질문하는 것이 좀 죄송한데 답변 주시면 정말 감사드리겠습니다. 감사합니다!
@Query("SELECT t From Team t join Fetch t.member m ORDER BY m.name desc") 예를 들어 이런 식으로 Fetch join을 이용해서 연관테이블 리스트를 가져올 때에 정렬해서 가져오고 싶습니다. 검색 등을 통해 해결해보려 했지만 방법을 모르겠네요 ㅠㅠ 만약 @Query가 안된다면 다른 방식으로 가져오는 방법이 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이런 오류가 나오는데 어떻게 해결해야 하나요...ㅠㅠ
섹션 4. 회원 도메인 개발-회원서비스 개발에 대해 질문있습니다. 테스트 junit으로 테스트 실행시 아래와 같은 에러가 나옵니다. Execution failed for task ':test'. > No tests found for given includes: [jpabook.jpashop.Service.MemberServiceTest](filter.includeTestsMatching) package jpabook.jpashop.Service; import static org.junit.Assert.*; import jpabook.jpashop.domains.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; //메모리db로 test import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(savedId)); } // @Test // public void 중복회원예외() throws Exception { // //given // // //when // // //then // // } } 에러 사항을 찾아보니 디렉토리 위치가 다를 경우에 에러가 날 수 있다고 하여 디렉토리 위치를 비교해봐도 같습니다. junit테스트도 동일합니다. 어느 부분이 틀린지 알 수 있을까요?