묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결토비의 스프링 부트 - 이해와 원리
@JdbcTest 관련 질문
안녕하세요. 섹션 10. 스프링 부트 자세히 살펴보기에서스프링 부트의 자동 구성과 테스트로 전환하는 부분 보다가 궁금증이 생겨서 질문남깁니다. @HellobootTest를 @JdbcTest 또는 @SpringBootTest로 전환하는 부분에서 @JdbcTest같은 경우는 내장된 테스트용 db로 교체를 한다. 라고 설명을 해주셨습니다. 그리고 이전 강의에서 테스트를 위해 인메모리 db인 h2를 사용하도록 application.properties에 설정을 하고 테스트를 진행했었습니다. 여기서 질문은 @JdbcTest를 사용하면 교체된다고 하는 db가 기존에 사용했던 h2 DB가 아닌 또 다른 DB로 전환된다는 말씀인건지가 헷갈려서 질문드립니다. 구체적으로 JdbcTemplateTest class가 jdbcTemplate을 테스트하기 위해 hello table을 db에 생성하고 insert하는 작업을 할 때, @HellobootTest 일 때는 h2 db를 사용하고 @JdbcTest로 교체했을 때는 다른 embedded db를 사용하는건가요? 감사합니다!
-
미해결토비의 스프링 부트 - 이해와 원리
Environment Abstraction 의 우선순위
섹션8의 Environment 추상화와 프로퍼티 제목의 강의의 막바지 부분에서 Environment Abstraction 의 우선순위에 대한 내용이 나옵니다. 강의 내용을 요약해보자면 ServletConfig Parameter < ServletContext Parameters < JNDI < System Properties < System Environment Variables < @PropertySource < application.properties, xml, yml 대로 오른쪽으로 갈 수록 우선순위가 높다라고 이해를 했습니다. 우선 저는 System Properties가 jvm 옵션을 말하는건가? 라는 생각을 가지고 들었고 그렇게 생각하고 위의 내용을 보니 jvm option의 우선순위가 os의 환경 변수보다 높아야 되는거 아닌가? 라는 궁금증이 생겼습니다. 제목 그대로 우선순위에 대한 내용에 오류는 없는것인지 궁금합니다.++ 질문 수정"자동 구성에 Environment 프로퍼티 적용" 강의를 들어보니 우선순위를 제가 반대로 이해한것 같습니다. 여기서 추가적으로 궁금증이 생겼습니다.저는 application level의 설정이 더 우선해야 되는 것 아닌가? 라는 생각에application property > jvm property > os level property 라고 생각을 했습니다. 하지만 스프링에서는jvm property > os level property > application property의 우선순위를 가지게 한 것 같은데 그 이유가 무엇일까요?이것에 대한 생각이 어떠신지 궁금합니다.그리고 우선순위의 변경을 원한다면 바꿀 수 있도록 스프링이 제공하는지도 궁금합니다! 감사합니다.=======================제가 강의 내용을 끝까지 안듣고 궁금한것을 적었는데..질문을 남기고 나머지 강의를 들어보니 궁금했던 내용이 해소가 됐네요. 자문 자답하자면, application의 설정을 default로 하되, 어떤 환경에서 어떤 사용자가 사용하냐에 따라 설정이 달라질 수 있어야 하기 때문에 jvm, os level의 property보다 우선순위가 낮아야 할 것입니다. 이왕 글을 남긴거 삭제하기 뭐해서 남겨두겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
AutoConfigure 시 등록되는 Bean 에 대해 질문있습니다.
안녕하세요 강사님. 덕분에 1년사이에 실력이 늘은것이 체감이 많이 듭니다. 다름이 아니라, 해당 강의에서 강사님께서 자동구성때 등록되는 DataSource 는 HikariDataSource 라고 하셨고TransactionManager 는 사용하는 라이브러리에 따라 달라진다고 하셨습니다. 그래서 스프링 부트가 AutoConfigure 할 때 등록되는 Bean 들을 찾아보았습니다. DataSource 는 HikariDataSource 가 잘 잡히는 것 같구요 TransactionManger 는 JDBC 를 사용하기때문에 DataSourceTransactionManager 가 잡히는 것을 확인할 수 있습니다. 제가 찾은것이 맞을까요? 근데 왜 첫번째 사진에서 HikariDataSource 를 리턴할때 null 을 리턴할까요? ㅠㅠ 이것을 모르겠습니다. 단순히 properties 나 yml 에 spring.datatsource.hikari 를 설정하지 않아서일까요? 좋은 하루 보내세요
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 이니셜라이저 사용 제보입니다
며칠 전부터 자바 11기반의 2.7.X 버전이 이니셜라이저에 안 뜨길래공식 사이트를 찾아보니 11월 24일 부로 지원이 종료되었다고 뜨네요 이제는 강의 내용처럼 자바 11을 쓰려면build.gradle에 구버전 의존성들을 직접 작성해야 하는 건가요?? 일단은 자바 17, 스프링부트 3.2.0으로 진행 중인 상태입니다
-
미해결토비의 스프링 부트 - 이해와 원리
proxyBeanMethods=false 와 관련해서 질문이 있습니다.
proxyBeanMethods=false 을 사용하면 Bean 오브젝트가 싱글톤 빈처럼 같은 오브젝트가 리턴되는 것이 아니라 매번 새로운 오브젝트가 생성된다고 하셨는데 이렇게 굳이 새로운 오브젝트를 매번 생성하는 이유가 있을까요?새로운 오브젝트를 생성하는 비용보다 프록시 생성을 해서 싱글톤 방식으로 같은 오브젝트를 리턴하는 비용이 더 크기 때문일까요?왜 그렇게 설정을 하는 것인지 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
@Configuration 과 @ComponentScan
@Configuration @ComponentScan public class HelloApplication { public static void main(String[] args) { AnnotationConfigServletWebApplicationContext applicationContext = new AnnotationConfigServletWebApplicationContext(){ @Override protected void onRefresh() { super.onRefresh(); ServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(); WebServer webServer = webServerFactory.getWebServer( servletContext -> { servletContext.addServlet("dispatcherServlet", new DispatcherServlet(this) ).addMapping("/*"); } ); webServer.start(); } }; // applicationContext.register(HelloController.class); // applicationContext.register(SimpleHelloService.class); applicationContext.register(HelloApplication.class); applicationContext.refresh(); } }강사님 안녕하세요, 강의를 복습하다보니 @ComponentScan을 사용할 때 @Configuration이 필요한지 의문이 들더라구요 처음에 @Configuration javaDoc를 보면 @ConponentScan 부분에 @Configuration 클래스는 구성 요소 스캐닝(component scanning)을 통해 부트스트랩될 뿐만 아니라, @ComponentScan 주석을 사용하여 스스로 구성 요소 스캐닝을 설정할 수도 있습니다.라고 작성이 되었더라구요 @ComponentScan public class HelloApplication {}이 상태로 register에 등록을 해도 컴포넌트 스캔이 동작합니다. Creating shared instance of singleton bean 'helloApplication' Creating shared instance of singleton bean 'helloController' Creating shared instance of singleton bean 'simpleHelloService'@Configuration이 없어도 직접 register에 등록하면 애노테이션을 읽어서 컴포넌트 스캔이 동작합니다. 그러면 register에 @Configuration을 붙이지 않고 직접 등록한다면 @ComponentScan만 있어도 되는데 붙이는 이유가 궁금합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 질문
체크 예외를 throws Exception으로 던지면 다른 체크 예외를 체크할 수 있는 기능이 무효화 된다고 하셨습니다.if문으로 필요로 하는 체크 예외를 따로 처리하면 될 것 같은데 안되나요??
-
미해결토비의 스프링 부트 - 이해와 원리
스프링 로그인 제어 문의드립니다
안녕하세요 토비님제가 테더링이 제한되서 부득이 하게첨부이미지로 질문드립니다수고하세요,,
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Test에서 NullpointerException이 떠요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의중 커넥션풀을 이용해 Test를 해보는 부분입니다.(강의에선 V1 로 사용하지만 저는 V0이라고 이름만 다르게했습니다)강의에선 이렇게 코드를 작성하시는데, 저는 똑같이 해서 test해보면 아래 crud메서드의 repository.save(member); 부분에서 nullpointerException이 발생합니다. 혹시 beforeEach 메서드 내의 초기화부분이 잘못된건가 해서이런식으로 초기화부분을 crud 메서드 안으로 가져온뒤 실행하면 테스트에 성공합니다.어디에 문제가 있는지를 잘 모르겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2 설치과정
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 모든 글들을 찾아본 결과 제가 원하는 답변들이 없어서 질문합니다 군인으로 지금 사지방에서 개발을 진행하고 있는데 h2 데이터베이스에서 항상 막혀 질문합니다.h2.bat 실행이 막혀있어 진행이 불가능합니다 혹시 이러한 해결책을 아시는지 궁금합니다. 의존성으로 추가해서 하는 방법이 있던데 yml 방식과 예전버전이라 방법이 안통하는것 같습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Test클래스에서 repository를 찾지를 못하는것 같아요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]사진처럼 MemberRepositoryV1과 MemberRepositoryV1Test 가 각각 있습니다그리고 이렇게 MemberRepositoryV1 repository = new MemberRepositoryV1(); 으로 객체 생성을 하면정상적으로 아래 crud 메서드가 실행이 되는데,해당 객체 생성을이렇게 @Autowired로 바꾸면 아래의 repository.save(member)부분에서 nullpointException이 발생합니다..repository에는 @Repository를 붙여놨고 해당 test 클래스는 @component와 @service여러개 다 해봤는데도고쳐지지가 않습니다..혹시 @ComponentScan 클래스가 main 패키지에 위치해서 test패키지까지는 범위가 닿지 않아서 그런걸까요??도와주세요..ㅠ
-
미해결토비의 스프링 부트 - 이해와 원리
스프링부트 내장톰캣이 아닌 별도 웹서버 설치 가능 여부 문의
스프링부트 내장톰캣이 아닌 별도 웹서버 설치 가능 여부 문의 토비님 안녕하세요~여전히 공공기관 프로젝트 참여중입니다관리하시는 총괄 PL 께서 혹시 스프링부트 사용하면서 내장톰캣이아닌 다른 웹서버를 설치 해서 사용 가능한지를물어보시더라구요내장톰캣이 아닌 웹로직이던, 다른제품을 두고웹로그분석기나 다른 솔루션을 같이 웹서버에언져서 사용하고 싶은가 보더라구요 1.이게 가능한지 문의 드립니다. 만약 가능하다면 제가 구글링이나, 스프링문서에서 어느 부분을 찾아 보면 될까요? 2.실전에서 내장톰캣이 아닌 별도 웹서버 설치해서 연동하는 이유는 어떤것 들이 있는지도 궁금하네요급한부분 아니니 한가 하실때 알려주시면 감사하겠습니다. 수고하세요김동희 드림
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Assertion가 작성이 되지 않습니다.
package hello.jdbc1.conncection; import lombok.extern.slf4j.Slf4j; import java.sql.Connection; import org.assertj.core.api.Assertions; @Slf4j public class DBConnectionUtilTest { @Test public void aa() { Assertions } } Assertions를 사용하려닌깐 이렇게 오류가 발생하는데 어떻게 해결해야 하나요??
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
추상화, 의존성 주입 질문 드립니다!
안녕하세요 강의를 보다가 질문 드리고 싶은 부분이 있어 작성하게 되었습니다.강의자료 2.커넥션풀과 데이터소스 이해 마지막 부분에서"외부에서 DataSource 를 주입 받아서 사용한다." 라고 설명을 해주셨는데DataSource 의 구현체를 DriverManagerDataSource를 주입 받을지 HikariDataSource를 주입 받을지 어떻게 정해지는건지 궁금합니다. 라이브러리에 현재 h2 데이터 베이스만 등록되어있어DriverManager에 h2 Driver가 의존성 주입이 되고h2 Driver 구현체를 사용함으로써DataSource에 자동으로 DriverManagerDataSource 의존성 주입이 되고DriverManagerDataSource 을 구현체를 사용함으로써 PlatformTransactionManager에 자동으로DataSourceTransactionManager 구현체를 주입 받고 MemberServiceV3_1 에서도 자동으로private final PlatformTransactionManager transactionManager;DataSourceTransactionManager를 외부로 자동으로 주입 받는게 맞을까요?? 그러면 혹시 나중에 라이브러리에 DB가 2개 이상 존재하게 되면 인터페이스에 어떤 구현체를 주입하게 되는지특정 config 에서 드라이버 및 데이터 소스, 트랜잭션 매니저 주입을 설정하게 되는건지 질문드립니다. MemberServiceV3_1Test에서 아래와 직접 같이 의존성 주입을 하는 것과 마지막에 트랜잭션 문제 해결 - 트랜잭션 매니저2 정리 부분을 설명을 듣던 중 갑자기 질문을 생각하게 되었습니다.DriverManagerDataSource dataSource= new DriverManagerDataSource(URL, USERNAME, PASSWORD); memberRepository= new MemberRepositoryV3(dataSource); PlatformTransactionManager transactionManager= new DataSourceTransactionManager(dataSource);memberService= new MemberServiceV3_1(transactionManager, memberRepository);너무 뻔한 질문이라면 죄송하다는 말씀 드리겠습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
isEqualTo 관련 Java 동등성/동일성 판단
[질문 템플릿]1. 예 2. 예 3. 예[질문 내용]Java에서 동일성(identity)와 동등성(equality) 개념에 관련하여 강사님께서 언급하신 내용에 대해 올바르게 이해하고 있는지 질문하려고 합니다. == 의 경우 두 객체가 같은지(주소값이 동일한지) 즉, 동일한지를 판단하기 위해 사용하고,equals() 의 경우 두 객체가 같은 정보를 가지는지 즉, 동등한지를 판단하기 위해 사용합니다. // findMember Member findMember = repository.findById(member.getMemberId()); // findById 메서드 일부 발췌 Member member = new Member(); member.setMemberId(rs.getString("member_id")); member.setMoney(rs.getInt("money")); return member; // member Member member = new Member("memberV0", 10_000); findMember와 member의 경우 애초에 같은 인스턴스가 아니기 때문에 동일성 판단 시 false인 것은 당연합니다.-> 서로 다른 곳에서 new 연산자를 통해 인스턴스를 생성했으므로, 주소값이 같을 수가 없음. 동등성 판단을 위해 isEqualTo 메서드를 이용하여 판단하는데, 원래대로라면 equals() 메서드를 overriding 하여 판단해야하지만 @Data(엄밀히 말하면 @EqualsAndHashCode) 가 equals()메서드를 overriding하기 때문에 동등성 판단이 제대로 이루어져서 true 로 제대로 판단하는 것으로 이해했습니다.-> equals()메서드를 overriding 해야하는 이유는 Object 클래스의 equals()메서드를 까보면public boolean equals(Object obj) { return (this == obj); }이렇게 동일성 판단을 하는 것으로 구현되어 있기 때문에 동등성 판단을 하도록 overriding 해야 합니다. 제가 알고 있는 지식을 통해서인스턴스 간 equals()와 ==의 결과값이 다른 것을 보여주신 이유에 대해 정리한 건데, 틀리거나 빠진 내용이 있을까 싶어서 질문글 작성하게 되었습니다. 감사합니다!
-
미해결토비의 스프링 부트 - 이해와 원리
imports확장자 인식이 안됩니다. ㅜㅜ
이거 저만 그럴까요..? ㅜㅜ 하위 디렉토리도 맞습니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
url만 희한하게 null이 나옵니다..
테스트 실패해서 디버깅 돌리는데,이상하게 다른 거 다 잘 들어오는 거 같은데 url만 null이 찍히네요.. 원인이 무엇인지 모르겠습니다.. DataSourceTest의 connect() 메소드입니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 예외를 지양해야되는 이유에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 Exception 예외를 지양해야되는 이유로 어떤 예외를 잡을건이 어떤 예외는 안잡을건지 알 수 없기 때문이라고만 설명해주셨는데, 그냥 다 잡아버리면 안되는 이유가 있을까요??Exception이면 의존 관계도 문제될거 없어보이는데 자세한 이유를 알 고 싶습니다.
-
미해결토비의 스프링 부트 - 이해와 원리
MydataSourceProperties를 작성하고 DataSourceConfig를 작성하는 도중 에러가 발생했습니다.
자동 배선을 할 수 없습니다. 'MyDataSourceProperties' 유형의 빈을 찾을 수 없습니다. 라는 에러가 나오는데 해결을 못 하고 있습니다. @MyConfigurationProperties(prefix = "data") public class MyDataSourceProperties { private String driverClassName; private String url; private String username; private String password; public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }tobyspring.config.autoconfig.TomcatWebServerConfig tobyspring.config.autoconfig.JettyWebServerConfig tobyspring.config.autoconfig.DispatcherSetvletConfig tobyspring.config.autoconfig.PropertyPlaceholderConfig tobyspring.config.autoconfig.PropertiesPostProcessorConfig tobyspring.config.autoconfig.DataSourceConfigdependencies { implementation('org.springframework.boot:spring-boot-starter-web') implementation('org.springframework:spring-jdbc') testImplementation 'org.springframework.boot:spring-boot-starter-test' }어디가 문제인지 안보이네요...
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀 초기화 시점 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의자료 2p 에 커넥션 풀 초기화 부분을 보면 애플리케이션을 시작하는 시점에 커넥션 풀을 미리 확보해 보관한다고 쓰여있는데, 참고 질문의 답변을 보면 실제 커넥션을 조회할때 풀이 초기화 되는것 같습니다. 커넥션 풀의 초기화는 실 커넥션을 조회할때 되는 것 일까요?맞다면 강의자료에 있는 "애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보해서 풀에 보관한다"라는 문구는 어떤 의미로 사용된 말인지 궁금합니다.