묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드시 경로가 재대로 인식이 안되는거 같습니다.
빌드과정에서 에러가 발생합니다. 읽어보면은 프로젝트안에서 build 폴더를 찾아서 들어가야 하는데, 앞에 B가 빠지고 uild 만 남아서 없는 폴더에 접근하려는거 같습니다.. 딱히 파일 건드린 거도 없고 강의 내용 그대로 따라하면서 프로젝트명만 그냥 데모를 그대로 사용한건데.... 문제가 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
커리큘럼 질문드립니다
[질문 내용]안녕하세요 영한님 저는 국비 학원을 5달째 다니고 있는 문과생 늦깍이 취준생입니다. 컴퓨터의 세상은 정말 방대하고 어렵네요..이때까지 공부해 본 어떤 것보다 어려운 것 같아요.ㅎㅎ 영한님께 제 상황에 맞은 조언을 얻고 싶어 질문드립니다. 학원에서는 자바, jsp, 서블릿을 배웠고 특히 서블릿은 따라쳐보고 이해하려고 노력했는데 뭘 잘 아는 것 같지는 않습니다. 그냥 대충 흐름만 이해하고 넘어갔어요. 영한님 강의는 스프링 입문, 스프링 핵심원리,http기본 지식까지는 수강했고 수업 듣고 이해하려고 해보고 안되면 넘어가고 나중에 또 중요한 건 나오겠지 이러면서 정신 승리하면서 공부하는 중입니다. 친절하게 잘 알려주시고 큰 숲을 볼 수 있게 그려주시니까 좋은 것 같아요. 근데 마음 급한 학생은 뭔가 속성으로 빠르게 배워서 당장 포트폴리오를 만들어야 하는데(3주정도) 영한님 로드맵을 보려니 너무 막막합니다 ㅠㅠ 학원에서는 스프링부트로 게시판 만드는 것을 이번주부터 수업을 하는데 사실 수업일수가 별로 안 남아서 강사님이 수업을 다 진행해 주실지도 의문이에요. 이렇든 저렇든 이제 수료까지 3주 정도 남았고 팀원들과 스프링부트로 웹프로젝트를 하나 만들어야 합니다. 지금 상황에서 mvc1,2편 안 듣고 실전 스프링부트와 jpa활용을 들어도 될까요? 지금 상황에서 어떻게 들으면 효율적으로 공부할 수 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요. 스프링 로그인 유지 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예/2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 들은 학생입니다. 이번에 스프링 인터셉터 - 인증 체크를 듣고 개발을 해보았는데요.김영한 강사님께서 만드신 로그인 세션 기능은 유저 한명일 때 잘 작동하는 것은 알 수 있는데, 궁금한 점은 유저가 여러명일 때는 작동이 잘되는가 라는 점입니다.세션은 서버의 메모리상에서 공유되는데 if( session == null || session.getAttrivute(SessionConst.LOGIN_MEMBER) == null ) .... 위와 같은 코드 부분에서 session이 있다고 하더라도 만약 다른 유저가 이미 로그인 되어 있다면(로그인을 했다면), session과 세션의 SessionConst.LOGIN_MEMBER 키에 대한 값은 이미 존재합니다.따라서 저는 이번에 예시로 작성해주신 로그인 세션 유지 기능이 유저 한명이 일 때만 작동한다고 생각합니다. 아직 제가 많이 부족하고 많이 모자랍니다. 나쁜 의도로 질문한 것이 아니라 너무 궁금하고 아무리 찾아봐도 모두 강사님처럼 코딩을 하셔서 질문남겨봅니다. 항사 강사님께서 쉽고 친절하게 설명해주신 덕분에 쉽게쉽게 스프링을 이해하고 잘 배워갑니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle 설정관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예 맞습니다2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 없는 네용입니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 전부 확인했습니다.[질문 내용]안녕하세요. 선생님의 강의를 보면서 스프링을 배워가는 학생입니다. 처음 인텔리제이와 gradle 설치 이후 sdk관련된 gradle 싱크 문제로 큰고생 후 이제 설정이 완료되었다고 생각했는데 저는 선생님처럼 gradle 칸을 열어도 dependency 부분이 보이지 않습니다. 또한 hello-spring.build부분도 색깔로 처리되어서 메소드등이 인식되는것이 아니라 회색 밑줄로만 표시되는데요 이부분도 제대로된 세팅법을 알고 싶습니다. 기본적인 세팅부분인지라 질문에 등록되지 않았던 부분인것 같은데 해결책을 알 수가 없네요..
-
미해결
스프링 단위 테스트 진행 및 통합 테스트 진행 문제 발생
안녕하세요스프링 강의를 듣고 공부한 내용을 연습삼아서 예제를 만들어보는데요. service 로직을 테스트하는데 오류가 걸려서 질문을 올립니다. 연습은 김영한 강사님의 스프링 강의를 참고하였습니다. --문제 DB를 적용하지 않은 MemoryRepository를 주입 후 searchById를 단위 테스트 진행시에는 성공하나, 전체 테스트를 진행하면 오류가 납니다. * 해당 테스트 부분 코드 * 단위 테스트 시 성공 * 전체 테스트 진행 시 오류 똑같이 객체를 생성해서 저장한 뒤, 해당 Id로 조회를 했으나 결과는 저장된 내용이 없다고 합니다. 저는 위 상황이 repository가 전체 테스트 진행시 리셋이 안됐다고 판단했습니다. 따라서 강의에서 배운대로 @AfterEach를 작성했지만, 여전히 오류에 걸리고 있습니다. 어느 부분을 놓치고 있는지 이유를 알 수 있을까요? (추가적으로 컨트롤러를 생성해서 실제로 구동할 때에는 문제가 없습니다.)
-
미해결코딩으로 학습하는 GoF의 디자인 패턴
안녕하세요 기선님 전략패턴 실무 적용에 있어서 궁금한점 질문합니다.
안녕하세요 기선님 전략패턴 강의를 듣고 프로젝트에 적용하고 있는데요 아래와 같은 어려움을 전략패턴으로 개선하고자 합니다. singleResult, listResult 에 따라 responseEntity를 생성하는 로직이 컨트롤러 method 마다 겹친다. 아래와 같은 방법으로 개선하고자 합니다. RestAPI spec에 맞는 httpResponse를 하기 위해.. org.springframework.http.ResponseEntity<T>와 spring hateoas를 사용하여 resultTemplate 이라는 큰 틀에 responseStrategy를 인터페이스로 두고 singleResult 전략과 listResult 전략을 만들어 각 전략에 맞는 로직을 수행하여 컨트롤러에서는 전략패턴을 통한 최종적인 responseEntity를 리턴하려 합니다. 궁금한 점 1. responseEntity 와 hateoas 를 전략에서 처리하는게 무리 일까요? 2. 이런 불편함을 개선하기 위한 더 좋은 디자인패턴이 있을까요? 3. 이런 로직으로 하게 된다면 결국엔 return type이 rawType(ResponseEntity)으로 IDE 딴에서 warning을 주는데 개선할 방법이 있을까요? 감사합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MultipartFile을 String으로 형변환? 문자열로 출력 가능한가요??
안녕하세요. 한가지 궁금한 점이 있어서 글을 남기게 되었습니다. org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@745ec3eb 위에 값은 List<MultipartFile> 안에 들어있는 값 중 하나인데 이거를 문자열로 출력이 가능한가요??? toString은 안되더라구요..! 도저히 혼자 해결하지 못하고 있어서 도움을 요청드립니다 ㅠㅠ 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
동적 파일 위치에 대해서 여쭤볼게 있습니다!
안녕하세요. 김영한 선생님의 로드맵대로 현재 HTTP 부분을 수강중인 수강생입니다. 한가지 궁금한 점이 있어서 질문을 남기게 되었습니다. /resources/static/img는 웹사이트에서 메인 이미지 등 고정되는 정적 이미지를 저장하는 곳으로 사용하고 있습니다. 그래서 /resources/static/images 이런식으로 웹사이트 내에서 업로드 되는 이미지를 저장시키면 서버를 다시 키거나, 해당 폴더를 리프레쉬해야 이미지를 불러올 수 있는 것을 확인하였습니다. 웹사이트에서 등록되는 수많은 동적 이미지들은 어디에 두는게 맞는건가요??? 답변부탁드립니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
실제 Proxy 주입 확인에 대해 질문있습니다.
/* MemberController*/ @Autowired public MemberController(MemberService memberService) { this.memberService = memberService; System.out.println("memberService = " + memberService.getClass()); // 프록시 조회해보기 } /* MemberService*/ public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; System.out.println("memberRepository = " + memberRepository.getClass()); // 프록시 조회해보기 } 안녕하세요! 프록시 조회에 대해서 질문드립니다!! 프록시를 조회하고 싶어서 print문을 써봤습니다.그런데 MemberService 프록시는 MemberController 생성자에 print문을 작성해주고 MemberRepository 프록시는 MemberService 생성자에 print문을 작성해주어 확인했는데, MemberController 프록시는 어디에 print문을 작성해서 확인해야 하나요? 두번째 질문은 출력 순서를 보면 1. AOP START 다음 2. 레포지토리가 출력되고 3. END 출력 4.그 다음에 서비스 프록시가 출력되는데, 순서가 왜 이렇게 되는지 궁금합니다. 스프링을 실행시키면 어떤 부분이 가장 먼저 실행되나요?? AOP START가 가장 먼저 출력되는 걸 보니 TimeTraceAop가 실행되고 그 다음에 MemberService가 실행되는 것인가요..?? 작동되는 순서를 전혀 모르겠습니다ㅠㅠㅠ SpringConfig이 먼저 실행되어 START에 SpringConfig.memberSerivce 메소드가 찍히는 것인가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 MVC에서 핸들러 매핑
[질문 내용]안녕하세요 스프링mvc 학습 중 궁금한 점이 생겨 질문 올립니다. 스프링 mvc에서 디스패처 서블릿이 핸들러 매핑할때 @Controller @RequestMapping 이 붙어있는 "클래스"를 찾아서 핸들러로 매핑 한다고 이해 했습니다. 그렇다면 어댑터는 해당 핸들러의 @RequestMapping("[url경로]") 애노테이션이 붙어있는 "메소드"를 실행 시켜주는것인가요?? @RequestMapping 애노테이션이 붙어있는 "메소드"를 컨트롤러라고 부르는건가요..? 만약 클래스 레벨에 @RequestMapping("[url경로]")가 있고 해당 클래스의 메서드가(애노테이션이 붙지않은 순수 자바 메서드) 단 하나뿐이라면 요청이 왔을때에 클래스의 메서드가 실행 되는것일까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
thymeleaf를 사용할때 Controller와 RestController의 차이 질문이요
thymeleaf 템플릿을 사용할 때 @Controller 사용하면 String으로 반환해서 페이지로 이동하는데 @RestController를 사용하면 String으로 반환할 때페이지로 이동을 못합니다... 그 이유가 무엇이고 어떻게 해결하면 좋을까요? 참고로 hello.html은 templates에 있습니다.. @Controller public class PostController { @GetMapping("/test") public String Test(Model model){ model.addAttribute("data","테스트입니다."); return "hello"; } } 여기서 아래처럼 RestController를 사용하면 페이지를 이동못하고 hello만 반환한다. @RestController public class PostController { @GetMapping("/test") public String Test(Model model){ model.addAttribute("data","테스트입니다."); return "hello"; } } 감사합니다.
-
미해결
스프링과 스프링부트 학습 순서가 어떻게 되나요?
안녕하세요. 스프링과 스프링부트 학습 순서가 어떻게 되나요? 또 취업을 위해서는 스프링과 스프링부트 중 어디에 더 중점을 둬야하나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 별개의 질문이 있습니다.
안녕하세요. 스프링 입문 다 듣고 기본편을 듣고 있는 수강생입니다. 개인적으로 스프링부트로 프로젝트를 하는도중 mysql 관련해서 궁금한 점이 있어서 글을 남깁니다. 간단하게 말씀드리자면 웹에서 회원가입을 했을 경우 필수 입력사항이 아니면 db에 null 값으로 안들어가고 공백으로 들어가고 있습니다.. 아래 일반적인 테이블인데 공백으로 들어가는 부분이 생깁니다. create table test( num smallint auto_increment primary key, id varchar(200), pw varchar(200), gender varchar(10) ) 다만, 아래 코드처럼 웹사이트가 아닌 쿼리문으로 바로 실행하면 값을 입력하지 않는 컬럼은 null로 들어가고 있습니다. insert into test (id,pw) values ('test','1234'); 웹에서는 입력하지 않은 값이 null이 아닌 공백으로 들어가는지가 궁금합니다.ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
갑자기 중복_회원_예외가 Tests failed 떠서 질문드립니다.
안녕하세요 스프링 데이터 JPA를 수강하던 중에 @Test 중복_회원_예외 부분에서 Tests가 failed 되어 질문합니다. 분명 setName으로 설정해준 값도 같은데 말이죠.. 왜 failed가 됐고 성공하려면 어떻게 해야할까요? 다음은 에러 코드입니다. 2021-12-09 22:56:32.154 INFO 5676 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@37052337 testClass = MemberServiceIntegrationTest, testInstance = com.example.hellospring.service.MemberServiceIntegrationTest@4ba1f425, testMethod = 중복_회원_예외@MemberServiceIntegrationTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@2320fa6f testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class com.example.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@51891008, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@9816741, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@2f67a4d3, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@49b2a47d, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@1a5a4e19, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@5e955596], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@2b4954a4]; rollback [true] Hibernate: select member0_.id as id1_0_, member0_.name as name2_0_ from member member0_ where member0_.name=? Hibernate: insert into member (id, name) values (null, ?) Hibernate: select member0_.id as id1_0_, member0_.name as name2_0_ from member member0_ where member0_.name=? 2021-12-09 22:56:33.381 INFO 5676 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@37052337 testClass = MemberServiceIntegrationTest, testInstance = com.example.hellospring.service.MemberServiceIntegrationTest@4ba1f425, testMethod = 중복_회원_예외@MemberServiceIntegrationTest, testException = org.opentest4j.AssertionFailedError: Expecting: <"~~~ 이미 존재하는 회원입니다. validateDuplicateMember"> to be equal to: <"이미 존재하는 회원입니다."> but was not., mergedContextConfiguration = [WebMergedContextConfiguration@2320fa6f testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class com.example.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@51891008, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@9816741, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@2f67a4d3, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@49b2a47d, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@1a5a4e19, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@5e955596], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] org.opentest4j.AssertionFailedError: Expecting: <"~~~ 이미 존재하는 회원입니다. validateDuplicateMember"> to be equal to: <"이미 존재하는 회원입니다."> but was not. Expected :"이미 존재하는 회원입니다." Actual :"~~~ 이미 존재하는 회원입니다. validateDuplicateMember" <Click to see difference> at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at com.example.hellospring.service.MemberServiceIntegrationTest.중복_회원_예외(MemberServiceIntegrationTest.java:55) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) 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:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) 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.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) 다음은 MemberServiceIntegrationTest의 중복_회원_예외 부분입니다. @Testpublic 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("이미 존재하는 회원입니다.");} 다음은 MemberService의 join부분입니다. @Transactionalpublic class MemberService { //private final MemberRepository memberRepository = new MemoryMemberRepository(); private final MemberRepository memberRepository; // 외부에서 memberRepository를 넣어준다. ★★(DI : Dependency Injection) @Autowired public MemberService(MemberRepository memberRepository){ this.memberRepository = memberRepository; } /** * 회원가입 */ public Long join(Member member){ validateDuplicateMember(member); // 중복회원 검증 //System.out.println("~~~ MemberService join save 직전"); memberRepository.save(member); //System.out.println("~~~ MemberService join save 직후"); return member.getId(); } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("~~~ 이미 존재하는 회원입니다. validateDuplicateMember"); }); } /** * 전체 회원 조회 */ public List<Member> findMembers(){ return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); }} 감사합니다 갑자기 잘 되던 부분이 안돼서 당황스럽네요..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 데이터 jpa 강의에서 에러 질문이요
안녕하세요 스프링 데이터 jpa 부분을 수강하던중에 에러가 발생해서 질문합니다.. 구글링해봐도 해결책이 안나와서 질문합니다.. 기존 JPA 강의까지는 에러없이 잘 실행 되던 코드가 SpringDataJpaMemberRepository 인터페이스를 추가하고 SpringConfig를 추가했더니 에러가 발생하네요.. 우선 SpringConfig.java코드는 아래와 같습니다. package com.example.hellospring;import com.example.hellospring.repository.JdbcTemplateMemberRepository;import com.example.hellospring.repository.JpaMemberRepository;import com.example.hellospring.repository.MemberRepository;import com.example.hellospring.service.MemberService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.sql.DataSource;@Configurationpublic class SpringConfig { // 스프링 데이터 jpa가 구현체를 만들어 놓은게 등록이됨 private final MemberRepository memberRepository; @Autowired // 생성자가 하나인경우는 생략해도됨, 그러나 명시하는게 좋을듯 public SpringConfig(MemberRepository memberRepository) { // 스프링 컨네이너에서 MemberRepository를 찾는다 근데 등록해 놓은게 ..SpringDataJpaMemberRepository this.memberRepository = memberRepository; } @Bean public MemberService memberService() { // memberService에다 의존관계 셋팅을 해줘야함 return new MemberService(memberRepository); }} 또한 SpringDataJpaMemberRepository 부분은 다음과 같습니다. package com.example.hellospring.repository;import com.example.hellospring.domain.Member;import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { // 스프링 데이터 JPA가 JpaRepository 를 상속받고 있으면 // SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다 (구현체로 만들어서 등록을 해준다.) // 이것을 SpringConfig에서 가져다 쓰면 된다. @Override Optional<Member> findByName(String name);} 기존 jpa강의 까지 회원가입과 중복_회원_예외 부분이 에러없이 성공적으로 실행 됐습니다. 그런데 아래와 같은 에러가 발생합니다. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 참고로 application.properties 부분과 build.gradle 부분은 직전강의까지 잘 실행되던 부분에서 수정한게 없습니다.. 혹시 몰라서 application.properties 부분과 build.gradle부분도 올리겠습니다. application.properties 부분입니다. spring.datasource.url=jdbc:h2:tcp://localhost/~/testspring.datasource.driver-class-name=org.h2.Driverspring.datasource.username=saspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=none build.gradle 부분입니다. plugins { id 'org.springframework.boot' version '2.4.12' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java'}group = 'com.example'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'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' runtimeOnly 'com.h2database:h2'// testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' }}test { useJUnitPlatform()} 감사합니다.
-
미해결스프링 핵심 원리 - 고급편
안녕하세요! 질문이 있습니다.
안녕하세요! 영한님, 언제나 좋은 강의 감사드립니다. 해당 수업을 들으면서 궁금한 사항이 생겨 질문 드립니다. 제가 해당 수업을 듣기 이전에는 그냥 막연하게 스프링 AOP에서는 프록시 객체를 런타임 시점에 바이트 코드를 조작해서 만들어 준다라고 알고 있었는데요. 런타임 시점에 바이트코드를 조작한다는 말은 잘못된 표현이라고 생각할 수 있을까요?? 해당 수업을 듣고 나니, 바이트 코드 자체를 조작하는 위빙은 컴파일 타임 위빙이나 로드 타임 위빙에서 바이트 코드를 조작하는 것이지 런타임 시점에서는 바이트 코드를 조작하는 게 아니라는 생각이 들어서요.
-
미해결스프링 핵심 원리 - 기본편
[혹시]스프링 배치프로그램 강의 예정은 없는지요 ?
[혹시]스프링 배치프로그램 강의 예정은 없는지요 ?
-
미해결
스프링입문 강의 오류 질문
스프링 입문 강의 22강 JPA 연결후 회원 가입 TEST 과정에서 오류가 나는데 해결이 안되네요 ㅠ 1. config class 2. service 2. test class join 확인시 하이버네이트 db 연결 오류가 나요 application.properites
-
미해결스프링 핵심 원리 - 기본편
질문입니다.
1. InitializingBean와 DisposableBean "개발자가 코드를 고칠 수 없는 외부 라이브러리에는 적용할 수 없다."라고 설명하셨습니다. 외부 라이브러리의 코드를 제가 직접 고칠 수 없는 건 알겠는데, 그렇기 때문에 해당 메소드를 적용할 수 없는 이유를 좀 더 상세하게 알려주시면 감사하겠습니다. 2. initMethod와 destroyMethod "코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 해당 메소드를 사용할 수 있다."라고 설명하셨습니다. 여기서 해당 기능이 설정 정보를 사용한다는 말의 뜻과 그렇기 때문에 외부 라이브러리에서 사용할 수 있는 이유를 좀 더 상세하게 알려주시면 감사하겠습니다.
-
미해결스프링 핵심 원리 - 기본편
질문입니다.
1. 생성자를 제외한 대부분의 빈은 "컨테이너 생성 -> 빈 객체 생성 -> 의존관계 주입 -> 초기화"의 라이프사이클을 가진다고 하셨습니다. 그러면 생성자 빈의 라이프 사이클은 어떻게 되나요? 강의 15분 48초에서 "생성자 주입 같은 경우에는 객체를 생성해야 되기 때문에 스프링 빈 생성 단계에서 어느정도 일어납니다. "라고 하셨는데, 좀 더 구체적으로 알고 싶습니다. 2. 초기화 콜백, 소멸 전 콜백에 관한 질문입니다. 초기화 콜백은 "의존관계 주입 완료 후 호출"이라고 하셨고, 소멸 전 콜백은 "빈이 소멸되기 직전에 호출"이라고 하셨는데, 여기에서 호출이라는 게 뭔가요? 무엇을 호출한다는 건지요?