묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
인텔리제이 커뮤니티에서 콘솔 색상 입히는 방법
커뮤니티 버전에서도 콘솔에 색상 입히는 방법입니다. 며칠 전에 어떤 수강생 분이 질문하셔서 얼티메이트vs커뮤니티 비교해서 답변 달았었는데 삭제 됐네요 ^^; 공부하다 알게되서 공유합니다 ~ ------------------------------------ application.properties spring.output.ansi.enabled=always ------------------------------------
-
해결됨스프링 핵심 원리 - 기본편
DI 활용한 시뮬레이션 관해 질문드립니다.
안녕하세요. 좋은 강의 열심히 듣고 있는 수강생입니다. 현직에서 절차지향 베이스 프로그램에 개발을 맡고있으며, 스프링 및 객체지향에도 관심이 있어 수강 중입니다. 강의를 수강하며 나름대로 C → Java Spring Framwork 로의 번역(?) 작업을 하는 걸로 독학하고 있습니다. 강의와 약간 동떨어져 보여질 수 있지만 질문 드립니다. Business 1) 잔액 충전 → 구매 → 잔액 조회 위와 같은 비즈니스가 있을 때, 각각의 서비스에서는 각각 그 DB값을 바라보게 설계되어 있습니다. 충전에서는 잔액을 Update 하고 종료. 구매에서는 잔액을 감액, Update 하고 종료. 최종 남은 잔액 조회. Business 2) (잔액에 100원 더 충전했다 치고) → 구매하면 → 잔액 조회 시뮬레이션 위와 같은 가상의 확인 작업이 필요하다고 할 때, 실제 DB값을 Update 할 수 없기에 휘발성 메모리 값으로 처리가 필요해보입니다. 배운 내용을 종합적으로 대입해봤을 때, Business 2 에서의 시뮬레이션에서는 ① 운영DB의 잔액을 메모리로 카피 한다음 ② 카피한 객체를 ( MemoryRepository 같은 느낌으로 ) DI 해주는 것으로 기존 서비스 로직에 수정없이 진행할 수 있을 것 같은데요. 1. 위와 같은 해결방법이 흔히 사용하는 방법인지? 2. 카피해야 하는 운영DB의 잔액 테이블이 다수일 경우, ( 충전의 경우 100개의 테이블이 변경 되며, 최종 잔액 조회시 모두의 값이 필요하다.) <Business 2>를 위해 100개의 테이블 값을 휘발성 메모리로 띄워 주입하는 방법뿐일지? 질문 드립니다. 장황하고 강의와 동떨어져 보여 죄송합니다. 좋은 강의 진심으로 깊은 감사드립니다.
-
미해결스프링 핵심 원리 - 기본편
좋은강의 감사드립니다 . 질문이 있습니다 !
현재는 스프링 부트를 사용하지 않아서 AutoAppConfig를 따로 만들고 @ComponentScan @Configuration를 해준건가요 ? 실무로 들어간다면 스프링 부트를 활용하고 AutoAppConfig는 따로 만들어주지 않고 싱글톤유지는 다른방법으로 해결하고 개발 하게 되나요 ?? 항상 좋은강의 감사드립니다 !
-
미해결스프링 핵심 원리 - 기본편
@autowired 필드명, @qualifier 강의에서 OCP를 위반하는 것이 아닌지에 대해 질문이 있습니다
안녕하세요. 좋은 강의 감사드립니다. 다름이 아니라 @Autowired 필드명, @Qualifier, @Primary 강의에서 조회 된 빈이 2개 이상일 때 @Autowired 필드명 이나 @Qualifier, @Primary 등을 사용하여 해결한다고 배웠습니다. 궁금한 점을 먼저 써보면, 위와 같은 해결 방법을 사용 시에 기존 구현체 클래스에 직접적인 수정이 일어나는 것에 대해서 1.OCP를 위반하게 되는 것일까요? 2.만약 위반이 아니라면 왜 위반이 아닌지 궁금합니다. 3.위반이라면 또 다른 해결책이 있는지 궁금합니다. 자세한 상황은 이렇습니다. 강의에서 OrderServiceImpl.class 에서 생성자 주입을 통해 discountPolicy에 두 개의 빈이 찾아져버리므로, 특정 빈을 찾을 수 있도록 인자의 파라미터 이름을 수정해야했습니다. (@Autowired 필드명 방식) @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } <OrderServiceImpl.class 수정 전> @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } <OrderServiceImpl.class 수정 후> 이것이 개방-폐쇠 원칙을 못지킨 것이 아닌가 하는 의문이 들었습니다. 이전에 같은 문제로 Component Scan 을 사용하지 않고 AppConfig.class에서 직접 수동으로 Bean을 생성하여 등록하는 과정에선 겹치는 빈이 있을 경우 AppConfig.class 내에서 해결 할 수 있었습니다.. 코드로 보자면 다음과 같습니다. (애초에 수동으로 빈을 등록하므로 애초에 두 개의 빈이 올라오지 않도록 빈을 안올려도 되며, 만약 두 개의 빈을 둘 다 올린다해도 아래와 같이 작성하면 의존성 주입 시 두 개의 빈 찾아져 오류가 생기는 일은 없을 것 같다고 생각합니다.) @Bean public DiscountPolicy discountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } 하지만 Component Scan, Component, Autowired를 사용할 땐 AppConfig.class에서 하던 것처럼 할 수는 없고, 직접 Impl 클래스에 변경을 해야하거나 @Quilifier 혹은 @Primary 어노테이션을 붙이기 위해 구현체의 클래스를 찾아가서 수정해줘야하는 것 같습니다. 바로 이 부분에 대해서, OCP를 위반하는 것인지 궁금합니다. 또한 만약 위반이 아니라면 왜 위반이 아닌지, 위반이라면 또 다른 해결책이 있는지 궁금합니다. 항상 좋은 강의, 명쾌한 강의, 속이 시원한 강의 해주셔서 너무나 감사드립니다. 강의 들으면서 속이 정말 뻥 뚫리는 느낌을 많이 받았습니다.
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan 시 Singleton방식
안녕하세요! 강사님 다름이아니라 라이브코딩 도중 의문점이 생겨서 질문 남겨봅니다! 번거로우실텐데 죄송합니다 질문1. 강의에서 본것처럼 AppConfig.class 에서 @Configuration 이 붙지않으면 스프링 컨테이너가 스프링빈들을 전부 싱글톤 방식이 아닌 계속 인스턴스생성을하여 메모리 낭비가 되는 모습까지는 이해했습니다. 근데, AutoAppConfig.class에서 @ComponentScan 시에 @Configuration 애노테이션을 안붙여도 모든 Component들이 스캔 후 알아서 싱글톤방식으로 빈이 생성되는것을 test코드를 통해 확인했습니다! AutoAppConfig에서 컴포넌트 스캔 자체가 AppConfig같은 설정정보 없이도 @Component만을 탐색해서 빈을 등록하는거까지는 이해하고는 있는데 왜 @Configuration 애노테이션을 안붙여도 자동적으로 싱글톤방식으로 빈이 생성되는지 궁금합니다! 제가 뭘 놓치고 있는걸까요???
-
해결됨PHP 7+ 프로그래밍: 객체지향
PHP 리플렉션에 대한 질문입니다.
안녕하세요. PHP 리플렉션 강의를 듣고 난 후 궁금증이 생겨 질문드립니다. 리플렉션이라는 것은 특정 클래스에 대한 메터 정보를 알기위한 용도로만 사용하는 것(?)으로 이해를 했는데요. 실제로 '실무에서 많이 쓰일 것 같다.' 라기보다는 라이브리러리 또는 PHP 프레임워크들에 대한 분석을 진행할 때 정도로만 사용할 것 같은 생각이 들더라구요. 실무에서 중요도가 높은 기능인지 궁금합니다. 글 읽어주셔서 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
질문있습니다!
안녕하세요. 강의 듣다 궁금한 것이 있어 질문 드립니다. 입문자라 기본적인 것도 많이 모릅니다. ㅠ public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회시 자식이 둘 이상 있으면, 중복 오류가 발생한다") void findBeanByParentTypeDuplicate() { assertThrows(NoUniqueBeanDefinitionException.class, ()->ac.getBean(DiscountPolicy.class)); } ...... @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } } } 이 테스트 클래스에서는 테스트용(?) 클래스?? 만들때 @Configuration 을 사용했는데 아래 테스트 클래스에서도 테스트용 클래스를 만드는데 @Configuration을 사용하지 않아서 궁금합니다. class StatefulServiceTest { @Test void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); //ThreadA: A사용자 10000원 주문 int userAprice = statefulService1.order("userA", 10000); //ThreadB: B사용자 20000원 주문 int userBprice = statefulService2.order("userB", 20000); //ThreadA: 사용자A 주문 금액 조회 // int price = statefulService1.getPrice(); System.out.println("price = " + userAprice); // Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000); } static class TestConfig { @Bean public StatefulService statefulService() { return new StatefulService(); } } } 좋은강의 감사합니다. 열심히 배우고 있습니다!!
-
미해결자바스크립트 비기너: 튼튼한 기본 만들기
console.log((5*10 % (2*2.3*10))/10); 에서 2를 왜 곱하나요?
[3:28] 강의에서 console.log((5*10 % (2*2.3*10))/10); 와 console.log((5*10 % (2.3*10))/10); 의 결과가 모두 0.4가 나옵니다. 제 생각엔 2를 곱하지 않아야 할 것 같은데요, 어차피 나머지를 구하는 것이니 2를 곱해도 결과가 같을 것이기 때문에 곱하신 건가요?
-
해결됨스프링 핵심 원리 - 기본편
인터페이스와 구현체의 패키지 관련 질문입니다
안녕하세요. 영한님. 복슴겸 해서 강의를 다시보다 궁금한 점이 있어 질문드립니다. 강의에서 member 패키지에 MemoryRepository 인터페이스를 작성하셨고 해당 인터페이스의 구현체는 다른 패키지에 작성하는게 좋다고 말씀하셨는데요, 실제 개발하실 때 어떠한 패키지명으로 구조화 하시는지 알 수 있을까요? hello.core.member에 인터페이스와 구현체 코드가 다 들어가 있는데 어떻게 패키지를 세분화 하시는지 궁금하네요! 사실 별거 아닌 간단한 질문일 수 있는데, MVC 강좌 진행 사항을 여쭙기 위한 build-up입니다.ㅎㅎㅎ MVC 강의 기대됩니다 😎
-
미해결스프링 핵심 원리 - 기본편
안녕하세요! 강의 중 필드 인잭션이 테스트가 어려운 경우가 헷갈려서 질문 남깁니다!!
안녕하세요 갓영한님 항상 강의 재밌고 유익하게 잘 보고 있습니다! 강의를 보고 "필드 인잭션은 외부에서 변경이 불가능하여 테스트하기 매우 어렵다"라고 이해했는데요! 이 경우가 테스트 할 때 1. 스프링 컨테이너를 띄워 테스트를 하는 경우인가요? 아니면 2. 순수 자바 코드로만 테스트를 하는 경우 인가요? 저는 2번인 경우로 이해를 했고, 예를 들면 Service 인터페이스에 구현체1, 구현체2 두 개의 클래스가 존재할 때 원하는 구현체로 테스트하기 어렵다는 것인지 궁금합니다 강의 너무 잘 설명 해주셨는데 정리가 잘 안돼서 질문 남깁니다 ^^ 감사합니다~
-
미해결스프링 핵심 원리 - 기본편
회원 도메인 개발 implements 관련
MemoryMemberRepository에서 MemberRepository를 implements 하는 과정에서 err 가 나올 때 저는 윈도우여서 art+enter 눌렀는데 change extend만 나오더라구요 그래서 영상에 나온 코드를 다 작성했는데도 동일한 err만 계속 나오면 어떻게 해결해야 implements method가 잘생성될 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
설계할 때 쓰는 툴?
안녕하세요 강의 잘듣고있습니다. 강의를 보다 문득 궁금해졌는데 영한님은 도메인 설계, 클래스 다이어그램, DB ERD 등을 만들 때 어떤 툴을 쓰시나요??
-
해결됨자바스크립트 비기너: 튼튼한 기본 만들기
인스턴스 생성 가능 여부 기준에 대하여.
prototype 값 존재 여부가 인스턴스 생성 가능 여부를 결정한다고 설명하셨는데 다음과 같은 코드가 동작하는 이유는 무엇인가요? function Test() {}; Test.prototype = undefined; var t = new Test(); // 객체 생성 console.log(t); // 객체 출력
-
해결됨자바스크립트 비기너: 튼튼한 기본 만들기
스펙 타입에 대해서 질문이 있습니다.
따로 구글에서 스펙 타입이라고 검색해도 문서가 나오지 않아서 그런데, 혹시 관련하여 더 공부해 볼 수 있는 문서(혹은 공식 문서)를 찾으려면 어떤 단어를 키워드로 검색해야 할까요? javascript spec type 이나 document type 이라고 쳐도 PPT에서 보여준 타입 관련 내용이 없어서 문의 드립니다.
-
미해결스프링 핵심 원리 - 기본편
진짜 빈 찾을때 질문이 있습니다 !
프록시는 싱글톤으로 되어있지만 진짜 빈을 찾을때는 싱글톤 객체가 되면 안될거 같은데 프록시가 진짜 빈을 요청 할때마다 스프링 컨테이너는 요청이 들어올때마다 새로운 request scope 객체를 생성해서 넘겨주나요 ?
-
미해결스프링 핵심 원리 - 기본편
interface를 반드시 만들어야 하는지에 대한 기준
안녕하세요, 실무에서 초급 개발자로 있는 학생입니다. 다름이 아니라, 강의에서 Impl 접미사는 보통 구현체가 1개일때 관용적으로 사용한다고 말씀해주셨는데 , 구현체가 1개인 경우에도 interface를 선언하고 이를 구현해주는 이유가 있나요? 실무에서 코드를 보아도 모두 interface를 선언하고 이를 구현해주고 있는데 이에 대해 무의식적으로 따라하기만 했지 이유를 생각해본 적이 없어서요. 수정개발을 하면 구현체 뿐 아니라 interface도 같이 변경해야해서 번거롭다고 느낄때도 있었구요. 정리하자면, 구현체가 1개인 경우 굳이 interface를 선언하고 구현하는 이유와 그에 따르는 장점 (단지 확장성 뿐인지)등이 궁금하여 이렇게 질문드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 부트 사용 vs 스프링 사용 정리
안녕하세요 강사님! 스프링 부트를 사용한 것과 사용하지 않고 하는 방법이 헷갈려서 아래 질문들이랑 강의를 토대로 정리해봤는데 제가 이해한 내용이 맞나요? 번거로운 질문 드려서 죄송합니다ㅜ /** * # spring boot 사용 x * new AnnotationConfigApplicationContext(AutoAppConfig.class); * 1. ApplicatonContext(스프링 컨테이너) 생성 * 2. AutoAppConfig를 스프링 빈으로 등록 * 3. AutoAppConfig에 @ComponentScan이 달려있으므로, @Component 어노테이션이 달려있는 클래스를 스프링 컨테이너에 빈으로 등록 * * # spring boot 사용 * 1-1. @SpringBootApplication 이 붙어있는 class(이 예제에서는 CoreApplication)의 main 함수가 실행. * 1-2. @SpringBootTest 테스트 실행 -> @SpringBootApplication 어노테이션을 찾아감 * 2. 위 둘 중 하나를 하면 스프링부트 내부에서 자동으로 ApplicationContext (스프링 컨테이너)를 생성. * 3. @SpringBootApplication에는 @ComponentScan이 포함되어 있음. * => @Component 어노테이션이 달려있는 클래스를 스프링 컨테이너에 빈으로 등록 * (@Configuration에도 @Component가 포함되어있으므로 이 어노테이션이 달려있는 설정 클래스도 빈으로 컨테이너에 등록, * 이때 만약 @Bean 어노테이션이 있으면 빈을 컨테이너에 등록) */ 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
서버 ? 클라이언트?
안녕하세요. 항상 강의 즐겁게 잘 보고있습니다. AppConfig를 제외한 클라이언트 코드에 변경이 없다고 하셨는데, 이 어플리케이션을 만약 배포한다면 하나의 서버로 동작하게 되는게 아닌가요? ㅠ 이 부분이 헷갈려요. discount, member, order 패키지들이 클라이언트라 말씀하시는건지 궁금해요. 아니면, 3개의 지점으로 이루어져서, (클라이언트 / 사용자가 데이터를 사용하게 되는 지점) <-> (서버 / hello.core 의 핵심 내용) <-> (설정자 / AppConfig) 이런 아키텍쳐가 되어서, 설정자만 업데이트해도 클라이언트와 서버(서버란 표현이 애매하네요, 이것도 서버이자 클라이언트라고 볼 수도 있으려나..?)는 업데이트하지 않아도 되어서 클라이언트라고 표현하신건가요 !?
-
미해결스프링 핵심 원리 - 기본편
AppConfig에서 생성자로 주입되는 원리
안녕하세요. 비전공자 백엔드 개발자 준비중입니다. 강사님 좋은 강의 덕분에 spring 공부에 큰 도움이 되고 있습니다. AppConfig에서 역할과 구현을 나누어 구현체를 쉽게 바꿀 수 있다는 원리는 이해하였습니다. 여기서 제가 궁금한게 어떻게 AppConfig에서 메소드를 만들어 구현체를 넣어주면 생성자를 통해 받을 수 있는지, 그 원리가 궁금합니다. 생성자에서 this.객체 = 객체 이런식으로 받는데, AppConfig에서 넣어준 값이 어떻게 해서 이런 원리로 주입이 되는건가요? 제가 생성자 개념이 부족해서 이해가 안되는 것 같기도 하네요... 그리고 Test에서는 AppConfig 인스턴스를 생성해서 넣어줬는데, 왜 실제로는 그렇게 해주지 않은건가요? 메모리 낭비 때문에 그런걸까요? 인스턴스 생성 해서 넣어주는 부분은 이해가 되는데, 생성자로 주입해주는 부분은 원리가 이해가 되질 않네요.
-
미해결스프링 핵심 원리 - 기본편
자동등록에서는 이 방법을 사용할 수 없나요?
@Component에서도 적용이 될까 싶어서 @Component(initMethod = "init", detroyMethod = "close") 를 해봤는데 컴파일 에러가 나네요. 이 방법은 수동 등록에서만 가능한 방법인건가요?