묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실습으로 배우는 선착순 이벤트 시스템
Coupon 도메인 중복
안녕하세요. 좋은 강의 항상 감사드립니다.Coupon 도메인 중복 관련해서 질문이 있습니다.consume 모듈을 새로 생성하면서 Coupon 도메인을 api 모듈에서 복붙을 하셨는데요.gradle 멀티 모듈을 만들 때 부모/자식 관계로 만들면 Coupon 도메인을 중복되지 않게 사용할 수 있을 것 같은데 강의에서는 시간상 패스한 것인가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size 설정을 지워도 지연로딩이 적용되지 않습니다.
default_batch_fetch_size 설정을 주었을때 쿼리가 나가는것과 default_batch_fetch_size 설정을 주석처리 했을때 쿼리 나가는것을 비교해보고 싶어서 테스트 코드를 아래와 같이 작성해봤습니다.@Test @DisplayName("회원 불러와서 getFriends 할때, default_batch_fetch_size 설정 여부에 따른 쿼리 개수 확인") public void findOne() throws Exception { //given Member member = Member.builder() .name("userA") .build(); Friend friendA = Friend.builder() .name("friendA") .member(member) .build(); Friend friendB = Friend.builder() .name("friendB") .member(member) .build(); Friend friendC = Friend.builder() .name("friendC") .member(member) .build(); Friend friendD = Friend.builder() .name("friendD") .member(member) .build(); Friend friendE = Friend.builder() .name("friendE") .member(member) .build(); //when memberRepository.save(member); friendRepository.save(friendA); friendRepository.save(friendB); friendRepository.save(friendC); friendRepository.save(friendD); friendRepository.save(friendE); em.flush(); em.clear(); //then Member findMember = memberRepository.findById(member.getId()); List<Friend> friends = findMember.getFriends(); for (Friend friend : friends) { log.info("getClass: " + friend.getClass()); // 프록시객체를 기대.. log.info("getClass: " + friend.getName()); } }Member와 Friend는 일대다 관계이며,Member 클래스에 있는 연관관계 필드는 다음과 같고,@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) private final List<Friend> friends = new ArrayList<>();Friend 클래스에 있는 연관관계 필드는 다음과 같습니다.@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member member;테스트코드에서,,Member findMember = memberRepository.findById(member.getId()); 이 부분에서 member를 조회하는 쿼리가 한번,log.info("getClass: " + friend.getClass()); 이 부분에서 프록시객체가 찍히고,log.info("getClass: " + friend.getName()); 이 부분에서 원본 객체를 조회하기 위해 쿼리가 한번 나가서, for문을 돌면서 총 1 + 5 개의 쿼리가 나가기를 기대했습니다.그리고 default_batch_fetch_size:100 를 글로벌설정에 주게 되면 멤버 조회하는 쿼리 1번, 해당 멤버와 관련된 전체 friend 들을 다 조회하는 쿼리 1번이 나가고 더이상 안나가게 되지 않을까 기대했습니다.그런데, 글로벌설정을 주기도 전에 1+5개의 조회 쿼리가 나가지가 않고 2개의 조회쿼리만 나가고 끝이 나네요..default_batch_fetch_size:100 이 옵션을 주석처리도 해보고, 아예 지워도 보고 default_batch_fetch_size:1 로도 값을 변경해보기도 하였지만 결과는 같았습니다.로그는 다음과 같습니다.2023-06-09 21:35:26.695 INFO 1106 --- [ Test worker] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@1bdaa23d testClass = MemberRepositoryTest, testInstance = com.example.myvers.member.MemberRepositoryTest@7ae75ba6, testMethod = findOne@MemberRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@79f227a9 testClass = MemberRepositoryTest, locations = '{}', classes = '{class com.example.myvers.MyversApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@42f48531, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@ea9b7c6, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@a8e6492, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@60dce7ea, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@f73dcd6, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@43015c69], 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@7b6b466a]; rollback [true] 2023-06-09 21:35:26.749 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.749 INFO 1106 --- [ Test worker] p6spy : #1686314126749 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.750 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.750 INFO 1106 --- [ Test worker] p6spy : #1686314126750 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.750 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.750 INFO 1106 --- [ Test worker] p6spy : #1686314126750 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.750 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.750 INFO 1106 --- [ Test worker] p6spy : #1686314126750 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.750 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.750 INFO 1106 --- [ Test worker] p6spy : #1686314126750 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.750 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence 2023-06-09 21:35:26.750 INFO 1106 --- [ Test worker] p6spy : #1686314126750 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b call next value for hibernate_sequence call next value for hibernate_sequence; 2023-06-09 21:35:26.751 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into member (created_date, email, grade, login_id, name, password, talk_count, member_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.752 INFO 1106 --- [ Test worker] p6spy : #1686314126752 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into member (created_date, email, grade, login_id, name, password, talk_count, member_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into member (created_date, email, grade, login_id, name, password, talk_count, member_id) values (NULL, NULL, NULL, NULL, 'userA', NULL, 1, 33); 2023-06-09 21:35:26.752 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.752 INFO 1106 --- [ Test worker] p6spy : #1686314126752 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (0, NULL, NULL, NULL, NULL, 33, 'friendA', 34); 2023-06-09 21:35:26.752 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.752 INFO 1106 --- [ Test worker] p6spy : #1686314126752 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (0, NULL, NULL, NULL, NULL, 33, 'friendB', 35); 2023-06-09 21:35:26.753 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.753 INFO 1106 --- [ Test worker] p6spy : #1686314126753 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (0, NULL, NULL, NULL, NULL, 33, 'friendC', 36); 2023-06-09 21:35:26.753 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.753 INFO 1106 --- [ Test worker] p6spy : #1686314126753 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (0, NULL, NULL, NULL, NULL, 33, 'friendD', 37); 2023-06-09 21:35:26.753 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) 2023-06-09 21:35:26.753 INFO 1106 --- [ Test worker] p6spy : #1686314126753 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (?, ?, ?, ?, ?, ?, ?, ?) insert into friend (age, created_date, gender, image_name, mbti, member_id, name, friend_id) values (0, NULL, NULL, NULL, NULL, 33, 'friendE', 38); 2023-06-09 21:35:26.759 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : select member0_.member_id as member_i1_1_0_, member0_.created_date as created_2_1_0_, member0_.email as email3_1_0_, member0_.grade as grade4_1_0_, member0_.login_id as login_id5_1_0_, member0_.name as name6_1_0_, member0_.password as password7_1_0_, member0_.talk_count as talk_cou8_1_0_ from member member0_ where member0_.member_id=? 2023-06-09 21:35:26.760 INFO 1106 --- [ Test worker] p6spy : #1686314126760 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b select member0_.member_id as member_i1_1_0_, member0_.created_date as created_2_1_0_, member0_.email as email3_1_0_, member0_.grade as grade4_1_0_, member0_.login_id as login_id5_1_0_, member0_.name as name6_1_0_, member0_.password as password7_1_0_, member0_.talk_count as talk_cou8_1_0_ from member member0_ where member0_.member_id=? select member0_.member_id as member_i1_1_0_, member0_.created_date as created_2_1_0_, member0_.email as email3_1_0_, member0_.grade as grade4_1_0_, member0_.login_id as login_id5_1_0_, member0_.name as name6_1_0_, member0_.password as password7_1_0_, member0_.talk_count as talk_cou8_1_0_ from member member0_ where member0_.member_id=33; 2023-06-09 21:35:26.765 DEBUG 1106 --- [ Test worker] org.hibernate.SQL : select friends0_.member_id as member_i8_0_0_, friends0_.friend_id as friend_i1_0_0_, friends0_.friend_id as friend_i1_0_1_, friends0_.age as age2_0_1_, friends0_.created_date as created_3_0_1_, friends0_.gender as gender4_0_1_, friends0_.image_name as image_na5_0_1_, friends0_.mbti as mbti6_0_1_, friends0_.member_id as member_i8_0_1_, friends0_.name as name7_0_1_ from friend friends0_ where friends0_.member_id=? 2023-06-09 21:35:26.766 INFO 1106 --- [ Test worker] p6spy : #1686314126766 | took 0ms | statement | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b select friends0_.member_id as member_i8_0_0_, friends0_.friend_id as friend_i1_0_0_, friends0_.friend_id as friend_i1_0_1_, friends0_.age as age2_0_1_, friends0_.created_date as created_3_0_1_, friends0_.gender as gender4_0_1_, friends0_.image_name as image_na5_0_1_, friends0_.mbti as mbti6_0_1_, friends0_.member_id as member_i8_0_1_, friends0_.name as name7_0_1_ from friend friends0_ where friends0_.member_id=? select friends0_.member_id as member_i8_0_0_, friends0_.friend_id as friend_i1_0_0_, friends0_.friend_id as friend_i1_0_1_, friends0_.age as age2_0_1_, friends0_.created_date as created_3_0_1_, friends0_.gender as gender4_0_1_, friends0_.image_name as image_na5_0_1_, friends0_.mbti as mbti6_0_1_, friends0_.member_id as member_i8_0_1_, friends0_.name as name7_0_1_ from friend friends0_ where friends0_.member_id=33; 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: class com.example.myvers.domain.Friend 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: friendA 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: class com.example.myvers.domain.Friend 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: friendB 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: class com.example.myvers.domain.Friend 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: friendC 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: class com.example.myvers.domain.Friend 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: friendD 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: class com.example.myvers.domain.Friend 2023-06-09 21:35:26.768 INFO 1106 --- [ Test worker] c.e.myvers.member.MemberRepositoryTest : getClass: friendE 2023-06-09 21:35:26.771 INFO 1106 --- [ Test worker] p6spy : #1686314126771 | took 0ms | rollback | connection 16| url jdbc:h2:mem:bd08892f-1de8-4235-819c-08b14b2b1f5b ; 2023-06-09 21:35:26.772 INFO 1106 --- [ Test worker] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@1bdaa23d testClass = MemberRepositoryTest, testInstance = com.example.myvers.member.MemberRepositoryTest@7ae75ba6, testMethod = findOne@MemberRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@79f227a9 testClass = MemberRepositoryTest, locations = '{}', classes = '{class com.example.myvers.MyversApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@42f48531, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@ea9b7c6, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@a8e6492, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@60dce7ea, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@f73dcd6, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@43015c69], 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]] 결론: default_batch_fetch_size 설정을 지워도 지연로딩이 적용되지 않는 이유를 알고싶습니다. 감사합니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
Kafka 등의 메시지 브로커를 사용하는 이유에 대해 질문있습니다!
안녕하세요, 좋은 강의 올려주셔서 잘 배우고 있습니다 :)강의에서 Kafka 도입 이유에 대한 궁금증이 생겨 질문 드립니다. 'Redis를 활용하여 문제 해결하기' - '문제점' 강의에서 해당 쿠폰 API에 요청이 몰리면 DB 서버에 부하가 갈 수 있다고 설명해주셨는데요. 그 해결방법으로 Kafka를 사용하셨고 API에서 직접 쿠폰을 생성할 때와 다르게 처리량을 조절해서 부하를 줄일 수 있다고 하였습니다. 이 내용 중 "처리량을 조절한다"는 의미는 어떻게 이해하면 좋을까요? 컨슈머 애플리케이션에서 처리량을 조절하는 로직을 추가하여 RDB 부하를 분산시키는 걸까요? 혹은 카프카에서 그러한 기능을 지원하는 걸까요? 혹은 마지막 강의에 있는 에러를 발생했을 때, 백업 데이터를 통해 실패 처리를 하는 경우에 대한 이야기일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
야생형 코스
안녕하세요. 스프링 김영한님 로드맵 따라갈려고 합니다. 그런데 원래 알려주셨던 아래 루트로 공부 할려고 했는데기본편 -> HTTP -> MVC 1편 -> MVC 2편 -> DB 1편 -> DB 2편 -> JPA 활용 1편 -> JPA 기본편 -> JPA 활용 1편 복습 -> JPA 활용 2편 -> 실전 스프링 JPA -> 실전 Query DSL게시판을 먼저 만들어보고싶은데스프링 기본편 -> HTTP -> MVC 1편-> JPA 활용 1편 -> JPA 기본편 JPA 활용 1편 -> JPA 기본편 1번 루트가 더 괜찮을까요? 아니면 2번으로 바로 시작해두 될까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Controller Test 시 Repository 사용 관련 질문입니다.
안녕하세요 호돌맨님 !! 강의 하면서 항상 궁금했던 점인데, 저는 Controller Test 를 End-To-End Test 용도로 자주 활용하고 있는데요, 이러면 Repository Method 를 Controller Test 에서 직접적으로 사용하는 것보다 Service 단 로직을 거쳐 Repository 의 Method 가 호출되도록 하는게 맞는걸까요 ? 호돌맨님은 항상 Controller Test 로직 짜실 때 Repository 의 save() 와 같은 메서드를 한번에 호출해서 사용하는 걸보고 질문 드립니다 !
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 도중 질문사항있어 글 남깁니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.프로젝트 생성부분 강의에서 openjdk 11.0.19 버전과 스프링부트 2.7.12버전으로 start.spring.io 사이트에서 파일을 받아서 진행하고 있는데 요런 warning이 나오고 있어서 질문드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceTest join() 부분 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의 5분쯤에 나오는 memberService.findOne(saveId).get()과 memberSrvice.findOne(saveId)의 차이점이 뭘까요 .. ? 반환이 둘 다 Optional 로 감싼 member라고 생각 했는데get()으로 값을 꺼내면 optional의 value 값이 나오는 걸까요 .. ? optional을 잘 이해를 못해서 그런건지 이 부분 잘 이해가 안 가는데 어떤 내용을 더 학습해야 이해에 도움이 될까요 ...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Cannot resolve method 'findById' in 'MemoryMemberRepositoryTest'
현 시점에서 강의 들을 때 부트3.0이상에 자바17 쓰라고 안내되어있어 현재 환경은 이렇습니다스프링부트 3.0.6java17인텔리제이 커뮤니티 23.1.1 컴파일 에러라 run을 해볼 수 없는 상황입니다ㅠㅜ검색하면서 IntelliJ 에서 InvalidateCaches는 해봤는데 안됩니다ㅠㅠ 컴파일 에러메세지Cannot resolve method 'findById' in 'MemoryMemberRepositoryTest' 강의와 다른 특이점강의에서 junit 임포트 하라고 할 때도 임포트가 안뜨고 classpath 설정하라고 추천이 떴고이때 junit 5.8.1로 추천하는 걸로 하고 나서 import가 뜨길래 이렇게 junit 임포트했습니다 @Testpublic void save(){Member member = new Member();member.setName("spring");repository.save(member);Member result = repository.findById(member.getId()).get(); // 검증하기 findById로 // get()으로 값을 바로 꺼내는 방법은 좋지 않으니 테스트코드에서는 상관xSystem.out.println("result = " + (result == member)); // 글자로 보는 건 불편하니 Assertions라는 기능이 있음Assertions.assertEquals(member,result); // .assertEquals(기대되는값expected, 실제결과actual) 파라미터
-
미해결스프링 시큐리티 OAuth2
로그인 화면을 쓰지않는다면??
- 안녕하세요! 강의 정말 잘 듣고 있습니다. 강의를 듣다가 궁금한점이 생겨서요! - keycloak 관련해서 로그인처리할 때 지금은 keycloak에서 제공하는 로그인 페이지를 사용하고 있는데, 만약 그 로그인페이지를 사용하지 않고 Front에서 만든 로그인 페이지를 사용하고, POST 요청으로 사용하면 http://localhost:8080/realms/bts/protocol/openid-connect/token URL로 직접 호출해서 토큰을 받는게 맞을지... 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JpaRepository 여러 entity에서 사용 시
JpaRepository 여러 entity에서 사용 시에 각각 마다 레포 생성해야 되나여?아래와 같은 경우요public interface BoardFileRepository extends JpaRepository<BoardFile,Long> {}public interface BoardRepository extends JpaRepository<Board,Long>, BoardRepositoryCustom { @QueryHints({ @QueryHint(name = org.hibernate.annotations.QueryHints.COMMENT, value = "BoardRepository.findByName") }) Board findByName(String name);}
-
해결됨스프링 시큐리티 OAuth2
OpenId Provider와 인가서버의 차이에 대해 질문드립니다.
안녕하세요 강사님.매번 너무나도 좋은 강의 감사드립니다. 강의 내용 중 OIDC 부분을 학습하다 궁금증이 생겨 질문드립니다.위의 이미지는 제공해주신 ppt 자료 중 96번 슬라이드의 내용입니다. 이전 내용에서 OIDC를 사용하지 않는 클라이언트의 요청을 확인하여 액세스 토큰을 발급하는 주체는 인가 서버라고 설명을 해 주셨는데 위의 이미지에서는 OP가 ID토큰과 액세스 토큰을 발급한다고 설명을 해 주셨습니다. 혹시 OIDC를 사용하는 경우에는 OpenID Provider가 인가 서버의 역할을 같이 하는 것이라고 생각해도 될까요?감사합니다.
-
미해결스프링 시큐리티 OAuth2
Oauth2 + jwt 에 대한 질문이 있습니다.
시큐리티 + jwt만을 사용한다면 회원가입하고 로그인하면 jwt를 클라이언트에게 보내줘서 다른 요청을 할 때 jwt를 함께 보내고 게시판이 해당 유저인지 판별할 때 예전에는 세션으로 사용했지만 이제는 jwt로 구별한다고 알고있습니다. 그러면 Oauth2 + jwt는 회원가입, 로그인만 소셜로그인 즉, 외부로 빼기만 한거고 소셜 로그인이 성공하면 jwt를 클라이언트에게 주고 그걸로 로그인을 유지한다던지 나머지 역할은 같나요? 소셜 로그인하면 accessToken을 발급해주는데 그거는 단지 서버에서 소셜로그인할 때 연결하기 위한거고 클라이언트에겐 따로 jwt를 만들어서 accessToken, refreshToken을 발급해줘야 하는건가요?
-
미해결스프링 부트 - 핵심 원리와 활용
라이브러리 관련 질문
안녕하세요.김영한 강사님. Spring boot 프로젝트를 라이브러리(jar)로 만들 때 질문이 있습니다. Spring boot에 있는 내장 tomcat과 관련해서 여쭤보고 싶습니다.(Spring boot 플러그인을 사용하는 경우) Spring boot를 쓰는 프로젝트를 라이브러리로 만들고,다른 Spring boot프로젝트에서 쓰는 경우 내장 tomcat 관련 문제는 없나요?(exclude module: 'spring-boot-starter-tomcat'로 라이브러리가 된 프로젝트에서 tomcat은 제외했습니다) 혹시 만약 문제가 있을 경우에는 보통 어떻게 대처하나요? 추가로 개인 프로젝트에서 비슷한 상황에 대한 질문이 있습니다.spring boot 프로젝트에서 redis를 사용하고 있습니다. redis의 repository를 사용하고 있습니다.(org.springframework.data.repository.CrudRepository) 이걸 다른 spring boot 프로젝트에서 사용할 때,저 repository bean을 생성을 못 하는 것 같은데 라이브러리를 쓰는 프로젝트에서 main에 @ComponentScan으로 라이브러리의 패키지를 주면 그때는 생성합니다. 자동구성 설정에서 scan 범위 관련해서 설정하는 게 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Assertions.assertThat()이 안됩니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의와 똑같이 작성했습니다.assertThat이 안되고 junit assert 임포트도 안먹히는 거 같은데 어떻게 해결하나요?그래들리는 이렇습니다.plugins { id 'java' id 'war' id 'org.springframework.boot' version '2.7.13-SNAPSHOT' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'jpabook' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() maven { url 'https://repo.spring.io/milestone' } maven { url 'https://repo.spring.io/snapshot' } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'junit:junit:4.13.2' testImplementation 'org.assertj:assertj-core' } tasks.named('test') { useJUnitPlatform() } 버전이 높아서 그런거면 버전을 낮게 설정해야하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
http://localhost:8080/hello에서 에러가 나요
서버도 껐다가 켜서 다시 하고 새로고침하고 클리어도 했는데 안돼요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드가 안돼요
윈도우 빌드가 안돼요 제발 도움좀요파일 이름은 Spring으로 했고 나머지는 다 강사님과 맞췄습니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
404 오류 질문입니다.
안녕하세요 5강의 GET 부분 진행하는데 404 오류가 계속 떠서 문의드립니다. 서버도 정상적으로 실행되고 타 프로젝트에서는 정상적으로 localhost:8080이 동작하는데 이 프로젝트만 계속 404 오류가 발생하네요..Java 11 사용중이고 Gradle Reload 해봐도 해결이 안돼 질문글 남깁니다..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
build.gradle 빌드 실패 에러(JDK 17.0.6, Spring boot 3.0.7)
안녕하세요, build.gradle의 빌드 실패가 나서 문의드립니다. JDK 버전은 다음과 같이 17.0.6입니다.그리고 인텔리제이 설정은 다음과 같습니다.java 컴파일러 설정2. 빌드 도구 설정3. 프로젝트 설정마지막으로 처음 프로젝트를 다운로드 받았던 설정은 다음과 같습니다.(spring boot 3.0.7 버전 사용)처음 build.gradle을 실행할 때부터 에러 로그 하나도 없이 그냥 빌드 실패했다는 에러가 뜹니다.컴퓨터를 여러번 껐다가 켜봐도 여전히 같은 에러가 뜹니다. 인텔리제이와 스프링이 완전 처음이라서 이 에러를 어떻게 해결해야 하는지 모르겠습니다. 커뮤니티의 다른 글들을 참고해봐도 딱히 도움이 되지는 않는 것 같습니다. 도와주시면 너무 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 컨텍스트 저장(persist())과 커밋의 관계
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요!에서 커밋되지 않기 때문에 INSERT문 안나가는건 이해 되는데요. persist()에 의해 영속성 컨텍스트에는 저장이 되어서 SELECT문도 안나가고 그냥 영속성 컨텍스트에서 가져와야 하는거 아닌가 라는 의문이 생겨서요.커밋 직전에 플러시 되면서 디비로 쿼리 나가는 건 알고 있었는데, 혹시 영속성 컨텍스트에 저장되는 것도 커밋이 되어야 일어나는 일인가요??어느 부분을 잘못 생각하고 있는건지 모르겠어요. 답변 부탁드려요!!
-
미해결토비의 스프링 부트 - 이해와 원리
DataSource 자동구성클래스 실습오류 발생
안녕하세요 강사님 항상 수업 잘 듣고 있습니다! 10강 DataSource 자동구성클래스 수업 실습을 따라하면서 오류가 발생했는데 원인을 못찾아서 질문드립니다! Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.NullPointerException