묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
static root 실제 저장 위치
안녕하세요. start.spring.io 를 통해 생성한 프로젝트에는 resources/static 폴더가 존재하는데, 강의에서는 따로 webapp 폴더를 만들어 그곳에 html 파일을 담는데요. resources/static/index.html과 webapp/index.html 을 2 개 모두 만들어 두고, URL=/ 로 접근해 보면 후자가 뜨는 것은 테스트를 통해 확인할 수 있었습니다. webapp/index.html 이 없으면 URL=/ 에 대응해 전자의 페이지가 뜹니다. 즉, webapp이 더 우선하는 것으로 생각됩니다. 질문은 : resources/static 영역이 있는데 강의에서는 왜 굳이 이와 같이 webapp을 따로 만들어 그곳에 html 파일들을 구성하신 것인지요? 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
new-form.jsp 요청시 jsp파일 자체가 다운로드 되어버립니다
이 전까지의 강의는 아무런 문제가 없다가 이번 편에서 아래처럼 URL을 요청했더니 /jsp/members/save.jsp 화면으로 넘어가지 않고 스크린샷 하단에 보시다시피 jsp파일 자체가 다운로드되어버립니다.. 구글링을 해봤는데도 마땅히 해결방법을 모르겠어서 질문남깁니다. 혹시 해결책을 아신다면 답변 부탁드리겠습니다
-
미해결스프링 핵심 원리 - 기본편
Car 인터페이스에 대해 질문이 있습니다
안녕하세요 선생님 귀중한 강의 너무 잘 듣고있습니다 감사합니다. 한 가지 궁금한 점은 예시에서 설명해주신 자동차를 인터페이스로 구현하면 엑셀, 브레이크 등 자동차의 기능적인 측면의 것들이 선언될 것이라고 생각합니다. 기능이 아닌 자동차의 상태적인 측면(색깔, 경유차/휘발유차/전기차, 4륜/후륜 등)을 생각했을 때, 공통적인 속성들을 상속하는 구조가 좋을 것으로 생각하는데 그럼 실제 코드로 구현한다고 하면 Car라는 공통 속성들이 정의된 부모클래스에 엑셀, 브레이크 등이 선언된 인터페이스, 그 외에 다양한 기능들이 정의된 또 다른 인터페이스들이 implements 되고 Car 클래스를 K3, Avante 등의 클래스에서 extends 해서 엑셀, 브레이크 등의 메서드를 오버라이딩 한다고 생각해야 하는건가요 ?? 그런식이라면 애초에 Car를 추상클래스로 선언해야하는건가요 ?? 헷갈리네요. 즉, 인터페이스로 역할을 정의할 때, 속성에 관련된 측면들은 어떻게 처리되어야하는지 궁금합니다. 감사합니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
컨텍스트 스위칭 질문
요청 마다 매번 쓰레드를 생성하는 방식의 단점 중 하나로 컨텍스트 스위칭 비용을 말씀하셨는데요. 컨텍스트 스위칭은 쓰레드 풀을 사용하더라도 똑같이 발생하는 비용 아닌가요? 쓰레드를 미리 만들어 놓는다고 cpu가 다른 스레드로 갈아탈(?) 때 컨텍스트 스위칭이 일어나지 않는 것은 아틸 텐데요. 답변 부탁드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
운영 환경에 올리려면 어떤 환경을 구성해야 되나요?
개발 환경 이후 실제 운영 웹서버에 올리고 실행하려면 어떤 환경을 구성해야 되는지요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 실행 시 생성되는 로그의 DDL문에 대해 질문합니다.
안녕하세요 강사님. 테스트를 실행했을 때 강사님께서는 DDL문이 한 줄마다 줄바꿈되어 나오는데, 저는 한줄로 쭉 연결되어 나옵니다. 사실 별 건 아니지만 가독성이 떨어져서 찾아보기가 약간 힘들게 느껴져서 혹시 설정하는 방법이 있는지 여쭤봅니다 ㅠㅠ 현재 H2 버전을 1.4.199를 깔아 사용하고 있는데 이거때문일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
제대로 이해한 게 맞을까요? + 오타 제보 + setter 추가 질문
수정하려는 엔티티의 키가 10이라고 했을 때, 1. DB에는 아직 수정 전인 엔티티가 들어있음. 이건 영속. 2. Book book = new Book(); 한 후 BookForm의 정보들로 set해줌. 이건 그냥 함수 내에서 new로 만들었을 뿐이니 JPA가 관리하고 있지 않음. 하지만 이 book의 키값인 10은 디비에 저장되어있음. 그래서 이건 준영속. (즉, 10이란 키값을 갖는 엔티티에 대해 영속 엔티티와 준영속 엔티티가 동시에 존재하는 상황.) 3. 여기서 준영속 엔티티 book의 key값으로 검색하여 영속 엔티티 findItem을 가져오고 값을 덮어씌움. 4. 모든 작업 이후에도 book은 여전히 준영속 엔티티이므로 더이상 사용하지 않는 것이 좋음. + 5. 결국 더티체킹 메서드를 직접 만들든, em.merge()를 사용하든 내부적으로는 전부 더티체킹을 사용하여 update하는 것임. (null 업데이트 문제는 제쳐두고) 이런 흐름이 맞나요? merge의 과정보다도 merge 실행 전에 같은 키값의 영속,준영속이 동시에 존재하는 부분이 맞는지가 더 모르겠고 궁금하네요. 감사합니다!ㅡㅡㅡㅡㅡㅡㅡㅡ19:53에서 맨 윗줄에 '재'한적이다 오타 제보드립니다. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ (추가질문) setter를 경계하라는 말씀을 다시 한 번 해주셨는데요. "change()처럼 엔티티에 변경 메서드를 따로 만들면 추적이 쉽다" 라는 말씀에서 이해가 좀 안 가는 부분이 있습니다. setter로 변경을 하더라도 그 setter명으로 역추적하면 변경지점이 어디인지 알 수 있는 것 아닌가요? 혹시 여러 엔티티에서 같은 이름의 멤버변수를 가지는 경우엔 setter이름도 같아져서 찾기 어렵다는 말씀이신가요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
일대N 컬렉션 페치 조인시의 페이징이 '불가능'?
안녕하세요. 영한님은 강의에서 컬렉션 페치 조인으로는 페이징이 불가능하다고 말씀하셨는데요, 빌드와 실행까지는 어쨌든 되니 불가능하다는 표현은 좀 안맞지 않을까요? 다만, 매우 위험하고 의도한 결과를 못낼 수 있기 때문에 사실상 쓰지 않는 것이 좋다 정도로 이해하는 게 적절한 것 같아서 소견을 말씀드리고 여쭙습니다. _ _;; 읽어 주셔서 감사합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요.
안녕하세요, 먼저 정말 기다리던 강의를 드디어 볼 수 있게돼서 감사하다는 말씀을 드립니다! 강의를 따라가던 중 문제가 발생하여 조언을 구하고자 질문을 드립니다. 김영한 팀장님의 기존 인강에서는 [Settings] -> [Build Tools] -> [Gradle] 에서 Build and run using / Run tests using 모두 'IntelliJ IDEA'로 설정 후 강의를 진행하셔서 저도 그렇게 강의를 모두 수강했고 현재 혼자 개발 중인 서비스도 'IntelliJ IDEA' 로 설정해서 진행 중입니다. 이번 스프링 MVC 1편 인강에서는 섹션2 - 프로젝트 생성에서부터 Build and run using 을 'IntelliJ IDEA' 로 설정하면 다음과 같은 에러가 발생하고, Run tests Using 을 'GRADLE'로 설정하면 또 다음과 같은 에러가 발생합니다. [Build and run using - 'IntelliJ IDEA' 설정 후 Application Run 한 상황 ] 2021-03-15 11:16:43.740 INFO 12576 --- [ main] travelbeeee.sec02.Sec02Application : Starting Sec02Application using Java 14.0.2 on DESKTOP-SJ3E1UQ with PID 12576 (C:\Users\HyunSeok\Desktop\studyWithMe\gitHub\studyWithMe\스프링MVC1편\sec02\out\production\classes started by HyunSeok in C:\Users\HyunSeok\Desktop\studyWithMe\gitHub\studyWithMe\스프링MVC1편\sec02) 2021-03-15 11:16:43.744 INFO 12576 --- [ main] travelbeeee.sec02.Sec02Application : No active profile set, falling back to default profiles: default 2021-03-15 11:16:44.376 WARN 12576 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet 2021-03-15 11:16:44.385 INFO 12576 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-03-15 11:16:44.406 ERROR 12576 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:196) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:745) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3] at travelbeeee.sec02.Sec02Application.main(Sec02Application.java:13) ~[classes/:na] Caused by: java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet at org.springframework.boot.web.servlet.WebServletHandler.<init>(WebServletHandler.java:39) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.web.servlet.ServletComponentRegisteringPostProcessor.<clinit>(ServletComponentRegisteringPostProcessor.java:49) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.web.servlet.ServletComponentScanRegistrar$ServletComponentRegisteringPostProcessorBeanDefinition.lambda$getInstanceSupplier$0(ServletComponentScanRegistrar.java:94) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1231) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4] ... 14 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.servlet.annotation.WebServlet at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na] ... 21 common frames omitted Process finished with exit code 1 [ Run tests Using 을 Gradle로 설정 후 Test 를 빌드한 상황 ] > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :compileTestJava UP-TO-DATE > Task :processTestResources NO-SOURCE > Task :testClasses UP-TO-DATE > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Users/HyunSeok/Desktop/studyWithMe/gitHub/studyWithMe/스프링MVC1편/sec02/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 1s 4 actionable tasks: 1 executed, 3 up-to-date 설정을 아래 사진과 같이 바꿔주면 문제가 없어서 당장 수업을 듣는데는 지장이 없지만, 구글링을 해봐도 이유를 알아내기 어려워 조언을 구하고자 질문을 남깁니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSON 형태로 리턴할 때 질문
HelloData 같은 경우는 username과 age 라는 2개의 데이터를 가지고 있어서, dto를 만들어서 반환하는게 맞지만 만약 한 개의 데이터를 json 형식으로 리턴하고 싶을 때는 어떻게 하나요?? 예를들어 username만 리턴하고 싶은 경우에 dto를 만드는 것은 비용적으로 아깝다고 생각이 들어서요
-
미해결스프링 핵심 원리 - 기본편
디자인패턴강의 응원합니다. @@
😄😄😄😄😄
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
null 값 부분에서 오류를 못 찾겠습니다.
안녕하세요~~!! 김영한 선생님!! 강의를 듣다가 해결이 되지 않아서 질문 하나 드리겠습니다. <질문> ItemRepository 부분의 save 메소드 안에 Item.getId() == null이 "Operator '==' cannot be applied to 'long', 'null'"오류 메세지가 나옵니다. 항상 좋은 강의로 보답 해주셔서 감사합니다. 코로나 조심하시고 다음 강의 기대하겠습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
내부 클래스 질문
안녕하세요 선생님! 바쁘신데 이곳저곳 여러번 질문드려 죄송합니다. 강의를 복습하다가 정말 궁금한게 생겨서요.. Request Dto는 인자로 받아야돼서 테스트같은 곳에서 직접 생성해야하 되기 때문에 static으로 선언했고, Response Dto 같은 경우에는 그럴 필요가 없기 때문에 non-static으로 선언했다고 이해했습니다. 그런데 이런 경고가 뜨길래 찾아봤더니 이펙티브 자바에서 메모리 문제나 gc 문제 떄문에 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적멤버 클래스로 만들라고 되어있습니다. 실제 프로젝트나 실무에서는 reponse dto처럼 외부에서 직접 생성할 일이 없어도 static inner class로 선언해야 될까요? 정말 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional을 Service에서 처리하는 이유?
@Transact ional의 사용 이유에 대해서는 이해가 되었습니다만, 왜 굳이 Service에서 그 처리를 해주는지 이유를 모르겠습니다. 개인적인 생각으로는 직접적으로 em을 사용하는 Repository에서 해주는 게 더 적절하지 않을까 싶습니다. Service에서 사용해야만 하는 특별한 이유가 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
@PostConstruct , @PreDestroy
안녕하세요~ 강의내용 중 궁금한점이 있습니다. MyLogger가 http request가 있을때만 생성이되기 때문에, @Component@Scope(value = "request")public class MyLogger Provider 로 먼저 생성시 매핑해준다는 내용은 이해했습니다. 그럼 맨처음 스프링 의존관계 주입이 일어날때도, @PostConstruct init() , @PreoDestroy close() 가 동작해야 될거같은데, 웹에서 요청보내기 전 빌드만 했을때는 해당 로그가 찍히지 않아서요. 해당부분이 궁금합니다~ 항상 감사합니다!
-
해결됨스프링 핵심 원리 - 기본편
인텔리제이 커뮤니티에서 콘솔 색상 입히는 방법
커뮤니티 버전에서도 콘솔에 색상 입히는 방법입니다. 며칠 전에 어떤 수강생 분이 질문하셔서 얼티메이트vs커뮤니티 비교해서 답변 달았었는데 삭제 됐네요 ^^; 공부하다 알게되서 공유합니다 ~ ------------------------------------ application.properties spring.output.ansi.enabled=always ------------------------------------
-
미해결실전! 스프링 데이터 JPA
데이터 중심 테이블 설계와 객체 중심의 테이블 설계
안녕하세요 김영한 스승님. JPA를 공부하다가 갑자기 궁금한게 생겨서 질문드립니다. 객체 중심의 테이블 설계와 데이터 중심의 테이블 설계가 차이점이 어떤것인가요? RDB도 객체처럼 테이블을 만들 수 있는데 그러면 굳이 객체중심으로 테이블을 설계할 필요가 없는거 아닌가요? 이 부분이 너무 헷갈려서 질문드렸습니다...
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Test method 접근제어자 질문드립니다.
안녕하세요. 강의를 듣던 중 테스트 메소드 접근 제어자에 궁금한점이 생겨서 질문드립니다. [회원 리포지토리 테스트] @Test public void save() { ... } [서비스 테스트] @Test void join() { ... } 이전 회원 리포지토리 테스트 코드에서는 위 코드와 같이 public로 선언했었지만, 이번 강의에서 Create Test 단축키로 생성한 테스트 메소드들은 public가 아닌 default로 선언되었습니다. default로 메소드를 선언했을 때 테스트를 수행하는데 문제가 없었는데 강의 코드에서 public으로 메소드를 선언하는 이유는 무엇인가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Optional 사용 방법에 대해서 질문드립니다.
1) Optional<Member> result = memberRepository.findByName(member.getName()); 2) Member result = memberRepository.findByName(member.getName()).get(); 1. 위 코드에서 2번의 방법보다 1번 같은 사용법을 권장한다고 하셨습니다. 1) memberRepository.findByName(member.getName()) .ifPresent( m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); 2) Optional<Member> result = memberRepository.findByName(member.getName()); result.ifPresent( m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); 2. 또한 바로 위의 코드에서도 2번의 방법보다 1번의 방법 사용을 권장한다고 말씀하셨습니다. 위 방법들이 권장되는 이유가 궁금합니다. 또 권장되는 Optional 사용법 같은게 따로 문서로 존재하는건가요?
-
해결됨스프링 핵심 원리 - 기본편
강의 로드맵 관련해서 궁금합니다.
스프링을 처음 시작하는거라 스프링 입문강의를 다 보고나서 <스프링 핵심원리-기본편> 강의를 들으려고 하는중인데 얼마 전에 스프링MVC 1편-백엔드 강의가 오픈되었더라구요. 새로 나온 강의는 이 강의를 듣고 난 후에 수강하면 좋은 강의인가요??