30%
53,900원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Resultset
select 쿼리의 결과가 Resultset 에 들어간다고 하셨는데 쿼리 결과 전체를 메모리에 올리는 건가요? 만약 그렇다면 쿼리의 결과가 많을 때 메모리가 넘치지 않을까 생각이 듭니다. 이럴때는 어떻게 해결하는지 궁굼합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC를 직접 쓰는 경우?
먼저 좋은 강의 제작에 힘써주셔서 감사합니다. 많은 도움이 되고 있습니다. 강의 후반부에 JdbcTemplate을 사용하는 것까지 듣고나서 드는 의문이 생겨서 질문을 남깁니다. 1. JPA를 쓰는 도중 JDBC를 사용하는 경우는 어떤 때인가요? 2. JPA를 쓰는 도중 JDBC를 사용할 일이 생겼을 때 기존의 Try~catch~finally로 쓰는 방식보다는 JdbcTemplate을 사용하나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2 Test 작성시 Scope 문제
안녕하세요 test를 gradle 말고 인텔리j 통해서 하신다면, db 커넥션 test 진행중에 아래와 같이 "No suitable driver found for h2~" 문제가 날 수 있는뎅, h2 Driver 관련 빌드 스코프와 관계가 있는듯합니다. build.gradle에 아래처럼 넣어주시면 해결이 가능합니다. testCompileOnly 'com.h2database:h2' 항상 좋은 강의 감사합니다 영한님~
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
connection 객체는 JSESSIONID를 가진 실제 conection을 생성해주는 객체인 것인가요?
DB 서버에 DB 클라이언트로 접근할 때는 JSESSIONID만 같으면 어떤 connection이든 같은 클라이언트로 여겨졌고 같은 트렌젝션을 가지게 되는 것 같았습니다.세션은 서버의 메모리에 남아서 커넥션보다 더 긴 생명주기를 가지고 stateless한 접속들을 stateful하게 처리하기 위한 방법이니까, 엄밀하게 말하면 어플리케이션에 있는 connection도 다른 connection과 JSESSIONID만 공유하면 같은 DB 세션과 트렌젝션을 가질 수 있어야 한다고 생각합니다.그런데 그런 것이 되지 않는 이유는 자바 스펙에서 connection이라는 객체가 connection 자체가 아니라 실제 connection들을 만들어주는, JSESSIONID를 보관하는 객체이기 때문이라는 생각이 들었습니다.한 마디로 getConnection()해서 커넥션을 획득해서 close()할 때가지 실질적으로는 하나의 커넥션이 생성되는게 아니라 preparedStatement의 executeQuery()와 executeUpdate()가 실행되어 tcp 통신이 이루어질 때마다 커넥션이 만들어졌다가 사라지고, 그때 connection 객체에서 관리되는 JSESSIONID에 의해서 같은 트렌젝션으로 관리된다는 생각이 들었습니다. 그리고 close()가 하는 역할은 커넥션의 종료라기 보다는 DB서버에 있는 세션을 메모리에서 내리는 역할을 한다는 생각이 들었습니다. 이런 제 생각이 맞을까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
REPEATABLE READ 등은 Serializable보다 완전히 안전하지는 않지만 성능이 좋기 때문에 사용하는 것인가요?
생각하다 보니까 고립도라는 것은 근본적으로 이런 경우에는 이런 고립도만 쓰지 않으면 100% 안전하기 때문에, 쓸 수 있는 고립도 중 가장 성능이 좋은 고립도를 쓰는게 아니라, 어떤 고립도를 쓰더라도 확률적으로 위험한 경우가 발생할 수 있지만 잘 일어나지 않기 때문에 Serializable 아닌 성능적으로 빠른 REPEATABLE READ 등을 사용하는 것인지 궁금합니다. ====================== 제가 생각한 일반적인 예는 아래와 같습니다. 아버지와 아들이 있습니다.아들은 다음날 수학 여행에 필요한 버스비가 1000원이라고 아버지께 말해놓았습니다. 그래서 아버지는 저녁때 아들의 계좌를 확인해서 1000원으로 맞춰놓기로 약속하셨습니다.그날 저녁 아버지의 행동을 함수로 구현하면 아래와 같습니다. 아들 계좌를 확인하고 1000원이 되도록 채워주기_f() {select해서 아들 계좌의 돈을 확인합니다. 1000 - 아들 계좌의 돈 만큼 다시 아들 계좌로 송금합니다.} 그날 저녁 아들 계좌에는 700원이 있었는데 자기 돈을 사용해서 200원짜리 포켓몬 빵을 사먹었습니다. (아들의 update문)그런데 그때 하필 아버지가 아들 계좌를 확인하고 1000원이 되도록 채워주기_f() 를 실행한 겁니다. 아버지가 select 할 때는 아들 계좌는 700원이었습니다. 그래서 아버지는 300원만 더 넣어주면 1000원이 되겠군, 이라고 결론을 내리고 300원을 아들 계좌로 송금합니다. 300원을 송금하는 부분을 쪼개어보면 select 해서 아들의 계좌 잔액을 가져오고 거기에 300원을 더한 값을 set 하는 방식이었습니다. (SQL에 add라는 기능이 없기 때문에)그래서 결국 락이 풀림과 동시에 set 1000이 될 겁니다. 아들은 분명 200원짜리 포켓몬을 샀는데도 계좌에는 800원이 아닌 1000원이 남게 됩니다. 무에서 유가 창출되는 사건이 발생하는 것입니다!============================================위의 예처럼 update문에만 락이 걸려도 무결성에 위배되는 경우가 생길 것 같습니다. Serializable이라는 고립 레벨이 있긴 해도 성능상의 이유로 Serializable은 잘 안 쓴다고도 알고 있습니다. 그럼 Serializable 아닌 경우라면 위와 같이 절묘하게 타이밍만 맞아 떨어지면 데이터 무결성이 깨지는 경우가 발생할 수 있다는 것인데... 그럼 일반적으로 REPEATABLE READ를 사용할 수 있는 논리와 아닌 논리로 나누어져 있다기 보다는 위와 같이 절묘한 순간이 잘 일어니지 않기 때문에 성능적으로 더 좋은 REPEATABLE READ 등을 사용한다고 보면 되나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
안녕하세요! 예외 관련 질문드립니다..!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요, 김영한 강사님! 강의 듣다가 예외 관련 궁금해서 질문드립니다. 만약 사용자가 몰라야 하는 오류인데, A 서버에서 내부 로직으로 처리하고 나서 관련 오류 로그를 다른 B 서버가 알아야 하는 상황이 온다면 A서버가 controller 계층까지 올려보내서 보내는거랑 관련 로그를 따로 보관해 뒀다가 B서버에서 직접 조회하는 거랑 어느 방식이 자연스러운 방식인지 궁금합니다..!
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2 처음 사용시 몇 가지 의문점
1. h2 사용시 왜 처음 외에는 jdbc:h2:tcp://localhost/~/test 로 접속해야하나요? 그냥 넘어가도 되는 부분이기도 하지만 계속 궁금해서요. 만약 그렇게 하지 않으면 무슨 문제가 생기나요? 2. 그리고 jdbc:h2:~/test 이게 파일로 접근하는 방식이라고 하셨는데요. 이 부분이 잘 이해가 안 갑니다. 예를 들어서 MySQL같은걸 사용하면 데몬서버에 JDBC를 사용하는 클라이언트가 요청을 보내면, MySQL의 엔진과 스토리지 엔진이 돌아가면서 DB에 데이터도 저장하고 읽기도 한다고 알고 있거든요. h2가 아무리 경량이라고 하더라도 DB라면 데몬 프로그램으로 어딘가 떠서 돌아가고 있고, 거기에 H2 콘솔이 JDBC를 사용해서 TCP로 요청을 보내고 응답을 받으며 작업을 해야할 것 같은데... 파일로 접근한다는 개념은 무엇인지 잘 모르겠습니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
별도의 스레드를 사용해서 커넥션 풀에 커넥션을 채우는 것이 이해가 되지 않습니다.
'애플리케이션을 실행할 때 커넥션 풀을 채울 때 까지 마냥 대기하고 있다면 애플리케이션 실행 시간이 늦어진다. 따라서 이렇게 별도의 쓰레드를 사용한다'라고 설명하셨는데 이 부분이 잘 이해가 되지 않네요... 별도의 스레드를 어떻게 사용하길래 커넥션풀을 채울 때 어플리케이션에 실행 시간에 영향을 주지 않게 되는 건지 다시 한번 설명부탁드립니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
beforeEach() 설정 중 오타입니다.
강의 8:00 정도에, `MemberRepositoryV1Test`의 `beforeEach()` 메서드 작성 중에, `PASSWORD` 설정하는 코드가 `setPoolName()으로 작성되어 있는 오타가 있습니다. (강의안에는 정상적으로 `dataSource.setPassword(PASSWORD);`로 적혀 있습니다)`PASSWORD`가 ""이라 값을 입력받지 않아도 테스트 자체에 이상은 없는 듯 하네요.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Spring Initializer을 이용하여 프로젝트 생성 후 실행 시 'invalid source release: 11' 에러메시지가 출력되는 사항에 대한 내용 공유
Spring Initializer을 이용하여 프로젝트 생성 후 실행 시 'invalid source release: 11' 에러메시지가 출력되는 사항에 대한 내용 공유드립니다. 제가 겪었던 문제였으며, 아래 기재된 링크들을 참고하여 해결하였습니다. [Google 검색 단어: spring boot Cause: invalid source release: 11] https://milenote.tistory.com/63 https://blog.naver.com/PostView.naver?blogId=tofhadl529&logNo=222374497101&from=search&redirect=Log&widgetTypeCall=true&directAccess=false
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DB 종류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]1. 안녕하세요. 혹시 디비는 꼭 H2를 써야할까요?? 주로 MySQL을 사용해서 이게 편리한데 강의를 듣는 중에 MySQL을 쓰면 강의 따라가는데 문제가 있을까 싶어서요~!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV2Test관련 질문 드립니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] MemberServiceV2Test를 보면 memberRepository에서 accountTransfer(정상 이체) 테스트를 보면 V1버전과는 다르게 findById를 할 때 트랜잭션의 커넥션을 유지하기 위해 Connection을 파라미터로 전달을 받아서 실행을 해야되는 것으로 알고 있습니다. 하지만 강의에서는 MemberServiceV2Test에서 findById를 사용할 때 memberId 파라미터만 전달하여 V1의 Repository를 사용하고 있는 것 같아서 질문 드립니다. 요약: MemberServiceV2Test 의 accountTransfer() 테스트에서 이 소스코드를 를 전역 필드에 선언하고 이렇게 소스코드를 수정해야 하는 것이 아닌가 생각해서 질문 드립니다. --------------------------------- 추가 MemberRepositoryV2 클래스에서 findById 메서드가 findById(String memberId) findById(Connection con, String memberId) 두 개가 동시에 존재해서 강의의 경우도 실행이 된 것 같습니다. 큰 문제는 아니지만 하나의 트랜잭션 내에서 findById(String memberId) 메서드로 여러번 호출할 경우 커넥션이 유지가 안되는 것이 맞는지.. 궁금합니다. 긴 질문 글 읽어주셔서 감사합니다. 항상 좋은 강의 감사합니다!!