묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
appconfig에 들어가는 memberService는 memberService의 생성자인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]public class AppConfig { public MemberService memberService(){ return new MemberServiceImp(new MemoryMemberRepository()); 이 코드가 생성자라면 public MemberServiceImp memberServiceImp(){ return new MemberServiceImp(new MemoryMemberRepository()); 이런식으로 되야하는게 아닌가 싶습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[강의 질문] hello-static.html 실행 관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]안녕하세요 수업을 따라하던 중 문제가 발생해 질문드립니다.[정적 컨텐츠] 강의 중 http://localhost:8080/hello-static.html 를 실행하면 창이 뜨는 문제가 발생합니다. 콘솔 창에 에러가 뜨지는 않고 파일 위치도 확인했습니다.직접 Application.java파일에서 초록색 재생 버튼으로 실행시 실행은 되지만 터미널에서 실행하고 싶습니다.답변부탁드립니다 아래는 깃 주소 첨부합니다hwangsungmin-00/study-spring (github.com) 감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ServletRequest
실제 부모의 인스턴스를 다운캐스팅하면 자식에서 받을 수 없는걸로 알고 있는데HttpServletRequest httpRequest = (HttpServletRequest) request;이 코드는 doFilter에서 받은 부모 인스턴스를 다운캐스팅해서 자식이 받고 사용하고 있습니다. 제가 문법을 잘못 알고 있는 건가요??parent parent = new parent(); child child = (test.child) parent; child.hello();다음과 같이 간단히 테스트 해보았을 땐 class test.parent cannot be cast to class test.child (test.parent and test.child are in unnamed module of loader 'app') at test.ttttt.main(ttttt.java:286)다음과 같은 오류가 떴습니다.어떻게 캐스팅이 가능한건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
EC2 중지후 재시작시 기존배포 애플리케이션에 대한 문의
EC2 중지후 다시 인스턴스를 실행 했는데 퍼블릭 ip주소가 바꼈습니다.그래서 다시 인스턴스 실행후 바뀐 퍼블릭 ip주소로 접속을 시도했는데보안설정도 그대로인데 접속이 안되서 보니 빌드 디렉토리는 존재하는데빌드 실행이 안된상태이고 어플리케이션도 종료가 되있는 상태였습니다 다시 빌드후 어플리케이션 재실행으로현재는 접속이 가능한 상태이지만 혹시 일레스틱을 사용하지 않는 경우나도메인을 따로 구입하지 않은경우에는인스턴스 중지후 재실행시 항상 이러한 절차를 거쳐야 하는건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
session
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);첫번째 파라미터 SessionConst.LOGIN_MEMBER는 세션 저장소의 이름 정도로 해석하면 될까요?만약 세션 저장소의 이름이라고 할 때Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER); 는 세션저장소의 이름으로 필요로하는 Member를 찾을 수 있는건가요?? 현재, HttpSession을 저장소, setAttribute를 put정도로 이해하고 있는데 맞는지 확인부탁드립니다!
-
미해결스프링 시큐리티 OAuth2
OAuth2 인가서버로부터 access token 발급 후 저장 관련 질문
안녕하세요 강사님.OAuth2 인가 프레임워크 관련하여 학습 중 인가서버로부터 받은 access token을 어떻게 저장하고 어떻게 활용할 수 있을지 고민하다가 궁금한 점이 있어 질문드립니다. 제가 생각했던 프로세스는 이렇습니다.[리소스 오너가 소셜 로그인 시 (구글인 경우)]리소스 오너가 구글 로그인을 한다.클라이언트 (내가 만든 스프링 서버)는 구글의 인가서버로부터 리소스 오너의 userInfo 엔드포인트 접근 시 사용할 수 있는 access token을 받는다.access token을 활용해서 userInfo 엔드포인트에 접근하여 리소스 오너의 이메일, 이름 등의 정보를 가져온다. (이 부분은 내가 구현하지 않아도 스프링 시큐리티에서 제공)소셜 로그인 시 얻은 정보 (oidc 활성화 시 id-token, 리소스 오너가 허용한 userInfo 등)를 클라이언트의 세션에 저장한다.그리고 로그인 프로세스 완료되어 LoginSuccessHandler에서 이후 로직을 처리할 수 있다. [이후 로그인 된 상태에서 클라이언트의 API 호출 시]클라이언트의 API를 호출할 때 SecurityContextHolder에 userInfo를 담아 활용할 수 있다.access token은 클라이언트에 저장되어 있고, API 호출 시 꺼내어 리소스 서버에 접근할 수 있다. 그런데 SecurityContextHolder에 access token 정보가 보이지 않아 궁금한점이 생겼습니다.만약 로그인이 된 상태에서 userInfo 엔드포인트에 접속 시 매번 새로운 access token을 발급 받아서 요청하는 것일까요? (SecurityContextHolder에 access token이 없어서 조금 헷갈리고 있습니다.)100명의 리소스 오너가 로그인 할 때마다 access token을 발급받으면 총 100개의 access token이 발급되는게 맞을까요?이러한 경우 클라이언트에 100개의 access token을 저장 후 userInfo 엔드포인트 접근 시 사용하며, 만약 만료되었다면 refresh token으로 access token을 재발급 받아 다시 userInfo 엔드포인트에 접근하는게 맞을까요?만약 1개의 클라이언트에 100개의 accessToken을 저장 후 만료 전까지 사용하는 것이라면 클라이언트에 부하가 많이 발생하여 scale-out하는 경우에는 보통 어떻게 해결할 수 있을까요?Google, Naver, Kakao 등의 소셜에서 access token을 발급 받는 것 까지는 스프링 시큐리티가 지원해주지만 이후 다양한 엔드포인트를 호출하거나, access token 만료 시 refresh token으로 재발급 받는 로직 등은 제가 구현해야 하는게 맞을까요? 제가 아직 강의를 절반밖에 듣지 않아서 이후 강의해주시는 부분에 제가 질문드린 내용이 포함되어 있을 수도 있을 것 같습니다. 만약 포함되어 있다면 간략하게나마 어떤 강의 동영상을 참고하면 좋을 지 말씀해주시면 감사하겠습니다.감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 비즈니스 로직을 원 쿼리로 하지 않는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.스프링 MVC 2편 - 섹션6. 로그인 처리1 중 로그인 기능 강의를 수강하다가 구현 방법에 대해 궁금한 점이 생겨 질문 드립니다.강의 3:49초 부분에서 로그인 핵심 비즈니스 로직을 2단계의 과정으로 나누고 이를 코드로 작성하는 것을 학습했습니다.입력 받은 loginId와 일치하는 회원 정보가 있는 지 DB에서 조회한다loginId로 DB에서 조회한 회원 정보의 password와 입력 받은 password를 비교하여, 일치하는 회원 정보를 찾는다public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(m -> m.getPassword().equals(password)) .orElse(null); }강의의 로직은 잘 이해하였지만,일종의 원 쿼리라고 부르는 방식으로, 한 번에 해결할 수 있을텐데, 왜 2단계로 나누어 해결하는 지 이유가 궁금합니다.강의에서는 메모리를 DB로 사용했지만 일반적인 DB를 사용한다고 가정했을 때,제가 생각한 방법은MemberRepository에 public Optional findByLoginIdAndPassword(String loginId, String password) 메서드를 정의하고loginId와 password가 모두 일치하는 (AND 조건) 회원 정보가 있으면, 그 회원 정보(Member)를 반환일치하는 회원 정보가 없으면 null 반환LoginService에서 리포지토리의 findByLoginIdAndPassword를 호출하기만 하면 되지않을까 생각했습니다.public Member login(String loginId, String password){ return memberRepository.findByLoginIdAndPassword(loginId, password); }이렇게 생각한 이유는입력한 정보와 일치하는 데이터가 DB에 있는 지 확인하기 위해 어차피 DB에 접근이 필요한 상황이고,그렇다면 자바에서 루프를 돌면서 비교하는 것보다 DB에서 WHERE 절을 통해 조건을 비교하는 것이 빠르지 않을까 싶어서 입니다.정답이 있는 건 아니겠지만, 영한님께서 로직을 2단계로 나누어 작성하신 데에는 이유가 있을 것이라 생각해서, 그 이유가 궁금합니다.저는 SI에서 근무를 했었는데, 비즈니스 로직을 모두 쿼리에 녹여내고, 대부분을 원 쿼리로 해결하는 방식의 개발 방법을 익혔었습니다.영한님 강의를 들으면서 이게 좋지 않은 방법이란 것을 알게 되었고, 보다 객체지향적으로 설계하고 개발할 수 있도록 노력하고 있습니다.그래서 로그인 로직에서도 원 쿼리보다는, 강의에서와 같이 2단계로 작성하는 것이 더 좋은 방법인 건지 궁금합니다.긴 질문 읽어주셔서 감사합니다. ^^
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Spring MVC 구조에서 IoC 개념이 적용되는 건가요?
안녕하세요 강사님! Spring MVC 구조에 대해 공부하다가 궁금한 것이 있어서 질문드립니다.DispatcherServlet에서 핸들러 어댑터를 호출하고핸들러 어댑터에서 저희가 구현한 핸들러(컨트롤러)를 호출해서 사용하는데 여기서 '스프링 프레임워크에서 사용자가 구현한 코드를 호출한다.' 라는 관점으로 보았을 때 IoC 개념이 적용되었다고 봐도 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hashMap 저장순서
hashMap에서는 값이 저장되는 순서가 보장이 되지 않는 다고 알고 있습니다. Map인터페이스의 values()메서드 또한 맵에 저장된 값들을 반환하지만 순서가 유지되지 않는 다고 알고 있는데요 그런데 전체 클래스 테스트시 findAll(), findByName(),save()순으로 실행이 되는 데 findAll()과 findByName() 에서 각 멤버 인스턴들이 save가 다 되고 난 후 System.out.println(repository.findAll());추가해 이를 통해 저장된 값들을 확인해 본 결과 findAll()의 System.out.println(repository.findAll()); 에서는 [hello.hellospring.domain.Member@589b3632, hello.hellospring.domain.Member@45f45fa1] findAll()이후에 실행된 findByName()의 System.out.println(repository.findAll()); 에서는 [hello.hellospring.domain.Member@589b3632, hello.hellospring.domain.Member@45f45fa1, hello.hellospring.domain.Member@67a20f67, hello.hellospring.Member@57c758ac] 값이 나왔는데 이 처럼 메소드가 실행된 순서와 각 인스턴스들이 save된대로 저장값의 순서 유지가 되서 출력값으로 나오는데 원래라면 hashMap과 values()메서드가 저장 순서를 보장하지 않으므로 System.out.println(repository.findAll()); 실행시 마다 Map에 저장된 값들을 저장순서 상관없이 랜덤하게 출력되야 되는 거 아닌가요? 제가 어떤 부분을 잘못알고 있는 지 궁금합니다.class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); assertThat(member).isEqualTo(result); } @Test public void findByName(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); Member result = repository.findByName("spring1").get(); System.out.println(repository.findAll()); assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); //hashMap 함수로 key로 id value로 member(id,name) 인스터스 저장 Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result = repository.findAll(); System.out.println(repository.findAll()); assertThat(result.size()).isEqualTo(2); } }
-
미해결3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]
저는 지금 자바 11.0.18버전을 사용하는데 11.0.2로 바꿔야할까요?
많이 차이가 나는지 질문드립니다
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
문제로 남겨주신 uuid에 대한 코드는 없는건가요 ?
UUID에 대해 제가 작성한 로직의 방향이 맞는지 확인해 보고싶은데, 문제관련 코드는 어디에 있나요 ?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
중복 회원 예외 실패라고 나오는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트 케이스 실행 시 결과값이 "이미 존재하는 회원입니다."라고 출력이 되는데, 콘솔 창에서는 tests failed 1 passed 1으로 나옵니다. 큰 오류는 아닌거같은데 failed라고 떠서 좀 찝찝한데 설정을 따로 바꾸는것인지 코드 자체 오류인지가 궁금합니다. Expacted와 Actual의 차이점도 궁금합니다. Click to see differences를 해도 무슨 차이인지 모르겠습니다...package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest @Transactional public class MemberServiceIntegrationTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("spring"); //When Long saveId = memberService.join(member); //Then Member findMember = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외() throws Exception { //Given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //When memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));//예외가 발생해야 한다. assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } } 2023-09-15T21:34:27.857+09:00 INFO 15492 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2023-09-15T21:34:27.999+09:00 INFO 15492 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/test user=SA 2023-09-15T21:34:28.001+09:00 INFO 15492 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended org.opentest4j.AssertionFailedError: expected: "이미 존재하는 회원입니다." but was: "이미 존재하는 회원입니다" Expected :"이미 존재하는 회원입니다." Actual :"이미 존재하는 회원입니다" <Click to see difference> at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at hello.hellospring.service.MemberServiceIntegrationTest.중복_회원_예외(MemberServiceIntegrationTest.java:41) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92) at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
import 관련 질문합니다.!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 import할 때마다 궁금증이 생겨 찾아봤지만 이해가 잘 가지 않아 질문드립니다...!맨 위에것으로 import 하면 되는건 알지만 왜 두가지가 뜨는걸까요?하나는 클래스, 인터페이스 두개가 어떤 차이인지 알려주시면 감사하겠습니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size: 100 으로 설정을 해줘도 쿼리가 한번에 가져오지 않습니다.
@GetMapping("api/v2/orders/{id}") // batch_fetch_size 검색용 public ResultMany findByBatchFetch(@PathVariable("id") Long id) { Customer customer = customerService.findCustomerById(id); List<Order> orders = orderRepository.findAllOrder(); return getOrderDtoList(orders); } public List<Order> findAllOrder() { return em.createQuery("select o from Order o", Order.class) .getResultList(); } private ResultMany getOrderDtoList(List<Order> orders) { List<OrderDto> orderDtos = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return new ResultMany<>(orders.size(), orderDtos); } @Data static class OrderDto { private Long id; private CustomerDto customer; private List<DiffuserProductRequestDto> diffuserProductRequest; public OrderDto (Order order) { id = order.getId(); customer = new CustomerDto(order.getCustomer()); diffuserProductRequest = order.getDiffuserProductRequests().stream() .map(diff -> new DiffuserProductRequestDto(diff)) .collect(Collectors.toList()); } } @Data static class DiffuserProductRequestDto { private Long id; private DiffuserDto diffuser; private int amount; private Deadline deadline; private ProductionStatus status; public DiffuserProductRequestDto (DiffuserProductRequest diffuserProductRequest) { id = diffuserProductRequest.getId(); diffuser = new DiffuserDto(diffuserProductRequest.getDiffuser()); amount = diffuserProductRequest.getAmount(); deadline = diffuserProductRequest.getDeadline(); status = diffuserProductRequest.getStatus(); } } 위에는 order클래스 연관된 클래스를 찾기위한 코드들인데 제가 27개의 오더를 만들고 get요청을 보내면 default_batch_fetch_size: 100으로 설정 해놓았기 때문에 27개를 한번에 가져올 것이라고 생각하고 있는데 결과는 그렇지 않습니다이렇게 두번의 쿼리로 찾아오는데 어떤게 문제인걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 수정부분에서 에러가 발생하는것 같습니다..
[질문 내용]섹션7의 상품수정 부분을 수강중입니다!강사님의 코드를 그대로 따라 쳤으나 상품 수정시 에러가 발생하는데 원인을 모르겠습니다. 다만, 아래와 같이 에러페이지가 나오나 홈으로 가서 다시 상품목록을 보면 수정이 반영되어었습니다... package jpabook.jpashop.controller; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.service.ItemService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller @RequiredArgsConstructor public class ItemController { private final ItemService itemService; @GetMapping("/items/new") public String createForm(Model model) { model.addAttribute("form", new BookForm()); return "items/createItemForm"; } @PostMapping("/items/new") public String create(BookForm form) { Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/"; } @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItem(); model.addAttribute("items", items); return "items/itemList"; } @GetMapping("items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "items/updateItemForm"; } @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:items"; } }package jpabook.jpashop.controller; import lombok.Getter; import lombok.Setter; @Getter @Setter public class BookForm { private Long id; private String name; private int price; private int stockQuantity; private String author; private String isbn; }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8분20초 강의에 hello.html이 404에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]hello.html 404에러뜹니다 무엇을 건드려야할까요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jsp 파일이 실행이 안되고 404 whitelabel 에러가 뜨네요 ㅠ
스프링부트 3.0 이상이라 build.gradle에 pdf 그대로 복붙하고, build and run using 도 gradle로 실행 했는데도 똑같은 에러가 떠요 ㅠ
-
미해결실전! 스프링 데이터 JPA
findById 쿼리 질문
@Test public void findMemberLazy(){ //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); //when Optional<Member> byId = memberRepository.findById(1L); }위와 같은 코드가 있을때 memberRepository.findById(1L); 를 하면 저는 em.find를 통해서 영속성컨테스트를 조회하기 때문에 select쿼리가 안나간다고 생각이 들었습니다.하지만 출력결과 select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 where m1_0.member_id=?select 쿼리가 나가는 것을 확인했습니다.https://www.inflearn.com/questions/1014206/%EA%B0%99%EC%9D%80-pk%EB%A1%9C-%EC%A1%B0%ED%9A%8C%EC%8B%9C-%EC%BF%BC%EB%A6%AC%EA%B0%80-2%EB%B2%88-%EB%82%98%EA%B0%80%EB%8A%94-%EC%9D%B4%EC%9C%A0제 예전 질문에서는 JpaRepository에서의 Method Naming Query의 경우 JPQL로 조회를 하기 때문에 실행전 em.flush()가 일어나서 Direct로 DB에 쿼리가 날아가고 findById는 JpaRepository Interface의 target인 SimpleJpaRepository에 있기 때문에 em.find를 한다고 보았는데 왜 select 쿼리가 나갔는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 다운로드 관련 문의
안녕하세요. 스프링 MVC 2편까지 수강한 이후에 내용을 복습하려고 1편과 2편의 내용을 통합하여 상품 관리 시스템을 만드는 중인데 파일 다운로드에서 문제가 생겼습니다.상품 등록 폼에서 상품 이미지를 포함한 상폼 정보를 저장하고 상품 상세 폼에서 상품 이미지를 불러와서 상품 정보들과 함께 나타내려고 합니다.파일을 업로드해서 로컬 컴퓨터에 저장하는 것 까지는 잘 작동이 되는데 상품 상세 폼에서 파일을 다운로드하는 것이 되지 않고 파일 src로 들어가보면 404 에러코드가 나타납니다. 저장은 잘 되는데 무엇을 잘못한 걸까요? 아무리 찾아보고 고쳐봐도 잘 모르겠네요ㅠㅠ
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
동시성 이슈 처리 질문있습니다!
DB 동시성 문제를 해결하기 위해낙관적 잠금, 유니크 제약조건, 비관적 잠금이 있는 것으로 알고있습니다.비관적 잠금은 성능상의 이유로 잘 사용하지 않는다고 알고있어서낙관적 잠금 또는 유니크 제약조건으로 동시성을 해결하고 있는데, 낙관적 잠금을 사용해야 할지, 유니크 제약 조건을 사용해야 할지 의문이 들어 질문 드립니다. 감사합니다!