안녕하세요 문의사항이 있어 질문드립니다. 일반적인 controller, service, repository layer 아키텍처를 구성할때, answer controller의 특정 api가 파라미터를 통해 question 도메인의 id를 전달받은 경우가 있습니다. answer controller는 question 엔티티를 controller에서 찾아 전달할 수도 있고, answer repository에 그대로 question Id를 전달하여 answer service가 question 엔티티를 찾도록 위임할 수도 있습니다. 이때 어떤 방법을 선택하는 것이 더 객체지향이나 유지보수 측면에서 좋을지 조언을 얻고 싶습니다. 예상되는 장단점은 다음과 같습니다. Controller에서 questionId를 그대로 전달할 경우 장점 Controller의 코드가 복잡해지지 않고 web 계층 에만 집중할 수 있음 단점 service 계층에서 많은 일을 해야 함 controller에서 Question 엔티티를 조회하여 전달할 경우 장점 service 인터페이스가 깔끔해짐 단점 controller가 조금 더 복잡해진다. question 엔티티를 조회하는 것이, 과연 controller의 역할인지 의문
영상속에서는 핸들러 매핑 우선순위가 @RequestMapping @Component로 스프링 빈 이름으로 핸들러 찾는다 라고 적혀있는데 핸들러 매핑이 컨트롤러를 찾는 개념 아닌가요? 찾은 핸들러를 어댑터에서 가능한지 확인하고 핸들러 호출 이라고 생각했는데 @RequestMapping은 단독으로 쓰면 매핑이 안되니까 핸들러 매핑이 아닌 다른거 아닌가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] response객체를 받는 경우에 sendRedirect를 사용하는 건가요?아니면 doFilter()가 반환타입이 void기 때문에 이렇게 해주는건가요??둘을 사용하는 경우의 차이를 자세히 알고 싶습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 김영한 선생님께서는 부트스트랩 css 파일을 직접 다운로드 받아서 static/css/bootstrap.min.css 경로로 css 파일을 위치시켰습니다. 하지만 부트스트랩 가이드를 보던 중 css는 위 사진과 같이 <link> 태그를 프로젝트 내 코드에 위치시켜서 href경로에 CDN링크를 지정한다면 자동으로 적용되는 것을 알 수 있었습니다. js 또한 <script> 태그를 배치시키고 src에 cdn 링크를 지정하면 자동 적용이 가능하였습니다. 즉 파일을 다운받지 않고 링크를 통해 부트스트랩 css에 접근이 가능하다는 사실을 알 수 있었습니다 따라서 어떤 이유로 선생님께서 프로젝트 내에 직접 파일을 다운받아서 배치시키셨는지 궁금합니다 !
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요! 강의 잘 듣고 있습니다. @Tansactional 어노테이션을 붙이면 private 메서드들에도 해당 어노테이션이 적용되는 건가요? 이 질문을 하는 이유는 join 메서드 안에서 validateDuplicateMember 메서드를 사용하고 있고 join은 @Transactional이 걸려있는 상태인데 이럴 경우에 어떤 게 적용되는지 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 5. 열거형 - ENUM.pdf 의 p.18 에 SLIVER 오타가 있습니다. SLIVER -> SILVER 로 변경되어야 할 것 같습니다.
plugins { id 'java' id 'war' id 'org.springframework.boot' version '3.2.5' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } 에러사항 Web Facets/Artifacts will not be configured properly groovy.lang.MissingPropertyException: Could not get unknown property 'archiveName' for task ':bootWar' of type org.springframework.boot.gradle.tasks.bundling.BootWar. at org.gradle.internal.metaobject.AbstractDynamicObject.getMissingProperty( AbstractDynamicObject.java:85 ) at org.gradle.internal.metaobject.AbstractDynamicObject.getProperty( AbstractDynamicObject.java:62 ) 코드를 치지도 않았고 강의 : 서블릿 프로젝트 생성 이부분만 따라했더니 위와 같은에러가 나옵니다. 어떻게 해결해야 하나요? 제가 실행을 누르지 않았고 그래들이 자동으로 실행하면서 위와 같은 메세지가 나왔습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. https://drive.google.com/file/d/1QfiDY489T4IrB7HkpCKxXqszfbUoTl9N/view?usp=drive_link 테스트시 이런 오류가 뜨는데 어디부분이 잘못됬는지 잘 모르겠습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. https://drive.google.com/file/d/10lDsYlqHbOkkPpEJtsSIOiDwBK9qwJD4/view?usp=drive_link member.getName()부분에서 오류가 뜨는데 잘 모르겠습니다 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의에서 테스트 코드 작성 중 MemoryMemberRepository에 clearStore()를 추가해주셨는데, 해당 메소드는 실제 실행시에는 사용되지 않고 테스트할때만 사용하는 메소드인 건가요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. [질문 내용] 강의 보면서 똑같이 따라써도 계속 오류가납니다 (@RequestParam("name")String name, Model model) 이것도 써봤는데 안되어서 혹시 몰라 required=false로해봐도 안됩니다.. 어느게 문제인지 모르겠습니다 ㅠ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] @NotBlank , @NotNull와 같은 Bean Validation 관련 어노테이션을 통해 검증할 경우 동적으로 파라메터를 지정해서 메시지를 처리할 수는 없는 것인가요? 예를 들어 Bean Validation으로 메시지를 지정할 땐 @NotBlank("값은 필수여야합니다.")와 같이 기본 메시지를 지정하던가 혹은 error.properties 와 같은 메시지 코드 관리하는 properties 파일에서 NotBlank=값은 필수여야합니다. 와 같이 메시지 코드를 통하여 메시지를 지정할 수 있는데 이때 {0} , {1}을 넣음으로써 동적으로 파라메터를 지정해서 바인딩하는 방법을 모르겠어서 여쭤봅니다 !
강의 다 보고 코드 복습하고 있는데 Repository 테스트를 진행한 걸 보고 의문점이 들었습니다. 처음에 Jdbc, Jpa 등 DB 연결을 하지 않았을 때는 아래처럼 메소드 구현하고 테스트 한 것으로 이해했습니다. (1) DB와 연동되어있지 않은 클래스 테스트 ( in-memory-database(IMDB)) MemberRepository -> MemoryMemberRepository 구현 -> MemoryMemberRepositoryTest 테스트 그렇다면 만약 Jpa를 구현하게 된다면 어떻게 테스트를 진행해야 할지 궁금합니다. Jpa를 사용하는 Repository인 경우 별개로 IMDB에서만 단위/통합 테스트를 진행하는 것이 좋을까요? 테스트를 어떻게 해야할지 생각해봤는데 (1), (2) 둘 중에 어느 방안으로 진행해야 할까요? (2) Jpa로 구현되어있는 클래스 테스트 MemberRepository -> JpaMemberRepository 구현 -> JpaMemberRepositoryTest 테스트 그리고 Repository로 단위 테스트 진행 후, 통합 테스트도 진행이 필요한지 궁금 합니다.
현재 HTTP 요청 데이터 - 개요를 듣고 있습니다. 강의 초반부인데 ServletApplication 실행이 아래의 오류는 아닌데 서버가 띄어지지 않고 바로 종료가 됩니다 2024-04-19T15:53:01.823+09:00 INFO 17800 --- [servlet] [ main] hello.servlet.ServletApplication : Starting ServletApplication using Java 17.0.10 with PID 17800 (C:\Users\uniti\OneDrive\바탕 화면\Developer\Back End\Spring\core\mvc1\servlet\servlet\out\production\classes started by uniti in C:\Users\uniti\OneDrive\바탕 화면\Developer\Back End\Spring\core\mvc1\servlet\servlet) 2024-04-19T15:53:01.830+09:00 INFO 17800 --- [servlet] [ main] hello.servlet.ServletApplication : No active profile set, falling back to 1 default profile: "default" 2024-04-19T15:53:03.289+09:00 WARN 17800 --- [servlet] [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Instantiation of supplied bean failed 2024-04-19T15:53:03.309+09:00 INFO 17800 --- [servlet] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-04-19T15:53:03.364+09:00 ERROR 17800 --- [servlet] [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Instantiation of supplied bean failed at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1223) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:202) ~[spring-context-6.1.6.jar:6.1.6] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:788) ~[spring-context-6.1.6.jar:6.1.6] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606) ~[spring-context-6.1.6.jar:6.1.6] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.5.jar:3.2.5] at hello.servlet.ServletApplication.main(ServletApplication.java:12) ~[classes/:na] Caused by: java.lang.NoClassDefFoundError: jakarta/servlet/annotation/WebServlet at org.springframework.boot.web.servlet.WebServletHandler.<init>(WebServletHandler.java:39) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.web.servlet.ServletComponentRegisteringPostProcessor.<clinit>(ServletComponentRegisteringPostProcessor.java:62) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.web.servlet.ServletComponentScanRegistrar$ServletComponentRegisteringPostProcessorBeanDefinition.lambda$getInstanceSupplier$0(ServletComponentScanRegistrar.java:94) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainInstanceFromSupplier(AbstractAutowireCapableBeanFactory.java:1257) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:951) ~[spring-beans-6.1.6.jar:6.1.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1217) ~[spring-beans-6.1.6.jar:6.1.6] ... 16 common frames omitted Caused by: java.lang.ClassNotFoundException: jakarta.servlet.annotation.WebServlet at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] ... 22 common frames omitted
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 2. 서블릿 pdf 파일에서 HTTP 요청 메시지 로그로 확인하기 부분에 logging.level.org.apache.coyote.http11=debug 라고 되어 있어요 근데 스프링 3 버전부터는 debug가 아니라 trace로 해야 적용이 되더라구요 그 부분 추가해주시면 다른 분들한테 도움될 거 같아요!
ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
혹시나해서 LoginService 클래스에서 using BusinessLayer.DTO 추가했는데도 인식을 못하네여.. 또한 ILoginService도 인식을 못하던데, 중간에 누겟설치와 참조 관계 때문에 그런건지? 여쭤봅니다. 수정) 다시보니, DTO 클래스에서 네임스페이스 바꾸지 않아서 인식을 못했던거네여.... 강의에서 네임스페이스를 안바꾼 이유가 있나요?