묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
여러 빈들이 @PostConstruct 사용시 질문입니다.
여러 빈들이 초기화할때, 서로 각각 초기화할때 생성된 데이터를 이용하는 경우 null에러같은 것이 일어날 수 도 있지 않나요?? 스프링은 이런걸 초기화할때 알아서 방지해줄지 궁금합니다 (아니면 클래스에 @order, @primary 등과 같은 기능을 붙여야하는지 싶습니다)
-
미해결스프링 핵심 원리 - 기본편
policyMap과 polices에 아무것도 안 나옴
System.out.println("policyMap = " + policyMap);System.out.println("policies = " + policies);했을 때, 영상과 다르게 아무것도 나오지 않습니다.분명 영상 코드와 똑같이 쳤는데, 무엇을 확인하면 좋을지 알 수 있을까요?아래는 제가 작성한 AllBeanTest class 코드 입니다ㅡㅡㅡㅡㅡㅡpackage hello.core.autowored;import hello.core.AutoAppConfig;import hello.core.discount.DiscountPolicy;import hello.core.member.Grade;import hello.core.member.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.List;import java.util.Map;public class AllBeanTest { @Test void findAllBean() { // 이렇게 클래스를 두개 모두 등록하면, 두개 모두 땡겨와서 등록시켜줌 ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); Assertions.assertThat(discountService).isInstanceOf(DiscountService.class); Assertions.assertThat(discountPrice).isEqualTo(1000); int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy"); Assertions.assertThat(rateDiscountPrice).isEqualTo(2000); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } }}
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
entity를 async 메소드 파라미터로 넘길 경우에 대한 질문입니다.
안녕하세요 강사님 항상 좋은강의 잘 보고있습니다. DB관련 강의를 보고서 코드를 작업하던 중 이해가 안가는 부분이 있어 질문드립니다. 정확한 질문포인트 강의를 찾지 못해 트랜잭션 관련 질문이라 이곳에 남깁니다.. Parent entity가 onetomany로 child entity list를 갖고있는 상황입니다. Lazy Loading으로 사용중입니다. @transactional이 붙은 A 메서드가 parent entity를 find해왔습니다. 아직 child를 사용하지 않았습니다. 조회쿼리도 나가지 않았습니다. A메서드는 @Async로 별도 thread에서 동작하는 B메서드에 parentEntity를 parameter로 넘깁니다. (B메서드에는 transactional코드가 없습니다) B메서드에서는 child를 사용하여 동작하는 코드가 들어있습니다. 의문점은 이게 fail to lazily initialize... no session이 나와야하지 않나 싶은데 정상작동한다는 점입니다. 강의를 통해 제가 이해한것은.. 1. transaction은 db connection과 함께 움직입니다. 2. transaction은 thread local로 관리되어 thread마다 할당됩니다. 고로 db connection은 thread에 할당됩니다. 3. entity manager는 일부러 엮지 않는 이상 thread끼리 공유하지 않는다. 한 thread에 하나씩 붙는다. 4. open session in view를 켜지 않는 한 entity manager는 transaction과 생명주기를 같이한다 async에서 할당된 thread들은 transaction이 없기 때문에 entity manager를 갖고 있지 않은 상태이고, parameter를 통해 받은 parent entity는 사실상 dto와 같은 취급을 받아야 하는게 아닌가 하는 생각입니다. 고로 parent entity에서 child를 조회하려하면 entity manager와 db connection이 없기 때문에 관련 에러가 터질것이라 생각했습니다. 하지만 async 메소드에서 child를 사용하려하면 정상적으로 쿼리가 나가고 실행에 아무런 장애가 없습니다. 이에 궁금증이 생겼습니다. 1. entityManager 생성이 transaction과 같이하는게 아니라, Thread가 생성될때마다 각 Thread는 entityManager를 자동으로 부여받는것인가? 2. 1번이 맞다면.. entity가 갖고있는 Lazy loading인 상태의 proxy항목이 Async thread에 있는 entitymanager를 사용해서 조회를한것인가? parameter로 넘긴 entity가 내부적으로 db connection을 물고있는건가 싶은 의문도 생겼습니다. 테스트코드는.. https://github.com/zzangisdaeho/transaction-test.git TestAsync.testAsync() 를 한번만 봐주실 수 있다면 감사하겠습니다. (테스트코드 에러는.. 테스트 종료시에 entitymanager를 release하면서 나는 NPE인데.. 아직 원인을 파악하지 못하였습니다. 궁금한점은 async쪽입니다..) 감사합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
레거시 코드에서 DriverManager를 사용하는데요...
안녕하세요~ 로드맵을 따라 듣다가 아직 이 강의를 볼 타임이 아닌데 ㅠㅠ 오늘 인수인계 받은 배치 애플리케이션의 소스코드를 봤는데 도무지 이해가 가지 않는 코드로 작성되어 있어 혹시나 싶은 마음에 강의를 찾아보니 있네요 ㅎㅎ 레거시 코드의 배치 애플리케이션에서 DriverManager, PreparedStatement, ResultSet을 사용해서 DB 처리를 하고 있습니다. 그런데... 서버가 기동될 때 최초 1회만 커넥션을 생성해서 close하지 않고 계속 사용합니다. 이걸로 서버 재기동전까지 계속 쿼리를 동작시킵니다. (PreparedStatement와 ResultSet는 사용하면 close 합니다.) 강의를 보니 커넥션을 맺는 비용이 비싸기 때문에 이런 코드가 만들어진 것으로 추측해보는데요 close를 하지않는 단일 커넥션을 사용하는 것은 어떤 장단점을 가지는지 궁금합니다. close를 하지 않는 단일 커넥션은 커넥션풀에 커넥션이 1개만 있는 경우와 같을까요? 배치 애플리케이션이니까 단일 커넥션으로 처리했을까요? * 배치의 정보를 드리자면.. 대략 수는 50개, 동시에 처리되는 것들이 보통 5개, 실행시간은 보통 5분 내외, 최대 3시간입니다. 이상한 코드가 맞겠죠?? 자야하는데 고민이 깊어지네요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
질문남깁니다.
homeLoginV3 에서 질문드립니다. //세션에 회원 데이터가 없으면 home로 보내주는 로직 if (loginMember == null) { return "home";} 에 대해서 의문점이 있어서 질문을 남기게 되었습니다.상단에서 이미 세션 관리자에 저장된 회원 정보를 조회했고, 세션이 존재하지 않는다면 home 으로 이동하고, 그렇지 않은경우(세션 관리자에 회원 loginMember가 있는경우)에서는 회원 데이터가 없을 수가 있나요??이미 기존에 회원이 로그인을 했었기 때문에, 세션에는 당연히 회원 데이터가 있다고 생각이 듭니다..세션에 회원 데이터가 없는 경우가 있는 상황이 있는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
isinstanceof 관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의내용 2분33초에서 findBeanByName() 메서드의 assertThat ~ isInstanceof 문장이 이해가 잘 안됩니다. 저는 AppConfig.class 에서 memberService가 MemberServiceImpl을 포함하므로 memberService와 MemberServiceImpl.class의 위치가 서로 반대라고 생각했는데 예상과 다르네요.
-
미해결스프링 핵심 원리 - 기본편
@Configuration을 사용한 싱글톤
안녕하세요! 김영한님과 서포터즈님들 항상 좋은 강의와 질문답변 감사합니다! :) 강의를 듣고 관련된 질문들을 찾아보면서 궁금한게 있는데요, @Configuration을 사용하면 스프링 컨테이너에서 해당 인스턴스가 존재하는지를 확인하고 있으면 인스턴스 반환, 없으면 생성하는 기능으로 싱글톤이 보장된다는것을 알겠습니다. @Congfiguration 없이는 싱글톤 보장이 안된다고하셨는데 https://www.inflearn.com/questions/288987 의 질문답변을 보면 @Congfiguration의 유무에 관계 없이 싱글톤으로 유지된다는 답변을 봐서 뭐가 맞는건지 궁금해서 질문드립니다. 그리고 @Configuration 없이 생성된 memberRepository 세개의 인스턴스들에 대해서 @Bean이 붙은 memberRepository객체는 스프링이 관리해주는 스프링 빈이고 나머지 MemberServiceImpl, OrderServiceImpl 의 memberRepository는 스프링 빈이 아닌거죠? 감사합니다~
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
에러 java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
[질문 내용]강의 내용 중 "JPA와 DB 설정 동작 확인"의 20분 경부터 나오는 ./gradlew clean build 를 실행하다가 -> 아래 화면 캡처와 같이 java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132 에러가 발생했습니다. Test 파일 2개 모두 동일한 에러 메시지입니다. 커뮤니티의 답변 및 구글 검색을 통해 문제를 해결하려 했으나, 해결하지 못해 문의드립니다. (커뮤니티 답변에서 저와 동일한 에러를 만난 경우는 진도가 더 나간 상태에서 발생한 에러였으며, 구글링에서는 대부분 AWS배포와 관련되어 이 에러가 발생하고 그것을 해결한 케이스였습니다.) Test 파일 2개는 아래와 같이 작성되었습니다. 커뮤니티 답변을 모두 확인한 것은 아니었기에, 혹시 저와 동일한 상황에서 동일한 에러가 해결된 경우가 있다면 링크를 부탁드립니다. (혹, 답변을 위해 더 공유해야 할 내용이 있다면 알려주세요)
-
미해결스프링 핵심 원리 - 기본편
프록시 관련 질문
10:55초 에서 MyLogger가 요청마다 각각 따로 생성 된다고 하셨는데 프록시 객체가 HTTP요청 마다 각각 따로 생성된다는 말씀이신가요? 그리고 실제 MyLogger는 실제 메서드가 사용 될 때 호출된다고 하셨는데 이게 MyLogger의 실제 기능(메서드)를 사용할 때 프록시객체와의 상속관계를 끊어버리는건가요? ( 가짜를 쓸 때도 진짜 MyLogger를 가리키고 있으나 그 땐 상속관계에 있는 프록시 객체로 오버라이딩 )
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 질문드려요~
질문을 찾아봤는데 없는것 같아서 질문 드립니다! 혹시 특정 Service만 OSIV를 끄고 커넥션을 유지하는 방법은 없을까요? 이전 강의에서 hibernate.default_batch_fetch_size는 전체 사이즈를 정하고 @BatchSize처럼 개별적으로 사이즈를 정하듯이 OSIV는 개별적으로 on/off는 불가능한지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
UpdateItemDTO
23분쯤에 UpdateItemDTO를 service계층에서 만들고 controller로부터 String name, int price... 이렇게 따로 받지말고 dto로 한번에 받는게 좋은 설계다 라고 말씀 해주셨는데 그러면 Controller에서 service 계층의 UpdateItemDTO를 알고 있어야 DTO를 service계층으로 보내줄텐데 이렇게 되면 UpdateItemDTO를 service계층에 만드는것은 문제가 따로 없는건가요? 서로 다른 계층에 대해서는 서로 몰라야 한다고 생각했는데 헷갈려서 질문 드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Unable to start the daemon process. 에러
Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/7.5/userguide/gradle_daemon.html Process command line: C:\Program Files\Java\jdk-11.0.16\bin\java.exe --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=KR -Duser.language=ko -Duser.variant -cp C:\Users\***(이름부분)\.gradle\wrapper\dists\gradle-7.5-bin\f1w0cc9nuo0eivz97x2xlu9sv\gradle-7.5\lib\gradle-launcher-7.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.5 Please read the following process output to find out more: ----------------------- Error: Could not find or load main class org.gradle.launcher.daemon.bootstrap.GradleDaemon Caused by: java.lang.ClassNotFoundException: org.gradle.launcher.daemon.bootstrap.GradleDaemon 혹시 저처럼 이런 오류 뜨는분 계실 까봐 글남깁니다. 제생각인데 이거 원인이 윈도우 사용자이름 때문인거 같습니다 . 사용자 이름이 한글이면 뭔가 안맞아서 이런 오류가 뜨는거같아요. 똑같은 컴에서 사용자 추가해서 실습하니까 아무문제 없이 잘되네요. 제 경험담인데 비슷한 일로 마인크래프트가 있습니다 마인크래프트도 사용자 이름이 한글로 되어있으면 실행이 안되더라고요(Exit code : 0 라고뜨면서 꺼집니다) 그래서 그때 사용자(윈도우 운영체제 계정?)를 새로 만들어서 하니까 잘되더라고요 바보같이 마이크로소프트 계정이름이 한글로 되어있는바람에 컴터 사용자가 한글로 됐고 그래서 이런일이...있는거같습니다.포멧하지 않는이상 해결안되는거같고 다른방법으로 사용장 계정(?)을 새로 만들어서 해결했습니다 저는요.. 좀더 자세히 추측해보자면 C:\Users\hong 이거랑 C:\Users\홍길동 이차이 인거같습니다 이폴더가 이름으로 되는거같은데 한글이면 문제가 되는거같습니다. 혹시 비슷한 문제 있으신분들은 참고하시면 될듯 합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 질문입니다
서블릿은 HTTP 요청과 응답을 편리하게 하기 위해 사용하는 것이다. 라고 생각해도 될까요?
-
미해결스프링 핵심 원리 - 기본편
빈 생명주기가 쓰이는 곳
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 영한 님이 그동안 설명해주신 것으로는 가급적이면 생성자 주입을 선택하라고 하셨는데, 빈 생명주기 콜백은 생성자 주입을 제외한 setter 주입 등에서 활용되는데 알아야 하나? (물론 중요하겠지만) 싶은 생각이 들어 질문드려 봅니다..! 예제에서의 예시처럼 데이터베이스 커넥션 풀 같은 과정은 생성자 주입으로는 할 수 없어서인 것일까요?
-
미해결스프링부트 시큐리티 & JWT 강의
질문있습니다.
안녕하세요. 강의 너무 잘 듣고 있습니다. 다름이 아니라 Authentication authentication = authenticationManager.authenticate(authenticationToken); 를 실행하는 과정에서 WARN 24292 --- [nio-8080-exec-1] o.s.s.c.bcrypt.BCryptPasswordEncoder : Empty encoded password 위와 같은 경고창이 뜨면서 실행되지 않습니다. 강의를 3번 돌려보았고, 소스상에는 문제가 없는데 왜이러는지 모르겠습니다. 참고로 회원가입을할때 Password를 똑같이 "1234"로 입력하여도 DB에 Encoding 된 비밀번호는 동일하지 않습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
강의 중 궁금한 사항
안녕하세요 영한님! 28:30 경에 예외는 다 예외로 할거야라고 하신부분이 잘 이해가 가지않습니다. 제가 이해한 바로는 잔고부족을 체크 예외를 쓰지 않고 리턴해서 다음 프로세스를 태운다로 이해했는데 맞을까요?DB 1편에서 체크 예외의 단점들에 대해 들었었는데, 그 부분때문에 체크 예외대신 리턴으로 쓴다고 하신건지 궁금합니다~
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
디스패처 서블릿은 서블릿컨테이너인가요??
설명하는 역할들이 어디서 일어나는지 궁금합니다. 서블릿 컨테이너 내에 디스패처서블릿이 있는건가요?스프링 컨테이너 내에 디스패처서블릿이 있는건가요? 기존 서블릿 컨테이너를 설명하실때,서블릿 객체의 역할에 추가 기능이 붙어 디스패처 서블릿이 되는건지,아니면 별개인지 헷갈립니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
모델 질문
41번 부분에서 모델은 매번 컨트롤러 마다 새로만들어지는 인스턴스 형식인거같은데 이러면 각 컨트롤러마다 모델이 여러개 생길수있는거 아닌지 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티 작성시, protected 만드는 구분
엔티티 생성할때, @NoArgsConstructor(access = AccessLevel.PROTECTED) 엔티티 생성할 때, 해당 어노테이션을 언제 사용하고 언제 사용하지 않는지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
프론트와 백엔드가 있는경우 WAS역할
타임리프와 스프링으로 개인프로젝트할땐 WAS에서 동적 HTML생성(타임리프)해 웹에 보여지는 것으로 이해했습니다. 1.(리액트 뷰 등...)프론트분들과 협력할때 , 타임리프는 사용안할텐데, 개인프로젝트에서 수행했던 HTML동적생성은 백엔드서버에선 이뤄지지 않고 프론트서버에서 이뤄지는 것인가요?? 2.프론트와 협력할때, 백엔드가 정적 리소스도 고민해야하는 경우가 있을까요??정적인 것이라면 고정적인 html코드일텐데 프론트쪽에서 고민하는게 낫지 않나 싶습니다.(프론트 서버에도 웹서버와 WAS같은 것이 있는거겠죠??)