묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
dto 변환 로직의 위치
requestDto 나 responseDto 를 변환하는 로직은 어디에 위치하는게 좋을까요? 애플리케이션이 복잡해지면 저런 변환 로직들이 컨트롤러에 있게 되면 컨트롤러가 너무 복잡해 질거 같은데 어디에 있는게 좋을까요? 그리고 dto 변환을 서비스 계층해도 해되 되는것인지도 궁금합니다. 서비스 계층에서는 dto 에서 엔티티로 변환된 객체만 받아야 하는 것인지 그럼 서비스 계층에서는 리턴 타입을 dto 로 해야 하는지 아니면 엔티티를 그대로 리턴해주고 컨트롤러에서 변환을 해야하는지... 엔티티와 dto 를 나눠야 하는 이유와 필요성에는 공감을 하지만 그 변환 로직의 위치는 어디로 해야 할지 기준이 잘 서지 않는것 같습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
질문드립니다
학습중 강의 설정대로 war, java11, 디펜던시 웹, 롬북 설정후 따라하는데 "C:\Program Files\Java\jdk-11.0.10_windows-x64_bin\jdk-11.0.10\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=52700:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath C:\servlet_re\servlet_re\out\production\classes;C:\servlet_re\servlet_re\out\production\resources;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-web\2.5.2\9d68318f6607728e253030aa145e529bae9b0883\spring-boot-starter-web-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-json\2.5.2\6af2e2d4fcf02fcda700dbbcd4643e78d31bcc8c\spring-boot-starter-json-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.5.2\5aa5345f60cd3fbca331c05015e0700553448d66\spring-boot-starter-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-webmvc\5.3.8\2cfa5e12bf103e2c82db78ce198e455dab456465\spring-webmvc-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-web\5.3.8\daa288e67b0f2e09a033500d5ce8406677c5045c\spring-web-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jsr310\2.12.3\f69c636438dcf19c49960c1fe8901320ab85f989\jackson-datatype-jsr310-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.module\jackson-module-parameter-names\2.12.3\592a882beaf1bd57b8fe960b937a2706b090b4d7\jackson-module-parameter-names-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jdk8\2.12.3\77424ea087313312e308dae5ff8445608aabb5e1\jackson-datatype-jdk8-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-databind\2.12.3\d6153f8fc60c479ab0f9efb35c034526436a4953\jackson-databind-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.5.2\aa924c5d0d375f4b2b66f211704c24d40a7e647b\spring-boot-autoconfigure-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.5.2\bd6dc87b5ad870dbf635d0c7d9a3006666c9e797\spring-boot-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.5.2\8b94a1e350f68f8c3a7de6460e5691a84c8c157d\spring-boot-starter-logging-2.5.2.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.8\da9b87dacaa5bbf80fad0f7b483988372a00a152\spring-core-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.28\7cae037c3014350c923776548e71c9feb7a69259\snakeyaml-1.28.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.8\c367a05423e963c222e38a6a88b97d44de3880ca\spring-context-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.8\1377f80f938b1fc7eabe9e6c4f6895e77e3bec40\spring-aop-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.8\3d66fed1eebfcd119efcabc6218c813700a21ed\spring-beans-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.8\8a14547b76cbae3aeb02739e5b38e71835a6bbd8\spring-expression-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-annotations\2.12.3\7275513412694a1aafd08c0287f48469fa0e6e17\jackson-annotations-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-core\2.12.3\deb23fe2a7f2b773e18ced2b50d4acc1df8fa366\jackson-core-2.12.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.3\7c4f3c474fb2c041d8028740440937705ebb473a\logback-classic-1.2.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.14.1\ce8a86a3f50a4304749828ce68e7478cafbc8039\log4j-to-slf4j-2.14.1.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.31\f9ff62d83a25a94c1619de06d4015e2797bc849c\jul-to-slf4j-1.7.31.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.8\a143c8618eb2be8674c3cf132d9a5c953bb5488\spring-jcl-5.3.8.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.3\864344400c3d4d92dfeb0a305dc87d953677c03c\logback-core-1.2.3.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.31\9545c9cb71de4c18d97a91e32ef0be6f3f6661b7\slf4j-api-1.7.31.jar;C:\Users\kcj30\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.14.1\cd8858fbbde69f46bce8db1152c18a43328aae78\log4j-api-2.14.1.jar hello.servlet_re.ServletReApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.5.2) 2021-07-05 18:59:15.929 INFO 9308 --- [ main] hello.servlet_re.ServletReApplication : Starting ServletReApplication using Java 11.0.10 on DESKTOP-S0IEC1P with PID 9308 (C:\servlet_re\servlet_re\out\production\classes started by kcj30 in C:\servlet_re\servlet_re) 2021-07-05 18:59:15.934 INFO 9308 --- [ main] hello.servlet_re.ServletReApplication : No active profile set, falling back to default profiles: default 2021-07-05 18:59:16.510 WARN 9308 --- [ 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-07-05 18:59:16.516 INFO 9308 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-07-05 18:59:16.539 ERROR 9308 --- [ 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.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:196) ~[spring-context-5.3.8.jar:5.3.8] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.8.jar:5.3.8] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.8.jar:5.3.8] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.2.jar:2.5.2] at hello.servlet_re.ServletReApplication.main(ServletReApplication.java:14) ~[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.5.2.jar:2.5.2] at org.springframework.boot.web.servlet.ServletComponentRegisteringPostProcessor.<clinit>(ServletComponentRegisteringPostProcessor.java:49) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.boot.web.servlet.ServletComponentScanRegistrar$ServletComponentRegisteringPostProcessorBeanDefinition.lambda$getInstanceSupplier$0(ServletComponentScanRegistrar.java:94) ~[spring-boot-2.5.2.jar:2.5.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1231) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.8.jar:5.3.8] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.8.jar:5.3.8] ... 13 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.servlet.annotation.WebServlet at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[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:521) ~[na:na] ... 20 common frames omitted Process finished with exit code 1 이런 오류가 발생했습니다 왜 이런거죠??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿에 대해서 질문있습니다!
서블릿이 싱글톤으로 하나만 생성된다는 것은 알겠는데 만약 url로 /hello, /spring 이렇게 다르게 요청이 올 경우는 싱글톤 서블릿 2개 가 생성된다고 보면 되나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
변경된 테스트에서 MemberRepository를 주입받는 코드의 용도
안녕하세요! 강의에서 기존 테스트를 통합 테스트로 변경하면서 생성자 주입 코드가 필드 주입 코드로 변경되었는데요 @Autowired MemberService memberService;@Autowired MemberRepository memberRepository; 필드 주입으로 변경한 후 MemberRepository를 Autowired 받는 부분은 주석 처리를 해도 테스트 코드가 정상적으로 수행되더라고요 @Autowired MemberService memberService;// @Autowired MemberRepository memberRepository; 생각을 해보니 MemberService를 Autowired할 수 있다는 건 MemberService 빈이 이미 생성되어 있다는 거고 MemberService 빈이 생성되려면 MemberService 생성자의 매개변수로 받을 MemberRepository가 필요하기 때문에 MemberRepository 빈도 이미 생성되어 있다는 거고 결국 MemberRepository 빈을 전달하면서 MemberService 빈을 생성했기 때문에 이후부터는 필드 주입이든 생성자 주입이든 MemberService를 Autowired하기 위해 MemberRepository가 함께 쓰이지 않아도 될 것 같더라고요 혹시 아니라면 MemberRepository를 주입받는 코드의 용도가 따로 있는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
AfterEach와 BeforeEach
memberRepository의 clearStore() 함수를 매 테스트 이전마다 호출해주는 BeforeEach나 매번 테스트가 끝날 때마다 호출해주는 AfterEach나 현재 테스트가 다음 테스트에 영향을 안미치도록 한다는 점에서 동일하기 때문에 뭘 쓰든 상관이 없을거 같은데 현업에서는 어떤 경우에 AfterEach를 사용하고 어떤 경우에 BeforeEach를 사용하나요?? 테스트 마다 동적 할당(BeforeEach)하고 해제(AfterEach) 할 때 일까요..?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DI 적용해보기!
안녕하세요! 수업 너무 재밌게 잘 듣고 있습니다. 수업 중에 FrontController에서 어댑터들을 DI로 적용할 수 있다고 하셔서, 좀 더 잘 이해하기 위해서 한번 해보려고 하였습니다! public FrontControllerServletV5(Map<String, Object> handlerMappingMap, List<MyHandlerAdapter> handlerAdapters) { initHandlerMappingMap(handlerMappingMap); initHandlerAdapters(handlerAdapters); } 코드를 돌리기 전에 생각해보니, 이런 식으로 파라메터를 입력받는 방법이 존재하지 않는다고 생각했습니다. V5에서 어떤 방식으로 DI를 구현하면 될까요?? 어떤 방식으로 접근해야할지 모르겠어서 질문드립니다! 감사합니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메소드
강사님 항상 좋은 강의 감사합니다! 연관관계 편의 메소드에 내부에 set과 add , get이 각각 들어갈때가 다르길때 혹시 어떤 경우일때 set이고 get인지 알고 싶습니다. 제가 생각했을때는 1) member엔티티와 order 엔티티 간 setMember메소드에서 member는 다대일 중 '다'이므로 setMember 메서드를 만들어야 했던건가요? 2) 마찬가지로 그렇다면 order와 orderItem 사이에서 orderItem은 일대다 의 '일' 이므로 addOrderItem()메서드가 생성되었다 생각을 했는데 그렇게 따지니 setDelivery() 메서드가 이해가 가지 않습니다. 일대일의 관계로 '일'에 위치해 addDelivery()인가 싶기도 하였으나 그렇지 않더라고요 ㅠㅠ 3) setDelivery()메서드는 set으로 시작하는 setMember() 메서드와 같은 방식으로 작성하는 것인가 했는데 메서드 내부에서는 this.delivery = delivery; //배송지 설정delivery.setOrder(this); 이렇게 set메서드와 add메서드가 섞여있는 것 같은데 이해가 많이 부족한 것 같습니다.. 혹시 이에 관해서 답변해주실 수 있을까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ModelAttribute가 한 개가 아닐 경우에는 어떻게 하나요?
콘트롤러에 @ModelAttribute Item item, BindingResult bindingResult 이렇게 연속적으로 매개변수를 설정해줘야 한다. bindingResult에 넣어주게 되는 Error 객체들이 @ModelAttribute의 필드들과 자동 맵핑되기 때문이다, 라고 이해했습니다. 그럼 두개의 ModelAttribute가 들어가는 경우 addItem ( @ModelAttribute Item item1, BindingResult bindingResult1, @ModelAttribute Item item2, BindingResult bindingResult2 ) 이렇게 설정해줘야 하는지요? 어라 그럼 템플릿에서 errors객체는 BindingResult bindingResult1, BindingResult bindingResult2 이 둘중에 뭐가 되는거지... 같은 의문이 들어서 질문드려봅니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
localhost 오류
안녕하세요 선생님 지금까지 실행은 잘 되다가 크롬에서 http://localhost:8080 이 안되서 어제 application.properties 에 server.port=8082 로 변경하여 잘나왔었는데 또 무언가를 잘 못건드렸는지 사이트에 연결할 수 없음 localhost에서 연결을 거부했습니다. 다음 방법을 시도해 보세요. 연결 확인 프록시 및 방화벽 확인 ERR_CONNECTION_REFUSED 이렇게 나옵니다. 포트 번호를 다른것으로 바꿔도 위와 같이 나오는데 이유가 무엇인가요??
-
미해결스프링 핵심 원리 - 기본편
프로토타입 빈을 생성할 때 DL
안녕하세요 강의 잘 듣고 있습니다~! 빈(또는 클래스?)을 사용할 때마다 프로토타입 빈을 새로 생성하고자할 때 Provider의 DL을 이용해서 컨테이너에서 해당하는 빈을 찾는다고 하셨는데요~! 실제로 결과를 출력해보면 새로운 프로토타입 빈을 반환하는 것을 알 수 있었습니다. Provider가 새로운 프로토타입 빈을 "생성"해주는 것 같은 느낌인데 어떻게 DL(Dependency Lookup) "조회" 개념으로 설명되는지 잘 모르겠습니다. 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
select 조회 성능 관련 질문
1. 일반 db에서 select * from 보다 select 칼럼명 from 보통 후자의 방법으로 원하는 칼럼들만 부르는 게 성능 면에서 더 뛰어난 게 아닌지 궁금합니다. 2. 복잡한 테이블에서 전체 칼럼의 갯수가 20~30개가 넘어가면 fetch join 방식보다 DTO로 직접 조회하시는 방법을 쓰시는지 궁금합니다. (fetch join으로 해도 성능이 원하는 만큼 안 나올때 DTO로 직접 조회 하시는건가요?) 3. JPA 관점에서 복잡한 테이블이나, 컬렉션 조회는 강좌에서처럼 최적화를 할 수 있지만. 일반 테이블 jpa에서는 보통 전체 엔티티를 불러올 수 밖에 없던데 1)전체 엔티티를 조회했을 때와 2)원하는 칼럼들만 조회했을 때의 성능차이가 미비한지 궁금합니다. 4. spring data jpa에서 Projections로 원하는 칼럼만 조회할 수 있던데 실무에서는 엔티티가 한 개이면서도 단순할 때 성능을 위해 많이 사용하시는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
아무리 해도 연결이 안되네요ㅠㅠ
Database "C:/Users/NOTE/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 윈도우 쓰고 있습니다. 비슷한 문제 있으신 분들이 올려준 질문 글이랑 답변도 보고 따라해보는데 계속 이 오류가 떠서 연결이 안됩니다.. 이거 때문에 진도를 못나가고 있네요.. 어떻게 해야할까요ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@WebServlet의 name을 지정해 줬는데 언제 사용하나요?
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param") requestParamServlet 은 언제 사용되어 지나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
질문드립니다.
강의중에 궁금한게 생겨서 질문남깁니다. 현재 3년동안 개발을 하면서 ConcurrentHashMap을 사용하지 않고 모든코드를 HashMap으로 처리하였습니다. 물론 실제 고객들이 사용하는 서비스개발 회사가 아니라 주로 금융권 SI프로젝트들 중에서도 고객내부직원들이 쓰는 업무를 주로 개발해서 트래픽이 많이 몰리진 않았거든요. 제가 경험했던 프로젝트들이 여러개의 쓰레드가 접근하지 않아서 HashMap으로도 무리없이 프로젝트가 진행되었던 걸로 생각하면 될까요?? 반대로 트래픽이 몰리는 서비스개발회사에서는 ConcurrentHashMap을 사용하면 되는건가요??
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스태틱 클래스 이런식으로 만들어도 되나요?
미리 사용할 정보들 미리 저장해둔다는건 맨날 생각만 해보고 해보진 않아서 강의듣고 억지로 만들어 보았습니다. 이런식으로 만들어도 문제가 없을까요? 작동은 잘되는거 같습니다. @Data@AllArgsConstructorpublic class DeliveryCode { private String code; private String displayName; public static class DeliveryCodes{ private static List<DeliveryCode> deliveryCodes = new ArrayList<>(); static { deliveryCodes.add(new DeliveryCode("FAST", "빠른 배송")); deliveryCodes.add(new DeliveryCode("NORMAL", "일반 배송")); deliveryCodes.add(new DeliveryCode("SLOW", "느린 배송")); } public static List<DeliveryCode> getDeliveryCodes() { return deliveryCodes; } }}
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
체크여부에 관계 없이 value값이 항상 true로 되어 있는 이유가 궁금합니다.
로그를 찍어보니까 체크를 해제하면 false로 들어오는게 보이는데 페이지 소스를 보면 value가 항상 true로 되어 있더라구요. <input type="checkbox" id="open" class="form-check-input" disabled name="open" value="true" /> html상에서 checked가 있느냐 없느냐에 따라 체크 여부를 렌더링하는 것까지는 이해했는데 true라는 값이 어디에서 나오는 것인지 궁금합니다. (1) 체크가 되면 open: true 전송 (2) 체크가 안되면 open값 자체가 전송이 안되니 value가 true여도 문제없음 이기 때문에 서버에 있는 value값을 무시하고 value="true"를 디폴트값으로 렌더링하면서 서버상의 true, false값은 checked 태그로만 확인하는 건가요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
item.getOpen()이 안되는 경우
혹시 저와 같은 문제를 겪으실 분들을 위해 제가 잠깐동안 삽질한 경험을 남깁니다. 강의를 쭉 듣던 도중에 로그를 찍는데 item.getOpen()이 안되는 상황을 겪었습니다. 그런데 item.setOpen()은 됐거든요. 찾아보니까 문제는 Item 클래스에서 open을 primitive타입인 boolean으로 선언했기 때문이었습니다. 롬복으로 게터세터를 적용할 경우 primitive boolean의 게터명명규칙이 getSomething이 아니라 isSomething입니다. 따라서 item.isOpen()을 입력해야 에러가 없습니다. 그럼 어떻게 영한님은 isOpen이 아니라 getOpen이 되었는가? 다시 잘 살펴보니 boolean이 아니라 참조형인 Boolean을 사용하셨습니다....ㅜ null값 때문인 것 같습니다. 참조형이니까 롬복이 getOpen을 생성합니다. 생각없이 따라치다가 이런 일을 겪네요. 집중해서 열심히 듣겠습니다. 혹시 이 글을 보게된 여러분 화이팅..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메소드 질문입니다.
어떤 엔티티 클래스에 작성해야하나요? Order에 ManyToOne으로 묶여있는 member OneToMany로 묶여있는 OrderItems 둘다 작성이 돼 있어서 어떤 규칙으로 어떤 엔티티 클래스에 작성해야 하는지 궁금합니다.,
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
th:action
이 부분을 생략안하고 사용하면 상품등록 버튼을 클릭하면 500에러가 나오는데, 왜 그런지 알 수 있을까요? 그림의 빨간색박스 부분도 th:action을 생략했을 때와, 생략하지 않았을 때 동일합니다.ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Exception 질문입니다.
안녕하세요 영한님, 매번 강의를 보고 커뮤니티 게시판에서 다른분들의 질문을 보고 저도 모르는걸 새로 배워가고있는데요 질문글 중 ====================================== 실무에서 보면 throw new xxxxException을 했을 경우 이를 호출하는 메서드에 뻘겋게 throw하거나 try catch하라고해서 똑같이 throw해주거나 했던거같은데... MemberService는 왜 이런게 없을까요? ============================== 라는 내용에서 질문이 있습니다. 구글링으로 checked와 unchecked의 차이에 대해서 알아보았습니다. 다만 checked는트랜잭션에서 롤백이 안되고 unchecked는 롤백이 된다고 하는걸 알았습니다. 여기서 궁금한게 있습니다. 강의 18:17에 validateDuplicateMember 매소드 내에서 if(!findMember.isEmpty() 일 경우 uncheck 예외를 던지게 됩니다. 같은 Unchecked인 IndexOutOfBoundException의 경우 배열의 크기를 잘못 접근하면 try catch로 묶지 않았을 경우 프로그램이 종료가 되더라구요, 하지만 RunTimeException을 상속받는 IllegalStateException은 따로 try catch문으로 잡아주지 않아도 프로그램이 종료되지 않고 예외가 발생하면 이미 존재하는 회원입니다. 라는 로그를 볼 수있습니다. 스프링 내부 어디선가 throw new IllegalStateException을 받아주는것인가요? 받는다면 어디서 받아주는 것인가요? 감사합니다.