[질문 내용] 해당 영상에서 unCheckedAppTest 클래스 내에서 SQLException을 RuntimeException으로 변환하는 부분을 static class로 생성해서 사용하고 있습니다. <첫 번째 질문> 이렇게 체크 예외를 런타임 예외로 바꿀 때 항상 static class로 생성해야 되는지 아니면 try { ~~ } catch(SQLException e) { throw RuntimeException(e); } 이렇게 사용해도 되는지 궁금합니다. <두 번째 질문> 체크 예외를 런타임 예외로 바꾸는 부분을 static class로 생성할 때 무조건 해당 체크 예외가 발생하는 클래스에다 생성해야 하는지도 궁금합니다.
findItems()에서 "itemA", "itemB"가 남아있다는 오류가 발생합니다. jdbc:h2:tcp://l ocalhost/~/testcase 로 접속해서 select 해 보면 데이타가 없는데, =jdbc:h2:tcp:// localhost/~/test 로 접속해서 select하면 "itemA", "itemB" 가 남아있습니다.(삭제하고 다시 실행해도....). TestDataInit을 실행하는거 같네요?? @Bean @Profile("local") public TestDataInit testDataInit(ItemRepository itemRepository) { return new TestDataInit(itemRepository); } 링크 :: https://drive.google.com/file/d/1HD2gxtYhL8B5fZ3KazZ148-4x66PPCuo/view?usp=sharing
Lombok의 @Data 가 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 를 만들어주는 애노테이션이라는 건 잘 압니다. 제 질문은 왜 스프링DB 2 :: 테스트 - 데이터 베이스 연동 테스트의 save에서 오류가 발생 했었는데, @Getter, @Setter를 @Data 로 바꾼 행위만으로 오류가 발생하지 않게 된 이유를 알려달라는 겁니다. @Getter, @Setter 만 설정하는게 잘 못 된거라면 그 이유가 뭐냐는 걸 문의한겁니다. https://www.inflearn.com/questions/1258907/%EC%8A%A4%ED%94%84%EB%A7%81db-2-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99-%EC%98%A4%EB%A5%98
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. ========================================= 헤매다가 해결했는데 다른 분들께 도움이 될 것같아서 커뮤니티에 남깁니다 ㅎ_ㅎ .gradle 폴더 내 6.8.2 파일 삭제(gradle 충돌 방지) gradle/wrapper/gradle-wrapper-.properties 수정 distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip build.gradle 파일 수정 plugins { id 'java' id 'org.springframework.boot' version '3.2.5' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } javax -> jakarta 수정 // import javax.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
https://drive.google.com/file/d/1n_YIwUiIsidlVs38Oq6rPsBjoO8HgW1T/view?usp=drive_link 강의자료 코드도 복붙해보고 소스파일 올려주신거도 열어봤는데 오류가 발생합니다. h2데이타베이스 내렸다 다시 켜봐도 안됩니다 ㅠ 로그를 보니까 OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 오류가 뜨고 멤버 테이블도 존재하지 않는다고 합니다.
추가 질문입니다. @Data 보다는 @Getter @Setter를 쓰는게 좋다고 하셔서 @Getter @Setter를 쓰고 별도 생성자도 만들었는데....... @Getter @Setter를 @Data로 변경 햤을 때 오류가 발생하지 않는 이유를 알려주세요. https://www.inflearn.com/questions/1258907/%EC%8A%A4%ED%94%84%EB%A7%81db-2-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99-%EC%98%A4%EB%A5%98
public class LoginController { private final LoginService loginService; private final SessionManager sessionManager; @PostMapping("/login") public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) { if (bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } //로그인 성공 처리 //세션이 있으면 있는 세션 반환, 없으면 신규 생성 HttpSession session=request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember); return "redirect:/"; } @Slf4j public class LoginCheckFilter implements Filter { private static final String[] whitelist={"/","/members/add","/login","/logout","/css/*"} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest=(HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); HttpServletResponse httpResponse=(HttpServletResponse) response; try{ log.info("인증체크 필터 시작{}",requestURI); if (isLoginCheckPath(requestURI)){//화이트 리스트가 아닐 때 true반환 로그인 상태가 필요한 사이트이라면 log.info("인증체크로직실행{}",requestURI); HttpSession session = httpRequest.getSession(false); if (session==null || session.getAttribute(SessionConst.LOGIN_MEMBER)==null){ log.info("미인증 사용자 요청{}",requestURI); //로그인으로 redirect httpResponse.sendRedirect("/login?redirectURL="+requestURI);//로그인 되면 다시 반환된 페이지로 로그인 return; } } //화이트 리스트일 때 chain.doFilter(request,response); }catch (Exception e){ throw e;//예외 로깅 가능하지만, 톰캣까지 에외를 보내주어야 한다. }finally { log.info("인증체크필터종료{}",requestURI); } { } } public String loginV3( 안에 HttpSession session=request.getSession(); 세션이 없으면 무조건 생성인데요. class LoginCheckFilter는 httpRequest.getSession(false);이거는 왜 false인가요? 로그인과 관련된 페이지 잖아요. 로그아웃의 경우 없애버릴꺼여서 세션을 만들지 않는것까지 이해했는데요.
예시로 설명해주신 NetworlClient클래스의 RuntimeConnectionEx 예외를 실제 시스템에서 잡지 않고 무시하면 서비스를 이용하는 고객들에게 어떤 문제가 발생하였는지 인지 시켜줄 수 없게되고 고객들은 연결이 안되는 서비스를 무한 로딩한 상태로 대기 하게 되는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 다음과 같은 오류가 발생하는데 어떻게 해결하나요?
강의 내용이 어려워서 다시 마음 잡을겸 처음부터 보고 있습니다. 강의 내용을 들으면서 앱도 웹 기반 동작을 하기 때문에 벡엔드 개발은 클라이언트에 의존하지 않는다고 이해 하였는데 웹 개발이 아닌 앱 개발을 할때도 start.spring.io 사이트에서 spring web을 다운 받으면 되는건가요? + 현제 스프링 db1편을 수강중인데 db2편까지 수강을 마치면 db연동까지 가능한(동시에 여러 사용자가 사용하는) 프로젝트를 개발하는것이 가능한가요? 아니면 나머지 강의인 스프링 고급과 핵심원리 활용까지 수강을 하여야 하나요?
저는 데이터를 새로 생성해서 테스트를 했는데, save와 finditems 두 군데 모두 오류가 발생합니다. 링크 :: https://drive.google.com/file/d/1i7i95iRprKTD08l5TuPj1iCOAVPDvNTT/view?usp=sharing save 오류 :: org.opentest4j.AssertionFailedError: expected: hello.itemservicedb.domain.Item@a2df0d5 but was: hello.itemservicedb.domain.Item@26d028f7 finditems 오류 :: org.opentest4j.AssertionFailedError: Expecting actual: [hello.itemservicedb.domain.Item@4cc26df, hello.itemservicedb.domain.Item@7848321e, hello.itemservicedb.domain.Item@f4f843f, hello.itemservicedb.domain.Item@7b5833ee, hello.itemservicedb.domain.Item@1e471884, hello.itemservicedb.domain.Item@27261190, hello.itemservicedb.domain.Item@543b0737] to contain exactly (and in same order): [hello.itemservicedb.domain.Item@6e46891d, hello.itemservicedb.domain.Item@48632f69, hello.itemservicedb.domain.Item@5fde1d64] but some elements were not found: [hello.itemservicedb.domain.Item@6e46891d, hello.itemservicedb.domain.Item@48632f69, hello.itemservicedb.domain.Item@5fde1d64] and others were not expected: [hello.itemservicedb.domain.Item@4cc26df, hello.itemservicedb.domain.Item@7848321e, hello.itemservicedb.domain.Item@f4f843f, hello.itemservicedb.domain.Item@7b5833ee, hello.itemservicedb.domain.Item@1e471884, hello.itemservicedb.domain.Item@27261190, hello.itemservicedb.domain.Item@543b0737]
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 테스트 케이스 중 save() 테스트와 updateItem()테스트에서 itemRepository.findById를 호출하는 부분이 있습니다. itemRepository.findById(item.getId()).get(); 이 경우 select 쿼리가 나가는 걸로 알고 있는데 로그에는 노출되지 않습니다. 1) save() 2) updateItem() 강사님 화면에도 노출되지 않던데 그 이유가 있을까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요 영한님. 항상 좋은 수업 감사합니다. 이번 수업을 통해 MySQL 또는 Postgresql와 같은 대중적인 RDBMS의 경우, 서로 다른 세션에서 시작된 서로 다른 트랜잭션에서 동시에 동일 테이블의 동일 row에 대해 write operation을 수행할 때에는, 별도의 Pessimistic Lock등을 사용하지 않더라도, RDBMS에서 제공해주는 기본 락이 걸리는 것으로 이해했습니다. 그럼에도 불구하고 상품 주문시 상품의 재고를 감소시키는 등의, 비즈니스 로직 단위의 레이스 컨디션 문제의 경우, select 후 udpate를 하게 되는데 그 select에서 update되기 전 값을 읽어온다면, (read operation에 대해서는 rdbms 기본 lock이 안걸리니깐) 여기서 레이스 커디션 문제가 발생하므로, 비즈니스 로직 단위의 레이스 컨디션 문제를 막고자 한다면 DB 락 or 레디스 등 별도의 솔루션을 적용해야 하는 것으로 이해했는데요, 제가 이해한 내용이 맞을지 질문 드립니다. 감사합니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 예외를 던지거나 잡아서 처리한다는 내용에 대해 질문이 있는데요.. 어떻게 예외를 처리해야하는지 그 부분이 현재까지 본 강의로는 조금 추상적이라 이해가 부족한데 혹시 조금더 설명 해주실수 있으실까요? try catch 를 이용해서 예외 발생시 롤백을 하고 어떤 응답값을 리턴한다 같은 처리를 이야기 하는걸까요? 만약 그렇다면 @Transactional을 하는 경우는 롤백은 되지만 응답에 대한 처리는 어떻게 할 수 있을까요?