묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
DTO로 조회시 DTO의 조회 위치는 어디가 되면 좋을까요..?
안녕하세요 강의를 보던 도중 의문이 생겨서 질문남깁니다. Layerd Architecture 에서 Controller, Service, Repository로 역할을 구분해서 레이어당 커플링을 줄이도록 하고 있는 알고 있습니다. 그런데 DTO 의 사용위치 (해당 DTO는 사용자 API)에 대해 궁금한 점이 있습니다. JPA에서 DTO로 조회하면 편하게 데이터를 가져 올수 있는데 해당 DTO가 서비스 혹은 Application Layer에 커플링이 생기는데 이럴 경우는 어떻게 해결해야 될까요..? DTO 자체를 Service DTO, 와 Controller DTO로 분리하여 컨버팅을 해주어야 되는지 아니면 Controller 에서 Repository 를 직접 사용해도 되는 예외상황을 고려해야될지가 고민입니다. 아니면 엔티티를 조회한후 필요한 부분만 DTO로 변환을 하는지 그것도 아니면 Object 객체로 조회한후 Object 안에서 데이터를 추출하는지 어떤 방법을 사용하시는지가 궁금합니다. 보통 이런 경우에는 어떻게 처리하는게 효율적인 방법일까요..? 시스템 개발을 하다가 서비스로 커리어 전환을 하고 있는데 김영한님 강의가 너무 재밌어서 계속 찾아보게 되네요 ㅎ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@Controller , @RequestMapping
안녕하십니까 영한님 ! 제가 잘 이해하고 있는지 , 아닌지에 대해 여쭙고자 질문을 남깁니다. @Controller를 통해 스프링 빈으로 해당 클레스가 등록이 되고 , @RequestMapping에 담긴 논리URL 통해 클라이언트가 전송한 URL과 매칭 여부를 판단해 ( getHandler() ) @Cotroller로 등록된 객체를 반환하여, 그에 맞는 어댑터를 통해 해당되는 Controller을 실행하는게 맞을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Error
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: org.h2.Driver 이런 코드가 뜨면서 계속 오류가 발생해서 test를 해볼 수가 없습니다. 무엇이 문제인가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
종속성 순환에러 질문드립니다....
선생님 안녕하세요! 꾸준히 걸어가고있는 코린입니다.. 혹시 @Component@Transactional@RequiredArgsConstructorstatic class InitService { 이 부분에서 static이 아닌 private으로 봐꿔보면 종속성 순환에러에 걸리는데 static일때는 메모리를 공유하고 private일때는 공유 하지않아서 생기는 문제인가요?
-
미해결스프링 핵심 원리 - 기본편
의존관계 주입 시점
IoC, DI, 그리고 커네이너 강의 질문입니다. DI 설명 중 주입은 런타임 시라고 되어있는데 컴파일 시점 아닌가요?? 컴파일 시점에 이미 다 주입이 되고, 런타임에는 주입된 것을 사용한다고 생각하는데 이해가 좀 안되어서요 ㅜ.ㅜ 컴파일 시점에는 주입은 일어나지 않고, 스프링을 빌드(런타임)할 때, 주입이 일어난다는 의미 일까요??
-
미해결스프링 핵심 원리 - 기본편
혹시 지금까지 제가 이해한 내용이 올바른건지 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 💡 DI (Dependency Injection) - 의존관계 주입 의존하는 객체를 직접 생성하는 것이 아니라, 외부에서 생성한 후 주입하는 것. 3가지 조건이 필요 클래스 모델이나 코드에는 런타임(실행) 시점의 의존관계가 드러나지 않는다. (= 정적인 클래스 의존관계가 아니다)(= 동적인 객체 인스턴스 의존관계이다) => 인터페이스에만 의존하고 있어야 한다 런타임 시점의 의존관계는 외부에서 결정한다 외부에서 실제 구현 객체(사용할 오브젝트에 대한 레퍼런스)를 생성하고 클라이언트(사용할 오브젝트)에 전달(주입)함으로써 의존관계가 연결되는 것이다 예를 들어 private Car myCar = new 벤츠(); => Car가 인터페이스고 벤츠가 구현 객체라면, 런타임 이전에, 즉 코드상으로 벤츠 클래스를 의존하는 것을 알 수 있다 private Car myCar; => 이러면 Car에 대해 무슨 차가 들어올지 알 수 없다.(런타임 시점의 의존관계가 드러나지 않으므로) => 즉 이렇게 인터페이스에만 의존하고 의존관계 주입이 발생할 수 있다. 💡 IoC (Inversion of Control) - 제어의 역전 프로그램의 제어 흐름(ex:메소드나 객체의 호출작업)을 개발자가 결정하는 것이 아니라, 외부에서 결정(관리)하는 것. 즉 객체를 개발자가 Member member = new Member(); 이런식으로 만드는 것이 아니라, 스프링이 스스로 객체를 생성해서, 필요한 곳에 사용할 수 있게 해줌! 1 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); cs 위 코드 단 하나만 실행했을 뿐인데, 우리는 ac.getBean을 통해, 원하는 객체를 사용할 수 있음!!!!! 참고로 DI도 제어의 역전에 포함되는 기술이며, IoC는 좀더 광범위하게 쓰인다! 🧾 부분 정리 스프링은 IoC, DI와 같은 기술을 사용함으로써 자바만으로는 DIP(의존관계 역전 원칙)와 OCP(계방-폐쇠 원칙)을 지켜가며 객체지향적으로 설계하는데 어려움이 있었는데, 이를 해결. 즉 스프링을 사용하면 좋은 객체 지향 애플리케이션을 개발하기 편해지며, 스프링은 이를 도와주는 프레임워크. 스프링이 좋은 객체 지향 애플리케이션을 개발하는데 도움을 주는 프레임워크인 것 처럼, 스프링 부트는 스프링의 기술들을 좀 더 편리하게 사용하는데 도움을 주는 프레임워크. 제가 정리한 내용들인데, 혹시 맞게 이해한건지요.. 너무 어려워서 여러차례 강의 반복하여 들으며 정리했습니다
-
미해결스프링 핵심 원리 - 기본편
@Component는 구현체에만 붙인다?
인터페이스에는 안붙이고 구현체에만 @Component를 붙이는 이유는뭔가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
이 강의에 대한 질문은 아니지만 질문이 있습니다..
안녕하세요 영한 선생님 ! 저는 강의를 듣고있는 선생님의 팬입니다. 다름이 아니라 선생님의 강의력에 이해가 쏙쏙 되고 뿌듯해하며 하루하루 코딩하며 살아가고 있습니다. 하지만 요즘 문득 이런 생각이 자주 듭니다. '내가 저 코드를 혼자 생각하면서 짤 수 있을까?' 라는 생각이요. 어떠한 원리로 동작하는지 머릿속으로는 알겠고 연결이 되는데 혼자서 코딩을 하려면 어디부터 작성해야할지 막막합니다. 이러한 부분은 어떻게 해야 기를 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
rateDiscountPolicy를 DiscountPolicy타입으로하는게 좋다
TestConfig에서 rateDiscountPolicy이 DiscountPolicy타입인데 다른데서 의존할때도 DiscountPolicy에 의존하고 있으니까 DiscountPolicy타입으로 하는게 좋다라고 하셨는데 그게 무슨말인지 잘 모르겠어요.. 예를들어서 설명해주실 수 있나요....?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberForm이 DTO 같은 역할인건가요?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 좋은 강의 감사드립니다! STS 3 을 배운 후 스프링 부트를 배우려고 강의를 듣고있는 학생입니다. STS3에선 DTO 클래스를 생성해 거기에 필요한 데이터 값들을 담는 식으로 진행을 했었는데 이 수업에선 MemberForm 을 사용하는걸 보고 비슷한 역할인지 궁금해서 질문 남깁니다 !
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
멤버 이름 중복 익셉션
회원가입시 멤버 이름 중복으로 가입하면 IllegalStateException 창이 발생하는데 이때 Spring MVC 2편에서 배웠던 예외처리 방법을 통해 다시 홈이나 가입화면으로 넘겨주면 되는건가요? 실무에서는 보통 ID중복확인 같은 버튼을 만들어서 검증된 ID만 회원가입이 되게 하는데 , 그 부분은 백엔드개발자가 신경쓸 부분은 아니고 지금처럼 익셉션을 날리면 되는건지 궁급합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
초보인데요~ 게터 세터 부분에서 궁금한게 있습니다
국비학원에서도 게터세터 이런형태로 하라고 배우긴 했는데요~ 왜 메서드를 써서 해야하는지에 대해서는 잘 이해가 안되더라구요. 예를들어서, "pivate" String name 을 "public" String name 으로 정의하고 Hello hello = new Hello(); hello.name = "hello"; 이렇게 name값을 정하는 것과 setName() 메서드를 이용해서 정하는 것의 차이가 무엇인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
바인딩에러에서 필드오류가 무엇인가요 ?
타임리프에서 사용하는 Field 에서 오류가 났을 때를 말하는건가요 ? 정확히 무엇인지가 궁금합니다. 그리고 지금 타임리프에 관련된 문법이나 명령어 등을 나중에 프론트(html,css,js)를 사용하게 되면 실무에서는 사용하지 않는건가요?
-
미해결스프링 핵심 원리 - 기본편
스프링에서 디자인패턴 적용
안녕하세요? 영한님 강의를 너무나도 잘 듣고, 실무에 적극 활요하며 성장 중인 주니어 개발자입니다. 먼저, 항상 좋은 강의 제공해주셔서 감사합니다. (벌써 3번째 듣는중인 강의입니다!) 다름이 아니라, 최근에 영한님께서 추천해주신 객체지향의 사실과 오해라는 책과, 오브젝트라는 책을 정독했어요. SOLID원칙에 조금 더 자세하고 정확하게 대해서 알게 되었고, 객체를 설계하는 법, 책임주도 설계 등 다양한 객체지향 원칙들을 배우고 학습하였는데 이를 실무에 어떻게 적용해나가야 할지 궁금합니다. Q1. 강의 중 [조회한 빈이 모두 필요할 때, List, Map] 에 나온 내용과 같이, 하위의 구체 타입 클래스들을 모두 Spring Bean으로 등록시키고 애플리케이션 컨텍스트가 실행되는 시점에 의존관계를 맺어주고, 필요한 상황에 따라서 필요한 Bean을 찾아서 알고리즘을 수행하면 되는 걸까요? 강의에서 말씀해주셨던 Strategy 패턴과 같이 다른 디자인 패턴들도 비슷한 방식으로 적용해나가면 될지?에 대한 궁금증이었습니다. Q2. 그렇게 된다면, 특정한 인터페이스를 설계하고 그 인터페이스를 구현하는 객체들은 모두 Spring Bean으로 등록되어야 할 것 같은데 방식이 맞을까요? Q3. 그리고 외부에서 어딘가 협력하는 객체의 구체 타입에 대한 정보를 알고 있고 전달해주어야 하는데, 예를 들어 강의에 나온 것처럼 파라미터에 구체 타입에 대한 문자를 받고 진행한다면 컨트롤러 레이어에서 해당 문자를 전달 해주면 컨트롤러 계층은 호출하는 서비스 계층이 어떤 클래스들과 협력하는지에 대한 정보를 알아야 하므로, 이는 캡슐화가 위반되는 것이 아닌가 싶기도 합니다. 왜 이렇게 생각했는지 말씀드리자면 1) 컨트롤러 계층에서는 Serivce 클래스가 누구와 의존하고 있는지 알아야 합니다. 2) Service 클래스가 의존하는 대상이 추상화여도 그 추상화의 구체 인스턴스의 종류들에 대해서 알고 있어야 합니다. (그래야 원하는 알고리즘을 수행 가능) 3) 캡슐화는 단순히 객체의 내부 상태를 숨기는 것 이상의 의미를 가진다고 생각합니다. 만약 구체 인스턴스의 종류가 삭제된다면 분명 컨트롤러 레이어에서도 변경에 대한 여파가 있을 것 같다는 생각이었습니다. 4) 이를 무시하고도 실무에서는 보통 이런식으로 구현을 많이 하는 편일까요? Q4. 제가 너무 Controller - Service - Repository의 일반적인 MVC 레이어에서 벗어나지 못하는 것이라고 생각이 들기도 했습니다. 일반적으로 대규모 서비스를 운영하는 회사에서도 한 마이크로 서비스 내에서 Controller-Service-Repository 구조를 가져가는지 궁금합니다. 네이밍을 조금 다르게 한다던지, 패키지 구조가 조금 다르다던지.. 그런 내용들이 있을까요? (현재 프로젝트 구조는 멀티 모듈화 시켜서 협력 패턴이 최대한 다른 컨텍스트에서도 재사용 될 수 있도록 프레임워크/라이브러리화 시키면서 설계해보려고 노력 중입니다. 그래도 애플리케이션 모듈은 C-S-R 구조를 벗어나기가 힘든 것 같아요) 작은 스타트업에서 주니어 혼자 끙끙 앓고 있어 답답한 마음에 여기에라도 질문을 올려봅니다. 너무 막연한 질문이라, 답변 주시기 어려울 것 같은 부분이 있다면 답변 안 주셔도 괜찮아요. 강의 제공 받는 것만으로도 저에게는 정말 큰 도움이 돼요 (사실 저도 어떻게 질문할지 막막해서 제가 봐도 어렵네요..) 항상 도움 주셔서 감사합니다 영한님 :)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 수업 실행하는데 이런 오류가 뜹니다.
학습하는 분들께 도움hello-spring 후 실행하면 이렇게 뜹니다... 어떻게 해야 하나요...?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerExceptionResolver 질문입니다.
안녕하세요. MyHandlerExceptionResolver랑 UserHandlerExceptionResolver는 WebConfig에 @Overridepublic void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { resolvers.add(new MyHandlerExceptionResolver()); resolvers.add(new UserHandlerExceptionResolver());} 이렇게 설정해놓으면 예외발생시 무조건 호출되는건가요?? log 찍어서 확인해보니 전부다 호출되는거같아서용..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Member테이블과 조인을 하는 이유가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] Order를 select할 때, 굳이 Member테이블과 조인하는 이유가 궁금합니다. 조인을 하지 않더라도, order를 조회할때, member 테이블로 따로 select문을 써서 값을 가져오고, 만약 fetchType을 LAZY로 할경우 필요할 때 Join쿼리를 추가적으로 날리는 것으로 알고 있습니다. 제가 생각했을 때는, 유일한 예외경우가 "Member가 null값인 Order가 조회되는 경우"인 것 같은데, 이 부분은 Order.createOrder 생성자에서 처리해줄 수 있을 것 같거든요. (혹은 Order의 member컬럼을 not null로 설정하거나) 이유가 궁금합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 시작 hello-spring이 실행이 되지 않아 계속 찾고 있습니다.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 처음으로 수업시간에 말씀하신 hello-spring을 다운 받은 후 Intellij에서 실행하였습니다. Intellij에서는 project SDK : 11로 바꾸어져있구요. Gradle : 11로 바꾸어져 있구요. Build and run using : Intellij IDEA Run tests using : Intellij IDEA로 되어 있습니다. The cache entry for initialization script 'C:\Users\lkc26\AppData\Local\Temp\ijmapper.gradle' appears to be corrupted. 와 java.lang.IllegalStateException: The cache entry for initialization script 'C:\Users\lkc26\AppData\Local\Temp\ijmapper.gradle' appears to be corrupted 계속 이러한 오류가 발생하여 실행하지 못하고 있습니다. 자료를 찾고 있지만 해결을 못하고 있습니다. (삭제 재설치까지 완료해보았습니다.) 도와주세요ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingError
1. 타입 미스매치 에러가 있을 때, 스프링 내부에서도 필드에러를 생성해서 넣어주고, 우리가 만든 컨트롤러 메서드에서도 바인딩에러를 추가해주고 있습니다. BindingError 클래스 계층도로 올라가보니까 에러를 추가하면 리스트에 추가가 되는데 그러면 똑같은 객체에 똑같은 필드에러가 두개 이상 존재하게 됩니다. 위 사진처럼 item의 price 필드에 스프링이 넣은 에러와 우리가 넣은 에러 두개가 존재합니다. 이렇게 될 경우 뭘로 판단하여 스프링이 뿌려주는 것입니까? 우선순위에 따라 정해지는 것인지 아니면 두개 다 중복해서처리하는 것인지 궁금합니다. 2. 같은 줄기의 질문입니다. 필드에러를 생성하는 메서드를 보면 rejectedValue 필드에 Getter함수를 사용하고 있습니다. bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, null, null, "상품 이름은 필수입니다.")); 이 때 getter를 호출해서 rejectedvalue에 넣어주면 null값이 들어갈텐데 어떻게 제대로된 사용자 입력값을 그대로 돌려주는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Autowired 질문드립니다.
Autowired 를 만약 Service에서 하게된다면 Service는 Repository를 DI해야하는것이 통상 개발하는 구조(?) 니까 자동으로 Spring은 Repository를 DI하는것같은 메소드(즉 Autowired) 된 것을 찾고 Autowired된 것들중에 Repository의 Class와 Service에서 Class가 일치하는것들 두개를 자동으로 주입시켜준다고 내부적 프로그래밍이 되어있다고 봐도 무방할까요?