묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
SQLexception 질문
체크예외인 SqlException의 문제점을 리포지토리 레벨에서 런타임 예외로 바꾸어 유지보수성을 향상시킨다고 생각했습니다.여기서 드는 생각은, 애초에 자바 진영(?) JDBC측에서 sqlException 자체를 언체크로 다시 설계해서 내뿜도록 하면 되지 않나요? 결국 예외가 발생하는 가장 처음 부분에서 잡는 것이지만 Jpa exception이 올라온다면 이를 또 바꾸어줘야 하는데 애초에 체크였던 sql,jpa exception을 언체크로 뿌려지게끔 하지 않는 이유를 모르겠습니다.체크는 꼭 인지해서 처리해야할 예외를 체크로 만든다고 했는데 사실상 처리하기 어려운 예외로 굳어져서 코드들만 유지보수성을 떨어뜨리는 체크예외를 라이브러리를 만든 측에서 언체크로 바꾸어주면 안되나 싶었습니다.제가 어떤 이해가 부족할까요... 아마도 언체크 예외로 바꾼다면 발생할 문제들이 존재할 것 같은데. (이전에 배운 exceptionHandler가 언체크를 못잡는 것도 아닌데 말이죠)
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
세션1이 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다는 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 아래는 강의 자료에 있는 내용입니다.------------------------------------------세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터 를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다.------------------------------------------ money=10000인 상태에서 세션1이 money를 5000으로 바꾼다고 하더라도 커밋을 하지 않는다면, 세션2가 보고 있는 money는 여전히 10000인 거고 10000에 접근하는 거 맞나요? 그렇다면 세션1이 롤백을 하더라도 세션2은 기존 10000을 수정하고 있는 거니 잘못된 데이터를 수정하는 건 아니지 않나요? 위에 굵게 표시한 부분 어떤 의미인지 궁금합니다. 아니면 위에 있는 설명은 커밋되지 않는 데이터에 접근하는 경우라고 가정하는 건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV3_3Test 질문드립니다.
스프링AOP를 적용하려면 스프링컨테이너가 필요하다고 하셨는데, 그 이유가 프록시객체가 스프링빈으로 스프링컨테이너안에 있어야하고, 이를바탕으로 @Autowired MemberServiceV3_3 memberService; 여기에 스프링컨테이너에 있는 프록시객체의 스프링빈을 의존성주입 해주기위해 라고 이해하면 될까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2의 트랜잭션 수행 시간 타임아웃
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]데이터베이스엔 트랜잭션 수행 시간 타임아웃이 보통 설정되어 있고, 설정한 시간을 넘어가게 되면 자동으로 rollback이 된다고 강의에서 말씀하셨는데 H2 DB의 경우 디폴트 시간이 얼만큼인가요? H2 콘솔에서 set autocommit false;insert into member(member_id, money) values ('data3',10000);insert into member(member_id, money) values ('data4',10000); 이렇게 실행하고 커밋은 안 한 다음,주기적으로 SELECT * FROM MEMBER를 해 봤는데 data3, data4에 대한 데이터가 계속 보입니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Autowired를 쓰면 밑줄이 떠서 찾아보니 PrototypeBean과 ClientBean에 @Component를 붙여야 하는데 질문있습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Slf4j @SpringBootTest class MemberServiceV3_3Test { @Autowired private MemberRepositoryV3 memberRepository; @Autowired private MemberServiceV3_3 memberService; @BeforeEach void before() { DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD); memberRepository = new MemberRepositoryV3(dataSource); PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); memberService = new MemberServiceV3_3(memberRepository); } @AfterEach void after() throws SQLException { memberRepository.delete("memberA"); memberRepository.delete("memberB"); memberRepository.delete("ex"); } @Test @DisplayName("정상 이체") void accountTransfer() throws SQLException { //given Member memberA = new Member("memberA", 10000); Member memberB = new Member("memberB", 10000); memberRepository.save(memberA); memberRepository.save(memberB); //when memberService.accountTransfer(memberA.getMemberId(), memberB.getMemberId(), 2000); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberB.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(8000); assertThat(findMemberB.getMoney()).isEqualTo(12000); } @Test @DisplayName("이체중 예외 발생") void accountTransferEx() throws SQLException { //given Member memberA = new Member("memberA", 10000); Member memberEx = new Member("ex", 10000); memberRepository.save(memberA); memberRepository.save(memberEx); //when assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) .isInstanceOf(IllegalStateException.class); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberEx = memberRepository.findById(memberEx.getMemberId()); //memberA의 돈이 롤백 되어야함 assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberEx.getMoney()).isEqualTo(10000); } }다음과 같이 @Autowired를 쓰면 밑줄이 떠서 찾아보니 PrototypeBean과 ClientBean에 @Component를 붙이면 해결된다고 합니다. PrototypeBean과 ClientBean에 대해서는 아는게 없어서 GPT에 물어봤는데 PrototypeBean과 ClientBean을 정의하고 @Component와 @Scope를 붙히면되고, Spring 컨테이너 설정은 @ SpringbootAplication 이 붙은 클래스가 있는 경우를 전제하에 설명해줬습니다.마지막에 프로토타입빈을 주입받아서쓰면된다고 합니다. 막혔던 부분은 일반적으로 애플리케이션의 PrototypeBean과 ClientBean을 정의하는 코드는@SpringBootApplication 클래스가 위치한 패키지와 그 하위 패키지 내에 배치해야만 한다는데 따로 @ SpringbootAplication이 있는 클래스가 없는데 새로 만들어야되는지 모르겠어요ㅠ마찬가지로 spring컨테이너 설정도 @ SpringbootAplication을 전제하에 설명하는데 지금 코드에 관련 애노테이션은 @SpringBootTest만 있는데 전혀 감이 잡히질 않습니다ㅠ
-
미해결토비의 스프링 부트 - 이해와 원리
강의 자료 레퍼지토리에 업로드
안녕하세요, 강사님.저는 강사님의 스프링 부트 강의를 수강하며 학습하고 있는 학생입니다. 학습한 내용을 정리하고 코드와 함께 깃허브에 업로드하여 관리하고 있습니다.제가 학습의 편의를 위해, 강의에서 제공해주신 자료도 함께 깃허브 레포지토리에 올려서 관리하고자 하는데, 이를 public으로 설정해도 괜찮을지 여쭤보고 싶습니다. 만약 문제가 된다면, 레포지토리를 private으로 설정하고 학습 자료를 개인적으로만 참고하겠습니다.답변 주시면 감사하겠습니다!감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의와 다르게 저만 에러가 떠요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 김영한 강사님 DB수업 1편 트랜잭션 이해 쪽의 적용 강의에서 자꾸 오류가 납니다.적용1은 에러뜨는게 너무 답답해서 적당히 이해하고 트랜잭션 적용된 코드인 적용2 강의를 듣고있었는데 계속 오류가 뜨네요.이 코드뿐만 아니라 김영한 강사님의 대부분의 수업에서 강사님은 오류가 안뜨는데 인텔리제이나 스프링의 업데이트 이후 달라진건지 모르겠지만 오류 안날코드에서도 오류가 납니다.일단 트랜잭션이 적용된 다음 코드에 있는 오류가 강의와는 다르게 왜 오류가 나는지 알려주시면 감사하겠습니다. https://drive.google.com/file/d/1jHHZ-dTRFJT8jga31k1VWrsB8cLG8OqH/view?usp=drive_link
-
미해결토비의 스프링 부트 - 이해와 원리
강의자료
안녕하세요 토비님 혹시 강의자료로 사용했던 notion 은 공유 안되나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
"정상 이체" 정상 실행인데 "이체중 예외 발생"은 실패하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 스프링 AOP는 스프링 컨테이너에서 등록된 빈들을 통해 DI가 되고 트랜잭션 프록시 객체를 생성하는 것은 완벽히 이해 했습니다. 근데 MemberServiceV3_3는 스프링 AOP를 쓰는데 강의처럼 Bean을 등록하기 전에 "정상 이체" 메소드는 정상 실행되고 "이체중 예외 발생"은 롤백이 일어나지 않아 실패하는건가요 ?빈들을 등록하지 않았기 때문에 "정상 이체" 메소드도 커밋이 되지 않아야 된다고 생각하는데 이유가 궁금합니다 !!
-
미해결토비의 스프링 부트 - 이해와 원리
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
제가 이번 강의까지 보다가 한달만에 다시봐서 헷갈리는걸수도 있는데 갑자기 궁금하여 질문드립니다..Hikari 라이브러리를 gradle에서 가져오지 못하는 이슈 때문에 이번 강의의 커뮤니티 게시판에 다른 분이 작성한 글을 참고하여 토비님과 다르게 gradle에 implementation('com.zaxxer:HikariCP:4.0.3')를 추가해줘서 강의를 보고 있는데요.강의에서 DataSourceConfig 클래스 안에서 Hikari 관련된 빈을 등록하여 사용하려고 하는데, 이게 어떻게보면 Hikari 관련된 라이브러리가 있으면 사용하고, 아니면 기본 DataSource를 사용하게끔 하는 의도가 있는 자동구성등록하는 방법 이잖아요.. 근데 Hikari 라이브러리를 gradle에 추가 후, 토비님 처럼 테스트를 하면 Hikari가 DataSource로 사용되어 정상 동작하는데, 만약에 반대로 Hikari를 gradle에서 빼면 기본적인 SimpleDriverDataSource 객체가 사용되는게 예상을 하였는데, 당연하게도? gradle에서 Hikari 관련된 implement를 제거해버리면, SimpleDriverDataSource 객체를 사용하기 전에 DataSourceConfig 클래스 안에서 Hikari 관련된 로직들이, Hikari 라이브러리가 없기 떄문에 오류가 나지 않나요?즉, Hikari라는 라이브러리가 없도록, gradle에서 Hikari와 관련된 implements를 빼버리면 SimpleDriverDataSource 가 사용되는게 아니라, 애초에 소스에서 오류가 나는게 맞는건데.. 제가 어디부터 혼란이 온지 모르겠네요.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
jdbc 등록 강의에서 레포지터리 테스트코드 돌려서 오류는 안뜨는데 테이블에 값이 안들어가져요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]jdbc 강의중 등록 이라는 강의 순서에서 MemberRepositoryV0 테스트 돌려서 오류는 안나는데 Member라는 h2의 테이블에 아무 값도 안들어가졌습니다. MemberRepositoryV0 코드는 강사님이 알려주신대로 똑같이 했는데 오류가 계속 나서 ppt에 있는 코드 가져와서 오류뜨는거 한개 정도만 잡았는데 레포지터리 코드가 이상한 걸까요? Repository코드package hello.jdbc.repository; import hello.jdbc.connection.DBConnectionUtil; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import java.sql.*; /** * JDBC - DriverManager 사용 */ @Slf4j public class MemberRepositoryV0 { public Member save(Member member) throws SQLException { 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 e; } catch (IllegalAccessException e) { throw new RuntimeException(e); } finally { close(con, pstmt, null); } } private void close(Connection con, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { log.info("error", e); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { log.info("error", e); } } if (con != null) { try { con.close(); } catch (SQLException e) { log.info("error", e); } } } private Connection getConnection() throws IllegalAccessException { return DBConnectionUtil.getConnection(); } }
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀 세션연결
안녕하세요.커넥션 풀 관련 질문이 있습니다! 커넥션 풀에있는 커넥션들은 dbms와 계속 연결되어있는 상태라고 하셨습니다. 만약 커넥션풀에 커넥션이 10개일때 이 10개의 커넥션은 dbms 세션이 계속 끊기지않고 연결되어있을테고 dbms 서버가 다운되지않는 이상 세션이 계속 유지 될텐데.. temp table 같은 가상 테이블을 사용하게 되면 세션이 무조건 종료 되어야 메모리에서 가상 테이블이 소멸된다고 알고 있는데커넥션풀을 사용하게되면 temp Table 은 소멸되지않고 계속 dbms 서버 메모리에 떠있게 되는건가요? 아니면 커넥션을 사용하고 반납하는 순간 세션이 끊기는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외처리에 대해서 이렇게 이해하면 될까요?
안녕하세요. 강의를 듣던중에 예외처리부분에 대해서 헷갈려서 다음장 예외처리 부분의 강의를 미리 보면서 구글링도 하면서 아래와 같이 정리해보았는데, 이렇게 이해하면 될까요? 0. throw = 예외를 던진다 = 예외를 발생시킨다. throws = 예외를 호출하는쪽으로 던진다. 1. [체크예외] - 반드시 예외처리를 해야함.메소드 안에서 throw를 통해 throw new 체크예외()를 하게되면, throw new 체크예외()를 try~catch를 통해 해결하거나, throws로 체크예외를 던져서 해당메소드를 호출하는쪽에서 예외를 처리하도록 해야한다.public void call() { throw new 체크예외();}이 코드에서 call메서드는 예외를 처리하거나 throws로 던지지않았다. 그래서 컴파일오류가 발생한다.그렇기때문에 call() 옆에 throws 체크예외를 적어주거나, public void call() { try { throw new 체크예외(); } catch (MyCheckedException e) { e.printStackTrace(); // 예외 처리 로직 }}try~catch로 예외를 처리해야한다.즉, 메소드를 실행할떄 , 메소드 내부에서 throw을 사용해서 예외를 발생시키고 싶으면, 예외를 발생시키는 코드만 단독으로 있으면 안되고 try문안에서 예외를 발생시키고 예외가 발생하면 catch를 통해 예외를 처리하는 코드랑 같이 사용하거나, throws로 해당예외를 실행시키는 메소드를 호출하는쪽에서 예외처리를 하게하도록 throws를 통해 넘겨야한다. 참고로 try~catch를 통해 해결하면 메서드를 호출하는쪽에서는 별다른 예외처리 없이 메서드를 사용할수있다. 2. [언체크예외] - 예외처리를 하지않아도됨.public void call(){ throw new 언체크예외();}컴파일오류가 발생하지않는다. 이코드에서 call메서드는 예외를 처리하지않아도되고, throws로 예외를 던지지않아도된다. 3. 체크예외를 처리한 후 catch 블록에서 다시 throw new 언체크예외()을 하는 것은 체크 예외를 언체크 예외로 바꿔서 언체크 예외를 발생시키기위함이다. throw new 언체크예외();는 예외를 단순히 발생시키는 것이기때문에 try~catch를 통해 해결하지않아도 되고 별도로 throws를 하지않아도 되기때문이다. 참고로 throw new 언체크예외();를 통해 언체크예외가 발생하면 프로그램이 중단된다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외부분에 대해서 질문드립니다
교재내용중에, " 해당람다에서 체크예외를 밖으로 던질수 없기때문에 언체크 예외로 바꾸어 던지도록 예외를 전환했다 " 의 의미는===> 람다에서는 bizLogic()을 호출할때 발생하는 체크예외를 throws를 사용해서 밖으로 던질수 없기때문에 try~catch로 예외를 처리했고, 체크예외를 처리할떄 catch안에서 throw로 IllegalStateException(언체크예외)로 바꾸어 던지는 이유는 트랜잭션 템플릿이 비즈니스로직을 수행하다가 언체크 예외가 발생하면 롤백하기 때문이다. 이렇게 이해하면될까요??
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 생성 시점 질문드립니다.
안녕하세요. 커넥션이 처음 생성되는 시점이 언제인지 질문드립니다..DataSourceUtils.getConnection()을 호출하는 시점에 커넥션이 처음 생성되는것인지, 아니면TransactionStatus status = transactionManager.getTransaction();을 호출하는 시점에 커넥션이 처음 생성되는것인지 질문드립니다..현재 강의에서는 DataSourceUtils.getConnection()의 경우에 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 새로운 커넥션을 생성해서 반환한다고 되어있는데, 다음강의 에서는 transactionManager.getTransaction()을 호출해서 트랜잭션을 시작하는데 이떄 커넥션을 생성한다고 되어있습니다..그래서 두가지 경우중 언제 커넥션이 생성되는것인지 혼란이와서 질문드립니다.. 감사합니다 + 위 내용에 대해서 알아보다가 아래와 같이 정리해 보았는데 이렇게 이해하면 될까요? 1. transactionManager.getTransaction(); 을 통해 트랜잭션 매니저가 트랜잭션을 시작하고, 커넥션을 생성해서 트랜잭션 동기화 매니저에 보관한다. bizLogic()안에 있는 fingById()나 update()를 통해 getConnection() 즉, DataSourceUtil.getConnection(dataSource)를 하게되면, 이때는 트랜잭션 동기화 매니저가 관리하는 커넥션이 있는 경우이므로, 해당 커넥션을 반환한다. 즉, findById()를 할떄의 커넥션과 update()를 할떄의 커넥션이 동일하다.2. transactionManager.getTransaction(); 을 하지않으면, 이때는 트랜잭션을 시작하지않은것이므로,bizLogic()안에 있는 fingById()나 update()를 통해 getConnection() 즉, DataSourceUtil.getConnection(dataSource)를 하게되면, 이때는 트랜잭션 동기화 매니저도 없고, 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우이므로, 새로운 커넥션을 생성해서 반환한다. 즉, findById()를 할떄의 커넥션과 update()를 할떄의 커넥션이 각각 다르다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
프로젝트 의존성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle 에서 implementation 'org.springframework.boot:spring-boot-starter-web' 를 넣고 실행 했을 때는 오류가 나고 지우고 실행하니깐 정상적으로 작동하는데 그 이유가 뭔가요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
런타임 예외를 사용해야 하는 이유에 대해
체크예외보다는 런타임 예외를 사용해야 하는 이유에 대해 다음과 같이 정리해봤는데, 잘 이해하고 있는 게 맞을까요?체크예외든, 언체크예외든 대부분의 예외는 컨트롤러나 서비스 계층에서 복구가 불가능한 예외이다.하지만 이 중에서 언체크예외를 사용한다면, 컨트롤러와 서비스 계층에서 디테일한 예외까지 의존하고 알 필요가 없어진다. 이러한 한 가지의 이유로 언체크예외를 사용하는 것이 더 좋다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
로그 관련 질문
예외와 관련된 로그를 찍는데 로그 레벨을 log.error가 아닌 info로 두는 이유가 있나요?System.out.print()보다 log를 남기는 방법이 더 선호되는 이유가 있나요?에러라는 표현과 예외라는 표현은 같다고 봐도 무방할까요?감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 v2.2.4와 실행모드 관련 질문
안녕하세요현재 강의 한참 초반부라고 할 수 있는 "데이터베이스 연결"부분을 보고 있는데요,강사님께서 사용하는 H2 모드가 임베디드 모드인가요 서버모드인가요?강의 1:09초 즈음 노출되는 화면을 보면 모드는 임베디드 모드이고, JDBC URL은 jdbc:h2:tcp://localhost/~/test 로 보이는데요저는 h2 버전 2.2.4를 이용 중인데 서버 모드일 때는 JDBC URL이 jdbc:h2:tcp://localhost/~/test 형태이지만, 임베디드 모드일 때는 jdbc:h2:~/test 입니다.DBConnectionUtilTest 가 자꾸 실패하여, JDBC URL을 임베디드 모드일 때의 url로 변경하고 서버를 내리면(= ./bin/h2 실행 종료)하면 테스트 코드가 성공하는데요,서버 모드의 url로 변경하면 테스트 코드 실패는 둘째치고 웹 콘솔에서 h2를 실행하려 할 때 아래와 같이 에러가 발생합니다.찾아보니 h2의 임베디드 모드 자체가, 여러 클라이언트가 접근 불가능한 모드이고 하나의 jvm 인스턴스만 접근 가능하다고 되어 있기 때문에, h2 실행파일을 종료하고 테스트코드가 성공하는게 자명하다고 느껴지긴 하는데요.. 영상에서 강사님이 진행하는 과정과 너무 달라지기도 하고, h2 서버모드 실행 시 sonarqube 관련 에러가 발생하는게 의아해서 질문 남깁니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
test 메서드 작성 시 질문
보통 저는 모든 메서드 명에 대해서 camel case로 작성을 합니다. 혹시, 강의 영상에서 테스트 메서드 명에 대해서 snake case로 작성하시는 이유가 있나요? 테스트 메서드 명에 대한 규약인가 싶어서 질문 드립니다.