묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
FormLogin과 Oauth2Client 둘 중 사용하는 시점
안녕하세요 FormLogin, Oauth2Client 설정 중에서요FormLogin을 설정하면 인가, 사용자 리소스까지 바로 가져올 수있고 Oauth2Client는 인가까지만 해주는데둘 중에 어떤 상황에 해당 설정들을 사용해야하는지 헷갈려서 질문드립니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP파일 문제
jsp 파일이 강의 처럼 뭔가 안뜨고 자바 클래스 import도 안했는데 빨간색이 안뜨네요. 단순히 입력만되는 창이 됐는데 어떻게 해결할 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
수동 빈과 자동 빈이 충돌될 때 로그에 overriding is disabled라고 남습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 섹션 7. 컴포넌트 스캔 - 중복 등록과 충돌 강의를 실습하던 중 @Component public class MemoryMemberRepository implements MemberRepository{} @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { @Bean(name = "memoryMemberRepository") public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } } 이러한 경우 자료에서는 "수동 빈 등록이 우선권을 가져서 수동빈이 자동빈을 오버라이딩 해버린다." 라고 나와 있습니다. 근데 제 콘솔 로그에는 09:37:26.010 [main] WARN o.s.c.a.AnnotationConfigApplicationContext --Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memoryMemberRepository' defined in class path resource [hello/core/AutoAppConfig.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=autoAppConfig; factoryMethodName=memberRepository; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [hello/core/AutoAppConfig.class]] for bean 'memoryMemberRepository' since there is already [Generic bean: class [hello.core.member.MemoryMemberRepository]; scope=singleton; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null; defined in file [/Users/g.u/logInDev/T.I.L/spring/basic/codebase/core/build/classes/java/main/hello/core/member/MemoryMemberRepository.class]] bound. (...생략....) The bean 'memoryMemberRepository', defined in class path resource [hello/core/AutoAppConfig.class], could not be registered. A bean with that name has already been defined in file [/Users/g.u/logInDev/T.I.L/spring/basic/codebase/core/build/classes/java/main/hello/core/member/MemoryMemberRepository.class] and overriding is disabled. Action: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true오버라이딩을 원하면 추가 옵션을 세팅하라고 나와있습니다. 이 경우에는 오버라이딩이 된게 아니고 스프링이 중단되었다고 판단됩니다. 혹시 강의에서는 추가로 옵션을 세팅한건 지 아니면 제가 잘못 코드를 작성한건 지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
연관관계 관련 질문 있습니다.
public void returnBook(String bookName) { UserLoanHistory targetHistory = this.userLoanHistories.stream() .filter(history -> history.getBookName().equals(bookName)) .findFirst() .orElseThrow(IllegalArgumentException::new); targetHistory.doReturn();리팩토링 강의에서 repository 사용없이 this.userLoanHistories.stream()로 바로 데이터를 불러오던데 mappedBy로 연관관계가 존재하면 가능한건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 자료 위치
[질문 내용]선생님께서 html코드를 복사하고 강의 중간중간 설명해주시는 강의 자료는 어디에서 찾을수있나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
체크 예외 -> 런타임 예외 변환 시 생성자
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]서비스 계층의 순수성을 위해 체크 예외를 런타임 예외로 변환해서 던지고, 런타임 예외로 변환 시 반드시 기존 체크 예외를 포함하여 던져야 한다.왜냐하면 예외 발생 시 어떤 예외 때문에 해당 예외가 발생했는지 스택 트레이스를 참고하기 위해서이다. 그러면 차라리 런타임 예외 클래스의 생성자에서 예외를 포함하도록 강제하면 예외를 포함하여 던져야 한다. 는 부분이 해결 될 것 같은데요강의에서는 다음과 같이 파라미터가 없는 기본 생성자를 만드는 특별한 이유가 있는 것인지 아니면 중요한 주제가 아니라 남기셨는지 궁금합니다. public class MyDbException extends RuntimeException { public class MyDbException() { // 이 부분을 없애고 다음의 생성자만 남김 } public class MyDbException(Throwable cause) { // 이 생성자만 강제하면 반드시 예외를 포함하여 던져야 하므로 문제가 해결됨 } }
-
미해결스프링 핵심 원리 - 고급편
스프링부트 3.0 이슈에 대한 정리
'프록시패턴과 데코레이터패턴.pdf' p.7 하단의 설명을 이해하는데 시간이 많이 걸렸습니다.다른 수강생분들도 참고하실 수 있도록 정리했습니다. 부트3.0버전에서 나타나는 현상위 상황에서 http://localhost:8080/v2/request?itemId=hello 으로 접근하면 아래와 같은 결과가 나옵니다. 수동등록하여 컨트롤러 Bean이 생성됐다 하더라도위 @RequestMapping 만으로 컨트롤러 로 '인식' 할 수 없음 (부트 3.0부터) 개선 1 (부트3.0)@RequestMapping 과 @ResponseBody ==> @RestController 로 교체시도이렇게 만들면 컨트롤러 로 '인식'할 수 있다.하지만 아래처럼 빈충돌로 애플리케이션 구동자체가 안된다.(@RequestMapping 을 쓰던 이전에는 컴포넌트 스캔이 대상이 아니여서 자동구성 빈이 생성되지 않았고오직 수동구성 빈만 생성됐음)(@RestController로 변경하면서 컨트롤러로 인식하게 됐지만자동구성으로 빈이 등록돼버리고 , 수동구성 빈 등록으로 덮어쓰기를 시도하려하지만 스프링부트는 스프링과 달리 이것을 허용하지 않고 빈충돌 에러를 발생시킴) 위 현상은 v1, v2에서만 발생한다. ('수동구성으로 진행되도록 유도된 예제'에서 불청객으로 자동구성이 발생)반면 v3에서는 발생하지 않는다. (자동구성으로 진행됐기 때문) 따라서 자동구성 대상이 되지 않도록 v3 패키지경로를 컴포넌트스캔지정하여 v1, v2를 스캔대상에서 제외시킨다. 개선 2 (부트3.4)@RequestMapping 과 @ResponseBody ==> @RestController 로 교체이렇게 만들면 컨트롤러 로 인식할 수 있다.위 개선1과 달리 빈충돌없이 애플리케이션 구동이 잘 된다. (빈이 덮어써지게 3.4는 개선됐나보다)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DI 적용 중 순환 참조 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]FrontControllerServletV5 에서 의존성 주입을 도전해보려고 다음과 같이 코드를 작성했습니다.FrontControllerServletV5에 HandlerMappingConfig, HandlerAdapterConfig를 이용하여 handlerMappingMap, handlerAdapter를 생성자를 통한 의존성 주입을 시도했습니다.FrontControllerServletV5@RequiredArgsConstructor @WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map<String, Object> handlerMappingMap; private final List<MyHandlerAdapter> handlerAdapters; @Override protected void service(HttpServletRequest request, HttpServletResponse response) //... }HandlerMappingConfig@Configuration public class HandlerMappingConfig { @Bean public Map<String, Object> handlerMappingMap() { Map<String, Object> handlerMappingMap = new HashMap<>(); handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4()); return handlerMappingMap; } }HandlerAdapterConfig@Configuration public class HandlerAdapterConfig { @Bean public List<MyHandlerAdapter> handlerAdapters() { List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); handlerAdapters.add(new ControllerV3HandlerAdapter()); handlerAdapters.add(new ControllerV4HandlerAdapter()); return handlerAdapters; } }하지만 다음과 같이 순환 의존성 에러가 발생했는데, 원인을 찾지 못하고 있습니다.정규 빈과 내부 빈이 서로 의존하고 있다는 것인가요..? 다른 수강생 분들의 코드와 다르게 작성해보려고 했는데, 이 에러가 발생해서 원인을 찾아보려고 했지만 찾지 못했습니다, 왜 발생한 것인지 도움 부탁드립니다..The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | frontControllerServletV5 ↑ ↓ | (inner bean)#61a91c9b defined in file [.../hello/servlet/web/frontcontroller/v5/FrontControllerServletV5.class] └─────┘
-
미해결스프링 핵심 원리 - 고급편
스프링부트 3.0 이슈에 따른 컴포넌트 스캔 패키지경로
안녕하세요.위 문제에서 패키지를 v3까지 디테일하게 지정을 했는데요.hello.proxy.app.v1 와 hello.proxy.app.v2 관점에서는 어떻게 해석할 수 있는지 궁금합니다. v3는 스프링부트3.0 이전과 이후 달라진 이슈에 영향을 받지 않아보입니다.v1, v2는 어떤 영향을 받는 것인지 알 수 있으면 전체적으로 이해가 될 것같아 질문드립니다.(v1, v2에는 @Controller, @RestController가 없습니다.따라서 빈 자동등록은 부트3.0 이전 이후 모두 동작하지 않을 것으로 기대됩니다)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
[다른 질문 파생 질문] DI 적용 시 순환 의존성 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]다른 질문들 중에 "DI 적용해보기"라는 질문과 답변을 보고 저도 DI 적용을 해보려고 했습니다.그런데 일급 컬렉션을 사용했을 때는 발생하지 않는 순환 의존성이 일급 컬렉션을 사용하지 않을 때는 발생하는데 혹시 이유를 알 수 있을까요? 제가 참고했던 코드는 아래에 있습니다.https://www.inflearn.com/community/questions/1251450/di-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0
-
미해결스프링 핵심 원리 - 고급편
스프링로드맵2 스프링기본편의 구성과 사용분리
안녕하세요. 스프링로드맵 2 스프링기본편 강의에서 MemberServiceImpl가 MemoryMemberRepository구현에 강결합되는 상황을 제시해 주셨습니다.이후 아래 그림과 같이 인터페이스 MemberRepository에만 의존하게 끔 설계를 해주셨는데요. 이 때 AppConfig가 등장합니다.public class AppConfig { public MemberService memberService(){ System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } public OrderService orderService(){ System.out.println("call AppConfig.orderService"); return new OrderServiceImpl( memberRepository(), discountPolicy()); } }위 코드를 설명하실 땐 구성 이라고 표현하셨는데요. (구성과 실행을 분리) 이것도 전략패턴이라고 말할 수 있나요? 전략패턴에서는 구성대신 조립 이란 설명으로 다르게 표현하셨습니다.
-
미해결스프링 부트 - 핵심 원리와 활용
커넥션 팬딩 질문
이런 팬딩 상황이 많은 사용자 접근으로 인해 흔히 서버가 터졌다는 상황인건가요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
하이버네이트 버전
이 강의에서 hibernate버전 6을 쓰지 않는 이유가 있나요? 5랑 6 버전 차이가 많이 나나요?
-
미해결스프링 핵심 원리 - 기본편
스프링 빈
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]앞 전 수업까지는 @bean을 메서드에 적어주어서 메서드만 빈으로 등록을 하는건줄 알았습니다.이번 수업에서는 @Compent를 클래스 적어주어 빈을 등록한다고 하였는데 클래스를 빈으로 등록하는 것과 메서드를 등록하는것은 무슨차이인가요?클래스를 @Compent를 이용하여 빈으로 등록하면 클래스의 메서드들과 필드 모두 빈으로 등록되는건가요?
-
미해결스프링 부트 - 핵심 원리와 활용
스프링부트가 설정파일을 인식하는 방법(application.properties 파일이름)
[application.properties 파일이름]1. 해당 파일 이름을 스프링 부트가 어떻게 설정 파일인지 알고서 설정하는 것인가요? 설정 파일명을 변경하고 싶으면 어떻게 해야하는지 궁금합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
공식 문서 링크 변경된 것 같습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]9. 스프링 트랜잭션 이해.pdf(v20240526) 32페이지에 나온 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-source-replica-replication-connection.html이 링크는 Page Not Found가 뜹니다.https://dev.mysql.com/doc/connector-j/en/connector-j-source-replica-replication-connection.html이 링크로 바뀐 것 같습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
<빌드하고 실행하기>0:20
<빌드하고 실행하기>0:20 에서 뜨는 화면이 어떤 화면일까요..??ㅠㅠ 그냥 폴더창켜서 폴더 만들고 하는 것과 같을까요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
hibernate.core 버전 변경
안녕하세요 hibernate.core의 버전 변경과 관련되서 질문드립니다.아래 코드와 같이 영한님이 말씀해주신 부분을 추가하고plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' ext["hibernate.versioin"] = "5.6.5.Final" configurations { compileOnly { extendsFrom annotationProcessor } }Gradle을 다시 로드했는데요 여전히 5.6.7 버전으로 구성되어 있습니다.버전이 바뀌지 않는데 어떻게 해야하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
utf-8 해결 이후 오류 질문입니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]utf-8 오류 나는 건 해결해서 테스트 성공 뜨긴 했는데 Mockito 오류가 뜨긴 합니다... 무시해도 되는걸까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 전반에 대해 잘 이해한것이 맞는지 여쭙니다
요청 시에 쿼리 파라미터가 아닌 HTTP body를 받게되면Dispatcher Servlet 에서 Argument Resovler를 통해 해당 파라미터에 대응되는 HTTP Message Converter를 찾아 객체를 생성하여 Controller로 넘긴다. 응답 시에해당 응답이 ResponseBody일 경우RetunValueHandler에서 해당 응답의 클래스 타입과 Accept 미디어 타입을 대조하여 HTTP Message Converter를 찾아 응답 결과를 Body에 작성 해당 응답이 View를 반환할 경우ViewResolver가 동작하여 HTML을 작성하여 반환 하는것으로 이해하면 될까요?그리고 ArgumentResolver와 ReturnValueHandler는 둘다 Adapter 패턴을 사용하여 맞는 HTTP Message Converter를 사용하는것인가요?