묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 호출
[질문 템플릿]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클래스 자체가 프록시로 생성되기때문인가요?옳바르게 이해한지 확인하고싶어 질문드립니다ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
그래서 정확히 멀티 쓰레드라는 게 무엇인가요?
쓰레드의 개념에 대해 알겠고, 실제로는 요청마다 쓰레드를 생성하는 것이 아니라 쓰레드 풀에 쓰레드를 200개 정도 생성해두고 꺼내 썼다가 반납한다는 것까지 알겠는데,그럼 멀티 쓰레드는 동시에 여러 쓰레드들이 사용되고 있는 그 상황을 의미하는 건가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
QueryDsl QueryProjection 을 사용했을 때의 dto 위치
안녕하세요! 덕분에 테스트 코드 잘 짜고있습니다 😋 강사님은 QueryDsl 에서 QueryProjection 을 통해 dto 로 한번에 조회하게 되었을때 해당 dto 를 service 계층에 두시는지, 혹은 repository 계층에 dto 를 하나 더 두시는지 궁금합니다!! 둘다 아니라면 어떻게 하시는지도 궁금합니다! (레이어드 아키텍처를 사용한다고 가정) 만약 Service 단에서 querydsl 을 위한 dto 를 생성하게 되면, repository 계층에서 service 계층을 알게되어 의존성측면에서 좋지 않다고 생각합니다. 그렇다고 repository 계층에서 querydsl 을 위한 dto 를 생성하게되면 의존성측면에서는 괜찮다고 볼 수 있지만 좀 번거롭다고 생각이듭니다. (계층마다 dto 가 하나씩..?) 선생님께서는 어떤 방식으로 해결하시는지가 궁금합니다! 제가 잘못생각한거라면 조언좀 부탁드립니다!(말을 너무 못하네요.. 죄송합니다)
-
미해결
생성 메서드에 대한 질문있습니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발강의 내용에서 Order 클래스에서 생성메서드를 만들었습니다.//==생성 메서드==// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; }위의 Order 클래스에서 만든 생성메서드를 OrderItem 클래스에서도 만든 이유가 궁금합니다.//==생성 메서드==// public static OrderItem createOrderItem(Item item, int orderPrice, int count) { // 생성메서드는 언제 사용해야하는지 질문 OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; }OrderItem 클래스에도 생성메서드를 만들어준 이유가 연관관계에 있어서 "다"인 쪽에 만드는건가요?(예를 들어서, 연관관계 1대 다에서 다 쪽에 생성메서드를 만드는 것인지에 대한 질문입니다.)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 정의
서블릿 정의가 자바를 사용하여 웹을 만들기 위해 필요한 기술 이라고 생각하면 되나요 ?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper 빈 오류
[질문 내용]안녕하세요, 스프링부트 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
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
homeController
homeController에서 return "redirect:/items"; 를통해 itemController에 있는 items로 매핑이 된 메서드로 이동해 items뷰템플릿을 보여주는건 이해했습니다!그런데 왜 localhost:8080을 웝페이지에 띄웠을 때static에있는 index.html이 호출이 되지 않고 homeController에있는 /URL이 호출이되나요 ?requestMapping("/") 이게 기본화면과 매핑된 URL인가요 ??
-
미해결
특정날 이벤트 오픈되는 서비스 구현 조언
현재 특정날에 (예: 2024.06.20 11:00) 에 쿠폰을 배포하는 서비스를 구현하려고 합니다.흔히 배민에서도 이런 이벤트를 진행하는 걸로 알고 있고,쿠폰은 아니지만, 인강 사이트 등에서 프리패스 상품을 오픈할 때 특정 날에 활성화돼서 해당 상품을 구매할 수 있도록 하는 것으로 알고 있습니다. 이외에도 콘서트 티케팅 오픈, 수강신청 오픈 등등 이러한 서비스를 구현하고자 하는데, 어떤 키워드로 검색을 하여 접근할지 감이 안옵니다.... 이것과 관련하여 어떤 키워드로 접근하면 좋을지 조언을 부탁드립니다.
-
미해결스프링 핵심 원리 - 고급편
스프링에서 제공하는 애너테이션들은 AOP 가 어떻게 적용되나요?
강의를 보면 커스텀으로 만드는 애너테이션들은 @Aspect 설정으로 등록이 가능한데요,스프링이 제공하는 대표적으로 @Transactional 같은 애너테이션들은 라이브러리를 뒤져봐도 @Aspect 설정을 두는 곳이 없어서 어떻게 프록시를 생성하는지 궁금합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
CSR이 대체 뭔가요?
CSR이 잘 이해가 안갑니다..프론트가 서버에게 api를 요청하는게 CSR인건가요 ?? 프론트가 있고, 백엔드가 있고 각자 배포를 해서 웹페이지를 구축함에 있어 api로 통신을 했을때 여기서 프론트가 CSR을 했다고 보는건가요 ?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
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(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
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(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
-
미해결스프링 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 이런 오류가 발생합니다.ㅜㅜ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿과 컨트롤러의 차이
서블릿과 컨트롤러의 차이가 뭔가요?서블릿도 url로 요청 오는 것을 받아들이고 컨트롤러도 url 요청 오는 것을 받아들이는데 서블릿과 컨트롤러의 차이를 모르겠습니다. 참고로 관련한 다른 글을 봐도 이해가 안 돼서 질문 드립니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 5.
@Controller @RequestMapping("/springmvc/v3/members") public class SpringMemberControllerV3 { private MemberRepository memberRepository = MemberRepository.getInstance(); @GetMapping("/new-form") public String newForm() { return "new-form"; } @PostMapping("/save") public String save(@RequestParam("username") String username, @RequestParam("age") int age, Model model) { Member member = new Member(username, age); memberRepository.save(member); model.addAttribute("member", member); return "save-result"; } @GetMapping public String members(Model model) { List<Member> members = memberRepository.findAll(); model.addAttribute("members", members); return "members"; } } RequestMappingHandlerAdapter에서 핸들러 어댑터를 찾으려면 핸들러 어탭터를 등록해야 하는데 스프링에서 애노테이션 인식해서 저장되는 핸들러 어탭터 뭘로 등록되는 건가요?위에 코드는 그냥 핸들러로 등록되는 거고, 그럼 SpringMemberControllerV3 핸들러를 실행시켜줄 핸들러 어댑터는 자동으로 생성되는데 궁금한 건 v4에서는 process로 모든 메서드가 같아서 처리가 가능했는데 지금은 다른데 어떻게 처리가 되는 겁니까?SpringMemberControllerV3에서 메서드가 3개니까 SpringMemberControllerV3을 호출해줄 핸들러 어댑터가 각 newForm, save, members를 사용할 수 있게 3개 생성되는 건가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
SpringMemberFormControllerV1 404 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]http://localhost:8080/springmvc/v1/members/new-form 접속시에 404 에러가 납니다 매핑이 안되는거 같은데... 왜 일까요 ㅠㅠㅠ 도와주세욥 소스코드입니다!commit 11 기준으로 봐주시면 감사하겠습니다!https://github.com/Leejuseop/Spring_Mvc_1
-
해결됨스프링 핵심 원리 - 기본편
섹션 3 질문
섹션 3 에서 AppConfig를 이용하여 test 코드 수정하는 장면에서 이해가 안되는 부분이 있어서 질문드려요.Before each가 매 테스트가 실행되기전에 실행되는것 까지는 이해가 가는데 왜 appConfig를 이용하여 구현체 연결해줄때 before each가 사용되어야하는지 잘이해가안갑니다. 이 테스트를 할때 beforeEach를 굳이 사용하여야 하는 이유가있을까요? 제 생각에는 안쓰고 테스트가 여러개 있어도 상관없을거 같은데. 예시와 함께 설명해주시면 이해가 더 잘될 것 같습니다 :)감사합니다
-
해결됨스프링 핵심 원리 - 기본편
인터페이스 질문.
안녕하세요 지금 막 섹션 2강을 다들은 학생입니다.강의를 보면서 따라서 코딩을 치다보니 궁금한 점들이 생겨서 질문남깁니다.MemberSerive와 OrderService는 각각의 구현객체가 하나씩 밖에 없고 구현객체가 하나밖에 없을시에는 Impl 구현객체클래스에 impl을 붙인다고 하셨는데, 구현객체가 어차피 하나밖에 없을경우에는 굳이 Interface를 안만들고 구현객체 클래스만 만들어도 되는거 아닌가요?지금 Interface를 만든이유가 나중에 추후에 확장 혹은 수정이 있기때문에 저렇게 코드를 짜놓은건가요? 감사합니다
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오타라고 봐도 될지 모르겠는데 일단 제보합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 로그인 처리1 - 쿠키, 세션.pdf (v20240408) '쿠키를 사용해서 로그인Id를 전달해서 ~~~' 이런 식으로 나와 있는데여기에 써진 로그인Id가 loginId랑 같은 의미라면 혹시 오타일까요?쿠키를 통해 전달하는 건 MemberRepository의 store에 저장된 id라서 memberId 혹은 id가 좀 더 명확하지 않나 싶어서 제보합니다.
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
put api 500 서버에러응답 문제
선생님 안녕하세요 두번째 강의 막 시작했는데요...^^강의 아주 초반에는 postman으로 성적저장 put api 보낼 때는 스프링 서버가 잘 응답했는데, 오히려성적저장 애플리케이션 개발 후 마지막으로 테스트 put api 보낼때는 응답못하고 500 에러 뱉으면서 local host access denied 이런 에러가 갑자기 나오는데 구글링하고 chatGPT 물어봐도 해결이 안 되요. 아무래도 db쪽 문제인 것 같은데 뭐가 문제일까요? 도와주세요.