묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
인텔리제이 커뮤니티에서 콘솔 색상 입히는 방법
커뮤니티 버전에서도 콘솔에 색상 입히는 방법입니다. 며칠 전에 어떤 수강생 분이 질문하셔서 얼티메이트vs커뮤니티 비교해서 답변 달았었는데 삭제 됐네요 ^^; 공부하다 알게되서 공유합니다 ~ ------------------------------------ application.properties spring.output.ansi.enabled=always ------------------------------------
-
해결됨스프링 핵심 원리 - 기본편
강의 로드맵 관련해서 궁금합니다.
스프링을 처음 시작하는거라 스프링 입문강의를 다 보고나서 <스프링 핵심원리-기본편> 강의를 들으려고 하는중인데 얼마 전에 스프링MVC 1편-백엔드 강의가 오픈되었더라구요. 새로 나온 강의는 이 강의를 듣고 난 후에 수강하면 좋은 강의인가요??
-
해결됨스프링 핵심 원리 - 기본편
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개의 테이블 값을 휘발성 메모리로 띄워 주입하는 방법뿐일지? 질문 드립니다. 장황하고 강의와 동떨어져 보여 죄송합니다. 좋은 강의 진심으로 깊은 감사드립니다.
-
미해결스프링 핵심 원리 - 기본편
실무에서 프로토타입 빈을 사용하는 경우는 어떤 경우인가요?
영한님 안녕하세요 강의 잘 듣고 있습니다 ^^ 프로토타입 빈은 사용시점마다 새롭게 생성해서 사용하는 용도라고 하셨는데요. 이러면 별도의 클래스를 만들어서 사용할 때랑 용도가 유사힐 거 같아서요. 프로토타입 빈을 실무에서 사용할 때는 어떤 용도로 사용되는지 알 수 있을까요? 스프링에서 DI를 할 때 항상 새로운 빈을 생성해서 주입해야 할 때 사용한다는 건 알겠는데 딱히 사용용도가 생각나지를 않아서요 ㅎㅎ
-
미해결스프링 핵심 원리 - 기본편
의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map
안녕하세요 영한님 제목에 있는 강의를 듣던 도중 궁금 한 것이 생겨 질문 남깁니다. 다름이아니라 아래와 같이 코드를 구성하였을 때 DiscountService는 AnnotationConfigApplicationContext에 넣어줌으로써 Bean으로 등록 된다는 것은 이해가 됩니다. 하지만 DiscountService 클래스에 있는 policyMap 과policyList는 제 생각으로는 아무것도 등록이 안되어있는 것이 맞을 텐데 어떻게 FixDiscountpolicy와 RateDiscountPolicy가 들어가는지 이해가 잘 되지 않습니다. 이 필드들은 각각 Map과 List이고 제네릭(?)만 DiscountPolicy 인데 스프링 컨테이너가 "음 Map 과 List 가 DiscountPolicy로 표현이 되었네? 그럼 내가 DiscountPolicy 타입으로 된 Bean이 있나? 아 ! AutoAppConfig에서 ComponentScan으로 해보니까 FixDiscountpolicy, RateDiscountPolicy가 있네? 그럼 그냥 이거 넣어야 겠다." 이런 메커니즘으로 동작하는 것인가요?
-
미해결스프링 핵심 원리 - 기본편
좋은강의 감사드립니다 . 질문이 있습니다 !
현재는 스프링 부트를 사용하지 않아서 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를 선언하고 구현하는 이유와 그에 따르는 장점 (단지 확장성 뿐인지)등이 궁금하여 이렇게 질문드립니다. 감사합니다.