묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Rest API 로 받을 때의 검증에 대해 질문있습니다.
Bean Validation에서 발생한 @NotBlank, @Max 등을 이후 강의에 나오는 RestControllerAdvice에서 잡아서 handling 하는 방법도 있을까요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 영한님 쿠키 관련 질문이 있습니다. :)
안녕하세요 영한님 :) 강의 정말 잘 듣고 있습니다. 다름이 아니라 질문이 있는데요 쿠키를 설정할 때 하위 도메인은 같이 쿠키가 공유 된다고 하셨었는데 하위 도메인이 아니라 아예 다른 도메인간에 쿠키를 공유하거나 다른 도메인에 쿠키를 설정할 수 도 있는 것인가요?? 안된다는 글도 봤었고 SameSite 속성을 None 으로 설정하면 된다는 것도 보았었는데 정말 다른 도메인간에 쿠키를 설정 또는 공유할 수 있는 것인지 궁금합니다. :) ex) exampleAAA.com exampleBBB.com 이렇게 서로 다른 도메인간 쿠키 공유 or 설정
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
run을 클릭할 때 실행이 되지 않아요
강의 내용 중 run을 실행시키는 부분에서 왼쪽에 화살표 모양이 나타나지 않습니다 상단에 있는 목록 중 run을 눌러 실행을 하면 밑의 이미지와 같은 문구만 나타납니다
-
미해결스프링 핵심 원리 - 기본편
회원 도메인 개발 05:52
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요. 질문 있습니다. store.put(member.getId(), member)에서 value로 member.getName()이 와야하지 않나요? 왜 member인지 모르겠습니다..ㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
사용되는 Servlet
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이번에 내용을 정리하면서 깨달은 사실이 맞는지 확인하고자 질문을 남깁니다. 원래 사용자의 요청이 들어오면 서블릿 컨테이너에서 해당되는 서블릿 객체를 꺼내서 사용한다고 알고 있습니다. 하지만 FrontController(DispatcherServlet)을 사용하여서 개발자는 컨트롤러만 작성하면 되었고 그 뜻은 실제로 사용되는 서블릿 객체는 위의 DispatcherServlet이 끝이라는 뜻인가요? 물론 저도 모르는 곳에서 이미 만들어진 Servlet이 사용될 수는 있지만 개발자가 따로 서블릿을 만드는 일이 별로 없는 것인지 궁금해서 질문을 남깁니다.
-
미해결실전! 스프링 데이터 JPA
Auditing transaction
안녕하세요, auditing 강의를 듣고 적용해보았습니다. 게시글을 처음에 만들때 원하는 값들이 잘 들어가지만 게시글을 수정하여 다시 저장할 경우audit 부분에서 createdBy, modifiedBy 를 못가져오면서 transaction 에러를 냅니다..! 혹시 실무에 적용하기 위해 추가로 적용해야 할 부분이 있을까요? 아마 AuditorAwareImpl에서 @Autowired MemberRepository memberRepository; 부분이 이상한 것 같은데...이유는 모르겠습니다 ㅠ_ㅠ public class AuditorAwareImpl implements AuditorAware<Long> { @Autowired MemberRepository memberRepository; @Override public Optional<Long> getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (null == authentication || !authentication.isAuthenticated()) { return null; } DefaultOAuth2User principal = (DefaultOAuth2User) authentication.getPrincipal(); String email = (String) principal.getAttributes().get("email"); if(email == null ){ return null; } Member member = memberRepository.findByEmail(email).orElse(null); if(member == null){ return null; } return Optional.of(member.getId()); } }
-
미해결스프링 핵심 원리 - 기본편
@Configuration 없이 @Bean만 사용할 때에 대한 질문
안녕하세요! 진짜 영한님 강의는 최고네요. 감사합니다. 듣다가 질문이 생겼는데요. `@Configuration`을 주석처리하고 `@Bean`만 남겼을 때 빈으로 등록되긴 하는데 여러개가 등록(싱글톤 X)된다고 하셨잖아요. 여기서 헷갈리는 이유는, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."라는 이론적 내용과, "같은 이름의 Bean이 여러개 생성되기도 한다"라는 이 강의의 실험 결과과 충돌해서인데요. 엄밀한 정리를 하고 싶어서 질문드려요. 일단은 "같은 이름의 Bean이 여러개 생성되기도 한다"가 먼저 가능성 측면에서 맞는 얘기고, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."는 정상적(일반적)인 방식으로 Bean을 등록한다면이라는 전제가 깔렸을 때 맞는 얘기일 거로 생각 됩니다. 그럼, 아래 내용중에는 무엇이 맞는 걸까요? 영한님이 보여주신 실험처럼, `@Configuration`을 누락하면 동일한 Bean이 여러번 생성되는 경우가 있는데 이 때, 1. `memberRepository`라는 메서드가 3번이나 호출되었는데, 새로 생성될 때마다 기존에 먼저 생성되었던 빈을 덮어쓰기(override)한다. 고로 생성만 N번 될 뿐이지, 결과적으로는 스프링 내에서는 싱글톤으로 존재한다.(* 만일 이게 맞다면 컴파일타임/런타임 모두 에러가 안나고, 동작 자체에는 문제가 없겠네요. 리소스는 많이 잡아먹겠지만요.) 2. `memberRepository`라는 메서드가 3번이나 호출되어 총 3개의 인스턴스가 빈으로 각각 등록되었다. 고로 이름을 같지만 3개의 빈이 실제로 모두 존재한다. (* 만일 이게 맞다면, 이 경우 빈을 사용하기 위해 주입할 때 컴포넌트 스캔 결과, ConflictingBeanDefinitionException이 뜨게 되겠네요.) --- 앗. 질문이 잘못된 부분이 있어서 수정했습니다.
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]컴포넌트 단원의 @ComponentScan에 관한 질문입니다 package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration //ComponentSacn은 Spring빈을 전부 검색해서 담는 과정을 수행함, 정확히는 @Componet가 붙은 녀석들을 전부 담아줌 @ComponentScan( //AppConfig에 등록한 Configuration을 제외해주는 과정ㅇ excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) 위의 코드는 예제 AutoAppConfig.java 파일안의 코드입니다. 이렇게 하면 AppCongif, TestConfig에서 주가되는 Bean을 예외로 하는것은 이해했습니다. 여기서 궁금증이 생기는데 자기 자신에도 @Configuration이 추가 되어있는데 자기 자신의 @Configuaration은 예외 처리를 안해주는것인가요? 질문을 정리하면 @ComponentScan을 통한 예외처리를 진행할 때 자기 자신의 클래스는 제외하고 예외처리를 진행하는것인지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링에서 post를 막아놨다는 의미.
안녕하세요. '상품 서비스 html' 강의 6분 50초 쯤에 상품 등록할 때의 버튼이 동작 안했을 때 김영한 선생님이 말씀하시길, static 정적 리소스는 get일 때 받는 것으로 되어있따. 스프링에서 post를 막아놨다는 말은 무슨 뜻인가요? 단순 브라우저에서 열었기 때문에(브라우저는 다양한 http메서드를 지원하지 않아서 postman 으로 여러 메서드들을 확인하듯) post를 지원하지 않는다? 뭐 이런 의미랑 관련이 있나요 스프링에서 막아놨다는 말과, get일 때 받는 것으로 되어있다.. 등 여러 의미적인 면에서 이해가 잘 안되네요. 미리 감사드립니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
spring MVC와 REST API차이의 개념이 궁금합니다.
제가 이해한건 Spring MVC와 REST API 개발의 차이는 VIEW를 반환하는가 아니면 JSON의 데이터를 반환하는가의 차이인데 제가 이해한것이 맞나요??
-
미해결스프링 핵심 원리 - 기본편
isInstanceOf
안녕하세요!구글 검색을 해봐도 명확한 답을 찾기가 어려워 질문을 남깁니다.assertThat(bean).isInstanceOf(RateDiscountPolicy.class); 처럼 검증을 할 때isInstanceOf가 어떻게 동작을 하는건지 잘 모르겠습니다.assertThat(bean).isInstanceOf(DiscountPolicy.class); 해도 테스트 통과를 하더라구요 답변 부탁드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 내부의 컨테이너(?)
강의내용을 되짚어 보다가 문득 궁금증이 생겨 질문드립니다. 스프링 컨테이너를 직접 만들지 않아도 빈 객체들을 주입 받을 수 있는데, 스프링 내부에 컨테이너가 있는 걸까요? 내부에 컨테이너가 있는게 맞다면 어떤 종류의 컨테이너이며, 어떤 라이프 사이클을 가지고 동작하는 건가요? 공식 문서에도 컨테이너를 만들고 사용하는 것에대해서만 설명하고 내부에 컨테이너가 있다는 말은 찾지 못했는데, 이런 내용은 어떻게 확인 할 수 있을까요? 알려주신 것 같이 컨테이너(Config)를 직접 만들어 쓰는 경우가 많나요? 주로 어떤 상황에서 많이 쓰이나요? 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Accept vs Content-Type
안녕하십니까 강사님 강의를 듣던 도중에 미디어 타입 조건 매핑에서 Accept와 Content-Type이 헷갈려서 질문드립니다. (Http 강의를 듣고 정리한 것도 보고 왔습니다) Accept는 클라이언트가 선호하는 표현을 요청하는 것으로 클라이언트 입장에서 응답을 받을 때, Accept헤더에 있는 데이터 타입이 오지 않으면 내가 말한 데이터가 아니잖아라고 거절을 하는 것이고, Content-Type은 해당 헤더에 있는 데이터가 오지 않았을 경우 서버 입장에서 내가 처리할 수 있는 데이터가 아닌데? 라고 거절을 하는 건가요?? Accept가 요청 때만 사용한다고 알고있어서 헷갈리게 되어 질문드립니다 감사합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
웹애플리케이션 계층구조가 mvc를 설명한건가요?
안녕하세요. 자바입문 듣고 스프링 강의를 신청하여 김영한님 강의를 듣는데요. 일반적인 웹애플리케이션 계층구조 설명하시는데 이것이 MVC 패턴 설명하신건지? 아니면 비슷한것인가 궁금합니다. 또한 클래스 의존관계 설명에서 구현체란 단어를 사용하시던데 구현체라는게 무엇인지??
-
미해결스프링 핵심 원리 - 기본편
빈 라이프 싸이클과 PostConstruct, PreConstruct 질문입니다.
1. 스프링빈은 객체를 생성한다.2. 의존관계 주입을 한다.3. 이후 필요한 데이터를 사용 할 수 있는 준비가 된다. 강의 듣다가 명확하게 이해하고 싶어서 질문드립니다. 의존관계 주입후 필요한 데이터를 사용 할 수 있는 준비가 된다고 하는데 그렇다면 생성자로 모든 데이터와 DB 커넥션을 해주는 작업을 한다면 의존관계주입이 발생될때 해당 초기화 했던 작업들은 다 무시가 되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드 관련 Setter 사용
영한님께서 설명해주신 내용중 연관관계 편의메소드 등에서 Setter로 인한 문제점들은 알겠습니다. 이를 해결하기 위한 방법중 연관관계 편의 메소드에서 setXXX() 등을 사용하기 보단 별도의 메소드를 생성하여 changeMember()등으로 사용하는 것은 괜찮은지 궁금합니다. 예를들어 아래와 같이 작성시 문제가 될 소지가 있는지...궁금합니다. public void changeOrder(Order order) { this.order = order;} //===연관관계 편의 메서드 ===//public void addOrderItem(OrderItem orderItem) { this.orderItems.add(orderItem); orderItem.changeOrder(this);
-
미해결실전! 스프링 데이터 JPA
DTO안의 List가 있으면 어떻게 받아와야하나요..
만약 dto안에 list가 있으면 생성자는 어떤 식으로 만들어야 하고 jpql쿼리는 어떻게 찾아서 받아야하나요...???
-
미해결실전! 스프링 데이터 JPA
@Transaction 전파 관련 문의
안녕하세요 김영한 팀장님! 실습한 MemberRepository의 구현체로 SimpleJpaRepository가 생성되며, 내부의 findById 메서드가 @Transactional(readOnly)이 적용되어 있고 기본 설정이 "Propagation.REQUIRED"이기 때문에 부르는 쪽의 Transaction이 전파되는 것으로 이해했습니다. @Transactional@GetMapping("/tx/{id}")public void findMember3(@PathVariable("id") Long id) { Member member1 = memberRepository.findById(id).get(); Member member2 = capsule(id); System.out.println(member1); System.out.println(member2);}@Transactional(propagation = Propagation.REQUIRES_NEW)public Member capsule(Long id) { return memberRepository.findById(id).get();} 하지만 다음과 같이 컨트롤러 메서드 "findMember3"에 @Transactional을 걸고, memberRepository의 findById를 수정할 수 없으므로 capsule 메서드로 감싸서 member를 조회해봤는데요. propagation을 new로 설정했음에도 출력 결과가 같은 인스턴스를 가리키는 것으로 나왔습니다.select query도 하나만 발생했는데, 이 경우에도 같은 영속성 컨텍스트를 공유하게 되는 건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Mybatis, JPA 혼용사용
안녕하세요 강의 잘 듣고 있습니다. 다름이 아니라, 기존 진행하던 프로젝트가 Spring, Mybatis를 사용하고 있어, JPA를 추가하여 혼용 사용하려고 합니다. 하나의 DB를 바라보게 하기 위해서 Datasource를 나눠서 생성하고, trancsaction을 Mybatis용 JPA용으로 나눠서 생성하였고, ChainedTransactionManager를 사용하여 트랜잭션을 묶어줬습니다. 하지만 계속 다음과 같은 에러가 발생하고 있습니다. [o.s.d.r.c.RepositoryConfigurationDelegate] - Multiple Spring Data modules found, entering strict repository configuration mode! 이런 문제가 발생했을때 어떻게 처리해야할까요 ㅜㅜㅜ 도움이 필요합니다. config.xml 파일입니다.. <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:mybatis/jdbc.properties</value> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxWait" value="3000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="50" /> <!-- connection - validation query --> <property name="validationQuery" value="select 1"/> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="7200000" /> </bean> <bean id="jpadataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxWait" value="3000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="50" /> <!-- connection - validation query --> <property name="validationQuery" value="select 1"/> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="7200000" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" /> </bean> <bean id="transactionManager" class="org.springframework.data.transaction.ChainedTransactionManager"> <constructor-arg> <list> <ref bean="mybatisTransactionManager"/> <ref bean="jpaTransactionManager"/> </list> </constructor-arg> </bean> <bean id="mybatisTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="jpaEntityManagerFactory" /> </bean> <bean id="jpaEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="jpadataSource"></property> </bean> <tx:annotation-driven /> <aop:config proxy-target-class="true"> <aop:pointcut id="serviceOperation" expression="execution(* com.xii..*Service.*(..))" /> <aop:advisor id="transactionAdvisor" pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="delete*" rollback-for="Exception"/> </tx:attributes> </tx:advice> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xii" /> </bean> <jpa:repositories base-package="com.xii"/> </beans>
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
em.persist 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 항상 수준 높은 강의에 감사드립니다. 몇 가지 의문점이 생겨서 질문하고자 작성하게 되었습니다. test에서 @Transactional 어노테이션이 롤백을 하신다고 강의에서 말씀하셨는데, 궁금한 점은 em.persist를 한 시점에서는 영속화 한 객체에 대해서 id 값은 영속성 컨텍스트에서 관리되면서 자동으로 부여되는건가요? db 에 isnert 하기 전부터 이미 id 값이 부여되서 관리되고 있는지 궁금합니다. 감사합니다.