묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강사님의 동영상처럼 어노테이션을 입력하면 저는 임포트가 안떠요!
강사님처럼 어노테이션을 입력하면, 임포트가 입력이 안되요. 직접 작성해도 web.에서 오류가 걸려요. 무엇인가 설정이 안되었거나 무엇인가 안깔려있는거 같은데, 어떻게 해결해야하나요? 그리고 임포트 단축키좀 알려주세요. ctrl+O인가요?
-
미해결스프링 핵심 원리 - 기본편
주문과 할인 도메인 개발 3:20초에서 Order 클래스 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]3:20에서 Order라는 클래스를 만들어주는데 클래스안에는 calculatePrice 클래스메서드를 만들어주는데, Order의 경우는 Interface로 만들지 않는 이유는 역할과 구현이 각각 무조건 하나이기때문에 만든걸까요? 아니면 다른이유가 있을까요? 예를들어 interface Order { .... 클래스 변수 및 생성자int calculatePrice() }뭐 이런식으로 역할 인터페이스를 만들고 클래스를 만들면서 구현체를 만들지않는 이유가 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
스프링 초반 설정이 안되요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]여기에 질문 내용을 남겨주세요. 해결하기 위해서 인터넷에 쳐서 해봤으나 gradle 관련된 연결된 게 전혀 뜨지 않아서 여쭤봅니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 기본기능 - 주석
타임리프에서 <!—/*..*/—> 주석과 <!—/*/../*/—> 주석 중에서 전자를 더 많이 사용하는 이유와 사용 예시를 알 수 있을까요..?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationManager 사용 방법 HttpSecurity 사용
AuthenticationManager 사용 방법 HttpSecurity 사용에서@Bean 사용으로 CustomFilter를 빈으로 생성하면 안되는 이유가AutenticationManager가 빈이 아니기 때문에 주입받지 못한다고 하셨는데securityFilterChain(HttpSecurity http)메서드에서 AuthenticationManagerBuilder를 통해build() or getObject()사용으로 AuthenticationManager를 가져오고.addFilterBefore(customFilter(autenticationManager))여기서 넘겨주면 파라미터로 AuthenticationManagerf를 받는게 아닌가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
SaveCheck , UpdateCheck
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.제목에 적은 2개의 클래스는 이번 프로젝트에서는 사용하지않는거 맞나요 ?
-
미해결코드로 배우는 스프링 웹 프로젝트 - Basic
인텔리제이 커뮤니티버젼을 진행해도 되나요?
얼티메이트 버젼은 유료버젼으로 알고있는데요.커뮤니티 버젼으로 진행해도 되나요?
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
개선된 아키텍처의 구조
많은 도움을 얻어가는 취준생입니다. 다름아니라 본 영상(레이어드 아키텍처의 문제점과 해결책) 9분30초의 구조는 DDD라고 볼 수 있나요?감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
db에 저장되는 이름과 객체를 지정하는 이름 스타일 차이는 그냥 관례일까요
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]db의 필드 이름은 item_name 이렇게 지정하고, 객체에서는 itemName이런 형식으로 camelCase 스타일로 지정하는 이유는 그냥 오랜 관례일까요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cmd 빌드 시 test 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빌드를 하면 다음과 같이 뜨는데요 무시하고 lib 가서 jar 실행하면 실행 되긴 합니다. 이건 어떤 문제인가요?
-
미해결스프링 핵심 원리 - 고급편
수동으로 빈 등록하는 부분에서 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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() 대신 잘못된 값을 넣을 수 있게 되니 잠재적으로 예기치 못한 동작을 유도할 수도 있을 것 같다는 생각이 드는데 이런 부분들은 어떻게 생각하시는지 궁금합니다..!