묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
프로토타입 빈 프록시
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요. 웹 스코프에서 프록시 모드를 사용했는데, 이것을 프로토타입 빈에도 적용할 수 있는지 궁금해서 코드를 조금 수정해보았습니다. public class SingletonWithPrototypeTest1 { @Test void prototypeFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class, SingletonBean.class); SingletonBean singletonBean = ac.getBean(SingletonBean.class); singletonBean.prototypeBean.addCount(); assertThat(singletonBean.prototypeBean.getCount()).isEqualTo(1); SingletonBean singletonBean1 = ac.getBean(SingletonBean.class); singletonBean1.prototypeBean.addCount(); assertThat(singletonBean1.prototypeBean.getCount()).isEqualTo(1); } @RequiredArgsConstructor static class SingletonBean { private final PrototypeBean prototypeBean; } @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }수명이 다할 때까지 동일한 인스턴스를 사용하는 request 스코프 빈과 달리 prototype 빈은 메서드를 호출할 때마다 인스턴스 주소값이 달라지는 것 같아요. 가짜 프록시 객체도 스프링 컨테이너에서 빈을 가져오기 때문인가요?request 빈은 수명이 다할 때까지 스프링 컨테이너에서 관리되지만, prototype 빈은 스프링 컨테이너에서 초기화 단계까지만 관여하므로, 가짜 프록시 객체가 해당 객체의 메서드가 호출될 때마다 새로운 인스턴스를 가져오는건가요?? 그럼 가짜 프록시 객체는 항상 스프링 컨테이너를 경유하는 건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Servcie, @Repository annotation 질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의에서 @SpringBootApplication(scanBasePackages = "hello.itemservice.web") 로 controller 부분 package 만 componentscan하고 나머지 설정부분은 @Import 를 통해서 @configuration 파일을 componentscan하는걸로 이해하고있는데 service, repository의 package에 bean을 config 파일에서 직접 등록하고 의존주입하고있는 상태에서 @Service , @Repository annotation 생략해도 되는데 사용한 이유가 서비스계층, repository계층을 명시 해주기 위해서 사용한 것 인지 궁금해서 질문 남깁니다.
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
강의 코드
안녕하세요 강사님 강의를 거의 다 들어가고 있는 시점인데...제공해주신 노션 자료는 너무 좋은데요.. 코드나 커밋된 git 주소 좀 알려주실 수 있나요?노션 자료가 좋긴한데 코드가 없어서 개인적으로 조금 힘드네요
-
미해결스프링 핵심 원리 - 기본편
다음과 같은 에러가 납니다... 몇 날 며칠 고민해도 해결이 안 됩니다.. 도와주세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. > Task :compileJava FAILEDC:\Users\user\Desktop\ȫ����\�ڵ�\core\src\main\java\hello\core\AppConfig.java:28: error: constructor OrderServiceImpl in class OrderServiceImpl cannot be applied to given types; return new OrderServiceImpl( ^ required: no arguments found: MemberRepository,DiscountPolicy reason: actual and formal argument lists differ in length1 errorFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':compileJava'.> Compilation failed; see the compiler error output for details.* Try:> Run with --info option to get more log output.> Run with --scan to get full insights.BUILD FAILED in 1s1 actionable task: 1 executed AppConfig랑 OrderServiceImpl은 강사님 코드랑 똑같이 했는데 어떤 것 때문에 안 되는지 모르겠습니다. 도와주세요.. 코드 첨부하겠습니다. package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberService memberService() { //1번 System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { //1번 System.out.println("call AppConfig.orderService"); return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { //2번? 3번? System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } } package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; // 아래 생성자를 RequiredArgsConstructor이 만들어줌 /* @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } */ @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice=discountPolicy.discount(member, itemPrice); return new Order(memberId,itemName,itemPrice,discountPrice); } // 테스트 용도 public MemberRepository getMemberRepository(){ return memberRepository; } }
-
해결됨토비의 스프링 부트 - 이해와 원리
신규강의와 스프링 3.1 책관련 질문드립니다
다른 질문글에서 스프링 신규강의 오픈 예정인 답변을 보았습니다.기존에 출판하신 스프링 3.1 책과 새로 오픈할 강의 같이 봐도 될까요? 강의만 보는걸 추천하시나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BasicErrorController과 WebServerCustomizer의 동시사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요BasicErrorController를 사용하면 뷰템플릿만 작성을 하여도 해당 에러에 맞는 뷰를 렌더링해준다는 것으로 이해했는데요, 에러페이지를 직접등록할때는 ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, “/error-page/500”);처럼 런타임예외가 터졌을때 /error-page/500경로에 해당하는 핸들러메소드를 호출할 수 있었습니다. 만약 RuntimeException이 터졌을때 특정 뷰템플릿을 렌더링하고싶을때는 어떻게 해야할지 궁금합니다. BasicErrorController를 씀과 동시에 WebServerCustomizer에서 에러페이지를 등록해줘야 하는 것일까요?그리고 저희가 ErrorPage를 등록할 떄 BasicErrorController를 알지 못한 상태였는데요, 이는 에러페이지를 직접 등록했을 때는 BasicErrorController에 의한 뷰템플릿호출이 후순위로 밀려 작동하지 않는다고 볼 수 있을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
save에서 Item을 반환하는 이유가 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제목 그대로 ItemRepository의 save는저장소에 저장만 하는 메서드인데 void를 쓰지 않고 Item을 반환하는 이유가 따로 있을까요??
-
미해결스프링 부트 - 핵심 원리와 활용
executable jar 파일 만들기에 질문이있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.fat 방식의 executable jar 방식 외에,지정된 lib 폴더로 별도 디펜던시가 있는 jar 파일을 복사가 되게하여 jar 패키징시 MANIFEST.MF 에 main class 와 class-path 를 지정된 lib 폴더 경로를 주어서 executable jar 로 만들어 주면 jar 가 자신의 내부의 jar 를 class path 로 로딩 할수 있는 것으로 생각하였습니다.강의에서 말씀해주신 내용을 보면 별도의 클래스로더가 있어야만 하는것 같아서 해당 내용 관련해서 심층있게 한번더 설명해주실수 있을까해서 질문드렸습니다.감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
오라클 연동되어 있는데 h2데이터베이스 설치해야될까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 인텔리제이 유료버전으로 설치해서 오라클을 연동해서 데이터베이스를 불러올수 있습니다선생님이 설치하시는 h2 로 설치해서 수업을 따라가야 할지 오라클로 진행해도 무리 없을지문의드립니다(스프링 기본편도 들을 예정입니다)유료버전과 강의의 무료버전으로 진행하는게 다른점이 있을지도 문의드립니다(유료버전 첫달 사용해보려는데 굳이 유료를 쓰는 이유가 어떤게 있을지도 알수 있을까요?저는 우선 추천받아서 결제를 진행하였습니다!)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
오라클 연동되어 있는데 h2데이터베이스 설치해야될까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 인텔리제이 유료버전으로 설치해서 오라클을 연동해서 데이터베이스를 불러올수 있습니다선생님이 설치하시는 h2 로 설치해서 수업을 따라가야 할지 오라클로 진행해도 무리 없을지문의드립니다(스프링 기본편도 들을 예정입니다)유료버전과 강의의 무료버전으로 진행하는게 다른점이 있을지도 문의드립니다(유료버전 첫달 사용해보려는데 굳이 유료를 쓰는 이유가 어떤게 있을지도 알수 있을까요?저는 우선 추천받아서 결제를 진행하였습니다!)
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
delete 오류
안녕하세요 트랜잭션 적용1 강의 10분 40초 정도에서 쿼리로 delete from member를 적었는데 Timeout trying to lock table "MEMBER"; SQL statement:delete from member [50200-224] HYT00/50200 (도움말) 이러한 오류가 떠서요 어떻게 하면 될까요?
-
미해결스프링 핵심 원리 - 기본편
실제로 수정자 주입시 누락문제를 경험하는 일이 있나요?
[질문 내용]여기에 질문 내용을 남겨주세요. 수정자 주입을 선택한 경우 4:38에 NPE가 나는 이유는 이해했습니다비록 @Autowired이 달려있지만 ac.getBean으로 획득한 orderService가 아니기 때문에 의존관계 주입이 일어나지 않았고 따라서 NPE가 발생한 것인데요그런데 실제로는 스프링을 사용할 것이고 따라서 orderService를 스프링 컨테이너가 관리하는 스프링 빈으로 사용을 할텐데 이 경우에는 @Autowired가 의존관계 주입을 알아서 다 해주니까수정자 주입의 경우에 누락문제를 걱정할 필요가 없는것 아닌가요?실제로 순수 자바코드를 사용해서 개발하는 경우가 있기 때문에 해당 예제를 보여주신것인지 궁금합니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
batch size관련 질문
안녕하세요! spring jpa를 공부하다가 궁금증이 생겨서 질문을 올립니다. 혹시 jpa표준이 아닌 spring jpa를 쓰면 batch size를 적용할 필요가 없나요? spring jpa는 Page인터페이스와 Slice인터페이스를 사용하기에 질문을 드립니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
MVC완강 후, 프로젝트 진행 중 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]mvc 강의를 다 듣고 프로젝트를 진행중인데 계속 오류가 떠서 혹시 한번만 봐주실수있나요 ? ㅠㅠhttps://drive.google.com/drive/folders/15tIzYE6utLhSHtXVeYGPBUeqcMUFxKJc?hl=ko http://localhost:8080/velog/signUp스프링을 실행시키고 위의 url로 이동한 뒤, 값을 모두 입력하고 Sign Up 버튼을 누르면 처음 기본 화면인 http://localhost:8080/velog/login으로 가야하는데 이동을 안하고 계속 에러가 뜨는 상황입니다 ㅠㅠ.. 혼자 해결해보려고 했는데 하루종일 잡고있어도 에러가 안풀리네요... 도와주시면 감사하겠습니다어느부분에서 오류가 난걸까요 ?ㅠㅠㅠ 오류 내용 그대로 GPT한테 물어보니 GPT는 아래처럼 대답하긴 했습니다.로그인멤버 객체를 저장하는 LoginMember를 로그인 처리하는 컨트롤러에서 사용하였는데요..@GetMapping("/login") public String LoginService(Model model) { model.addAttribute("loginMember", new LoginMember()); return "home"; }위의 코드가 문제인것같은데,,ㅠㅠ 뭐가 문제일까요제발 살려주세요ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 @ComponentScan을 제대로이해한것이 맞나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 @Configuration의 역할에 대해 질문드립니다처음에 제가 생각한 @Configuration의 역할은 "Bean을 등록할 때 싱글톤이 되도록 보장해준다" 였는데요https://www.inflearn.com/questions/323589https://www.inflearn.com/questions/157309위 두 답변을 보고 제대로 이해한것이 맞는지 궁금하여 질문드립니다제가 이해한것은 다음과 같습니다1. 스프링 빈은 스프링 컨테이너에 언제나 싱글톤으로 등록/관리된다2. @Configuration은 의존관계로 동일한 클래스가 여러번 객체로 생성되는것을 방지한다그래서 싱글톤의 원래 목적인 하나의 클래스는 하나의 객체만 유지해서 사용하기 위함을 @Configuration을 사용하는 것이지@Configuration 자체가 스프링 빈을 싱글톤으로 보장하는것은 아니다(어차피 빈은 언제나 싱글톤으로 관리되므로)3.@ComponentScan 역시 스프링 빈을 등록해주므로 싱글톤으로 빈을 등록해준다만약 2번과 같이 의존성으로 싱글톤을 해칠 가능성이 존재하는 경우에 스프링 빈 수동등록에서는 @Configuration을 활용했다면스프링 빈 자동등록에서는 @Autowired로 해결한다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
에러가 해결이 안돼요ㅜ
에러 : Parameter 0 of constructor in com.group.libraryapp.service.user.UserServiceV1 required a bean of type 'com.group.repository.user.UserJdbcRepository' that could not be found. 구글링해보니까 service, repository 등의 annotation이 빠져서 그렇다고 하는데 다 들어가있습니다ㅜ계속 문제가 해결안돼서 참고하라고 주신 코드로도 변경해봤는데 계속 동일한 문제가 뜨네요.. package com.group.libraryapp.service.user; import com.group.libraryapp.dto.user.request.UserCreateRequest; import com.group.libraryapp.dto.user.response.UserResponse; import com.group.libraryapp.dto.user.request.UserUpdatRequest; import com.group.repository.user.UserJdbcRepository; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceV1 { private final UserJdbcRepository userJdbcRepository; public UserServiceV1(UserJdbcRepository userJdbcRepository) { this.userJdbcRepository = userJdbcRepository; } public void saveUser(UserCreateRequest request) { userJdbcRepository.saveUser(request.getName(), request.getAge()); } public List<UserResponse> getUsers() { return userJdbcRepository.getUsers(); } public void updateUser(UserUpdatRequest request) { if (userJdbcRepository.isUserNotExist(request.getId())) { throw new IllegalArgumentException(); } userJdbcRepository.updateUserName(request.getName(), request.getId()); } public void deleteUser(String name) { if (userJdbcRepository.isUserNotExist(name)) { throw new IllegalArgumentException(); } userJdbcRepository.deleteUser(name); } } package com.group.repository.user; import com.group.libraryapp.dto.user.response.UserResponse; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class UserJdbcRepository { private final JdbcTemplate jdbcTemplate; public UserJdbcRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public boolean isUserNotExist(long id) { String readSql = "SELECT * FROM user WHERE id = ?"; return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty(); } public void updateUserName(String name, long id) { String sql = "UPDATE user SET name = ? WHERE id = ?"; jdbcTemplate.update(sql, name, id); } public boolean isUserNotExist(String name) { String readSql = "SELECT * FROM user WHERE name = ?"; return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); } public void deleteUser(String name) { String sql = "DELETE FROM user WHERE name = ?"; jdbcTemplate.update(sql, name); } public void saveUser(String name, Integer age) { String sql = "INSERT INTO user (name, age) VALUES (?, ?)"; jdbcTemplate.update(sql, name, age); } public List<UserResponse> getUsers() { String sql = "SELECT * FROM user"; return jdbcTemplate.query(sql, (rs, rowNum) -> { long id = rs.getLong("id"); String name = rs.getString("name"); int age = rs.getInt("age"); return new UserResponse(id, name, age); }); } }package com.group.libraryapp.controller.user; import com.group.libraryapp.dto.user.request.UserCreateRequest; import com.group.libraryapp.dto.user.request.UserUpdatRequest; import com.group.libraryapp.dto.user.response.UserResponse; import com.group.libraryapp.service.user.UserServiceV2; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController //스프링 빈이 됨. 즉 jdbc에 의존하게됨 public class UserController { private final UserServiceV2 userService ; //@Quailifier("main")가 primary보다 더 앞선다. public UserController(UserServiceV2 userService){ this.userService = userService; } @PostMapping("/user") public void saveUser(@RequestBody UserCreateRequest request){ userService.saveUser(request); } @GetMapping("/user") public List<UserResponse> getUsers(){ return userService.getUsers(); } @PutMapping("/user") public void updateUser(@RequestBody UserUpdatRequest request){ userService.updateUser(request); } @DeleteMapping("/user") public void deleteUser(@RequestParam String name) { //query를 직접 사용해서 포스트맨으로 찾음 그래서 requestbody가 아니라 param을 씀userService.deleteUser(name); userService.deleteUser(name ); } }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Jdbc 적용후 member 등록을 누르면 에러페이지가 나옵니다.
강의 섹션6 스프링DB 접근 기술에서순수 JDBC 강의 편을 듣고 따라하던중 spring실행해서 멤버를 등록한 후 갱신되는지를 확인하는 장면을 따라했습니다.그런데 데이터베이스에 입력한 멤버가 삽입은 되는데 화면과 console 에서 에러가 나옵니다.jdbcMemberRepository로 변경전에는 모두 이상없이 실행되었습니다. 아래는 에러페이지입니다. 이클립스로 실행했습니다.아래는 console로그에서 에러부분 입니다.java.lang.NumberFormatException: Character A is neither a decimal digit number, decimal point, nor "e" notation exponential mark.threw exception [Request processing failed: java.lang.IllegalStateException: java.sql.SQLException: 부적합한 변환이 요청됨] with root cause java.lang.NumberFormatException: Character A is neither a decimal digit number, decimal point, nor "e" notation exponential mark. at java.base/java.math.BigDecimal.<init>(BigDecimal.java:586) ~[na:na] at java.base/java.math.BigDecimal.<init>(BigDecimal.java:471) ~[na:na] at java.base/java.math.BigDecimal.<init>(BigDecimal.java:900) ~[na:na] at oracle.jdbc.driver.T4CVarcharAccessor.StringToNUMBER(T4CVarcharAccessor.java:782) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0] at oracle.jdbc.driver.T4CVarcharAccessor.getNUMBER(T4CVarcharAccessor.java:257) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0] at oracle.jdbc.driver.T4CVarcharAccessor.getLong(T4CVarcharAccessor.java:555) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0] at oracle.jdbc.driver.GeneratedStatement.getLong(GeneratedStatement.java:208) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0] at oracle.jdbc.driver.GeneratedScrollableResultSet.getLong(GeneratedScrollableResultSet.java:261) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0] at com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java) ~[HikariCP-5.0.1.jar:na] at com.example.hello.repository.JdbcMemberRepository.save(JdbcMemberRepository.java:43) ~[main/:na] at com.example.hello.service.MemberService.join(MemberService.java:29) ~[main/:na] at com.example.hello.controller.MemberController.create(MemberController.java:34) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:259) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:192) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.4.jar:6.1.4] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:920) ~[spring-webmvc-6.1.4.jar:6.1.4] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:830) ~[spring-webmvc-6.1.4.jar:6.1.4] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.han~$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] 제가 데이터베이스를 오라클로 설치했는데 오라클에서 테이블 생성 sql 은 이렇습니다. 데이터는 보면 id에 모두 숫자만 들어가 있습니다.create table member( id number generated by default as identity, name varchar2(255), primary key(id) ); 혹시나해서 설정파일도 올려봅니다아래는 bundle.gradle입니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'com.oracle.ojdbc:ojdbc8:19.3.0.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('bootBuildImage') { builder = 'paketobuildpacks/builder-jammy-base:latest' } tasks.named('test') { useJUnitPlatform() } 아래는 application.properies 입니다.server.port = 8090 spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.username=test_1 spring.datasource.password=admin123
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에서 타임리프에 관해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]백엔드 개발자가 타임리프를 공부하는 이유가 혼자서 뭘 만들어볼때 빠르게 웹페이지를 확인해보면서 개발하려고 하는 거고 실무에서는 보통 프론트엔트쪽에서 react같은걸로 서비스를 만드는거 맞아요? 백엔드개발자와 프론트엔드개발자의 역할에 대해 약간 헷갈려서 여쭤봅니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
MyHandlerExceptionResolver 등록 관련 질문
MyHandlerExceptionResolver 클레스를 등록하기 위해서 WebConfig 클래스에서 해당 메서드를 오버라이딩 해주었는데 그냥 MyHandlerExceptionResolver 에 @Component 애노테이션을 사용해서 스프링 빈으로 등록 시켜줘면 안되는건가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
반환 타입이 void인 메서드에 대한 질문이 있습니다.
안녕하세요 강의 잘 듣고 있습니다! 위 사진처럼 Service 레이어에서 반환 타입이 void인 메서드의 경우, assertJ로 검증하는 방법이 있나요? 해당 메서드에서 create 작업을 수행하지만 굳이 생성된 객체를 응답할 이유가 없어서요!예전에 임시로 반환 타입을 바꿔서 생성된 객체를 검증하는 식으로 테스트를 작성하면 된다는 얘기를 들었는데, 결국 void로 되돌리게 되면 테스트가 실패하니까 테스트를 주석 처리할 수 밖에 없었거든요...이렇게 하게 되면 테스트 코드를 작성하는 의미도 좀 퇴색되는 것 같아서 고민이 됩니다!일단은 급한대로 then은 비워두었습니다만 이렇게 하는 게 좋은 방법일까요?