묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
스프링부트 3.x 로그관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 전환하기 4분 49초의 내용입니다.현재 스프링부트 3. 버전으로 강의를 수강하고있는데MemberApp을 실행하였을때 Spring에서 자동으로 만들어주는 Creating shard instance.. 부분 빈 생성로그가 뜨질 않습니다. 2.7버전으로 프로젝트를 생성하였을 경우 로그가 뜨는데 3.x버전으로도 뜨게 하는 설정은 없을까요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
다차원 배열 순회 관련 질문입니다.
System.out.println("------------"); // 세로크기 10 x 가로크기 15 영화관 자리ㅣ String[][] seats3 = new String[10][15]; String[] eng = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"}; for (int i = 0; i < seats3.length; i++) { //세로 for (int j = 0; j < seats3[i].length; j++) { //가로 seats3[i][j] = eng[i] + (j + 1); } }이 부분에서 혹시 i < seats3.Length; 단순히 A부터 J까지 10개라서 10이되는건가요?그리고 j < seats3[i] 는 어떤 원리로 15가 되는건지 궁금합니다.
-
미해결자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 1(기초편)
접근 제어 지시자 강의 10분40초부분에서 막혀요 선생님 ㅠ
똑같이 강의따라하다가 뭐가 잘못된건지 몰라서 물어봐요 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
[기본편]섹션2 - 회원 도메인 실행과 테스트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]마지막에 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다고 하셨는데, 인터페이스는 MemberRepository를 의미하고 구현의존은 MemoryMemberRepository를 말씀하신건가요?그리고 '추상화에도 의존하고 구체화에도 의존함'이라고 하셨는데 이건 어떤 의미일까요?
-
미해결스프링 핵심 원리 - 기본편
회원등급이 추가되면 OCP 위반인가요?
안녕하세요!문득 궁금증이 생겨서 질문합니다.예제에서는 Basic, VIP 이렇게 2개의 회원등급이 enum에 존재하고 DiscountPolicy 구현클래스는 각 등급에 따른 분기로 할인정도를 조절합니다. (VIP의 경우 10%할인, 1000원 할인)만약 회원등급이 추가된다면 DiscountPolicy 구현클래스의 코드를 모두 수정해야 하는데, 이 경우 OCP위반이라고 하나요?아니면 어쩔 수 없는 비즈니스 로직이 변경된 경우인가요?
-
해결됨스프링 핵심 원리 - 기본편
DiscountPolicy 동적으로 의존성 변경
항상 좋은 강의, 감사히 보고 있습니다.강의에서 AppConfig에서 DiscountPolicy를 FixDiscountPolicy로 고정합니다.만약 상황에 따라 정률, 정액할인 정책을 동적으로 적용한다고 한다면 어떤식으로 설계하면 좋을까요?쿠폰에 따라 할인정책이 달라지는 경우 어떻게 해야 될까요..?
-
미해결스프링 핵심 원리 - 기본편
5. 싱글톤 컨테이너 > @Configuration과 싱글톤 > 참조값 문의
아래 코드 실행 시 print해주는 참조값이 셋 다 같아야 하는데 모두 각각 다릅니다. 어떤 부분 때문에 실습 영상에서는 같게 나온 세 참조값이 모두 다르게 나왔는지 원인 파악 문의드립니다. 해당 프로젝트 실습 링크는 다음과 같습니다. https://drive.google.com/file/d/1bmEbBnSeiU_y_vEvmizju_MUVcFVRwpw/view?usp=sharing package salt.core.singleton; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import salt.core.AppConfig; import salt.core.member.MemberRepository; import salt.core.member.MemberServiceImpl; import salt.core.order.OrderServiceImpl; import static org.assertj.core.api.Assertions.*; public class ConfigurationSingletonTest { @Test void configurationTest() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("orderService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); // assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); // assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); // 셋 다 같아야 하는데 셋 다 참조가 다름 // memberService -> memberRepository = salt.core.member.MemoryMemberRepository@5af5def9 // orderService -> memberRepository = salt.core.member.MemoryMemberRepository@3a45c42a // memberRepository = salt.core.member.MemoryMemberRepository@36dce7ed } }
-
미해결스프링 핵심 원리 - 기본편
필드 주입 vs 생성자 주입
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]필드 주입으로 구현했을경우 테스트 코드 작성 시 유연하게 변경이 불가하다고 이해했습니다.그렇다면 생성자 주입으로 구현했을경우 테스트 코드 작성 시 아래와 같이 의존관계를 유연하게 변경 가능하기 때문에 생성자 주입은 필드 주입의 단점을 보완 가능한 것이 맞을까요?// 생성자 주입으로 DI 주입 void fieldInjectionTest() { OrderServiceImpl orderService = new OrderServiceImpl(new JpaRepository, new RateDiscountPolicy); orderService.createOrder(1L, "itemA", 20000); }
-
미해결스프링 핵심 원리 - 기본편
스프링핵심원리이해2-객체지향원리적용 편 질문
회원관리(가입,조회) 서비스, 주문서비스(할인, 주문)(OrderServiceImpl)에서역할을 담당하는 인터페이스를 바라보게 해야하는데, 현재코드는 구현체도 바라보게 했다는 점에서 코드의 수정이 필요하다는 강사님 말씀은 이해가 됩니다!다만, 여기서 강사님 표현으로 '클라이언트'코드도 수정이 이루어져야 한다고 말씀하셨는데,클라이언트코드라는 용어가 조금 혼동이 됩니다.클라이언트 코드에 대해서 설명 한번 부탁드립니다!
-
미해결스프링 핵심 원리 - 기본편
스프링컨테이너의 동작 순서와 autowired어노테이션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1 . 컴퍼넌트 스캔 및 autowired어노테이션을 사용할 때 스프링컨테이너 파라미터로 넘겨진 설정클래스의 컴퍼넌트스캔 어노테이션을 통해 스프링 컨테이너가 컴퍼넌트가 붙은 클래스를 빈으로 모두 등록한 후에 스프링컨테이너가 의존관계주입을 하는 단계에서 autowired를 통해 의존관계주입을 하자나요 근데 스프링컨테이너가 이 autowired어노테이션을 어떤식으로 찾는건가요? 2 . 스프링컨테이너는 빈을 다 등록한 후에 의존관계주입이 이루어진다하셨는데 memberSerivceImpl 랑 orderServiceImpl의 의존관계주입을 둘 다 수정자방식으로 autowired어노테이션을 붙여서 수정자에다 모두 콘솔을 넣고(memberimpl의 수정자메서드에는 콘솔 1 order에는 콘솔2) 실행시켜봤는데 로그에 autoConfig rateDiscountPolicy memberServiceImpl memoryMemberRepository 1 orderServiceImpl 2 이런식으로 나오는데 위에 논리라면 1이 orderService까지 다 생성된후에 1이 나와야하는거 아닌가요??3 . 위랑 비슷한 예인데 수동(config,Bean)을 이용할때에도 원래는 스프링컨테이너가 빈을 다 등록한뒤에 의존성주입이 이루어진다고 하셨는데 이것저것 해봐서 로그를 봤는데 로그는 빈을 등록하면서 의존성주입에 필요한 빈을 등록하고 의존성주입이 이루어지는 방식으로 되던데 이것도 이해가 잘 안됩니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
객체 생성 및 생성자 질문드립니다.
안녕하세요 나도코딩님선생님의 강의를 들으면서 모르는것들을 하나하나 곁가지 치듯이 검색하면서 알아보던 도중에CHAT GPT에 인터페이스 관련으로 질문하면서 공부하다가 아래의 코드를 보게되었습니다.// 인터페이스 정의public interface Drawable {void draw(); // 추상 메서드 선언}// 인터페이스 구현public class Circle implements Drawable {@Overridepublic void draw() {System.out.println("원을 그립니다.");}}public class Rectangle implements Drawable {@Overridepublic void draw() {System.out.println("사각형을 그립니다.");}}// 사용 예시public class Main {public static void main(String[] args) {Drawable circle = new Circle();circle.draw(); // "원을 그립니다."Drawable rectangle = new Rectangle();rectangle.draw(); // "사각형을 그립니다."}}여기서 제가 이해가 되지 않는 부분이Drawable circle = new Circle();위의 부분인데요객체를 생성할때에는A a = new A();이처럼 작성하는걸로 알고있는데왜 저기에서는 B a = new A();이런식으로 되어있는지 궁금합니다.구글에 검색을 많이 해봤는데 이해가 안되더라구요ㅠㅠ답변 부탁드립니다!!
-
미해결자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 1(기초편)
섹션3 < 객체의 속성은 이라는 강의에서 질문이요!!
7분28초 부분에서 똑같이 실행했는데 저는 왜 안되는걸까요? 어디부분이 잘못되었을까요? ㅠㅠ
-
해결됨스프링 핵심 원리 - 기본편
스프링 빈에 DTO 클래스를 등록하는 경우도 있을까요?
현재 스프링 빈 싱글톤 방식 파트 강의를 수강 중입니다.강의 중 싱글톤 방식의 문제점에 대해 아래와 같이 이해하였습니다. public class StatefulService { // private int price; // 상태를 유지하는 필드 public int order(String name, int price){ System.out.println("name = " + name + " price" + price); //this.price = price; //여기가 문제! return price; } // public int getPrice() { //// return price; // } } @Test void statiefulServicesingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(testConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); //ThreadA : A사용자가 10000원 주문 //statefulService1.order("userA", 10000); int userAPrice =statefulService1.order("userA", 10000); //ThreadB : B사용자가 20000원 주문 //statefulService2.order("userB", 20000); int userBPrice =statefulService2.order("userA", 10000); //ThreadA : 사용자A가 주문 금액 조회 // int price = statefulService1.getPrice(); // 10000원 조회해야 하는데?? System.out.println("price = " + userAPrice); // Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000); Assertions.assertThat(userAPrice).isEqualTo(10000); }스프링 빈에 등록된 인스턴스(StatefulService)에 공유필드(price)가 있는 경우,추가로 참조하는 인스턴스(statefulService2)로 인해 값이 변경될 수 있고 큰 버그를 초래할 수 있다. 위와 같은 개념을 익히다보니 자연스럽게 DTO의 공유필드가 떠올랐습니다.처음에는 DTO는 일반적으로 필드를 사용하니 문제 되지 않나? 했는데 스프링 빈에 등록된 경우에만 문제가 된다고 이해하였습니다. (제가 잘못 이해했는지도 궁금합니다 ㅎㅎ)그렇다면 혹시 DTO를 스프링 빈에 등록하는 경우가 만에 하나라도 있을까요?DTO를 스프링 빈에 등록한다면 동일한 문제가 생길 것 같아서요.
-
미해결자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 1(기초편)
함수와 메서드 < 강의내용 10분에서 오류요!
강의에서 출력결과가 마지막에 5050 으로나오는데 저는 1로만 출력이 안되네요 제가 뭘 잘못한거겠죠? ㅠㅠ 어디가 잘못된지 모르겠어요 선생님!
-
미해결PHP 7+ 프로그래밍: 객체지향
35강 미들웨어에서 인증 과정을 Auth클래스로 만들면, 어느 디렉토리에 둘까요?
35강 중간에 AuthMiddleware 클래스를 만드는 부분에서, 인증을 하는 부분을 따로 Auth클래스를 만들어서 할 수도 있다라는 내용이 잠깐 지나갑니다.이때, Auth클래스는 어떤 디렉토리를 만들어서 두면 좋을까요? 유틸 디렉토리를 만들어서 둘까 했지만, Auth클래스를 유틸 클래스라고 하기엔 좀 모호한것 같아서요.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
구조 분해는 componentN으로 순서에 의존하는거같은데 이 의존을 없앨 수 없나요?
구조분해가 순서에 의존하는 것 같은데, 이러한 순서에 대한 의존성을 제거할 수는 없는 것인가요? data class Foo( var a:String, var b:Int, var c:Long, var d:String ) fun main(){ val foo = Foo("hello", 33, 44L, "Bye") //기존 방식 val (a, b, c, d) = foo //원하는 방식 val (c, a) = foo }
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
제네릭 클래스(연장 전반전) user.name
안녕하세요,제네릭 클래스(연장 전반전) 5:30 부분에서 궁금한 점이 있어 질문드립니다. CoffeeByUser 클래스의 method로서 ready() 를 정의해주었는데, 이때 출력구문에 들어간 user.name 에 대해 잘 이해가 되지 않아 여쭤봅니다. user는 CoffeeByUser 클래스의 아직 자료형이 정의되지 않은 '변수'인데, 어떻게 User 클래스의 변수인 name과 함께 쓰여서 user.name이 될 수 있는건가요?만약 user.name이 아니라 단순히 user 혹은 name 으로 변경한다면 출력값이 다른 걸까요? 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
서비스 계층에서 인터페이스와 Impl 구분에 대해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 다른 사람의 코드를 읽던 중에 궁금한 것이 생겨서 질문 남깁니다.제가 읽은 코드에는 ~~Service(인터페이스) 와 ~~ServiceImp로 작성을 했습니다. 이 전에도 이런 구조를 사용하는 코드를 종종 봤습니다. 저는 지금까지 그냥 바로 인터페이스 없이 ~~Service를 만들고 비즈니스 로직을 작성 했습니다.제가 찾아본 결과로는 인터페이스와 구현을 구분하는 이유는 2가지 였습니다.OCP 법칙을 더 잘 지키기 위해서추상과 구현을 OCP 법칙을 지키고 다형성을 확보하기 위해서AOP Proxy과거 스프링에서 AOP를 사용할 땐 JDK Dynamic Proxy를 사용하기 때문에 인터페이스가 필요했다. 하지만 지금은 GCLIB를 사용할 수 있기 때문에 사실상 의미를 잃었다.추가적으로 인터페이스를 나누고 인터페이스에 javadoc용 주석을 남겨두면 유지보수 측면에서 읽기에 더 나은 부분이 있지 않을까 정도 생각해 보았습니다.서비스 계층에서 인터페이스와 구현을 나누는 것과 하나의 서비스 클래스에 구현하는 것 중에 대부분의 경우 어떤 것을 더 권장하시는지 궁금합니다. 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
xml 관련 질문 드립니다.
[질문 내용]처음 스프링을 배울 때 spring legacy 프로젝트로 배웠습니다. 따라서 root-context.xml, servlet-context.xml 방식으로 배웠습니다. 이전에 질문 드렸을때, "SpringApplication.run() 메서드는 기본적으로 @SpringBootApplication이 위치한 패키지와 하위 패키지를 시작점으로 모든 클래스를 스캔합니다 따라서 @Configuration, @Component, @Service, @Repository 등의 애노테이션이 있는 클래스를 찾아서 스프링 애플리케이션의 컨텍스트를 생성하는데 사용합니다." 라고 답변을 받았습니다. 하지만 legacy 프로젝트를 실행할때에는 @SpringBootApplication을 따로 적지 않았는데, 어떻게 해당 xml(root, servlet)에서 bean을 읽어오는지 의문이 듭니다. 추가로 xml로 작성하였을때도 SpringApplication.run() 메서드가 자동으로 읽는지도 문의드립니다.
-
해결됨자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
미로찾기 문제에 VISIT의 쓰임
이해하는데 시간이 좀 걸려서, 다른 분들도 고민하실까봐 글 남겨요 public static int VISIT = 2;미로찾기 문제에서 나오는 상수 VISIT 의 쓰임새는탐색한 모든 위치를 VISIT 주는 것이 아니라,정답의 길만 VISIT을 주고있어요 따라서 그 위쪽 로직에서newPosition.direction = direction +1;을 주는 겁니다. NOTVISIT 이여도 이미 갔던 path를 다시 안가기 위해서요