묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결토비의 스프링 부트 - 이해와 원리
TestRestTemplate ResourceAccessException 문제
TestRestTemplate 테스트를 하려고 했으나, 해당 문제가 계속 발생하더라구요.구글링을 해봐도 포트나 @SpringBootTest 어노테이션을 사용해서 해결해라 이런 얘기 들만 보여서아래 결과 처럼 해결 했습니다만, 왜 영상에서 나오는 것처럼 해서 는 안되는 것인지 모르겠습니다.1.2. (LocalServerPort를 없애보았으나 잘됨)
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 템플릿과 AOP의 프록시객체
안녕하세요.앞에서 템플릿 콜백 패턴으로 트랜잭션 템플릿(스프링이 제공한 것이긴 하지만)을 구현했던 것처럼 AOP의 프록시 객체 클래스를 직접 구현할 수도 있을까요??구현할 수 있다면 어떤 방식으로 구현하는지,구현이 어렵다면 어떤 부분 때문에 어려운지 궁금합니다...!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
dataSource에 관한 질문
앞선 강의들에서 driverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고 커넥션을 획득하는 기능을 제공한다고 배웠습니다.하지만 여러 요청이 동시에 왔을 때 DriverManager는 커넥션이 하나 뿐이라 여러 요청을 병렬처리를 할 수 없다는 단점이 있어 커넥션 풀 이라는 개념을 도입하여 여러 요청을 풀 내의 여러개의 커넥션을 통해 병렬 처리가 가능하도록 하는 것이고, 이러한 커넥션을 획득하는 방법이 DriverManager, Hikari, DBCP2 등 여러 커넥션 획득 방법이 존재하기 때문에 이들을 추상화해둔 것이 DataSource interface이고, DataSource 구현체로 DriverManager를 통한 커넥션 획득 방법은 DriverManagerDataSource, Hikari를 통한 커넥션 획득 방법은 HikariDataSource이다.제가 이해한 것은 이정도 인데 맞는지 모르겠습니다..
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
SQLExceptionTranslator translate의 파라미터로 무엇을 넘기는 건가요?
SQLExceptionTranslator translate의 파라미터가 (String task, @Nullable String sql, SQLException ex) 이런식으로 되어있던데 첫번째 task에 무엇을 넣어야하는지 궁금합니다. 맥락상 실행한 메서드명을 넣는 것 같은데 이것저것 변경해보다가 전혀 관련없는 글을 써넣어도 정상작동하던데 task에 무엇을 넣는지, 어떤 역할을 하는지 궁금합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
spring mapping 여러개 문의 드립니다
안녕하세요 토비님제가 자주 질문 드려서 싫어 하실거 같네요..https://www.url01.urlcom/충청도 or 제주도 or 인제군 or ...(지자체 정보 170개 )이런식으로 ~Controller.java170개의 경우를 겟매핑이나 포스트매핑(보안문제로)해야 합니다@GetMapping({ '/충청도', '/제주도', or '/인제군' or ......이런식으로 170 개의 지자체 })아래 부분을 위해서 수기 타이핑 문자열이 아닌db에서 불러와서 배열로 넣을려고 하니 되지 않아서제가 잘못 생각하고 있는지 여쭤봅니다변수 = 서비스.지자체리스트; //170개 db에서 꺼내옴@GetMapping({ value = 변수 }) ==> 이거 원래 안되는 것일 까요? 계속 스택오버플로우나 구글링 찾아봐도 제가답을 못 찾았습니다 혹시 원래 되는 기능 이라면 , 제가 어디 문서를 찾아 봤었어야 할까요?( 예를 들면 토비님 같은 경우스프링 공식 문서 샘플 설명 사이트 나, 자주 방문하는 이 사이트 찾아 보면 금방 답이 나왔을 것이다이런 부분 알려 주시면 감사합니다.. )
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 추상화 관려해서 궁금한 점이 있습니다.
트랜잭션 추상화시키는데, 이것도 일관성 있는 서비스 추상화로 볼 수 있는건가요?공통 인터페이스를 만들어서 구현체만 바꿔주는 방법이 일관성 있는 서비스 추상화를 활용하는 것으로 볼 수 있는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
PlatformTransactionManager 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.1.위의 코드에서txTemplate의 타입은 TransactionTemplate인데생성자를 만들 때는 왜PlatformTransactionManager의 타입으로 받는건가요?2. TracsactionTemplate 타입인 txTemplate에 어떻게 PlatformTransactionManager의 타입으로도 주입해줄 수 있는건가요?tracsactionTemplate와 PlatformTransactionManager는 어떤 관계가 있는건가요? 위와 같은 설명과 연관이 있는거 같은데 잘 이해가 안됩니다 설명 부탁드립니다!
-
미해결토비의 스프링 부트 - 이해와 원리
spring url 리다이렉트/포워딩 기술적 문의 드립니다
spring url 리다이렉트/포워딩 기술적 문의 드립니다안녕하세요 김동희입니다제가 공공기관 프로젝트에 개발자로 참여중입니다이쪽프로젝트 환경은jsp + 전자정부프레임웍(Spring) + html + postgre(db) 입니다이쪽 pm 이 알아봐달라고 부탁하는 사항이 있고,제가 생각하기에도 궁굼해서혹시 이런부분이 될런지 문의 드립니다메인 정부기관 홈페이지는 아래입니다 ex)https://www.url01.urlcom각 전국 지역별(강원,인천,제주..) 지자체관 별로 별도로 지역별 블로그 형식으로 지자체관 형식을 뛰웁니다ex) 강원특별자치도 인제군 지자체관https://www.url01.urlcom/xxx/xxx/xxxx/xxxxx/infoMain.do?ctpv=6420000&sgg=4330000하지만, 고객(공무원)측에서 url 하위로 깔리는 url 변수를 보여주지 말라지자체관별로 단축 url 을 사용 할 수 있게 해달라고 합니다 as-is https://www.url01.urlcom/xxx/xxx/xxxx/xxxxx/infoMain.do?ctpv=6420000&sgg=4330000to-be https://www.url01.urlcom/injegun 혹시 요청이 현재 spring(전자정부프레임웍) + jsp + tiels 환경에서 이 환경에서 고객(공무원) 들의 요청을 수렴해서반영 할 수 있을지 모르겠습니다 AA,TA 적인 기술적인 측면에서스프링의 config 또는 다른설정값 변경, 인터셉터변경, ~Controller~.java 변경~tiles.xml 변경 등을 통해서 가능 할까요?염치 불구하고 저도 이런부분이 궁금하기도 해서 문의 드립니다김동희 드림
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랙잭션 종료 후에 setAuotoCommit(true)로 변경하는 이유가 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.커넥션 풀을 고려하여 setAutoCommit(true)로 되돌린다고 하셨는데 그 이유가 무엇인가요?설명 부탁드립니다 !
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DataSourceUtils.getConnection() 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강사님께서 설명하신 내용 중에 DataSourceUtils.getConnection()는 트랙잭션 동기화 매니저에서 관리하는 커넥션이 있으면 해당 커넥션을 반환한다고 말씀하셨습니다.근데 여기서 제가 궁금한 부분은어떤 커넥션인지 구분하는 부분이 없는데 어떻게 구별해서 커넥션을 반환하는 건가요?예를 들어, A통장에 대한 트랙잭션을 시작한 뒤에 A통장 커넥션이 트랙잭션 동기화 매니저에 존재할 때,동시에 B 통장도 트랙잭션을 시작하고 B 통장의 커넥션이 트랙잭션 동기화 매니저에 존재하는 상황에서 데이터 접근 로직에서 트랙잰션 매니저에 접근해서 커넥션을 가져오는 과정에서 어떻게 A 커넥션, B 커넥션을 구분해서 반환하는 건가요??설명 부탁드립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
spring bean 에 대해서 질문 있습니다.
bean 등록 기준이 있을까요? 1안public class ExcelExtractor { private final File file; public List<Data> excetued() { // extract logic } } 2안@Component public class ExcelExtractor { public List<Data> excetued(File file) { // extract logic } } 1안은 스프링 빈 등록 없이 사용하는 코드입니다. 2안은 빈으로 등록하여 사용합니다. 빈으로 등록했을 때 장점은 의존성 주입을 통해서 어떤 객체를 의존하는지 한 눈에 알 수 있다고 생각합니다.1안으로 사용하면 ExcelExtractor 객체는 서비스 클래스의 메소드 안에서 생성됩니다. 의존성이 숨겨져 있다고 생각합니다.2안으로 사용하면 서비스 클래스 의존성에 ExcelExtractor을 추가해서 명시적으로 표시할 수 있습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Component
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MemberRepositoryV1 에 @Repository 나 @Component를 해줘야 스프링빈에 등록이 되고MemberServiceV1 에서 @AutoWired로 의존성주입이 가능한게 아닌가요? 헷갈려서 질문 남깁니다.아니면 현재 실제 서버를 띄우는게 아닌 TEST 만 진행 중이라서사용을 안하고 있는건가요?
-
미해결토비의 스프링 부트 - 이해와 원리
독립 실행형 스프링 애플리케이션까지 본 수강생입니다. 질문있습니다.
질문은 다음과 같습니다...!====Spring Container 제작시, 자기자신을 Bean으로 등록하는 이유==== 코드를 수정했습니다.Servlet Container, DispatcherServlet을 Bean으로 등록하는 코드를 config 패키지의 클래스로 따로 빼버렸습니다.[ :이유:ComponentScan은 자기자신을 탐색범위에 넣지 않는다->클래스 내부의 Configuration을 찾지 못한다-> Configuration만 외부로 빼면 자기자신을 Bean으로 등록하지 않아도 된다] Spring Container를 만드는 과정에 Servlet Container를 만들지 않습니다. 분리시켰습니다.(순서대로 만들어진다는 느낌을 받기위해...) 다음은 제가 작성한 main 문의 코드입니다.@ComponentScan public class DemoApplication { public static void main(String[] args) { //Spring Container 구성정보 AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); // Bean 등록 applicationContext.register(DemoApplication.class); //Spring Container 실행(초기화) applicationContext.refresh(); // ========================================= //Servlet Container 구성정보 ServletWebServerFactory serverFactory = applicationContext.getBean(ServletWebServerFactory.class); //servlet 만들기 DispatcherServlet dispatcherServlet = applicationContext.getBean(DispatcherServlet.class); dispatcherServlet.setApplicationContext(applicationContext); //Servlet Container 인스턴스 WebServer webServer = serverFactory.getWebServer(servletContext -> { servletContext.addServlet("dispathcerServlet", dispatcherServlet).addMapping("/*"); }); //서버 실행 webServer.start(); } }1번의 이유로,// Bean 등록 applicationContext.register(DemoApplication.class);이걸 주석처리했습니다.같은 클래스내에 ApplicationContext가 있고, 생성도 완료한 시점이기 때문에, 본인이 Bean에 직접 접근해서 꺼내 써도 된다고 생각했습니다.실제로도 직접 Bean을 꺼내서 주입시켜버립니다. ServletWebServerFactory serverFactory = applicationContext.getBean(ServletWebServerFactory.class); DispatcherServlet dispatcherServlet = applicationContext.getBean(DispatcherServlet.class); 따라서 저는, Spring Container가아래 2줄의 코드에서 Bean을 다 생성하고 DI까지 완료한줄 알았습니다.//Spring Container 구성정보 AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); // Bean 등록 //applicationContext.register(DemoApplication.class); //Spring Container 실행(초기화) applicationContext.refresh();어차피 서블릿 환경 설정도 저 어딘가에서 ComponentScan 해서 Bean으로 등록하기 때문에자기자신을 Bean으로 등록하는건 필요 없는줄 알았습니다. 그리고 발생한 에러 입니다.No qualifying bean of type 'org.springframework.boot.web.servlet.server.ServletWebServerFactory' available =======주석만 풀면 잘 돌아갑니다. 왜이럴까요...?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Jpa애서 jdbc의 commit을 안쓰고 따로 commit의 구현체를 만든 이유가 무엇일까요?
제가 이해하고 있기로는 jpa이 jdbc위에 올려져 db의 종류에 구애받지 않고 자바 코드로 쿼리를 짤 수 있는 도구라고 알고 있습니다. Jpa도 jdbc를 쓴다면 jpa에서 트랜잭션 구현체가 따로 있는것의 필요성이 의아해져서 질문드립니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DataSource 구현체를 변경하는 일이 잦나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요!강의를 듣고 DataSource의 최대 장점이 추상화라고 이해했습니다.사용하는 입장에서는 구현부에 의존하지 않아도 된다는 것인데요.그런데 실무에서는 과연 DataSource 구현체를 갈아끼우는 일이 잦은지 궁금합니다.여러 후보군들 사이에서 HikariCP와 같은 커넥션 풀이 압도적으로 우세하다면, 커넥션 개수와 같은 DataSource 설정을 변경하는 일은 있을 수 있어도 DataSource 구현체 자체를 변경하는 일은 적지 않을까 생각이 들어서요!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 ACID 에 대한 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용]ACID 중 일관성에 대한 질문이 있습니다.자료를 보면 "데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야한다" 라고 작성되어 있는데요. name 컬럼을 가진 테이블이 있고 해당 컬럼은 null 값을 허용하지 않는다는 제약조건을 가진다고 가정하겠습니다. 트랜잭션이 진행되는 과정에서 name 이 null 로 변경되었다가 최종적으로 트랜잭션이 종료되기 전에 name 에 값이 채워진다면 이 부분도 일관성을 만족하지 못한다고 할 수 있을까요? 아니면 트랜잭션이 종료되는 시점에는 제약조건을 만족했으니 일관성을 만족한다고 보는걸까요? 만약 일관성을 만족하지 못하는 것이라면 해당 트랜잭션은 rollback 되나요?
-
미해결토비의 스프링 부트 - 이해와 원리
의존성 주입과 NullPointerException
안녕하세요, 토비님.강의를 수강하다가 문득 의문이 들어서 토비님 말씀을 듣고 싶어서 질문을 드립니다.의존성 주입을 생성자가 아닌 Setter나 필드 인젝션(변수 위에 @Autowired 붙이기)으로 하면, 1) 빈이 생성되는 시점이 아닌 런타임에 의존성 주입이 이루어지고, 2) 따라서 NullPointerException이 발생하는 경우가 생길 수 있을까요?예를 들어서 @RestControllerclass UserController { @Autowired UserService service;} 같은 코드가 있으면, 빌드할 때 UserController 빈이 만들어지고, service의 메소드를 사용하려는 시점에 의존성 주입이 이루어지게 되는 것일까요?따라서 이런 경우 NullPointerException이 발생할 수 있을까요?검색을 통해 찾아보아도, 어떤 내용이 정확한지도 불분명해서 질문을 드리게 되었습니다.혹시 추천해 주실 글이 있으신지요?읽어주셔서 감사드립니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
키워드 final에 대한 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]private final MemberRepositoryV1 memberRepository;위 코드에서 MemberRepositoryV1의 객체 memberRepository에final이라는 키워드를 사용하는 이유는 아래와 같다라고 이해하면 되나요?"final 키워드를 붙인 객체 memberRepository를 생성함으로써 MemberServiceV1의 클래스 내에선MemberRepositoryV1의 객체는 memberRepository가 유일하고, MemberRepositoryV1의 객체는 객체를 더 이상 생성할 수 없다."이렇게 이해했는데 옳게 이해한 것인지 모르겠습니다.설명 부탁드립니다.항상 친절한 답변 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV1 @RequiredArgsConstructor 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강사님께서 코드에서@RequiredArgsConstructor은final이 붙거나 @NotNull이 붙은 필드의 생성자를 자동생성해주는 롬복 어노테이션이라고 알고 있습니다.근데, 이 코드에서 @RequiredArgsConstructor가 사용된 이유가 무엇인가요?private final memberRepositoryV1 memberRepository;를 사용하는 이유는 싱글톤으로 코드를 작성하기 위해(즉, memberRepositoryV1이라는 하나의 객체를 사용)이라고 이해하고 있습니다.혹시, @RequiredArgsConstructor를 사용한 이유가 싱글톤 코드를 작성하기 위한 것과 연관이 있는 것인가요?항상 친절한 답변 감사합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
안녕하세요 강의 질문 드립니다
안녕하세요,프로버티 빈의 후처리기 도입 강의 내용 질문드립니다. 질문 :ServerPropeites에 @Component 자체가 없어도 되지 않나요??애초에 @Component 있어도 ComponentScan 대상이 아니라고 판단했습니다.. 패키지가 분리되어있다고 판단했습니다..아래 부분만 있어도 되는것 아닐까요? @Import(ServerProperties.class) public class TomcatWebServerConfig {