묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
changeName(Camera camera)의 부분이 잘 이해되지 않습니다.
public static void changeName(Camera camera){ camera.name ="잘못된 카메라"; } 와같은메소드를 다시 선언하셨는데요.(참조형변수)String (참조변수)c1 = (객체생성) new (생성할 객체)Camera() 이런개념으로 이해를 하였는데요. changeName 메소드를 선언하기전에는 c1, c2 참조변수를 통해서 Camera라는 메소드에 접근을 하여 c1.name, c2.name 이렇게 Camera 인스턴스 변수에 접근이 가능하였습니다. 근데 changeName이라는 변수에는 객체가 생성되지 않았는데 바로 camera.name 이렇게 접근하는것이 잘 이해가 가지 않습다. changeName(Camera camera)이부분에서 Camera(?) camera(참조변수))앞부분의 Camera가 이해가 되지않습니다.Camera메소드를 부르는건지 메소드라면 Camera() 이와같이 호출하는것은 아닌지... 정리가 잘 안됩니다. ㅜㅜ
-
미해결스프링 핵심 원리 - 기본편
Provider를 이용한 request scope 문제 해결 방법
강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다."ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?전자가 맞는지 후자가 맞는지 궁금합니다.*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.https://www.inflearn.com/questions/702458위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다. @Controller @RequiredArgsConstructor public class LogDemoController { private final ObjectProvider<MyLogger> myLoggerProvider; // 추가된 라인 private final ApplicationContext ac; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { // 추가된 라인 MyLogger testMyLogger = ac.getBean(MyLogger.class); // 추가된 라인 System.out.println(testMyLogger); String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); LogDemoService.logic("testID"); return "OK"; } } ApplicationContext를 의존주입 받아서,getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?
-
미해결스프링 핵심 원리 - 기본편
초기화라는 단어
빈 생명주기 콜백 강의를 듣고 질문 남깁니다.public NetworkClient(String url) { this.url = url; }이렇게 생성자에 url을 넘겨주어 값을 지정해주는 것이 초기화 작업이라고 생각하고 강의를 들었는데그러면 문맥상 맞지 않더라고요.가령스프링 빈은 객체 생성, 의존관계 주입이 끝나야 필요한 데이터를 사용할 수 있다.따라서 초기화 작업은 의존관계 주입이 모두 완료되고 호출되어야 한다.이런 부분에서 위 코드와 같은것이 초기화라고 생각한다면 그냥 객체 생성 단계에서 url 값이 지정되었기 때문에 그냥 사용 가능한거 아닌가요?강의에서 말하는 초기화 작업은 정확히 어떤걸 말씀하시는건가요?
-
미해결스프링 핵심 원리 - 기본편
setter 주입을 private으로 선언해도 의존 주입이 되는 이유
수정자 주입과 관련된 질문이 생겨서 글을 쓰게 되었습니다.강의에서 setter를 이용한 의존 주입을 할 때는, setter 함수를 public으로 열어놔야한다고 하셨습니다.만약에 private으로 막아놓으면 어떻게 될지 궁금해서 private으로 막아 놓고 테스트를 돌려보았는데, 여전히 올바르게 의존주입이 되는 결과가 나왔습니다.아무리 생각해봐도 스프링이 private으로 막혀있는 setter 함수를 호출할 수 없을 것 같은데, 어떻게 올바른 의존 주입이 되는 결과가 나온건지 궁금합니다.테스트에 사용한 코드는 아래와 같습니다.// OrderServiceImpl.java package hello.core.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.Member; import hello.core.repository.MemberRepository; import hello.core.repository.MemoryMemberRepository; @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; // ! setter 주입(setter 주입을 사용하려면 final 키워드를 사용할수 없음) @Autowired private void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Autowired private void setDiscountPolicy(DiscountPolicy discountPolicy) { 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 this.memberRepository; } } // AutoAppConfigTest.java package hello.core.scan; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import hello.core.AutoAppConfig; import hello.core.member.MemberService; import hello.core.order.OrderServiceImpl; import hello.core.repository.MemoryMemberRepository; public class AutoAppConfigTest { @Test void basicScan() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); OrderServiceImpl orderServiceImpl = ac.getBean(OrderServiceImpl.class); System.out.println(orderServiceImpl.getMemberRepository()); } } // AutoAppConfig.java package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan(basePackages = "hello.core", basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { }
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 @ComponentScan의 충돌
안녕하세요. @ComponentScan을 공부하다가 궁금한게 생겨서 질문드립니다.@ComponentScan에 의해서 @Configuration 이 붙은 클래스를 스캔했을 때, 이 때 만들어진 스프링 빈도 팩토리 빈의 역할을 하게 되나요?예를 들어,AppConfig 라는 클래스에 @Configuration을 붙이고 내부에 @Bean을 이용해 등록할 빈들을 만들어놓는다.AutoAppConfig 라는 클래스에 @ComponentScan을 붙이고 스프링 컨테이너(ApplicationContext)에 AutoAppConfig.class 로 설정정보를 넘겨준다.위와 같이 했을 때, AutoConfig가 스프링 빈으로 등록되고 @ComponentScan에 의해 스캔이 시작되어, AutoAppConfig가 위치한 패키지부터 하위 패키지까지 스캔되어 스프링 빈이 등록 될 것입니다. (AppConfig는 패키지 내부에 속해있어 스캔된다고 가정하겠습니다.)그럼 이 경우에 exclude 필터로 @Configuration에 해당하는 클래스를 제외하지 않는다면, AppConfig도 스프링 빈으로 등록될텐데,스프링 컨테이너(ApplicationContext)에 직접적으로 AppConfig.class와 같은 설정 정보를 전달하지 않았는데, 이때도 AppConfig가 팩토리 빈이 되어, 위의 1번에서 @Bean으로 만들어놓은 빈들을 스프링 컨테이너가 등록하게 되는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
@RequiredArgsConstructor
@RequiredArgsConstructor 사용할 때, 추가 생성자를 작성하면, @RequiredArgsConstructor에 의해 자동으로 만들어진 생성자에는 @Autowired를 따로 추가해줘야하나요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
맥 인텔리제이가 실행이 되지않습니다
이화면에서 계속 멈춥니다,,지우고 깔고 계속 기다려보는데도 여기서멈춰요...
-
미해결스프링 핵심 원리 - 기본편
ObjectProvider를 Singleton으로 사용하지 않는가?
ObjectProvider 를 이용해 request scope 빈과 관련된 문제를 해결하는 과정에서 궁금한 것이 생겨 질문드립니다.교안에서 LogDemoController 와 LogDemoService 는 각각 필드로 ObjectProvider<MyLogger> 를 갖고 있는데요.실제로 애플리케이션을 동작시켜 출력해보니, LogDemoController 와 LogDemoService가 서로 다른 ObjectProvider 객체를 사용하고 있었습니다.ObjectProvider<MyLogger> 를 싱글톤으로 사용하지 않는 이유가 있을까요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
void 의 사용법
void 를 어떨 때 쓰는 건지 도무지 이해가 되질 않습니다 ㅠㅠㅠ반환하는 값이라는게 뭘까요?
-
해결됨스프링 핵심 원리 - 기본편
싱글톤빈에 항상 새로운 프로토타입빈을 주입하는 방법
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 싱글톤빈에 항상 새로운 프로토타입빈을 주입하는 방법에 대해 생각해보았는데요. 혹시 이 방법은 사용하면 안되는걸까요??logic을 실행하기 전 new PrototypeBean이 생성돼서 항상 1이 반환됩니다.static class ClientBean { private PrototypeBean prototypeBean; public int logic() { this.prototypeBean = new PrototypeBean(); this.prototypeBean.addCount(); return this.prototypeBean.getCount(); } }
-
해결됨스프링 핵심 원리 - 기본편
스프링 컨테이너 라이프사이클 질문입니다.
10: 07초에 보시면스프링 컨테이너는 크게 두가지 라이프사이클 있다라고 말씀하셨는데1. 스프링 빈 등록 단계- 생성자에 @Autowired는 이때 자동적으로 의존관계 주입2. 의존관계 설정 단계 (Autowired가 걸린애를 자동으로 주입)- 수정자에(setter) @Autowired는 이때 자동적으로 의존관계 주입이렇게 이해를 했는데 맞는지 궁금합니다.답변주시면 정말 감사하겠습니다.
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 관련 질문입니다.
다른분 질문에서안녕하세요. g g님, [공식 서포터즈](https://www.inflearn.com/blogs/617) David입니다.자동 빈 등록, 자동 의존관계 주입은 수동 빈 등록, 수동 의존관계 주입을 애노테이션 몇가지를 통해 대체해 주는 게 핵심입니다.이 과정에서 @ComponentScan, @Component, @Autowired 같은 애노테이션이 사용되거나 필요로 합니다.그 중 @Autowired 는 자동 빈 등록에 해당합니다.이런 글이 있었는데 (아래 코드를 예시로 들겠습니다)@Component public class MemberServiceImpl implements MemberService{ //구현 객체를 선택해줘야함 아님null값 private final MemberRepository memberRepository; @Autowired //ac.getBean(MemberRepository.class) 와 비슷(Autowired가 더 기능이 있음) public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; }저는 @ComponentScan 이 @Component 가 붙은 MemberServiceImpl 클래스와 memberRepository를 스프링 빈으로 등록하고 그 다음에 생성자에 @Autowired가 자동으로 MemberServiceImpl 과 의존관계를 가지는 memberRepository(스프링 빈)을 타입으로찾아서 의존 관계를주입한다.getBean(MemberRepository.class) 와 비슷(Autowired가 더 기능이 있음)라고 이해하고 있었는데 @Autowired도 빈을 등록하는 것인가요?제가 예시로 든 코드에서 생각하는 과정이 맞는건가요??
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
강사님, 질문 하나 더 드립니다!
참조 강의 마지막 영상에 기존에 있던 참조를 끊어버리는 코드를 보여주셨는데요. null 할당 후, 다시 객체의 인스턴스 변수에 값을 입력해주려면 어떻게 해야하나요?다시 객체 생성부터 해서 진행하면 되는 것인지? 궁금해서 여쭤봅니다. cam1 = null; cam2 = null; cam1.name = "길동이"; cam2.name = "똥개"; System.out.println(cam1.name); System.out.println(cam2.name);이런식으로 코드를 작성해보니, NullPointerException이 에러가 발생해서, 어떻게 해야할지 궁금해 여쭤봅니다!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
public, class, static, void 언제 어떻게 조합해서 쓰는건지
현재 챕터07 접근제어자(후반전) 까지 강의를 들었고 퀴즈도 다 풀어냈습니다.그런데 public, class, static, void 등을 조합해서 코드 앞부분에 쓰는데 언제 어떻게 왜 조합해서 저것들을 붙이는 건지 정확한 개념을 잘 모르겠습니다. 이럴때는 강의를 다시 돌려보며 개념을 알고 가야하나요? 아니면 그냥 강의 쭉 들으면서 서서히 익히면 되는건가요유튜브 영상으로 9시간 다 보고 인프런 결제했는데 갑자기 진행속도가 너무 빨라진 듯한 느낌이 듭니다. 유튜브 기초 9시간때는 이해하면서 잘 들었는데 지금은 코드 따라적기 바쁘네요ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
싱글톤 적용 관련 질문
옵션처리 부분의 강의에서 모든 테스트 케이스를 돌려보았을 때, 선생님과 다른 오류가 나오고 해결방법을 잘 모르겠어서 질문 남깁니다. 이러한 테스트 문을 작동 시켰을 때이러한 오류가 뜹니다.우선은테스트를 실행시켰을 때의 로그를 통해 보시는 바와 같이 스프링 빈에 잘 올라가있음을 알 수 있습니다.memberServiceImpl와OrderServiceImpl은 컴포넌트 스캔과 Autowired 또한 잘 적용되어 있음을 알 수 있습니다. 또한 AppConfig에서 지정한 코드를 보면위와 같이 작성되어 있고, 의존관계에 따라 구현 함수의 내용을 보면MemberRepository의 구현체 MemoryMemberRepository DiscountPolicy의 구현체 RateDiscountPolicy 또한 컴포넌트 스캔이 잘 작성되어 있음을 알 수 있습니다. 따라서 스프링 부트에 올라가있고, 싱글톤이 적용되어야하는데, 왜 객체가 다르게 반환되는 지 궁금합니다.
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
유틸리티 클래스
유틸리티 클래스 예시 자바 코드가 아래처럼 되어 있는데요. 추상클래스이다 보니 상속도 안되고 생성자가 private이다보니 인스턴스도 만들수 없는데, isDirectoryPath 메소드를 사용할 수 있는 방법이 있을까요?isDiretoryPath 메소드가 static 메소드가 되어야하는게 아닐까 싶어서요!package com.lannstark.lec11; public abstract class StringUtils { private StringUtils() {} public boolean isDirectoryPath(String path) { return path.endsWith("/"); } }
-
미해결Java TPC (생각하고, 표현하고, 코딩하고)
강사님 private 관련해서 궁금한점 있습니다!
클래스에 생성자 메서드를 여러개 생성할 수 있잖아요(overloading)을 통해서 만약에 하나의 생성자 메서드에는 private 가걸려있고다른 하나는 안걸려 있으면 다른하나를 통해서 static이 안걸린 메서드에 접근이 가능할까요???
-
미해결스프링 핵심 원리 - 기본편
싱글톤패턴 사용사례
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요!스프링 컨테이너가 싱글톤 기반이라고 하셨고, 단점도 많은데 실무에서는 어떠한 경우에 싱글톤 패턴이 적용되는지 궁금합니다!
-
미해결[코드팩토리] [입문] Dart 언어 4시간만에 완전정복
CachedNetworkImage 로 인한 memory leak 문제..
안녕하세요 코드팩토리님!선생님의 dart강의를 듣고flutter로 혼자 사이드 프로젝트를 진행하고 있는 중에 질문이 있어 이렇게 글을 남깁니다.다만 무료 dart 강의만 듣고 flutter 질문을 드리는 것이 죄송하네요..ㅜㅜ 우여곡절끝에 제가 생각하던 앱을 비슷하게나마 완성을 했는데요.아기 사진을 가족들과 공유할수 있는 사진앨범 앱을 만들었습니다. 기본적으로 firebase를 연동하여 데이터를 받아와서, gridview 이미지들을 보여주고있습니다.스크롤 시, 추가적으로 데이터들을 받아와서 이미지들을 보여주게 되는데요여기서 이미지들이 다 불러와지지 않은 상태에서빠르게 스크롤을 하면 앱이 꺼져버리는 문제가 생겼습니다. 구글링 및 디버깅을 해보니 memory leak으로 앱이 꺼지는 것 같은데Image.network를 CachedNetworkImage로 바꿔도 보고setState를 남발해서 그런가 싶어서 코드팩토리님 유튜브의 'provider로 sns 스타일 infinite scroll 구현하기!' 를 참고하여provider로 상태관리를 하도록 바꿔도 보고const를 선언할수 있는 부분은 선언하고최대한 build를 호출 안하게끔, build에 복잡한 로직이 안들어가게끔 수정하였는데요.그럼에도 불구하고 이 문제는 고쳐지지가 않더라구요 ㅜㅜ 불러오는 이미지 url을 CachedNetworkImage로 보여주지 않고그냥 Text로 보여주면 해당 문제가 안나오는걸로 봐선뭔가 이미지 관련해서 문제가 있는것 같긴한데어떻게 해결해야하는지 감이 잡히지도 않고, 답답한 심정입니다 ㅜㅜ괜찮으시다면 방법을 제시해주실수 있을까 싶어 질문남깁니다.감사합니다!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
강사님, 아무래도 제 개념의 혼동 때문에 그러는 것 같은데요..!
if (factoryCam instanceof FactoryCam) { (FactoryCam)factoryCam; }이 구문에 혼동이 생겨서 질문드립니다! if 안에 조건문의 내용이 " factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 " 이라고 설명을 해주셨는데요 (8분 27초경) 만약에 factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 형변환이 필요 없는거 아닌가요? 또 헷갈린거 하나 더 문의드립니다. 다형성에 대한 예시를 위해 작성해주셨던 코드 내용인데요.Camera factorycCam = new FactoryCam();만약에 위 코드로 작성한게 부모클래스인 " Camera" 로 객체를 생성한 거라면, factoryCam 의 참조 클래스는 Camera 인 것 같은데요. (그러니까 FatoryCam 의 인스턴스 메서드를 불러왔을 때 에러가 나는 것으로 보이구요.) 근데 이 설명과 "factoryCam instanceof FactoryCam" 이 구문이 " factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 " 이라고 설명을 해주시니 상충되는 내용이 아닌가 싶어 혼동이 옵니다. 내용 요약factoryCam 은 부모 클래스로 만들어진 객체라서 FactoryCam 의 인스턴스 메서드를 사용할 수가 없다고 설명을 해주셨습니다!헌데 if 조건문은 "factoryCam 이 FactoryCam 클래스에 포함되어 있다면 " 이라고 설명해주신 부분이 상충되지 않나 하여 헷갈립니다.그리고 2번에 내용처럼 만약 factoryCam 이 FactoryCam 클래스에 이미 포함되어 있다면, 굳이 형변환을 하지 않고도 detectFire 메서드를 호출할 수 있어야 하지 않는지..?제가 개념을 잘못 이해하고 있을 것 같은데, 혹시 설명을 좀 부탁드려도 될까요?이 부분에 자꾸 혼동이 생겨서 다음으로 넘어가기가 어렵네요 🤣ps. 이전에 강사님 파이썬 강의로 난생 처음 태어나 클래스란 개념을 이해했던 수강생으로써, 이번 자바편도 개인적으로 큰 도움되고 있습니다. 감사합니다!