묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
동의 후 인증 절차의 구현이 변경됐습니다.
Scope 동의단계2, 즉 최종사용자의 동의가 이루어졌을 경우이 요청은 POST /oauth2/authorize 로 보내지는데요이 과정에서 내부구현의 차이가 강의 버전과 맞지 않아서 코드를 확인해봤습니다.1. 0.4.0 버전부터이때 작동하는 AuthenticationConverter 는 OAuth2AuthorizationConsentAuthenticationConverter 입니다.여기서 OAuth2AuthorizationConsentAuthenticationToken 가 구성됩니다.2.OAuth2AuthorizationConsentAuthenticationToken 의 처리는 OAuth2AuthorizationConsentAuthenticationProvider 가 맡게 됩니다.여기서 code 생성 절차가 진행되는 차이가 있습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MTV, MVC 질문
원래는 장고 프레임워크를 주로 이용했었습니다.MTV와 MVC의 View가 장고는 비즈니스로직을 처리해서 Template에 주고, M은 스프링의 Repository와 비슷하다고 생각했습니다. 조금 헷갈리는게,MVC일 때 V는 확실히 랜더링 부분만 담당하는 것이 이해가 갑니다. 다만 Controller가 비즈니스 로직을 담당하는데, Service와 의미가 겹치지 않나 싶었고보통 django에서는 view에서 처리한 데이터를 Model을 통해 넣는다던지 아니면 model을 통해 가져온 데이터를 view로 하여금 template에 전달한다는 느낌이었는데 오늘 강의의 그림을 보니 controller -> model -> view 인 것 처럼 보여서 그러면 MTV의 M과 MVC의 M은 또 많이 다른건가 싶었습니다. 심지어 이것을 더욱 헷갈리게 하는 것이 Repository인데... MVC인데 뭔가 MVC+Service+Repository인건가 싶기도 하고 헷갈리네요 ㅠㅠService - Controller : 프로젝트가 거대해지면 비즈니스로직은 서비스에서 처리하고 컨트롤러는 서블릿 형태의 역할로만 남는건가 싶기도 하고(추측)Model-Repository : 레포지토리가 아무리 봐도 후에 JPA ORM을 사용할 수 있는 영역일 것 같은데, 그렇다면 오늘 강의의 그림에서 보여진 Model은 단순히 컨트롤러에서 View로 데이터 전달을 위한 임시보관소인가 싶습니다. Model은 그림상 DB랑 연결되는 느낌은 없는데.. 아니면 Model은 껍데기고 Model이 리포지토리에 구축된 JPA ORM을 이용해서 DB랑 통신하는 개념일지... 질문이 장황한데... 헷갈려서 그렇네요 답변 주시면 감사하겠습니다:)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
글로벌 Validatior, Bean Validation
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 선생님 학습 도중 이해가 되지 않아 질문 드립니다. 1. 스프링 부트는 자동으로 글로벌 Validator로 등록한다.위 말은 즉, 글로벌 Validator가 Bean Validation인가요 ?2. 필드 타입 오류의 발생유무의 상관없이 글로벌 Validator는 적용되고 Bean Validation(ex : itemValidator)는 적용이 되거나/안되거나 인가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
소스가 전혀 실행이 안됨
강의 1편때의 소스로도 실행이 안되서,다시 2편 소스로 수행하면 에러메시지가 잔뜩 나오는데너무 시작부터 불성실하게 시작하는거 아님?지금 소스 받아서 환경을 맞춰주고 강의를 시작해야지 대뜸시작하면 실행도 안되는 소스로 뭐 어떡하라고.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional 했는데 롤백 문구가 안 떠요
다음과 같이 코드를 실행하면 강의 화면처럼 "Rolled back transaction for test"가 나와야 하는데 그렇지 않고 H2에서도 컬럼만 있는 빈 테이블입니다. 뭐가 문제일까요? package jpabook.jpashop; import com.fasterxml.jackson.databind.deser.std.StdKeyDeserializer; 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.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memeberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } }
-
미해결스프링 부트 - 핵심 원리와 활용
톰캣설정 인텔리J 무료버전 설정
윈도우에서 가이드데로 진행했는데 실행이 실패했습니다.bulid.gradle에는 아래와 같이 똑같이 코딩했습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle build가 버전문제로 안되요.
[질문 내용]안녕하세요! 해당 강의를 듣던 와중에 (1:24까지 들었다가 막혔습니다.) 더이상 진도를 못나가게되어 질문드립니다. 자바 버전 추천하는게 55.0 까지인거 같은데, 저의 자바 클래스 파일 버전은 61이라서 에러가 나면서 그레이들 빌드가 되고 있지 않습니다. 어떻게 해야할까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
BookForm 객체에 toServiceDto() 메서드 사용 질문드립니다.
안녕하세요!ItemServiceDTOItemFormItemController위와 같이 ItemForm(BookForm) 클래스에 toServiceDTO()라는 빌더 메서드를 작성하였습니다. Controller에서 ItemForm의 빌더 메서드를 통해 ItemServiceDTO로 바로 변환해 Service단에 넘겨주었는데 위와 같이 구현해도 괜찮을까요? 만약 상관이 없다면 ItemForm에서 ItemServiceDTO를 의존하고 있는데 DTO끼리의 의존은 크게 신경 안써도 될까요? 좋은 강의 감사드립니다!!
-
미해결스프링 핵심 원리 - 기본편
스프링 프로젝트 부분 수정에 대한 질문입니다.
스프링이 처음입니다. 문의가 어설퍼도 이해바랍니다. 스프링으로 개발된 프로젝트가 있습니다. 서버에는 컴파일 된 class 파일들이 있는데요. 부분적인 기능 수정을 위해서 전체 프로젝트를 WAR파일로 컴파일하지 않고 해당 java 파일만 컴파일하여 class파일을 만들어 서버에 올려 파일을 교체해도 전체 서비스 작동에 문제가 되지는 않는지 궁금합니다.a.java -> a.class 예를 들어 요렇게 부분 파일만 코드 수정 후 서버에 해당 a.class 파일을 교체해도 문제가 없는지요.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
was vs 서블릿 컨테이너
톰캣 처럼 서블릿을 지원하는 was를 서블릿 컨테이너 라고 하셨는데 그럼 서블릿 컨테이너와 was는 차이가 없는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
saveFile 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@PostMapping("/upload") public String saveFile(@RequestParam("itemName") String itemName, @RequestParam("file") MultipartFile file) throws IOException { if (!file.isEmpty()){ String fullPath = fileDir + file.getOriginalFilename(); log.info("파일저장 fullPath={}",fullPath); file.transferTo(new File(fullPath)); } return "upload-form"; }SpringUploadController 에 있는 savFile 입니다. @RequestParam String itemName 없어도 되는거죠 ?@RequestParm MultipatrFile file은 현재 파일이 빈값인지 아닌지 확인해야하기때문에 필요한거같은데 itemName은 필요가없을거같아서요 view단에서 값을 넘겨야하는것도 없는거같구요 답변 부탁드립니다 ~
-
해결됨스프링 핵심 원리 - 기본편
NoSuchBeanDefinitionException 오류
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ConfigurationSingletonTest에서 memberRepository 빈이 없다는 오류가 뜹니다. AppConfig 파일에서 memberRepository 메소드가 @Bean으로 잘 등록되었고, AppConfig 파일도 @Configuration으로 잘 등록된 것을 확인했습니다. 다음과 같이 오류가 뜨는 이유를 잘 모르겠습니다. 아래와 같이 ConfigurationSingletonTest코드 중 getBean에서 오류가 생기는 것 같은데 이유를 모르겠습니다.MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);아래는 MemberServiceImpl, orderServiceImpl, AppConfig, ConfigurationSingletonTest 코드입니다. package hello.core.member; public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } //테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } }package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } //테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } }package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberService memberService(){ return new MemberServiceImpl(MemberRepository()); } @Bean public MemberRepository MemberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService(){ return new OrderServiceImpl(MemberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPolicy(){ //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }package hello.core.singleton; import hello.core.AppConfig; import hello.core.member.MemberRepository; import hello.core.member.MemberServiceImpl; import hello.core.order.OrderServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static org.assertj.core.api.Assertions.assertThat; public class ConfigurationSingletonTest { @Test void configurationTest(){ ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("orderService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }
-
해결됨스프링 핵심 원리 - 기본편
OrderService를 테스트 하는데 MemberService도 꺼네서 사용하는 이유가 있을까요??
코드를 보면 조인만 하고 다른 동작은 안하는것 같은데 막상 MemberService 부분을 제외 해보면 NullPointException이 생겨서MemberService가 있어야만 예외가 안생기는지 궁금합니다@Test void createOrder() { Long memberId = 1L; Member member = new Member(memberId, "memberA", Grade.VIP); memberService.join(member); Order order = orderService.createOrder(memberId, "itemA", 10000); Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000); }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
intellij 기동상에는 문제 없지만, 서버가 계속 도는 현상
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 영한쌤 !!현재 제가 듣고 있는 강의는,"스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"섹션 1. 프로젝트 환경설정 - View 환경설정입니다.intellij에서 기동은 되고 페이지도 잘 뜨고 ㅣ있지만, 현재 계속 서버가(tomcat?) 돌아가고 있는 모습이 보여서 질문드립니다. 이게 정상은 아닌거같아서요. 어떤 설정으로 변경해야할까요?그리고 기동을 중지했을때, 이런 빨간색 에러 표시가 납니다.강의듣는덴 문제가 없지만 어떤 오류인지 뭐가 잘못됬는지 알고 싶습니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
application.properties 코드 질문(Failed to initialize JPA EntityManagerFactory)
[질문]은 굵은 글씨로 표시해 두었습니다.application.properties에 강의에서 나온 대로 입력하였는데, 아래와 같은 에러가 발생하였습니다.j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)검색을 해보니, Hibernate가 H2 데이터베이스 Dialect을 자동으로 인식하지 못하기 때문이라 하여 아래와 같은 코드를 추가하여 문제를 해결하였습니다.spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect최종적으로 스프링부트어플리케이션도 잘 작동하고, 테스트코드도 통과하였습니다. 본 강의에서는 5줄 만으로도 코드가 잘 작동하는데, 왜 저는 H2 데이터베이스를 명시적으로 설정하는 코드를 추가로 작성해야 하는지 궁금합니다. 최종 application.properties 코드spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect질문용 파일 : https://drive.google.com/file/d/1JpK0g8GjAL0quy9aOx-EMB8nF599Tk-U/view?usp=sharing=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션 4 회원 기능 테스트에서 yml 파일을 test에 추가하면
23:18 에서 run을 하면 connection url 이 jdbc:h2:mem:testdb로 나타나는 것이 아니라 jdbc:h2:mem:4ea5215f-2678-4770-ad7b-4696fcde71b2 이렇게 특정 숫자로 나타나는데... 뭐가 문젠가요?그리고 test 파일에 붙여넣은 application.yml 파일도 main 폴더에 있는 yml파일처럼 초록색 잎사귀 모양으로 나타나는게 아니라 빨간색 y아이콘으로 나타나는데 이게 yml파일이 제대로 적용되지 않았다는건가요? 그래서 gpt를 참고해보니 src/test/resources 폴더가 Test Resources로 설정되어 있는지 확인합니다. 그렇지 않으면 폴더를 선택하고 Mark as: Test Resources로 설정합니다. 라고 해서 해보려 했더니 Source root 'C:\Users\jar05\OneDrive\바탕 화면\Github\JPA_study\jpashop\jpashop\src\test\resources' cannot be defined in module 'jpabook.jpashop' because it belongs to content of nested module 'jpabook.jpashop.test'이런 에러가 발생합니다..
-
미해결토비의 스프링 부트 - 이해와 원리
강의 공부방법
안녕하세요 현재 자바를 공부하고 있습니다. 곧 스프링 부트 공부를 시작할 것 같은데 처음 배운 언어가 Python이라 Django정도만 다뤄봤습니다. 워낙 유명한 강의기에 퀄리티나 내용은 의심치 않지만 입문한지 얼마 안된 사람도 이해하기 쉬운 난이도인지 궁금합니다. "이 강의는 코드를 잘 짜는 법을 가르쳐주는 강의가 아닌 더 나은 개발자가 되는 방법을 가르쳐 주는 강의입니다." 그리고 저도 강의를 다 듣고나서 저런 감정을 느끼고 싶습니다! 저렇게 하려면 스프링 부트를 공부할 때 어떻게 공부를 해야하는지 궁금합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트하기 어려운 영역을 분리하는 과정
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 박우빈님, 강의 잘 듣고 있습니다다름이 아니라 '테스트하기 어려운 영역을 분리하기' 세션 중 아래 코드와 같이 createOrder() 메서드를 오버로딩하여 테스트가 어려운 영역을 분리하여 테스트를 진행해주셨습니다.여기서 실제로도 어려운 영역을 분리하여 테스트 하기 위해 실제 비즈니스 로직에 테스트를 위한 메서드를 오버로딩하여 테스트 하는지가 궁금증이 생겼습니다.실무에선 해당 Test 클래스 내에서 메서드를 오버로딩 하여 사용하는 방식인가 싶은 생각도 들었습니다.실무에선 어떤 식으로 오버로딩하여 사용하나요?public Order createOrder() { LocalDateTime currentDateTime = LocalDateTime.now(); LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); } public Order createOrder(LocalDateTime currentDateTime) { LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); }
-
해결됨스프링 핵심 원리 - 기본편
역할과 구현에 대해
회원 서비스의 역할이 회원 가입과 회원 조회라는 것은 알겠는데회원 가입과 회원 조회 그 자체가 구현이 되는 것인 가요?실무에서 글로만 요구 사항을 전달 받았을 때무엇을 역할로 지정하고 무엇을 구현으로 정하는지궁금합니다, 기준이 있다면 기준이 무엇인지 알고 싶습니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테이블 member 해결 불가 오류
JdbcTemplateMemberRepository 클래스에서 해당 오류가 발생하는데 테스트 실행에는 영향을 주지 않습니다 이 오류는 왜 발생하는 건가요? 그리고 어떻게 해결하는지 알려주시면 감사하겠습니다