묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
isInstanceOf가 왜 여러개로 되나영?
@Test @DisplayName("부모 타입으로 조회시,자식이 둘 이상 있으면,빈이름을 지정하면 된다.") void findBeanByParentTypeBeanName(){ DiscountPolicy rateDiscountPolicy=ac.getBean("rateDiscountPolicy",DiscountPolicy.class); assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class); 이럴경우 //rateDiscountPolicy로 부터 반환된 실제 객체는 RateDiscountPolicy타입이고rateDiscountPolicy변수내에 담긴 실제객체가 RateDiscountPolicy타입의 인스턴트인지 비교한다고 커뮤니티에 설명을 해주셧엇는데 assertThat(rateDiscountPolicy).isInstanceOf(DiscountPolicy.class);왜 이런 경우에도 테스트가 성공되는걸까요? rateDiscountPolicy로 부터 반환된 실제 객체는 RateDiscountPolicy타입이지 DiscountPolicy타입은 아니지 않나요?
-
해결됨스프링 시큐리티 OAuth2
시큐리티 완전정복(6.x 개정판) 쿠폰 저도 받을수 있을까요.. ㅜ
학습질문과 전혀 관련없는 질문이라 죄송합니다. ㅠ저와같이 할인쿠폰 만료일 지나신 분 쿠폰요청글을 보고 혹시나 저도 아직 가능한지 여쭙고 싶어서 혹시나 하는 마음에 글올립니다.oAuth하고 이전버전 시큐리티 강의 듣고 있습니다.저도 메일을 늦게 확인하여서 쿠폰 만료일이 지났는데받을수있을까요?발급받았던 이메일 주소 는laundryday@naver.com입니다.. 좋은 하루 보내세요 감사합니다.
-
해결됨Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
inner sequence context 관련 질문
안녕하세요 강사님 좋은 강의 감사드립니다.해당 영상에서 예제 코드가 잘 이해가 되지 않아 질문 남깁니다. inner Sequence 내부에서 Context에 저장된 데이터를 외부에서 읽을 수 없다면 subscribe할 때 Context에 저장된 job은 inner 시퀀스에서 저장한 것이므로 읽을 수 없어야 한다고 생각이 들었습니다. 근데 실행 결과에서는 job에 대한 데이터를 잘 읽어오길래 혼란이 왔습니다.제가 아직 리액티브 프로그래밍 동작 방식이 익숙치 않아서 그런데 확인해주시고 부연 설명해주시면 정말 감사드리겠습니다.@Slf4j public class ContextFeatureExample4 { public static void main(String[] args) throws InterruptedException { String key1 = "id"; Mono.just("Kevin") // flatMap 내부: inner Sequence .flatMap(name -> Mono.deferContextual(ctx -> Mono.just(ctx.get(key1) + ", " + name) .transformDeferredContextual((mono, innerCtx) -> mono.map(data -> data + ", " + innerCtx.get("job"))) .contextWrite(context -> context.put("job", "Software Engineer")) ) ) .publishOn(Schedulers.parallel()) .contextWrite(context -> context.put(key1, "itVillage")) .subscribe(data -> log.info("onNext = {}", data)); Thread.sleep(100L); } }
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
boundedElastic 관련 질문
안녕하세요 강사님 좋은 강의 감사드립니다.해당 영상에서 Schedulers.boundedElastic() 이 아닌, newBoundedElastic() 예제를 보여주셨습니다.newBoundedElastic 예제는 어느정도 이해가 되었는데 boundedElastic() 실행 결과가 궁금하여 예제에서의 newBoundedElastic()을 boundedElastic() 으로 바꿔 실행해봤습니다.실행결과가 첨부한 사진처럼 나오던데 스레드 풀에 있던 스레드 6개가 사용된 것으로 보면 될까요?확인해주시고 답변 주시면 감사드리겠습니다 !
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
내부 트랜잭션 롤백시 마킹의 필요성
대원칙인 모든 논리 트랜잭션이 커밋되어야 모두가 커밋되는거고 하나라도 롤백되면 모두가 롤백된다는 개념에서 내부 트랜잭션이 롤백되면 그 시점에 모두 롤백시키면 되지 않나요? 굳이 내부 트랜잭션 롤백 후 물리 트랜잭션에 rollback_only마크를 달아 결국 모두가 롤백되도록 하는 이유가 궁금합니다.또 궁금한 점은 만약 개발자가 실수로 외부 트랜잭션을 먼저 롤백해버린다면 -> 제가 실험해보니 외부 트랜잭션 롤백시 물리 트랜잭션이 즉각 롤백이 되더라구요. 아마 isNewTransaction이 트루인 경우니 최종 결정권자의 형태로 바로 롤백을 시키는 것 같은데 그러고 나서 내부 트랜잭션 롤백을 시도하니까 여전히 롤백 마크를 남기는 로그가 뜨더라구요. 이 점에 대해서 설명 부탁드립니다:)
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cmd - gradlew 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.왜 이런 오류가 발생하는 걸까요? gradlew.bat build로 해도 똑같고gradle home도 잘 지정되어 있습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
@Configuration vs @TestConfiguration
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래 코드는 스프링 핵심 원리 기본 편에서 작성했던 코드입니다.public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); . . . @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy FixDiscountPolicy() { return new FixDiscountPolicy(); } } }여기선 @Configuration를 써도 문제가 없었는데이번 강의에선 @TestConfiguration을 작성해야만 오류가 안 생기는 이유가 뭔지, 어떤 차이 때문인지 잘 이해가 안 갑니다. 검색해 봐도 잘 와닿지가 않는데 이번 강의의 코드에선 왜 @Configuration을 하면 테스트가 제대로 수행되지 않는 건가요?
-
해결됨스프링 핵심 원리 - 기본편
MemberApp오류
> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 3s3 actionable tasks: 1 executed, 2 up-to-date================================Unsupported Java. Your build is currently configured to use Java 21.0.4 and Gradle 8.8.Possible solution: - Use Java 20 as Gradle JVM: Open Gradle settings - Open Gradle wrapper settings, change distributionUrl property to use compatible Gradle version and reload the project 두개의 오류가뜨고 있습니다 ㅠ
-
미해결Practical Testing: 실용적인 테스트 가이드
쿠키/세션은 어떻게 테스트하는지 문의드립니다!
배경회원가입을 할 때, 이메일로 인증한 회원만 회원가입이 진행되도록 하는 구현중에 있습니다.그래서, 이메일로 인증한 회원에 한해서 MAIL_VERIFIED_MEMBER 세션을 만들어서 반환하고, 회원가입할 때 MAIL_VERIFIED_MEMBER 세션이 있는지 확인하고자 합니다. 그래서, 이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER 세션이 잘 들어가는지 Controller 테스트를 진행하고자 하는데, 어려움을 겪어서 질문드립니다. 이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER 세션을 넣어주는 API이며, 이 api 를 테스트 하고자 합니다.@PostMapping("/email/authenticate") public ApiResponse<Void> authenticateEmail(@RequestBody @Valid EmailAuthenticationRequest request, HttpServletRequest servletRequest) { // 메일 인증한 회원에게 세션을 추가한다 if (mailService.isValidMail(request.toServiceRequest())) { HttpSession session = servletRequest.getSession(); session.setAttribute(MAIL_VERIFIED_MEMBER, true); return ApiResponse.ok(); } return ApiResponse.status(HttpStatus.BAD_REQUEST); } 테스트 코드를 아래 사진처럼 짜보았습니다.그러자, Response should contain header 'Set-Cookie' 라는 오류와 함께 테스트가 실패하게 됩니다.Postman 으로 api 를 호출하면 Set-Cookie 헤더에 JSESSIONID 값이 잘 들어 오는 것을 확인하였습니다.그러나, 테스트로 진행하면 JSESSIONID 도 무작위 값이 아닌 1, 2 로 들어오게 되어 'api 호출 후 세션이 생성되어 쿠키에 들어갔는지' 테스트하는데 어려움을 겪어 질문 드립니다...ㅠㅠ api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..? andDo(print()) 에서 MockHttpServletRequest 의 Session Attrs 에는 세션 값이 왜 들어가 있을까요.. 해당 api 를 호출하면 세션이 아직 생성이 안되었을 것이라 생각했기 때문입니다..해당 테스트를 실행할 때의 andDo(print()) 의 결과는 다음과 같습니다. MockHttpServletRequest: HTTP Method = POST Request URI = /member/email/authenticate Parameters = {} Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"48"] Body = {"email":"123@naver.com","authCode":"312nj5acz"} Session Attrs = {verified_member=true} MockHttpServletResponse: Status = 200 Error message = null Headers = [Content-Type:"application/json"] Content type = application/json Body = {"code":"0200","status":"OK","message":"OK","data":null} Forwarded URL = null Redirected URL = null Cookies = [] 질문이 길어 죄송합니다..그리고, 좋은 테스트 강의를 지식 공유 해주셔서 감사드립니다!!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
최근에 강의 듣다보면 일시적인 오류가 자주 발생합니다
-
해결됨스프링 핵심 원리 - 기본편
클라이언트코드라는게 멀까요?
ocp에서 클라이언트 코드는 변경하지 않아도된다고 하셧는데 클라이언트쪽은 프론트쪽이아닌가요?클라이언트는 요청이고서버는 요청을 받는거라고 생각해서 백엔드코드는 다 서버아닌가요? 해당 코드에서도 클라이언트코드와 서버코드가 나눠져있다면 serviceimpl쪽만 클라이언트코드고 appconfig,order,discount쪽은 서버가 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 DB 연결 오류 : MemberRepositoryTest 실행 시
[질문 내용]MemberRepositoryTest 실행 시 자꾸만 오류가 나네요....... 어찌 해야할지 ㅠ 오류 :java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]JdbcIsolationDelegate.java:116 at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] jpashop/src/main/resources/application.yml spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=true username: sa password: driver-class-name: org.h2.Driver jpa: database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: create #Application 실행 시점에 Entity 삭제 & 재생성 properties: hibernate: show_sql: true #생성한 SQL 이 다 보임 :) System out 을 통해 출력. format_sql: true logging: level: org.hibernate.SQL: debug #sql 을 전부 DEBUG 모드로 남긴다는 뜻. Logger 를 통해. server: port: 8092 MemberRepository.javapackage jpabook.jpashop; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository //DAO 랑 그냥 똑같은거 public class MemberRepository { @PersistenceContext private EntityManager em; //starter-jpa-start 에 포함! // EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory("JPA_DEMO");// // EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager(); public Long save(Member member) { // System.out.println("em:: "+em.toString()); System.out.println("save"); em.persist(member); //영속성. 영원히 저장한다 (=DB SAVE) return member.getId(); } //커맨드와 쿼리를 분리하는 정책 설계때문에 Id 만 리턴한다구 함 public Member find(Long id) { System.out.println("find"); return em.find(Member.class, id); } } MemberRepositoryTest.javapackage jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; // import org.junit.Before; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void test() throws Exception{ //given Member member = new Member(); member.setUsername("memberA"); System.out.println(member.toString()); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then System.out.println("Then"); Assertions.assertThat(findMember.getId()).isEqualTo(findMember.getId()); } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
build 부분 관련 질문 입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 환경은 윈도우 환경입니다. C:\Users\user\Desktop\study\hello-spring>gradlew.bat이후 build successful in 8s 까지 확인하고 cd build로 이동하여 dir /ad를 하면 C 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: E456-7A80 C:\Users\user\Desktop\study\hello-spring\build 디렉터리2024-09-02 오전 08:56 <DIR> .2024-09-02 오전 07:56 <DIR> ..2024-09-02 오전 07:56 <DIR> classes2024-09-02 오전 07:56 <DIR> generated2024-09-02 오전 08:56 <DIR> libs2024-09-02 오전 08:56 <DIR> reports2024-09-02 오전 07:56 <DIR> resources2024-09-02 오전 08:56 <DIR> test-results2024-09-02 오전 08:56 <DIR> tmp 0개 파일 0 바이트 9개 디렉터리 265,771,782,144 바이트 남음 이렇게 뜹니다.이러한 이유로 뒤 진행이 되지 않고 있습니다. 제가 놓친 부분이나 추가로 확인해야 하는 상황이 있을까요
-
미해결스프링 핵심 원리 - 기본편
주입할 스프링 빈이 없어도 동작해야 할 때
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 주입할 스프링 빈이 없어도 동작해야 할 때가 있다. 라고 하는데 예를 어떤 상황이 있는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ExceptionResolver 에러 해결에 관하여 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네!2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네!3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네![질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요!mvc2 9chapter (API 예외 처리)API 예외 처리 - API 예외 처리 - HandlerExceptionResolver 시작에서의 의문점 입니다. 해당 부분에서는 IllegalArgumentException이 컨트롤러단에서 발생할 경우 Resolver를 이용해 정상흐름으로 만든 뒤 sendError를 호출하고 있는데요 @Slf4j public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof IllegalArgumentException) { log.info("IllegalArgumentException resolver to 400"); response.sendError(HttpServletResponse.SC_BAD_REQUEST); return new ModelAndView(); } } catch (IOException e) { log.error("resolver ex", e); } return null; } }그에 따른 api 호출 결과는 다음과 같습니다.{ "timestamp": "2024-08-31T18:06:36.410+00:00", "status": 400, "error": "Bad Request", "exception": "java.lang.IllegalArgumentException", "message": "잘못된 입력 값", "path": "/api/members/bad" } resolver는 컨트롤러 단에서 예외가 발생했을 때 그 예외를 해결하고 새로운 결과를 만드는 것 이라고 학습하였습니다. 'IllegralArgumentException 예외를 해결' 하고 'sendError(400)'으로 새로운 결과를 만들어 내었다고 생각하였는데 json 결과에서 status가 400으로 바뀌긴 하였지만, IllegralArumentException에 대한 exception과 message가 나와있는 것을 확인해 볼 수 있었습니다. resolver에서 '예외를 해결' 하였으니 exception 필드과 message 필드는 없어야 한다고 생각하는데 어떤 메커니즘에 의해 저 json 결과가 나왔는지가 궁금합니다. 좋은 강의 만들어 주셔서 항상 감사드립니다.
-
미해결토비의 스프링 부트 - 이해와 원리
MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점
안녕하세요! MyAutoConfigImportSelector에 implements DeferredImportSelector만 해주었는데요! 따로 BeanClassLoaderAware 를 같이 implements 해주지 않았는데도, 어떻게 classLoader가 생성자로 주입이 가능한 지 궁금합니다! MyAutoConfigImportSelector가 Bean은 아닌것 같아서요!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]컨트롤러에서 모델에 addAttribute안해도 이미 모델에 들어가있는 경우가 있던데 이런것들고 명시적으로 model 에 넣어서 보내주는게 좋을까요? 아니면 코드 깔끔하게 그냥 없애는게 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티를 반환받을때 어디서 response용 dto로 바꿔주는게 좋나요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]파라미터를 받을 때는 컨트롤러에서 메서드 실행될때 이미 dto로 받는건 알겠는데 dto를 저장하기 전에 엔티티로 바꾸는건 어디서 보통 하는건가요? 컨트롤러인가요 서비스인가요? 그리고 리포지토리에서 받아온 엔티티는 어디서 response용 dto로 바꿔주는 건가요? service에서 처리하고 컨트롤러로 보내는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤 안에 DTO
소스코드를 보면 request라 response dto를 따로 격리시키는게 아니라 컨트롤러 소스코드 내에 정의하셨는데 이건 분리하는 게 맞지 않나요...? 혹시 컨트롤러 안에 정의한 이유가 있을까요?
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
Map 방식 인가 구현 이후 로그인 에러
시큐리티 6.1.6 사용중입니다지금까지 클론 코딩하면서 진행하고 있는데,성공 처리 핸들러에서 SavedRequest 에 /error 경로로 이동하도록 나오던데.. 어떤 부분을 봐야할지 감이 안잡힙니다 ㅜㅜ Map 인가 정보도 동일하게 사용했습니다