묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 및 커밋 질문드립니다.
1. "자동커밋모드에서 수동커밋모드로 변환하는것" 을 트랜잭션을 시작한다라고 표현하는것일까요? 아니면 "수동커밋모드로 작업을 하는것" 을 트랜잭션을 시작한다고 표현하는것일까요?2. 강의 14분경에, memberRepository.update() 코드에서 "트랜잭션이 없어서 auto commit된다" 라고 말씀하셨습니다. 여기서 "트랜잭션이 없어서 auto commit 된다" 는게 무슨의미인지 잘 모르겠습니다. 2-1. 트랜잭션이 없다는게 트랜잭션을 시작하지 않았다는것일까요? 2-2. 수동커밋모드가 아니라서 트랜잭션이 없고 트랜잭션이 시작하지않은것일까요?2-3. 트랜잭션이 없으면 무조건 auto commit일까요?3. 트랜잭션이라는것이 수동커밋모드로 하고나서, 쿼리를 실행하고, commit이나 rollback을 하는 과정을 의미하는게 맞을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 및 커밋 질문 드립니다.
0
-
미해결토비의 스프링 부트 - 이해와 원리
커스톰 @Conditional 에서 다양하게 의존성 주입이 가능한가요?
@Conditional 강의를 들으면서, 특정 조건(Condition)에 따라서 의존성 주입을 A, B로 변경할 수 있어서 흥미롭게 보게되었습니다.토비님께서 예제로 설명해주신 웹서버 설정외에 다른 방법도 가능할까요?matches 메서드 안에서 DB를 조회하여, 해당 값으로 인해 A, B로 의존성 주입이 가능할까요??-> 서비스 빈을 찾아서 jpaRepository로 조회할려고 하니, jpaRepository가 null이 되어 아직 주입되지 않는 듯 합니다. 다른 방법이 있을까요?사용자구성정보랑 자동구성정보의 빈 생성 시점이 달라서 인지 궁금합니다.gradle 설정에서 implement의 설정에 따라서 @Conditional matches로 의존성주입이 가능하던데, 마찬가지로 멀티모듈구성시 모듈의 주입되지 않을경우, @ConditionalOnMissingBean으로 멀티모듈의 빈이 아닌 해당빈으로(디폴트 빈)으로 설정이 가능한지 궁금합니다.바쁘실텐데 답변주시면 감사하겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2 database 연결 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]선생님 h2에 서버 모드로 연결하려고 할 때 해당 오류가 발생합니다. 도와주세요 ㅜㅜ 도저히 저의 힘으로 해결 할 수가 없습니다.IO Exception: "/Users/jonghyunlee/test outside /opt/homebrew/var/sonarqube/data" [90028-224] 90028/90028 (도움말)org.h2.jdbc.JdbcSQLNonTransientException: IO Exception: "/Users/jonghyunlee/test outside /opt/homebrew/var/sonarqube/data" [90028-224] at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.engine.ConnectionInfo.setBaseDir(ConnectionInfo.java:250) at org.h2.server.TcpServerThread.run(TcpServerThread.java:152) at java.base/java.lang.Thread.run(Thread.java:840) at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) at org.h2.engine.SessionRemote.readException(SessionRemote.java:650) at org.h2.engine.SessionRemote.done(SessionRemote.java:619) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:148) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:438) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:330) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:288) at org.h2.server.web.WebServer.getConnection(WebServer.java:811) at org.h2.server.web.WebApp.login(WebApp.java:1039) at org.h2.server.web.WebApp.process(WebApp.java:227) at org.h2.server.web.WebApp.processRequest(WebApp.java:177) at org.h2.server.web.WebThread.process(WebThread.java:154) at org.h2.server.web.WebThread.run(WebThread.java:103) at java.base/java.lang.Thread.run(Thread.java:1583)
-
미해결토비의 스프링 부트 - 이해와 원리
섹션3 HelloController, DemoAppication
둘다 Mapping이 "/hello"인데실행을 하면 DemoApplication에서 정의한 hello가 매핑되는건 왜인가요??(HelloController는 안타는 이유가 뭘까요?)
-
미해결토비의 스프링 부트 - 이해와 원리
섹션2 hello project
@RestController public class helloController { @GetMapping("/hello") public String hello(String name){ return "hello"+name; }}안녕하세요, @RequestParam을 안쓰는 이유가 무엇인가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
메타 어노테이션
안녕하세요.@Component 나 @Controller 또한 Target(ElementType.TYPE)으로만 설정되어있는데, 어떻게 @Configuration이나 @RestController 등과 같이 메타 어노테이션으로 설정될수있는건지 질문드립니다ㅜㅜ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
데이터 접근 예외 직접만들기 코드 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. public void create(String memberId){ try{ repository.save(new Member(memberId,0)); log.info("saveId = {}",memberId); }catch(MyDuplicateKeyException e){ log.info("키 중복, 복구 시도"); String retryId = generateNewId(memberId); log.info("retryId = {}",retryId); repository.save(new Member(retryId,0)); }catch(MyDbException e){ log.info("데이터 접근 계층 예외",e); throw e; } } private String generateNewId(String memberId){ return memberId + new Random().nextInt(10000); }현재 이런식으로 중복된 Id가 있다면 그 뒤에 랜덤한 숫자를 덧붙여서 새로운 Id를 만들어서 재시도 하는것으로 이해했습니다.사실 완전 중복되는것을 막으려면 실제로는 UUID같은것을 생성하면 된다고 생각하지만..이 문제의 경우에서, 새롭게 만든 Id마저도 중복이 되면 오류가 나는것을 확인했습니다.만약 예외가 발생해서 해당 예외를 복구하기위해 재시도를 했으나 그것마저도 실패하는 경우에는 catch구문안에서 또 try~catch를 해야하는건가요?.. 어떤 방법이 있는지 궁금합니다.읽어 주셔서 감사합니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db, jdbc, jpa 등 관계 정리 문의
현재 트랜잭션관하여 강의를 듣고있는 중입니다. jdbc 트랜잭션 코드랑 jpa 트랜잭션 코드랑 다르다고 하셨는데 이 부분에서 관계정리가 안되거 같아 질문드립니다.위의 사진처럼 이해하면 되나요?? jpa에서 자체적으로 데이터소스를 관리하는지 jdbc 트랜잭션 코드라고 설명을 해주셨는데 여기서 jdbc가 의미하는게 데이터소스 코드를 의미하는지 위의 두개의 질문도 궁금합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 질문 드립니다.
안녕하세요. 현재 9강까지 강의를 들은 상태입니다.다름이아니라, 현재 9강까지는 JDBC를 사용하는 부분을 학습하고 있는데요. 여기서 JDBC를 사용한다는게 구체적으로 어떤것을 의미하는지 질문드립니다.JDBC를 사용한다는것이 DriverManager를 사용하는것을 말하는것일가요? 아니면 DriverManager뿐만아니라, Connection, PreparedStatement, ResultSet를 사용하는것을 말하는것일까요? 헷갈려서 질문드립니다..!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
set autocommit 질문
set autocommit false; 인 상황에서delete from member; 를 수행한 뒤에 commit을 하지 않고, set autocommit true; 를 해보았습니다.그랬더니, db에 데이터가 없는 것을 확인했습니다. 혹시 set autocommit true; 명령어를 수행시키는 순간 commit이 한번 자동으로 실행되는 것일까요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2 버전 질문드립니다...
안녕하세요.강의에서 말씀하시기를 인텔리제이 내 라이브러리에 명시되어있는 h2의 버전을 다운로드 받으라고 말씀하셨고, 강의 자료에서는 스프링부트 2.x를 사용하면 1.4.200버전을 다운로드해야되고, 스프링부트 3.x를 사용하면 2.1.214버전을 다운로드 해야된다고 말씀하셨는데요. 제 인텔리제이 프로젝트의 gradle 및 라이브러리를 보면 스프링부트의 버전은 2.7.14이고, h2의 버전은 2.1.214라고 나와있습니다.이럴때에는 h2의 어떤 버전을 다운로드 해야되는지 질문드립니다.. 현재 저의 스프링부트의 버전이 2.x라서 1.4.200버전을 다운로드해서 진행하고 있었는데 혹시 추후에 문제가 될게 있을까봐 질문드립니다.. h2의 어떤 버전을 다운로드 해야될까요?
-
미해결토비의 스프링 부트 - 이해와 원리
프로퍼티 클래스의 분리 강의중 this 의 사용에 궁금증이 있습니다.
안녕하세요 강의를 열심히 듣다가 궁금증이 생겨 문의드립니다. filed에 선언된게String contextPath, int port 이렇게 두가지인데 factory에 set 할때는 contextPath에는 this.contextPath그 밑 port에서는 this를 사용하지 않았습니다.this를 생략하여도 같은 필드변수를 가져오는것일까요 ?(제 생각에는 같은 필드변수를 가져온다고 생각합니다. )두개가 어떤 차이를 가지는지 알고 싶습니다.( 제 생각엔 port 에도 this. 가 생략되어있다고 생각됩니다.) 질문을 읽어주셔서 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 세션 질문
1:55 쯤에서 영한님이 커넥션 10개를 생성하면, 세션도 10개 만들어진다고 하셨습니다. 그럼 1개의 커넥션에는 1개의 세션이 만들어진다가 맞나요?커넥션과 세션은 일대일 매칭인건가요?여러 커넥션이 하나의 세션을 바라보거나 하나의 커넥션이 여러 세션을 생성할 수는 없을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
프로젝트 생성 시 jdbc:failed 하면서 빌드가 실패했다고 나옵니다.
> Task :prepareKotlinBuildScriptModel UP-TO-DATEFAILURE: Build failed with an exception.* What went wrong:Could not resolve all dependencies for configuration ':compileClasspath'.Failed to calculate the value of task ':compileJava' property 'javaCompiler'.Cannot find a Java installation on your machine matching this tasks requirements: {languageVersion=17, vendor=any, implementation=vendor-specific} for MAC_OS on aarch64.No locally installed toolchains match and toolchain download repositories have not been configured.* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.BUILD FAILED in 504ms 이런 오류가 발생합니다.ㅜㅜ
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
예외처리
예외처리에 관련해 질문이 있습니다.try 구문안에서 예외가 발생하면 밑에있는 try의 남은 구문 건너뛰고 바로 catch문으로가서 잡아주는것으로 알고있습니다.그런데 공부하다보니까 헷갈리는게 MemberRepository에 있는 save메서드로 예를 들면,con.prepareStatement(sql)부터 SQLException을 발생시키는데 어떻게 try안에 있는 것들이 정상적으로 수행되는지 궁금합니다.예외가 나오는 순간 catch문으로가서 catch구문을 수행하는 것이 아닌가요 ?? @Override public Member save(Member member) { String sql = "insert into member(member_id,money) values(?,?)"; Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney()); pstmt.executeUpdate(); //수정 return member; } catch (SQLException e) { log.error("db error", e); throw new MyDbException(e); }finally { close(con, pstmt, null); } }
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
test.mv.db 파일이 생성된걸 어디에서 확인 가능한가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.test.mv.db 파일이 생성된걸 어디에서 확인 가능한가요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
예외처리
안녕하세요 예외처리에 대한 질문이생겨 글 적습니다 !MemberServiceV3_2에서 bizLogic()을 호출해서 메서드에서 던져진 SQLException을 잡습니다 그런데 MemberServiceV3_1에서 트랜잭션 매니저로 처리하는 try catch문에서는 Exception으로 예외를 잡는데 Exception이 모든 예외의 조상이라서 모든 예외를 잡는건 알고있습니다 !그런데 헷갈리는 부분이 SQLException이 commit을 하면 사라지나요 ?아니면이때 SQLException이 잡히나요 ? 잡히지만 이미 커밋을 해버려서 롤백할 데이터가 없기 때문에 SQLException을 IllegalStateException으로 바꿔주기만 하고 try catch문을 빠져나오는 걸까요 ??
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
별도의 쓰레드를 만드는 원리
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요!!최근 병행해서 공부하고 있는 멀티 쓰레딩 개념을 도입해서 정리한 게 맞나 확인하고 싶어서 이렇게 남겨봅니다.별도의 쓰레드를 만드는 이유: 커넥션 풀에 채우는 작업 자체가 CPU 점유 시간(cpu time)이 커서별도의 쓰레드가 생긴 이유: HikariCP 라이브러리를 만든 개발자가 코드를 그렇게 작성 쓰레드 관리: 자바의 쓰레드 풀에 있는 쓰레드는 유저 레벨 쓰레드이고 os레벨의 쓰레드와 매핑되어서 사용하는데 이 멀티 쓰레딩 자체는 결국 cpu가 cpu 스케줄링을 통해서관리(= 컨텍스트 스위칭)항상 감사합니다
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
개인프로젝트에서 Datasource dataSource 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]리포지토리인 Dto 클래스에 private final DataSource dataSource시 Could not autowire. No beans of 'DataSource' type found.라는 오류가 뜨면서 빌드가 안 됩니다! 서비스에서 트랜잭션을 쓰지는 않지만 DataSource를 적용해보고 싶었는데 안 되네요 ㅠㅠ package com.spring.dto; import com.spring.dao.member.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; @Repository @RequiredArgsConstructor public class JDBCMemberDto implements MemberDto{ private final DataSource dataSource; // 테이블 열 private static final String TABLE_NAME = "USERS"; private static final String ID_COLUMN = "ID"; private static final String USERID_COLUMN = "USERID"; private static final String PASSWORD_COLUMN = "PASSWORD"; private static final String NAME_COLUMN = "NAME"; @Override public Member save(Member member) { String query = "INSERT INTO " + TABLE_NAME + " (" + ID_COLUMN + ", " + USERID_COLUMN + ", " + PASSWORD_COLUMN + ", " + NAME_COLUMN + ") VALUES (SEQ_USER.NEXTVAL, ?, ?, ?)"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)){ pstmt.setString(1, member.getUserId()); pstmt.setString(2, member.getPassword()); pstmt.setString(3, member.getName()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return findByUserId(member.getUserId()).get(); } @Override public Member findById(Long id) { Member member = new Member(); String query = "SELECT * FROM USERS WHERE id = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)){ pstmt.setLong(1, id); ResultSet rs = pstmt.executeQuery(); if(rs.next()) { member.setId(rs.getLong(ID_COLUMN)); member.setUserId(rs.getString(USERID_COLUMN)); member.setPassword(rs.getString(PASSWORD_COLUMN)); member.setName(rs.getString(NAME_COLUMN)); } else { throw new NoSuchElementException("유저를 찾을 수 없습니다. memberId=" + id); } } catch (SQLException e) { e.printStackTrace(); } return member; } @Override public Optional<Member> findByUserId(String userid) { return findAll().stream() .filter(member -> member.getUserId().equals(userid)) .findFirst(); } @Override public List<Member> findAll() { List<Member> list = new ArrayList<>(); String query = "SELECT * FROM USERS"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)){ pstmt.executeUpdate(); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong(ID_COLUMN)); member.setUserId(rs.getString(USERID_COLUMN)); member.setPassword(rs.getString(PASSWORD_COLUMN)); member.setName(rs.getString(NAME_COLUMN)); list.add(member); } } catch (SQLException e) { e.printStackTrace(); } return list; } private Connection getConnection() throws SQLException { Connection connection = dataSource.getConnection(); return connection; } }