묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
수동으로 빈 등록하는 부분에서 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Slf4j @Configuration @Import({AppV1Config.class, AppV2Config.class}) public class BeanPostProcessorConfig { @Bean public PackageLogTracePostProcessor logTracePostProcessor(LogTrace logTrace) { return new PackageLogTracePostProcessor("hello.proxy.app", getAdvisor(logTrace)); } private Advisor getAdvisor(LogTrace logTrace) { //pointcut NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut(); pointcut.setMappedNames("request*", "order*", "save*"); //advice LogTraceAdvice advice = new LogTraceAdvice(logTrace); return new DefaultPointcutAdvisor(pointcut, advice); }위와 같이 코드를 작성하셨을 때, @Import 코드가 잘 이해가 안됩니다 "AppV1Config와 AppV2Config는 수동으로 스프링 빈으로 등록해야 동작한다" 근데 AppV1Config와AppV2Config 코드를 보면 아래와 같습니다.근데 @Configuration이 붙은 클래스는 컴포넌트 스캔의 대상이 되고, 필드에 있는 @Bean이 붙은 메소드의 반환 값은 빈으로 자동 등록된다라고 이해를 하고있었습니다. 근데, 강사님께서 말씀하신 "@Import로 수동으로 빈으로 등록한다"라는 부분이 잘 이해가 안됩니다. 설명 부탁드립니다 ! @Configuration public class AppV1Config { @Bean public OrderControllerV1 orderControllerV1() { return new OrderControllerV1Impl(orderServiceV1()); } @Bean public OrderServiceV1 orderServiceV1() { return new OrderServiceV1Impl(orderRepositoryV1()); } @Bean public OrderRepositoryV1 orderRepositoryV1() { return new OrderRepositoryV1Impl(); }@Configuration public class AppV2Config { @Bean public OrderControllerV2 orderControllerV2() { return new OrderControllerV2(orderServiceV2()); } @Bean public OrderServiceV2 orderServiceV2() { return new OrderServiceV2(orderRepositoryV2()); } @Bean public OrderRepositoryV2 orderRepositoryV2() { return new OrderRepositoryV2(); }여기에 질문 내용을 남겨주세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스 연결
h2 데이터베이스 연결이 자꾸 안된다고 뜹니다...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)
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
react 소스 부탁드립니다.
강의 너무 잘 보고 있습니다.강의를 진행하면서 그냥 따라하는것보다는이건 이렇게도 해보고 저건 저렇게도 해보면서 배움을 진행 하는게 좋을 것 같아요청 드립니다 ㅎ좋은 강의 감사합니다.jhr7124@naver.com
-
미해결스프링 핵심 원리 - 기본편
웹과관련된부분이 머에여?
여기서 중요한점이 있다. request scope를 사용하지 않고 파라미터로 이 모든 정보를 서비스 계층에 넘긴다면, 파라미터가 많아서 지저분해진다. 더 문제는 requestURL 같은 웹과 관련된 정보가 웹과 관련없는 서비스 계층까 지 넘어가게 된다. 웹과 관련된 부분은 컨트롤러까지만 사용해야 한다. 서비스 계층은 웹 기술에 종속되지 않고, 가급적 순수하게 유지하는 것이 유지보수 관점에서 좋다.request scope의 MyLogger 덕분에 이런 부분을 파라미터로 넘기지 않고, MyLogger의 멤버변수에 저장해서 코드와 계층을 깔끔하게 유지할 수 있다. <-이부분이 이해가 안되여 ㅠ 웹과관련된 정보라는게 머에여? public void logic(String id) { myLogger.log("service id = " + id); 이부분도 웹과관련된부분 아닌가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@GeneratedValue 전략
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@GeneratedValue 에서 따로 strategy 전략을 안주면 AUTO로 설정되고 jpa에서 pk 순서?를 관리해주는걸로 알고있는데몇번 post man으로 API 요청을 날리다보니 member_id 가 1,2까지 순차적으로 증가하다가 갑자기 52번으로 뛰었어요. 그래서 member_seq 테이블의 값을 3으로 수정해줬는데 다시 api 호출을 해보니 음수로 바뀌었습니다. 이부분이 이해가 안가는데 pk 값을 어떤식으로 동작? 관리 하는지 알려주시면 감사하겠습니다. 그리고 이 방식은 항상 순차적인 값으로 증가가된다는 보장이 없는것 같은데 AUTO 로 사용해도 되는지 궁금합니다.참고로 db는 Mysql 사용했습니다. .
-
미해결스프링 핵심 원리 - 기본편
count1과 count2가 값이 다른이유
@Test void singletonClientUsePrototype(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class,ClientBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(2); assertThat(clientBean1).isEqualTo(clientBean2); System.out.println("clientBean1 = " + clientBean1); System.out.println("clientBean2 = " + clientBean2); System.out.println("count1 = " + count1); System.out.println("count2 = " + count2); }clienBean1=clientBean2는 싱글톤으로 같은걸 알았는데왜 count1과 count2는 값이 다른건가요?? count1에서 count2는 공유가되서 2가 되었는데 count2에서 count1은 공유가 안된건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요
안녕하세요깃허브 부분까지도 다 듣고, 깃허브에 README기능을 알게되어 어떤 기능이 있는지 등을 간단히 적어두었는디 괜찮을까요?또한 깃허브에 계속 올려놔도 되는건지 궁금합니다(저작권 때문에여!)
-
미해결Practical Testing: 실용적인 테스트 가이드
Spring REST Docs 관련 질문 사항
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! 강의 유용하게 잘 보고 있습니다.테스트 기반 문서에 대해서 의문점이 있어 질문 드립니다. 기존에 작성한 MockMVC를 활용한 Controller단 테스트는, REST Docs를 사용하기 위해 만든 테스트가 있다면 중복되는 테스트는 제외를 해도 관계가 없을까요?예시로, 정상 Case 테스트와, 예외 Case (비교적 다수) 가 하나의 API에 테스팅 될 것 같은데, 정상 Case 테스트만 RestDocs로 운용, 나머지 예외 케이스는 Mocking 하여 별도의 Test 진행.아니면 controller 테스트는 Docs로 구분, 정상케이스만 .andDo(...) 적용하여 같은 테스트 파일에 포함되도록 설정 등등... REST Docs의 가장 큰 장점은 테스트가 완료된 API End Point만 명세화되어서 작성 된다고 느껴졌습니다. 테스트 코드를 통과해야 merge가 가능하도록 branch 전략을 수립하거나, CI/CD 과정에 포함시키는 등을 진행하면 Swagger를 통한 명세 작성에 비해 떨어지는 접근성을 지닐 수도 있다고 생각합니다.다만, 테스트코드의 강제성 부분에서는 장점이 있다고 생각되는데 혹시 다른부분의 장점이 또 있을까요?테스트 코드 작성 부분이 많이 약해 도움받을 목적으로 강의를 수강하게 되었는데, 많은 부분에서 도움을 받은 것 같습니다. 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
CoreApplication 실행 시 무한 로딩
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용][ MyLogger.java ] 코드package hello.core.common; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.UUID; @Component @Scope(value = "request") public class MyLogger { private String uuid; private String requestURL; public void setRequestURL(String requestURL) { this.requestURL = requestURL; } public void log(String message) { System.out.println("[" + uuid + "]" + "[" + requestURL + "]" + message); } @PostConstruct public void init() { uuid = UUID.randomUUID().toString(); System.out.println("[" + uuid + "] request scope bean create:" + this); } @PreDestroy public void close() { System.out.println("[" + uuid + "] request scope bean close:" + this); } }[ LogDemoController.java ] 코드package hello.core.web; import hello.core.common.MyLogger; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }[ LogDemoService.java ] 코드package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class LogDemoService { private final ObjectProvider<MyLogger> myLoggerProvider; public void logic(String id) { MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } } [ build.gradle ] 코드plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' //lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProcessor } } //lombok 설정 추가 끝 java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' //web 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'jakarta.inject:jakarta.inject-api:2.0.1' //lombok 라이브러리 추가 시작 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //lombok 라이브러리 추가 끝 testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } ObjectProvider를 사용하면서 부터 CoreApplication을 실행하면 Negative Match 가 뜨면서 아래에ActiveMQAutoConfiguration: Did not match: - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) AopAutoConfiguration.AspectJAutoProxyingConfiguration: Did not match: - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition)이러한 오류들이 뜹니다.IntelliJ는 무료버전이므로 build and run은 Gradle로 설정해놓은 상태입니다. 어떻게 해야 정상작동할까요...
-
미해결Practical Testing: 실용적인 테스트 가이드
실제 비즈니스에서 createOrder() 오버로딩에 관한 질문
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! 강의를 듣는 중에 createOrder() 메소드에 관한 궁금한 점이 생겨 질문드립니다.좋은 예시와 설명으로 테스트를 어렵게 코드들을 외부로 빼서 테스트를 쉽게할 수 있게 하는 점을 잘 이해했습니다.그런데 강의에서 파라미터 주입으로 변경한 createOrder(LocalDateTime ) 메소드는 사실상 다른 비즈니스 클래스에서 사용한다고 했을 때 모두 LocalDateTime.now()을 파라미터로 사용할 것으로 생각됩니다.그래서 저렇게 파라미터로 뺀 경우 createOrder() 메소드를 사용하는 다른 비즈니스 클래스에선 불필요한 코드 반복이 발생할 수 있을 것 같고 또 개발자가 LocalDateTime.now() 대신 잘못된 값을 넣을 수 있게 되니 잠재적으로 예기치 못한 동작을 유도할 수도 있을 것 같다는 생각이 드는데 이런 부분들은 어떻게 생각하시는지 궁금합니다..!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
메서드 2번 호출 건에 대하여
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]service에 한해서만 apo를등록해보았는데요, 서비스뿐만아니라 모든 메서드에서 2번호출이 일어나는데 이건 웹에서 2번호출을 한거라고 보면될까요?조회 페이지 버튼을 눌렀을때 디버깅을 찍어봤는데 MemberService의 findMember메서드에 2번 들어오더라고요
-
미해결스프링 프레임워크 입문
./mvnw spring-boot:run 명령어 실행과 spring-boot:run 파일 더블클릭 실행
두 방법의 차이점이 무엇인가요? ./mvnw spring-boot:run 명령어는 잘 실행되지만 더블클릭 실행은 실행이 안되네요.
-
미해결토비의 스프링 6 - 이해와 원리
paymentService를 호출 할때 new로 생성한다면
paymentService를 호출 할때 new로 생성한다면, 매번 new로 생성해야 해서 리소스가 많이 투여 되지 않을까요?기존에는 @Autowired를 통해 service를 호출해왔는데, autowired를 사용할 때에도 new PaymentService(new WebApiExRateProvider) 이렇게 사용해야 할까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validation 질문
[질문 내용]강의중에 bean validation을 활용을 하면 직접 validator을 이용한것보다 쉽게 되는거는 이해가 됩니다다만 특정 필드가 아닌 복합검증시에는 validator을 활용한 검증이 필요하다고 생각이 됩니다그러면 프로젝트를 보통 구현할떄 bean validation과 validator을 동시에 구현을 통해서 검증을 거치는 과정을 가지나요?.
-
미해결토비의 스프링 부트 - 이해와 원리
SimpleCacheConfiguration과 빈 등록
안녕하세요! 수업을 듣다 질문이 생겨서요! SimpleCacheConfiguration의 Condition Report가 Positive한 것 까지는 이해가되는데요! 그안에, @Bean의 파라미터를 보면, CacheProperties와 CacheManagerCustomizers가 있더라구요! 제 생각에는 해당 값들이 없을 때는 Bean등록이 되지않고 에러가 나는게 아닐까 싶은데, 에러가 나지않더라구요!문서를 찾아 읽어보니, @EnableCaching과 함께 사용할 때 SimpleCacheConfiguration에 있는 Bean을 주입받을 수 있던데, @EnableCaching이 없이도 어떻게 SimpleCacheConfiguration이 에러가 없는지 궁금합니다!
-
미해결스프링 부트 - 핵심 원리와 활용
5장 자동구성) 자동 구성이 내부에서 컴포넌트 스캔을 사용하면 안되는 이유
자동 구성이 내부에서 컴포넌트 스캔을 사용하면 안되는 이유가 무엇인가요? 컴포넌트 스캔을 사용하면 패키지 구조에 의존적이게 돼서 그런걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
해당 작업을 따로 tool을 설치해야 하는건가요?
아래와 같이 명령어를 입력해야 하는데 따로 tool을 설치해서 명령어 입력인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
localhost8080 오류
코드를 복붙해도 404 오류가 뜨는데제가 코드를 작성할때 삼성 ssd 카드에서 불러와 코드를 작성합니다 혹시 내 컴퓨터가 아닌 ssd에서 코드를 작성하고 실행하면 경로를 못찾아서 오류가 뜰수있나요? 포스트맨도 경로를 못찾는것같고 git push도 안되는것같습니다.어떤건 오류가 안뜨고 어떤건 뜨고 잘 모르겠습니다확실한건 이번 강의때는 오류가 항상났습니다 /domain과 같이뒤에 붙여주면 안되는것같습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
어노테이션 적용이 안되요...
어노테이션 적용이 안됩니다..자바는 17로 컴파일 했습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
javadoc 사용법이 따로 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]22:34초 경에 영한님 같은 경우에는 초록색 글씨로 주석이 자동 작성되어있는걸 볼수 있는데요 저 같은 경우에는 이렇게 초록색 글씨 없이 표시되는데 인텔리제이 ultimate버전은 지원하지 않는 기능인가요?? 영한님은 엔터프라이즈 버전을 쓰셔서 나오는걸까요? 아니면 따로 설정이 있는걸까요??