[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] static class CallService{ public void external() { log.info("call external"); printTxInfo(); internal(); } @Transactional public void internal() { log.info("call internal"); printTxInfo(); } } 위 코드에서 교안의 그림과 설명에서 callService.external()을 호출할 때, 트랜잭션 프록시로부터 먼저 호출된다고 되어있는데 external()메서드는 @Transactional이 적용되어 있지 않음에도 프록시로 호출되는 이유는 같은 클래스 레벨인 internal()메서드에 @Transactional이 선언되어 있어서 CallService클래스 자체가 프록시로 생성되기때문인가요? 옳바르게 이해한지 확인하고싶어 질문드립니다ㅠㅠ
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 정말 JPA를 제대로 배우며 유익한 시간을 보내고 있는 수강생입니다. 질문 1. 페치조인2 - 한계 강의를 듣던 중 @BatchSize 를 조절하여 N+1 문제를 해결하는 예시를 보여주시는데 보여주신 예시의 로그와 제가 테스트 해봤을 때의 로그가 좀 다르게 나와 질문드립니다. 인강에서 보여주실 때에는 load one-to-many 라고 주석이 달리면서 실제 조건문에서는 ? 가 2개만 찍혀있는데 제가 테스트 해보니 BatchSize에 지정해준 숫자 만큼 로그에 ? 가 찍히는것을 확인 할 수 있었습니다. 혹시 제가 잘 못 테스트 한 것 일까요? 질문 2. 또한 강의에서 일반적으로 BatchSize 를 전역 설정으로 해놓고 100~1000 사이의 크기를 지정하여 사용하신다고 말씀하셨는데 이는 DB 조회 쿼리 횟수는 줄어들어 N+1 문제는 완화할수 있지만 지연 로딩 시 내가 접근한 객체의 수 만큼만 로드하는 것이 아닌 무조건 배치 사이즈 만큼 로드되기 때문에 그 간격이 크면 메모리적인 낭비가 되는거 아닌가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. for (int i = 0; i < numbers.size(); i++) { System.out.print(numbers.get(i)); if(i<numbers.size()-1){ System.out.print(", "); } } i < number.size()-1 쪽이 제대로 이해가 안되는거같아서 질문합니다. 정수 입력을 1,2,3 입력했으면 numbers.size() = 3 i값 = 0 , numbers.size =3 i값 = 1 , numbers.size = 3 마지막 반복인 i값 = 2 , numbers.size = 3 을 할때는 2<3-1 은 맞지않으니 마지막 3뒤에 " , " 출력안됨 제가 이해한게 맞을까요 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요 강의 정말 잘 듣고있습니다 !! 강의 30:00 부근에서 TABLE_PER_CLASS 전략이 왜 안좋냐면 조회시 부모 클래스로 조회를 할 수도 있는데 그런경우에 UNION 쿼리가 나가는 단점이 있다고 하셨습니다. 그래서 전략을 JOINED로 바꾸고 실행해봤는데 이런식으로 LEFT JOIN을 여러번 하게 되고 SINGLE TABLE 전략은 예상한대로 이런 결과가 나오더라구요. 이 결과들만 보면 SINGLE TABLE이 말씀하신것처럼 심플하게 조회가 되고, JOINED와 TABLE PER CLASS 는 사실 성능상 비슷해보이는데 TABLE PER CLASS 전략만 단점을 소개해주셔서 질문드렸습니다. 질문은 한마디로, JOINED도 성능이 그렇게 좋진 않은것 아닌가?? 입니다!! 읽어주셔서 감사합니다.
[질문 내용] 안녕하세요, 스프링부트 3.3.0 버전이라서 교재에 나온대로 mybatis-spring-boot-starter 3.0.3으로 추가했는데 다음과 같이 ItemMapper가 빈으로 등록되지 않습니다. Could not autowire. No beans of 'ItemMapper' type found. 그래서 다른 분들처럼 버전 내려보기도 해봤는데 계속 오류가 뜨네요. 자주하는 질문에 나오는 프로젝트 초기화도 해봤는데 오류가 생깁니다. 한번 봐주시면 감사하겠습니다. 구글 드라이브 https://drive.google.com/file/d/1EDUWv_GFWyZqOXpXsSuGvkU_ovDC8SWA/view?usp=sharing
homeController에서 return "redirect:/items"; 를통해 itemController에 있는 items로 매핑이 된 메서드로 이동해 items뷰템플릿을 보여주는건 이해했습니다! 그런데 왜 localhost:8080 을 웝페이지에 띄웠을 때 static에있는 index.html이 호출이 되지 않고 homeController에있는 /URL이 호출이되나요 ? requestMapping("/") 이게 기본화면과 매핑된 URL인가요 ??
현재 특정날에 (예: 2024.06.20 11:00) 에 쿠폰을 배포하는 서비스를 구현하려고 합니다. 흔히 배민에서도 이런 이벤트를 진행하는 걸로 알고 있고, 쿠폰은 아니지만, 인강 사이트 등에서 프리패스 상품을 오픈할 때 특정 날에 활성화돼서 해당 상품을 구매할 수 있도록 하는 것으로 알고 있습니다. 이외에도 콘서트 티케팅 오픈, 수강신청 오픈 등등 이러한 서비스를 구현하고자 하는데, 어떤 키워드로 검색을 하여 접근할지 감이 안옵니다.... 이것과 관련하여 어떤 키워드로 접근하면 좋을지 조언을 부탁드립니다.
데이터를 bbb 같은 데이터에 담고 그걸 presenter에 담으면 presenter에서 데이터를 알아보기 어려우니까 3번과 같이 map 자체를 <div> 에 담아서 렌더링 한다고 말씀하셨는데요, 그렇다면 3번과 같은 렌더링은 컨테이너의 return에 적는걸까요 아니면 presneter의 return에 적는걸까요?
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class LoginDto { @NotBlank private String email; @NotBlank private String password; } ------------------------------------- @Component public class LoginValidator implements Validator { private final UserRepository userRepository; public LoginValidator(UserRepository userRepository) { this.userRepository = userRepository; } @Override public boolean supports(Class<?> clazz) { return LoginDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { LoginDto loginDto = (LoginDto) target; User user = userRepository.findByEmail(loginDto.getEmail()); if (user == null) { throw new LoginFailedException("User not found"); } if (!user.getPassword().equals(loginDto.getPassword())) { throw new LoginFailedException("Invalid password"); } } } 위 코드처럼 DTO 클래스에서 간단한 검증은 bean validation으로 시행하고, 복잡한 검증로직은 LoginValidator에서 관리 및 커스텀 예외를 리턴하는 방식은 안좋은 방식인가요? 제가 알기로는 errors는 bindingresult처럼 복잡한 검증이 아니라 단순한 검증결과를 담는 것으로 알고 있는데, validate를 override하여 복잡한 검증 실행 및 검증 결과를 LoginFailedException(커스텀 예외)으로 반환하려고 하니 Errors를 리턴해야 한다는 강제성 때문에 혼란이 생겼습니다. 따라서 제가 궁금한 점은, 간단한 검증작업(ex. 정규식) 과 복잡한 검증작업(ex.이메일,비밀번호가 DB에 있는지 검증)은 어떻게 처리하는게 이상적인가? 입니다. 저는 각각 Bean Validation, Validator(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class LoginDto { @NotBlank private String email; @NotBlank private String password; } ------------------------------------- @Component public class LoginValidator implements Validator { private final UserRepository userRepository; public LoginValidator(UserRepository userRepository) { this.userRepository = userRepository; } @Override public boolean supports(Class<?> clazz) { return LoginDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { LoginDto loginDto = (LoginDto) target; User user = userRepository.findByEmail(loginDto.getEmail()); if (user == null) { throw new LoginFailedException("User not found"); } if (!user.getPassword().equals(loginDto.getPassword())) { throw new LoginFailedException("Invalid password"); } } } 위 코드처럼 DTO 클래스에서 간단한 검증은 bean validation으로 시행하고, 복잡한 검증로직은 LoginValidator에서 관리 및 커스텀 예외를 리턴하는 방식은 안좋은 방식인가요? 제가 알기로는 errors는 bindingresult처럼 복잡한 검증이 아니라 단순한 검증결과를 담는 것으로 알고 있는데, validate를 override하여 복잡한 검증 실행 및 검증 결과를 LoginFailedException(커스텀 예외)으로 반환하려고 하니 Errors를 리턴해야 한다는 강제성 때문에 혼란이 생겼습니다. 따라서 제가 궁금한 점은, 간단한 검증작업(ex. 정규식) 과 복잡한 검증작업(ex.이메일,비밀번호가 DB에 있는지 검증)은 어떻게 처리하는게 이상적인가? 입니다. 저는 각각 Bean Validation, Validator(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 질문이 생겨서 글을 남깁니다. 저가 이것저것(아픔 + 번아웃..등)이 있어서 한 2주 정도 인가요? 코딩하는데 거의 손을 놓고 있엇습니다.(해 봐야 30분에서 2시간이하 정확히는 기억이 안남 ,아니면 아에 안함 ) 그리고 나서 날짜와 시간 사이에서 너무 막혀서(캘린더 는 정말 싫네요.. 하신 분들 존경 합니다.) 에라이 전에 있던 문제 풀이나 복습 해보자 하고 하였는데.. String챕터 문제 풀이 부터 막히더라고요.(문제와 풀이만 보고서여.pdf파일에 있는 내용 참조 안함) 그래서 다시 보고 있긴 한데, 시간이 지나고 나서( ex)예외처리까지 챕터 까지했을때 - 7월달까지 중급2편을 끝내고 싶었는데.. 역시 계획 대로는 안되네요...), 저가 이것들을 할 수 있을까 하는 의문이 들더라고요. 이럴 때에는 어떻게 해야 하는지 궁금합니다. 지금은 저가 중요하다고 생각하는 것을 손코딩 + 동영상 보면서 코드 를 지우고 다시 침, 이렇게 하고 있긴 한데 더욱 좋은 방법이 있을까요? 아니면 지금 이대로 계속 하는 게 맞는 방법인가요? 답변 부탁드립니다.
> Task :prepareKotlinBuildScriptModel UP-TO-DATE FAILURE: 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 이런 오류가 발생합니다.ㅜㅜ