묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
DiscountPolicy 설계 관련 질문입니다.
안녕하세요. DiscountPolicy 설계 관련하여 질문드립니다. 해당 클래스 내 discount 메서드에서, 할인된 금액(= 할인 정책 적용 후 총 금액)이 아닌 할인 대상 금액(= 깎아준 금액)을 리턴하는 이유가 궁금합니다. 정액 할인 정책을 고려하고 있기 때문에 이를 쉽게 확인하기 위해 할인 대상 금액을 리턴한다고 보면 될까요? 할인 자체만 놓고 본다면 할인 후 총액을 사용하는 경우가 더 많지 않나, 해서 여쭤봅니다.
-
미해결스프링 핵심 원리 - 기본편
.class 가 정확히 뭔가요?
getBean 함수를 호출할때 name과 xxxService.class를 인자로 넘기는데 여기서 .class는 정확히 뭔지 알 수 있을까요? 객체 인스턴스인가요 아니면 클래스 타입인가요?
-
해결됨스프링 핵심 원리 - 기본편
생성자 주입에 관하여 질문드립니다!
좋은 강의 항상 감사드립니다! ^^다양한 의존관계 주입 방법 부분의 강의를 듣던 중 궁금한 점이 있어 질문 드립니다. OrderServiceImpl 객체를 생성하여 스프링 빈으로 등록하는 과정에서 궁금한 점이 있습니다. 우선 OrderServiceImpl을 스프링 빈으로 등록하기 전 OrderServiceImpl 객체를 생성하기 위해 아래와 같이 생성자를 호출하게 되고 -> new OrderServiceImpl(memberRepository, discountPolicy); 이 과정에서 생성자의 파라미터로 들어온 객체의 스프링 빈을 찾아와 OrderServiceImpl을 생성한다고 하셨습니다. 강의의 12:40 부분에서 memberRepository와 discountPolicy가 생성이 되어 있지 않다면 스프링이 생성을 한 후 가져온다고 하셨습니다. 저는 위 말씀을 생성자 주입 시 생성자의 파라미터로 들어온 객체가 스프링 빈으로 등록되어 있지 않다면 스프링이 그 객체도 자동으로 스프링 빈으로 등록한다고 이해를 하였습니다. 따라서 new OrderServiceImpl(memberRepository, discountPolicy); 코드 실행 시 만약 memberRepository와 discountPolicy가 스프링 빈으로 등록되어 있지 않아도 1. 먼저 스프링이 memberRepository와 discountPolicy를 스프링 빈으로 등록한 후2. OrderServiceImpl의 스프링 빈 등록과 의존 관계 주입이 동시에 일어난다고 이해하였습니다. 하지만 생성자 주입 사용 시 생성자의 파라미터로 들어오는 객체가 스프링 빈으로 등록되어 있지 않을 경우 NoSuchBeanDefinitionException 예외와 UnsatisfiedDependencyException 예외가 발생하였고, 제가 이해한 부분이 틀린 건지 헷갈려서 질문을 남기게 되었습니다. Q1. 12:40 부분에서 하신 말씀에서 memberRepository와 discountPolicy가 생성이 되어 있지 않다는 뜻이 '스프링 빈으로 등록되어 있지 않다'는 뜻이 아닌 건가요? Q2. memberRepository와 discountPolicy가 생성이 되어 있지 않아 스프링이 생성을 한 후 가져온다는 뜻이 '생성자의 파라미터로 들어온 객체를 스프링 빈으로 생성하여 가져온다'는 뜻이 아닌 건가요?
-
미해결모든 개발자의 실무를 위한 올인원 기본기 클래스
amend commit 질문
amend commit 실행하고 insert로 바꿨는데 수정모드 끄는건 어떻게하는건가요 나와지질않네요 insert랑 replace 상태여서 :wq를 입력못하고있습니다 ㅠ insert에서 못벗어나서 종료하고 reset하고 다시 했는데 아예 amend commit이 안되네요.. E325: ATTENTION Found a swap file by the name "C:/Users/user/PycharmProjects/git-tes/.git/.COMMIT_EDITMSG.swp" owned by: user dated: Thu Dec 30 09:41:32 2021 file name: ~user/PycharmProjects/git-tes/.git/COMMIT_EDITMSG modified: YES user name: user host name: DESKTOP-C2BR6PG process ID: 1916 While opening file "C:/Users/user/PycharmProjects/git-tes/.git/COMMIT_EDITMSG" dated: Thu Dec 30 10:00:55 2021 -- More --
-
미해결모든 개발자의 실무를 위한 올인원 기본기 클래스
revert 오류
이런 상태에서 git revert하면 아래처럼 오류가뜹니다. $ git revert 7a6a52c error: Your local changes to the following files would be overwritten by merge: a Please commit your changes or stash them before you merge. Aborting fatal: revert failed a가 merge가 되있어서 revert가 안된다는뜻인가요?
-
미해결스프링 핵심 원리 - 기본편
흐름이 이렇게 흘러가는게 맞나요?
1.컨테이너 생성 2.스프링 빈 생성 3.의존관계 주입 4.초기화 콜백 이렇게 완료가 되는걸로 알고있습니다. @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; } 이때 LifeCycleConfig.class에 있는 빈 정보들을 바탕으로 빈 생성하고 의존관계주입등을 하는걸로 알고있는데 여기서 질문이 스프링 컨테이너에 있는 빈은 return networkClient; 즉 리턴된 객체를 뜻하는건가요? 다음 질문은 NetworkClient networkClient = new NetworkClient(); 했을때 생성자가 호출이 되고 public NetworkClient() { System.out.println("생성자 호출, url = " + url); } 값주입?? 이 일어난후 networkClient.setUrl("http://hello-spring.dev"); 초기화 콜백이 일어나는거 같은데 맞나요?? @PostConstruct public void init() { System.out.println("NetworkClient.init"); connect(); call("초기화 연결 메시지"); }
-
미해결스프링 핵심 원리 - 기본편
취준생 방향 좀 한번 봐주시면 감사하겠습니다!
안녕하세요! 올려주신 강의 감사히 잘 듣고 있습니다. 현재 저는 HTTP -> MVC1 -> 스프링 입문 -> 스프링 핵심(기본) 까지 들은 상태입니다. 그리고 앞으로 제 계획은 MVC2 -> JPA활용1 -> 표준JPA -> JPA활용1 -> JPA활용2 -> 토이프로젝트 -> 스프링 핵심(고급) 순서로 인강을 듣고 스프링 데이터JPA, Querydsl은 여유가 된다면 추가적으로 학습하려하고 있습니다. 혹시 학습 순서를 바꾸면 좋겠다 싶은 부분이 있으시면 말씀해주시면 정말 감사하겠습니다! 추가적으로 다른 질문에 답변 해주신 글을 보니 기본적인 DB 지식이나 mysql 공부는 따로 해야 된다고 하셨는데 그럼 이 부분은 JPA를 들어가기 전에 공부를 하는 것이 좋을까요??
-
미해결스프링 핵심 원리 - 기본편
싱글톤과 멀티스레드 질문
안녕하세요. 질문드리겠습니다. 멀티스레딩 환경에서 싱글톤 객체를 사용해 요청들을 처리하기 위해서는 stateless한 설계를 해야한다는 내용 잘 이해됐습니다. 이 stateless와 직접 연관되는 부분은 아닌 것으로 보이지만.. 싱글톤 멀티스레딩 관련 궁금증이 생겨 질문을 남깁니다. 싱글톤으로 생성된 Controller, Service등의 객체에서도 객체를 생성하는 경우가 있을 것입니다. ex) PointAccmlParam (포인트 적립에 필요한 속성들을 전달할 객체) 이 또한 객체이기 때문에 heap 영역에 저장될 것이고 멀티스레딩 환경에서 heap은 공유 영역입니다. 물론 각 인스턴스의 참조값이 다르니 엉뚱한 객체의 값을 사용하게 될 경우는 없겠습니다만.. 이러한 경우에는 싱글톤의 객체 생성 제한이란 장점이 사라져버리게 되지 않을까? 하는 생각이 듭니다. 기껏 Controller, Service를 싱글톤으로 잘 설계해봤자.. 그녀석들이 저렇게 request별로 각각의 param객체를 생성해버린다면.. 앞서 Controller, Service를 굳이 싱글톤으로 설계한 의미가 없어지는 것 아닌가 싶습니다. 이 부분에 대한 해결책이 있을까요? Param 객체도 싱글톤을 적용시키면서 엉뚱한 참조가 일어나지 않게 하는 마법같은 방법이라던가 하는 것이요. 아니면.. 그냥 Param 객체는 어쩔 수 없는 부분이고, 객체 생성을 줄일 수 있는 곳에서라도 줄이기 위해서 Controller, Service만이라도 싱글톤으로 가져간다. 라고 생각하고 넘어가야 할까요?? 답변 부탁드립니다. 감사합니다!
-
미해결모든 개발자의 실무를 위한 올인원 기본기 클래스
8분 19초에 gst는 왜치는건가요?
gst 치는이유 알고싶습니다.
-
미해결모든 개발자의 실무를 위한 올인원 기본기 클래스
git init 오류
0 git init 부터 막혔는데 해결법 계속 찾고 있는데 뭐가 문제일까요..? git : 'git' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오. 위치 줄:1 문자:1 + git init + ~~~
-
미해결스프링 핵심 원리 - 기본편
MemberService를 인터페이스와 구현 클래스로 나눈 이유가 궁금합니다.
제목 그대로 MemberService를 인터페이스와 구현 클래스(MemberServiceImpl)로 나눈 이유가 궁금합니다. 실무에서 Service 객체를 여러 개 두고 바꿔 끼우는 경우가 있나요? 있다면 어떤 상황이 있는지 예를 들어 주시면 좋을 것 같습니다:)
-
미해결스프링 핵심 원리 - 기본편
싱글톤 방식의 주의점 강의의 질문입니다.
강의를 듣고 스프링 프레임워크에 의하여 생성되든 사용자가 Java 코드를 이용해 생성하든 Singleton 방식으로 구현된 객체는 1개의 객체가 여러 곳에서 재사용하기 때문에 무상태(stateless) 형태로 설계해야 한다는 것을 잘 알게 되었습니다. 강의에서도 예시를 들어주시면서 Class 내 Member 변수가 아닌 Method 내 지역 변수로만 값을 핸들링하며 return 시켜주시며 무상태(stateless)의 적절한 구현방법을 설명해주셨는데요. 한가지 의문이 들었습니다. 만약 Singleton 객체 내부에 선언된 공유 가능한 변수(강의 내에서는 Class의 Member 변수)에 상태값이 남을 수 있다면 함수도 Singleton 형태로 사용되는 것인가요? 만약 객체의 무상태(stateless)만 신경쓰고 개발하다가 아주 짧은 시간 내에 Singleton 객체 내부에 있는 A라는 함수에 동시다발적으로 호출이 몰리게 되면 A 함수 내부에 선언된 지역변수도 공유될 가능성이 존재하는 것인가요?
-
미해결스프링 핵심 원리 - 기본편
싱글톤의 DIP 위반
다른 질문들에서 해답을 찾지 못해 질문을 올립니다. AppConfig의 memberService()에서 return new MemberServiceImpl(memberRepository()); 대신에 return new MemberServiceImpl.getInstance();로 사용하는 것은 클라이언트가 구현체(싱글톤객체)에 의존하게 되므로 DIP가 위배된다 라는 것이 강의의 내용인데요..AppConfig와 같은 구성에 사용되는 클래스는 어쩔 수 없이 구현체에 의존을 해야만 하는 것 아니었나요?실제로 싱글톤 사용 전인return new MemberServiceImpl(memberRepository());방식에서도 MemberServiceImpl이라는 구현체를 의존하고 있었고 이전까지의 내용에서는 이를 두고 DIP를 위반한다고 보지는 않았던 거 같은데 말이죠.오랜만에 공부하려니 쉽지가 않네요.. 답변 부탁드립니다 ㅠ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ ( 자답 )혹시 아래 내용이 맞는지 확인 부탁드립니다. 싱글톤 반영 전에는 AppConfig에서 return new MemberServiceImpl(memberRepository());를 통해 MemberRepository의 구현체까지 AppConfig 내부에서 모두 결정됨. 즉, 클라이언트 (MemberServiceImpl) 가 MemberRepository의 구현체에 의존하지 않음 -> DIP 충족인 것이고,싱글톤 반영 후 AppConfig에서 return MemberServiceImpl.getInstance()할 경우 클라이언트 (MemberServiceImpl)의 내부 코드에서 다시 MemoryMemberRepository.getInstance() 를 호출해야한다.즉, 클라이언트가 구현체에 의존하게 된다.-> DIP 위반 제가 너무 AppConfig 안에서만 생각해서 인지부조화가 발생한 것 같은데.. 이렇게 받아들이는게 맞을까요?
-
미해결스프링 핵심 원리 - 기본편
getId()를 찾을 수 없다고 나옵니다.
안녕하세요. 아래 이미지와 같이 수행 했을 때 getId()가 자꾸 오류가 발생하는데 어떻게 해결 해야 되는지 문의드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
객체지향 마무리 질문있습니다.
class Marine { public: // 특정 마린 객체에 종속적 int _hp; void TakeDamage(int damage) { _hp -= damage; } static void SetAttack() { s_attack = 100; } // 특정 마린 객체와 무관 // 마린이라는 '클래스' 자체와 연관 static int s_attack; // 설게도 상으로만 존재 }; int GenerateId() { // 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음) // 가시범위 : // 정적 지역 객체 static int s_id = 1; return s_id++; } 강의에서 나오는 Marine클래스와 GenerateId()함수입니다. 강의 중 GenerateId()함수를 여러번 부를 경우 정적 지역 객체인 s_id가 계속해서 1로 초기화 되는 것이 아닌, 처음 함수를 부를 때만 1으로 초기화 되고 그 다음부터는 ++만 연산해서 1, 2, 3, ... 과같이 s_id가 계속해서 증가하는 모습을 보였습니다. 그래서 저는 Marine클래스의 SetAttack()도 처음에만 100으로 세팅해주는것인가? 라는 생각이 들어 Marine::SetAttack(); cout << m1.s_attack << endl; Marine::s_attack = 7; cout << m1.s_attack << endl; Marine::SetAttack(); cout << m1.s_attack << endl; 이렇게 실행해 보았으나, 출력이 100 7 100으로 다시 초기화가 된 것을 확인하였습니다. 왜 SetAttack()은 부를때마다 초기화가 진행되고 GenerateId()는 그렇지 않은 것인가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
service와 controller의 역할에 대한 질문이 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]service와 controller의 역할에 대한 질문이 있습니다. 강의를 듣고 활용해던 도중 의문점이 생겼습니다. 한참 찾아봤는데 아직도 모르겠어서 질문드립니다. 저의 기존 코드에서는 어떤 컨트롤러의 post 요청에서 A,B,C 엔티티가 반드시 순서대로 생성된후 저장되어야 합니다. (참조관계 떄문에 그렇습니다) 기존에 저는 컨트롤러에서 A 엔티티 생성 -> AService.createA() 한 후 B, C도 동일한 과정을 거칩니다. 이러니까 컨트롤러가 서비스의 역할을 해버린다고 생각했습니다. 그래서 컨트롤러는 그냥 dto를 넘겨주고 서비스에서 위의 작업을 하려했습니다. 그랬더니 몇가지 문제가 생겼습니다. 1. service에서 repository만을 사용하면 코드 중복이 심함(create 할때 복잡한 중복검증 로직이 있는대, 그것까지 전부 다시 해야함) 2. service에서 service를 주입받아서 하자니 순환참조, 나말고 코드 이해도 낮은 다른사람이 손대면 실수할 가능성 높음 등등의 문제가 생김 그래서 그냥 원래대로 냅두려니 controller가 너무 크고 service가 하는게 그냥 repository로 요청 보내기인 경우가 대부분임 그래서 질문은 1. 적절한 방법이 뭘까요? 2. 복잡하고 큰 규모의 서버 코드를 보고싶은데 좋은 예시를 어디서 찾을수 있을까요? 3. 제가 해결방법으로 여러 service를 주입받아서 사용만하는 service를 만들어서 컨트롤러에 있던 코드를 거기로 옮겨서 컨트롤러에 비즈니스 로직이 생기는걸 없에고 순환참조, 코드 중복 등을 제거 해봤는데 이게 맞는건가요? 4. MSA와 상관있는 문제일까요?
-
미해결스프링 핵심 원리 - 기본편
도메인 설계를 잘하고 싶어요 (학습에 대한 고민 상담)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예...아니오...애매합니다ㅠㅠ2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 선생님의 강의를 재밌게 듣고 있습니다. 백엔드에 대한 기초 지식 하나 없다가 자바 기본서 하나 읽고 바로 선생님의 강의를 들었어요. 그래서 중간에 많이 버벅대긴 하지만 레고를 맞추는 듯 즐겁게 진행중입니다. '주문과 할인 도메인 설계' 까지 선생님꽈 쭉 공부를 진행하던 중... 고민이 생겼는데요, 분명 선생님의 설명을 들으면 설계가 정말 기가 막히게! 이해가 되지만, 스스로 설계를 해볼 수 있겠나? 물으면 대답을 못하겠어요. 알고리즘에 대한 공부를 제대로 안 하고 바로 넘어와서 이런 걸까요? 사실 프로그래밍을 배우면서 늘 '보면 이해 되는데 직접 못하겠어' 라고 느낀 적이 상당히 많았는데요... 여태까진 이 막막함을 견디고 하다보면 뭔가 나중에 이해가 되긴 되었지만. 가끔 너무 막막할 땐 어떻게 해야 할지 모르겠네요. 학습을 할 때 나무가 아닌 숲을 바라보는 어떤 비결이 있을까요? 학습법에 대해 조언을 구하고 싶습니다! 선생님의 강의를 좀 더 제대로 곱씹고 이해하고 싶어요. 좋은 강의 감사합니다! 덕분에 저 꽤 멀리까지 왔어요ㅎㅎ 선생님 강의를 듣다가 문득 뒤를 돌아보면 정말 깜짝 놀란답니다!
-
해결됨스프링 핵심 원리 - 기본편
커스텀 어노테이션을 클래스 형태로 등록하는 이유
안녕하세요 강의에서 직접 애노테이션(MyIncludeComponent, MyExcludeComponent) 을 인터페이스로 선언한다고 배웠습니다. 그런데 테스트코드 ComponentFilterAppConfigTest 클래스의 @ComponentScan 내부에서는 MyIncludeComponent.class 로 등록하더라구요, 인터페이스로 선언했는데 왜 .class 를 붙여 등록하는지 궁금합니다..!
-
미해결스프링 핵심 원리 - 기본편
클래스 필드에서도 Map @Autowired를 사용할 수 있나요?
이번 예제에서 내부 클래스인 static class DiscountSerive에 Map 타입과 List 타입의 멤버변수를 만들고 @Autowired를 설정해 보았습니다. 저는 출력결과가 수업강의에 있었던 예제 처럼 타입에 맞는 빈이 모두 출력될 것이라 기대했는데 결과물은 null이네요. 클래스 필드에서는 @Autowired를 사용할 수 없는것일까요? <코드> <결과물>
-
미해결스프링 핵심 원리 - 기본편
Bean 메타정보 관련 동작, 스프링 컨테이너에 등록되는 과정이 궁금합니다.
안녕하세요. 항상 양질의 답변 글을 달아주셔서 너무 감사합니다. 다름이 아니라 이전 강의를 복습하면서, 제가 궁금한 부분이 있어 질문 드리고 싶어 글을 적습니다. Bean Definition을 통해서 스프링 컨테이너에 등록되는 과정이 궁금한데, 한번 이런 흐름으로 가는데 틀린 부분이 없는지 봐주실 수 있을까요? 전체 흐름이 맞는지, 그리고 각 과정에서 잘못 알고 있는 부분은 없는지 한번 알려주시면 감사하겠습니다. 1. 스프링부트가 시작되면 @Configuration이 붙은 AppConfig 클래스를 자동으로 스캔해서 스프링 컨테이너에 넣는다 2. 스프링 컨테이너, 여기서는 ApplicationContext의 구현체인 AnnotationApplicationContext가 AppConfig.class 정보를 AnnotatedReader를 통해서 읽은 다음 @Bean이 붙은 Bean Definition을 만든다. 3. 만들어진 Bean Definition을 AnnotationApplicationContext에서 읽어서 빈 객체를 생성해서 내부 빈 저장소에 저장한다. 이 때, 각 메서드는 @ComponentScan에서 생성자 주입과는 다르게 동작한다 (생성자 주입은 빈 객체를 생성하면서 의존관계 주입 설정 완료) 4. 의존관계 주입 단계에서 각 Bean Definition을 참고해서 Bean 간의 의존 관계를 설정해준다. 이 때, 생성 방식은 Bean Factory Interface의 구현체인 AnnotationContext로 했기 때문에 Bean Factory Method 방식으로 Bean Definition이 생성되었다. 앞뒤 내용을 조합해보면, 이렇게 될 것 같은데.. 혹시 틀린 부분이 없을지 같이 한번 봐주실 수 있으실까요? 항상 많은 가르침 주셔서 너무 감사합니다.