묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
InitalizingBean 과 설정정보(init)의 차이 중 외부 라이브러리에서 사용 가능 불가능의 차이
initalizingBean 같은 경우는 스프링에 의존하기 때문에 외부라이브러리에서 사용하지 못한다고 배웠습니다. 구체적으로 왜 사용하지 못하는지 예시를 들어주시면 감사하겠습니다. 왜냐하면 아래와 같은 의문이 생겼기 때문입니다. 외부 라이브러리를 만드는 사람이 그냥 이미 intializingBean 같은 것을 implement 해놓은 상태이면, 저희가 수정하지 못하더라도 쉽게 초기화, 종료 등을 사용할 수 있는 거아닌가 싶어서 질문드립니다. 그런 점이라면, 굳이 @Bean설정정보방식을 써야하는 이유를 모르겠습니다.
-
미해결스프링 핵심 원리 - 기본편
야생형 코스 간다면 로드맵이 어떻게 되나요 ?
기본편을 방금 완강 했는데 활용편 1 - 먼저 활용편 1을 쭉 따라 치며 전체 기술과 백엔드 서비스 개발의 감을 익힙니다. (이해가 좀 부족해도 우선 진행하시길 권장합니다.) JPA 기본편 - JPA 기본 내공을 다집니다. 활용편 1 복습 - 이미 기본편을 학습한 상태이기 때문에 처음부터 다시 쭉 따라하다 보면 JPA의 깊이있는 내용을 이해할 수 있습니다. 활용편 2 - 실전에서 JPA를 개발하고, JPA 성능 최적화를 어떻게 하는지 이해합니다. 스프링 데이터 JPA - 실무에서 필요한 기능 위주로 스프링 데이터 JPA를 학습합니다. Querydsl - 복잡한 쿼리와 동적쿼리 문제를 해결합니다. 순서로 강의를 모두 들은 후에 모든 개발자를 위한 HTTP 웹 기본 지식 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 스프링 DB 1편 - 데이터 접근 핵심 원리 스프링 DB 2편 - 데이터 접근 활용 기술 출시 예정 스프링 핵심 원리 - 고급편 이 순서로 마저 들으면 되나요 ? 강의를 모두 결제했는데 야생편을 따라 가보려고하는데 어떤 순서로 들어야할지 모르겠습니다 저때 당시에는 MVC강의를 비롯해서 나오지 않아서 저렇게 추천하신건가요? 스프링 완전 정복 로드맵 듣고 JPA와 실무 완전 정복 로드맵으로 넘어가면되나요?> 로드맵이 헷갈립니다
-
미해결스프링 핵심 원리 - 기본편
@Quilifier, @Primary를 써야 할 이유?가 궁금합니다
스피링 빈에 등록할 때 굳이 같은 이름으로 등록 해야만 할 때가 있나요 ?? 다른 이름으로 빈을 등록해서 사용하는 것이 더 편하지 않나요 ??.. 같은 이름으로 빈을2개나 등록하고 애노테이션을 써야하는 불편함을 감수하고도 등록해야할 때가 어느 때인지가 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
왜 오류가 발생할까요 ?
강의에 나오는대로 @Component와 @autowired를 다 등록했는데 오류가 발생합니다
-
미해결스프링 핵심 원리 - 기본편
@Bean 등록 질문입니다
Appconfig에 @configuration 과 @Bean 이 있잖아요 그럼 처음에 스프링 컨테이너에는 Appconfig라는 클래스만 등록하고 그 뒤에는 원하는 클래스가 Spring Container에 있으면 그걸 반환하고 없으면 Appconfig에서 찾아서 Spring Container에 등록하고 반환해주는건가요 ? 처음에 실행하면 @Bean 붙은걸 다 Spring Container 등록하는건 아닌거죠 ? 필요할때마다 등록하게 되는 구조? 인건가요 ? 만약 Appconfig에 사용하지 않는 Bean이 있다면 이건 Spring Container에 등록되지 않나요 ?
-
해결됨스프링 핵심 원리 - 기본편
DIP OCP
안녕하세요 이전부터 solid에 관해 자주 강의에서개념이 나와서 좋습니다. 잠시 하나 짚고 넘어가고싶습니다 제가 생각하는게 맞는지 DIP가 위반이되면 구현체에 의존을하니까 자연스럽게 덤으로 OCP까지 위반이 되는건 당연하다고 생각이드는데 제가 생각하는게 맞는건가요 ?
-
해결됨스프링 핵심 원리 - 기본편
ac.close method
아래의 코드 처럼 ApplicationContext로 스프링 컨테이너를 사용해서 스프링 빈의 생명주기를 Test해 보았는데요. init은 출력이 되었지만 close는 출력되지 안되더라구요. 1. Spring을 수동으로 내려 주지 않으면 Spring Bean이 내려갈때 소멸전 콜백은 실행되지 않는건가요? 2. ApplicationContext로 실행 했을때는 13:15:33.326 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@53aac487, started on Mon May 02 13:15:33 KST 2022 이와 같은 로그가 뜨지 않았는데 제가 Test로 해서 Spring Container가 내려 가지 않은건가요(Spring이 종료가 되지 않음)? 난잡한 변수명 이해부탁 드립니다. 감사합니다. package hello.core.lab; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class SpringClose { @org.junit.jupiter.api.Test void ContainerClose() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); // ac.close(); } @Configuration static class TestConfig { @Bean public Test hi() { return new Test(); } } static class Test { @PostConstruct public void init() { System.out.println("init"); } @PreDestroy public void close() { System.out.println("close"); } } }
-
해결됨스프링 핵심 원리 - 기본편
lombok관련질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]여기에 질문 내용을 남겨주세요. 강의에서는 lombok을 이용해서 생성자가 1개인 경우를 기준으로 간단하게 나타내는것을 알려주셨는데 시스템이 복잡하게 될 경우 생성자를 2개이상사용하게 될때도 lombok으로 간단하게 표현을 할 수가 있나요?
-
해결됨스프링 핵심 원리 - 기본편
ComponentScan 질문 있습니다.
강의에서 SpringBootApplication이나 ComponentScan 어노테이션이 붙어 있으면 자동으로 스프링 빈을 스프링 컨테이너에 등록해주고 의존관계 설정을 해준다고 하셨는데 그러면 혹시 RateDiscountPolicy와 FixDiscountPolicy 두 클래스에 모두 @Componet 어노테이션을 붙이면 OrderServiceImpl의 discountPolicy는 어떤 클래스로 주입이 되는건가요?
-
해결됨스프링 핵심 원리 - 기본편
DB 필요 지식 수준
JPA 로드맵으로 넘어가기 전에 어떤 DB의 어느 정도 지식이 필요한가요??? 혹시 추천해주실만한 책이나 강의가 있을까요?
-
미해결스프링 핵심 원리 - 기본편
SOLID에 관해서
안녕하세요. SOLID에 관한 형식에 맞게 Appconfig를 작성해서 의존관계 주입을 해서 해결하는건 정말 멋진 생각입니다. 그러다 문득 드는 생각이 구현체에 new RateDiscountPolicy 를 수정하던지 AppConfig에 new RateDiscountPolicy로 수정하던지 프로그래밍적으로는 실행시점(런타임 상태)에 어떤 정책을 선택할지가 결정되지만 결국 프로그래머가 물리적으로 수정하는 영역은 동일하지 않나라는 생각이 들어서요. 제가 아직 프로젝트를 만들어보지 않아서 이런 생각을 하는건지.. 어떤 이점이 있는지 많이 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
ac.getBean()의 반환값에 대해서
안녕하세요. 스프링 입문강의부터 열심히 보고 있는 수강생 입니다. 강의를 듣다가. 스프링 빈조회 기본 편에서는 assertThat().isInstanceOf(구현객체.class)이렇게 하셔서 getBean()의 반환값이 config의 return값이 들어오는줄 알았습니다. 근데 해당강의에서는 구현객체 클래스가 아닌 MemberRepository.class인 인터페이스로 비교를 하길래, 궁금하여 질문합니다. 코드상에서는 인터페이스든, 구현 클래스든 둘다 상관없이 비교가 가능한 것 같은데, 그 이유가 궁금합니다 !
-
해결됨스프링 핵심 원리 - 기본편
BeanDefinition 관련 질문
1. 우선 강의 내용을 듣고 이해한 바로는 ApplicationContext 구현체들의 각 BeanDefinitionReader들이 자신들이 읽어들일 수 있는 설정 파일에 따라 읽어들인 후 Bean 하나당 하나의 BeanDefinition들을 만들어내는 걸로 이해했습니다. 제가 이해한 것이 맞을까요? 2. 그리고 설정 정보를 읽어 오는 것이 BeanDefinitionReader라면 그 BeanDefinition을 읽어서 Bean을 생성하는 것은 어떤 것인가요? 3. 마지막으로 수업에서 BeanDefinition의 내용을 출력하며 확인해보는 부분이 있었는데 그 BeanDefinition 속성들의 설정 및 수정은 각 Reader들이 읽어들이는 그 파일에서 설정 및 수정이 가능한건가요??
-
미해결스프링 핵심 원리 - 기본편
@Scope 관련 질문이 있습니다.
안녕하세요! 항상 좋은 답변 달아주셔서 감사합니다. 한 가지 궁금한 점이 있어 글을 적게 되었습니다. 1. A라는 클래스에 Request Scope를 사용하게 될 경우, 각 HTTP 요청마다 다른 A 클래스가 생성되서 오는 것을 확인했습니다. 이 때, 각 쓰레드별로 다른 Request Scope 빈을 사용하는 것으로 확인이 되었고, @PreDestory 메서드까지 처리되는 것을 확인했습니다. 정리해보면 요청이 올 때마다 새로운 Request 스코프빈이 만들어져서 스프링 컨텍스트에서 관리된다는 것으로 이해를 할 수 있을 것 같습니다! 그럼 요청 10개가 오면, 동시에 10개의 쓰레드가 활동하면서 동일한 빈을 만들고, 스프링 컨테이너에 저장되어있는 것으로 보입니다! 이 때, 각 쓰레드는 어떻게 자기가 처음에 배정받았던 Request Scope 빈을 스프링 컨테이너에서 받아오는지 궁금합니다. 그리고 각 Request Scope 빈은 동일한 타입의 다른 이름으로 저장이 되는 걸까요? 2. Set Proxy 모드로 Request 객체를 만들었습니다 .이 때, Controller 클래스에 @RequiredArgusConstruct를 이용해서 @Controller 클래스가 스프링 빈으로 등록될 때, RequestScope 빈을 DI 받도록 설정했습니다. 이 때, Http 요청을 동시에 10개를 하게 되면 각 쓰레드마다 다른 프록시 객체를 가지는 것을 확인했습니다. 그런데 이 RequestScope는 이미 Controller 빈이 등록될 때, 정해진 빈인데 어떻게 각 쓰레드가 요청할 때 마다 쓰레드별로 다른 빈을 반환해주게 되는 것인가요? 너무 궁금합니다 항상 좋은 답변 주셔서 감사합니다. 좋은 하루 되세요.
-
해결됨PHP 7+ 프로그래밍: 객체지향
로컬환경에서 개발 후 운영환경으로 배포 시 발생하는 이슈에 대한 문의입니다.
질문에 앞서 해당 질문은 'CentOS 7.* 서버쪽으로 배포를 해보던 중에 질문드립니다.' 질문과 연관됩니다. 안녕하세요. 이번 강의를 통해 만들어본 프로젝트를 운영환경쪽으로 배포해 보고자 합니다.운영환경 서버 S/W 정보는 아래와 같습니다. [서버 S/W 정보] 1. OS: CentOS 7.9 2. Language: PHP 7.3.27 3. Database: MariaDB 10.4.17 4. Web Server: Apache 2.4 (기본적인 APM 구성을 따르고 있습니다.) 현재 아파치 웹 서버의 가상호스트(VirtualHost) 설정을 통해 부여된 도메인으로 접근이 가능하도록 설정해 놓은 상황입니다. 하지만 사이트 접근 시 500 Error 페이지로 전환됨에 따라 PHP error log를 확인해 본 결과 아래와 같은 에러 메시지가 출력되고 있는 상황이었습니다. PHP Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ')' in {DOCUMENT ROOT}/vendor/painkill2r/inflearn-lecture-lib/src/Application.php on line 27 소스코드를 확인해 보니 Arrow Function에서 문제가 발생하는 것 같아서 문법 지원 버전을 확인해보니 PHP 7.4부터 지원되는 문법으로 확인이 되어 운영환경은 PHP 7.3을 사용하고 있기 때문에 에러 페이지로 전환되는 것으로 원인 파악이 되었는데요. 이런 경우 PHP 버전 업데이트를 하지 않고서는 해결이 불가능한 문제인지 아니면 다른 문법으로 변경을 해서라도 접속이 되게 할 수 있는지 첨언 부탁드립니다.감사합니다.
-
미해결스프링 핵심 원리 - 기본편
uuid가 안찍힙니다 ㅠㅠ
안녕하세요 김영한 선생님, 스태프님들!! 너무 쉬운 이야기 일 수도 있는데.. create 이 후 uuid가 안찍혀서 메시지 남깁니다!! [아래와 같이 오류 발생] [2992c07d-caf8-4a90-bb4d-c7a16165a064] request scope bean create: hello.core.common.MyLogger@373901b7 [null][http://localhost:8080/log-demo][controller test] [null][http://localhost:8080/log-demo][service id = testID] [null] request scope bean close: hello.core.common.MyLogger@373901b7 [MyLogger] package hello.core.common; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.UUID; @Component @Scope(value = "request") public class MyLogger { private String uuid; private String requestURL; public void setRequestURL(String requestURL) { this.requestURL = requestURL; } public void log(String message) { System.out.println("[" + uuid + "]" + "[" + requestURL + "]" + "[" + message + "]"); } @PostConstruct public void init() { String uuid = UUID.randomUUID().toString(); System.out.println("[" + uuid + "] request scope bean create: " + this); } @PreDestroy public void close() { System.out.println("[" + uuid + "] request scope bean close: " + this); } } [LogDemoController] package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); logDemoService.logic("testID"); return "OK"; } } [LogDemoService] package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class LogDemoService { private final ObjectProvider<MyLogger> myLoggerProvider; public void logic(String id) { MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } } 어떤게 문제일까요...ㅠ* 추가적으로 이런 오류도 못잡는 상황인데,, 강의 보기 보단 자바문법이 부족한 것 같아요... 파이썬 공부하고, 자바는 훌훌 넘겨보면서 봐서, 부족한데... 어떤 부분을 보면 좀 보강하고, 강의를 보는데 이해할 수 있을까요.. 바쁘실텐데 이런 오류 메시지나 남기고... 면목없습니다 달아주실 답변에 미리 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
request scope bean의 생성을 지연한다는 의미가 무엇일까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 공부 중 궁금한 게 있어서 질문드립니다. 1. ObjectProvider.getObject()를 호출하는 시점까지 request scope bean의 생성을 지연한다고 설명해주셨는데요. provider를 사용하지 않는다면 스프링 어플리케이션을 실행하는 시점에 싱글톤 빈은 생성해서 주입이 가능하지만, request scope bean은 실제 고객 요청이 오지 않아 생성되지 않는 문제가 생기잖아요? 그런데 제가 조금 헷갈린 건 실제 고객 요청이 오기 전이라 request scope bean이 생성되지 않는데 왜 윗 문단처럼 request scope bean의 생성을 지연한다고 말씀하신걸까요?ㅠㅠ 궁금한 점은 고객이 요청하기 전에는 scope빈이 생성되지 않는데 그걸 왜 http 요청이 오기전까지 지연을 시키는 지 입니다... 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
해당 proxymode 를 프로토타입쪽에 적용해보았는데 실패합니다.
안녕하세요 아래와같이 prototype bean 에대해서 proxy mode 를 적용했는데.. 테스트 결과가실패하네요. 보면 prototype 이 제대로 만들어지지 않는거같은데 ComponentScan 으로 만든게아닌 임의의 AnnotationApplicationContext 를통해서 만들어서 그런가요?? @Test void prototypeFInd() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); PrototypeBean bean = ac.getBean(PrototypeBean.class); bean.addCount(); Assertions.assertThat(bean.getCount()).isEqualTo(1); PrototypeBean bean2 = ac.getBean(PrototypeBean.class); bean2.addCount(); Assertions.assertThat(bean2.getCount()).isEqualTo(1); } @Test void singletonCLientUsePrototype() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); Assertions.assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); Assertions.assertThat(count2).isEqualTo(1); } @Scope("singleton") @RequiredArgsConstructor static class ClientBean { private final PrototypeBean prototypeBean; public int logic() { System.out.println("prototypeBean Add = " + prototypeBean); prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } }
-
미해결스프링 핵심 원리 - 기본편
모바일(코틀린) 앱을 제작하려하는데 스프링을 이용해서 rest api 서버를 만드려고 합니다.
모바일(코틀린) 앱을 제작하려하는데 스프링을 이용해서 rest api 서버를 만드려고 합니다. 시간이 촉박해서 최대한 적게 배우고 만들고 싶은데 그렇다면 어느정도까지 스프링을 알아야 할까요?
-
미해결스프링 핵심 원리 - 기본편
다음 강의 커리큘럼에 대해 궁금한게 있습니다
안녕하세요. [ 스프링 핵심원리 기본편 / 자바 ORM 표준 JPA 프로그래밍 기본편 / 스프링 입문 ] 이 세 강의를 들은 후 SpringBoot - JPA(Mysql ) 을 활용한 프로젝트를 진행해보고 있습니다. 그런데 [ SpringBoot - JPA(Mysql ) 의 설정 ( application.properties )] , [ 엔티티와 빈 컨테이너 구현 ] 관련해서 어려운게 있어서 추가적으로 강의를 하나 더 듣고 싶은데 1. 모든 개발자를 위한 HTTP 기본 상식 2. 실전! 스프링 부트와 활용 1 3. 실전! 스프링 부트와 활용 2 4. 실전! 스프링데이터 JPA 이 네 가지 강의 중 지금 제가 듣기 적합한게 있을까요? 물론 다 들을 거긴한대 프로젝트와 연관해서 수업을 듣고 싶어 질문남깁니다. 감사합니다.