묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka connect 실행 에러가 발생합니다..
강사님이 제공하기 파일로 진행하고 있었습니다..\bin\windows\connect-distributed.bat . \etc\kafka\connect-distributed.properties위의 명령어로 kafka connect을 실행하려하는데 아래와 같은 에러가 발생합니다.log4j:ERROR Could not read configuration file from URL [file:C:/Work/confluent-7.3.1/config/connect-log4j.properties].java.io.FileNotFoundException: C:\Work\confluent-7.3.1\config\connect-log4j.properties (지정된 경로를 찾을 수 없습니다)at java.base/java.io.FileInputStream.open0(Native Method)at java.base/java.io.FileInputStream.open(FileInputStream.java:219)at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)at java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86)at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184)at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557)at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:504)at org.apache.log4j.LogManager.<clinit>(LogManager.java:119)at org.slf4j.impl.Reload4jLoggerFactory.<init>(Reload4jLoggerFactory.java:67)at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388)at org.apache.kafka.connect.cli.ConnectDistributed.<clinit>(ConnectDistributed.java:59)log4j:ERROR Ignoring configuration file [file:C:/Work/confluent-7.3.1/config/connect-log4j.properties].log4j:WARN No appenders could be found for logger (org.apache.kafka.connect.runtime.WorkerInfo).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.log4j 가 없다는거 같은데 어떻게 해결할지 알려주시면 감사하겠습니다..
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
[31강]오류를 찾아 내지 못하겠습니다.
2023-04-29 16:04:35.522 ERROR 19256 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException] with root causejava.lang.IllegalArgumentException: null at java.base/java.util.Optional.orElseThrow(Optional.java:403) ~[na:na] at com.group.libraryapp.service.book.BookService.loanBook(BookService.java:36) ~[main/:na] at com.group.libraryapp.service.book.BookService$$FastClassBySpringCGLIB$$9fdbff4c.invoke(<generated>) ~[main/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.24.jar:5.3.24] at com.group.libraryapp.service.book.BookService$$EnhancerBySpringCGLIB$$fffb0d80.loanBook(<generated>) ~[main/:na] at com.group.libraryapp.controller.book.BookController.loanBook(BookController.java:25) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) ~[tomcat-embed-core-9.0.70.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.70.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at java.base/java.lang.Thread.run(Thread.java:831) ~[na:na]항상 좋은 답변해주셔서 감사합니다. 하루동안 오류를 찾아내는데 못 찾겠습니다....ㅠ 도와주세요
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
@Transactional 에 따른 변경감지 작동여부 질문
안녕하세요! 먼저 좋은 강의 감사하다는 말씀 드립니닷!개인 프로젝트 수행 중에, 변경 감지와 관련한 이슈를 발견해서 질문드립니다.물론 개인 프로젝트 관련한 질문은 안 받아주시는 것을 충분히 숙지하고 있지만, 개념적인(?) 내용이라 혹시 도움 받을 수 있을까 싶어 질문드립니다. (사실 아무리 생각해봐도 모르겠습니다..ㅠㅠ)상황한 트랜잭션 안에서, 엔티티 객체를 만들고 이를 영속성 컨텍스트에 올려 id 값을 받아와 이 id 값을 가지고 해시값을 만들어 해당 해시값을 다시 엔티티 객체에 할당하려 합니다.문제문제는 위 작업을 수행하는 메소드의 @Transactional 위치에 따라 변경감지가 될 때가 있고 안 될 때가 있다는 점입니다.위 쪽의 create(ShortUrlCreateRequest request) 메서드를 호출하여 아래에 오버로딩된 create(String originUrl, Period expirationPeriod) 를 통해 위에 서술한 작업을 하려합니다. (Repository 객체는 Data Jpa Repository를 사용하고 있습니다.)create(ShortUrlCreateRequest request) 를 호출하면,아래의 create(String originUrl, Period expirationPeriod) 메서드에 @Transactional 을 붙였음에도 아래와 같이 insert 문만 호출됩니다.이번에는 위의 create() 에 @Transactionl 붙였을 때 입니다. insert 문과 update 문 모두 의도한 대로 호출되는 것을 확인할 수가 있습니다. 트랜잭션 진입 시점이 다른 것인데 왜 이에 따라 변경감지 가 일어나고/ 안 일어나는 지 감을 잡지 못하겠습니다. 일말의 힌트를 주실 수 있을까요?항상 영한님과 서포터님들께 감사드립니닷!!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
postman 대신 insomnia 사용 가능할까요?
기존에 insomnia를 사용했었는데, 혹시 postman 대신 insomnia를 이용해도 무관할까요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
BookRepository 위치
혹시 BookRepository를 domain/book 아래에 만드신 이유가 있으신가요?? BookRepository이니까 repository/book 아래 만드는게 나중에 찾을 때도 편할거 같고 좀더 직관적인 거같아서 질문드립니다.
-
미해결실전! 스프링 데이터 JPA
뭘 사용할지 선택에 있어서 질문입니다.
EntityManger를 주입받는 방법으로private final EntityManager em;이렇게 선언하고 @RequiredArgsConstructor로 받을 수도 있고, 이번 강의에서처럼 @PersistenceContext로 받을 수도 있는데 각각의 차이점이 무엇인가요 ? public long count() { return em.createQuery("select count(m) from Member m", Long.class) .getSingleResult(); }또 여기서 메소드 선언문에는 long 타입을 반환타입으로 설정했는데 createQuery의 2번째 파라미터로는 Long값을 주는데 어떤 이유인지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
@GeneratedValue에 관한 질문입니다.
member = Member(id=3, username=member1, age=10)-> member.getTeam() = Team(id=1, name=teamA)member = Member(id=4, username=member2, age=20)-> member.getTeam() = Team(id=1, name=teamA)member = Member(id=5, username=member3, age=30)-> member.getTeam() = Team(id=2, name=teamB)member = Member(id=6, username=member4, age=40)-> member.getTeam() = Team(id=2, name=teamB) Team을 먼저 persist 했기때문에 team의 id가 1,2가 됐고, 그 뒤에 순차적으로 member의 id가 3,4,5,6이 된 건가요 ? Team은 Team대로, Member는 Member대로 각 엔티티마다 id를 사용하는게 낫지 않나요? 실무에서는 어떤지 궁금하고, 만약 실무에서는 각 엔티티마다 id값을 공유한다면 강의에서는 모든 엔티티가 같은 id값을 공유하는지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
'Spring Boot를 이용한 RESTful Web Services 개발' 강의와의 연관성
안녕하세요, 제 질문은 아래와 같습니다. '강의를 시작하며' 수업에서 본 강의는 'Spring Boot를 이용한 RESTful Web Services 개발' 강의의 후속 강의라고 말씀해주셨습니다. 기존에 Rest API를 알고 있음에도, 'Spring Boot를 이용한 RESTful Web Services 개발' 강의를 먼저 들어야만 할까요? 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
key store 패스워드의 암호화 필요성
DB 패스워드를 암호화하기 위해 key-store를 생성하게 되는데여기에서도 key-store의 패스워드가 yml 설정파일에 존재하게 되는 것으로 이해했습니다.key-store의 패스워드는 암호화 하지 않아도 되는건지 헷갈려서 질문드립니다.만약 암호화가 필요하다면 DB 패스워드를 암호화 하기 위한 key-store의 패스워드를 암호화 하기위한 key-store..... 이런식으로 무한루프가 돌 것 같은데 실무 환경에서는 어떻게 사용하고 있는지 궁금합니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
로그인 테스트 관련해서 간단한 질문
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.안녕하세요 호돌맨님.다름이 아니라 호돌맨님 영상 9:30쯤에서 Login DTO에 대한 @NoArgsConstructor가 없는데도 테스트가 정상 작동되는 모습이 보입니다.저는 반대로 NoArgsConstructor가 없이 실행하니 생성자를 만들고 테스트를 실행하라고 빌드내용이 떴습니다.이에 대해서 제가 놓치고 있는 부분이 있는가 싶습니다.자바 버전 이슈인가, 롬복 버전 이슈인가 고민이 드네요https://github.com/uiurihappy/blog.ybchar.dev/commit/e5ee816f3b3a3c05dabb586caee0ddfb9fc471a6 해당 커밋입니다.
-
미해결더 자바, 코드를 조작하는 다양한 방법
어노테이션 프로세서 활용 예와 관련해 질문 있습니다.
'마무리' 한 강 남았네요.덕분에 많이 배우고 많이 성장한 것 같습니다.그런데, 어노테이션 프로세서 활용과 관련해서,, QueryDSL 사용 시 생성되는 엔티티의 Q파일도 어노테이션 프로세서를 활용한 기술인지 궁금합니다.짐작으로는 맡긴 한데, 관련 언급이 없었어서요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
No tests found for given includes: [ooo.ooo.oooTests](--tests filter)
테스트 도중No tests found for given includes: [ooo.ooo.oooTests](--tests filter)intellij ide 사용중인데 해당 에러가 뜹니다.해결방안으로 settin -> Run test using -> Gradle에서 intelliJ IDEA로 변경하면테스트 케이스가 잘 작동하는데요.이유가 무엇인가요??인텔리제이는 왜 실행이 되고그레들로는 실행이 안되는지도 궁금합니다. 스프링 부트 2.7.10gradle 2.6.1java 11버전입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JOIN FETCH와 1차 캐시 질문드립니다.
JOIN FETCH를 이용하여 쿼리를 작성하고 테스트 해보던 중에 이해가지 않는 동작이 발견되어 질문드려요!JOIN FETCH로 채우려는 필드가, 1차 캐시에 엔티티가 이미 존재할 때에, 해당 필드가 null 이 되는 현상입니다.오히려 영속성 컨텍스트를 비워주면 프록시를 가져오는 것 같습니다... 어떻게 동작하는 건지 질문 드립니다!테스트 메서드를 간단하게 작성하며 생성 및 조회를 하나의 트랜잭션에서 진행했습니다.엔티티는 간략하게 다음과 같습니다.@Entity public class Collection { @Id @GeneratedValue private Long id; @OneToMany(fetch = FetchType.LAZY, mappedBy = "collection", cascade = CascadeType.ALL, orphanRemoval = true) private List<ReviewInCollection> reviews = new ArrayList<>(); // ... } @Entity public class ReviewInCollection { @Id @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "COLL_ID") private Collection collection; @Id @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "REV_ID") private Review review; // ... } @Entity public class Review { @Id @GeneratedValue @Column(name = "REV_ID") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PLACE_ID", nullable = false) private Place place; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MEMBER_ID", nullable = false) private Member member; // ... } 문제가 발생한 코드입니다. @Test void updateReviewsTest() { final SessionImplementor session = em.unwrap(SessionImplementor.class); final PersistenceContext pc = session.getPersistenceContext(); // mock up //!=========================================================================================!// em.flush(); // em.clear(); Collection coll = em.createQuery( "select c from Collection c " + "join fetch c.reviews cr " + "join fetch cr.review r where c.id = :collId ", Collection.class) .setParameter("collId", 1L) .getSingleResult(); coll.getReviews() // ReviewInCollection .stream() .map(cr -> cr.getReview() // Review → NPE .getId() ) .toList(); } Cannot invoke "com._2cha.demo.review.domain.Review.getId()" because the return value of "com._2cha.demo.collection.domain.ReviewInCollection.getReview()" is null java.lang.NullPointerException: Cannot invoke "com._2cha.demo.review.domain.Review.getId()" because the return value of "com._2cha.demo.collection.domain.ReviewInCollection.getReview()" is nullJOIN FETCH 를 통해 Collection.reviewsReviewInCollection.review를 채워 오고자 했는데,Collection → for each ReveiwInCollection → review 가 null 로 채워지게 됩니다.> 쿼리 이전의 영속성 컨텍스트입니다.> 쿼리 이후 영속성 컨텍스트입니다. 주석 처리한 em.clear() 를 실행하면, null이 아닌 프록시로 가져와서 LAZY 방식으로 Review를 채웁니다. LAZY 또한 예상한 동작이 아니긴 하나, 일단 왜 null이 들어가는지가 가장 궁금합니다... 영속성 컨텍스트와 JOIN FETCH의 충돌이 있는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
11분 쯤에 프록시 관련하여 질문입니다.
지연 로딩을 사용하면 그 객체를 사용할 때 프록시 객체에서 영속성 컨텍스트에 연결을 요청해서 진짜 객체를 가져오는 거로 알고 있는데요이번에는 단순히 Order만 Return 했기 때문에 Order객체 안에 있는 프록시 객체(Member, Delivery, OrderItems)는 사용할 일이 없는 것 아닌가요 ?왜 프록시 객체를 사용하려다 문제가 발생했는지 알 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
오류발생
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.똑같이 했는데 저부분이 오류가 발생합니Cannot resolve method 'hasText' in 'StringUtils'이렇게 나옵니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct 사용 전 데이터 뻥튀기 현상이 일어나지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님과 코드를 똑같이 작성했는데 distinct를 사용하기 전에도 데이터 뻥튀기 없이 올바르게 데이터가 나옵니다. 제가 어떤 부분을 잘못한 건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
format_sql 안됨
server: port: 80 spring: jpa: hibernate: ddl-auto: none properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace logging: level: org: hibernate: persister: entity: debug 디비연동은 잘해놨습니다. 그런데 로그가 정리가 안되네요..format_sql: true 이게 안먹는것같습니다.ㅠㅠ 버전은 2.6.0 인데 버전문제일까요?
-
미해결실전! 스프링 데이터 JPA
createQuery
public List<Member> findByPage(int age, int offset, int limit){ return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); }em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class)아래처럼 끝에 반환하는 클래스 타입을 적어줘야 된다고 기억을 하는데 위에 코드 처럼 적어주지 않아도 정상적으로 작동을 하더라구요? 반면에public long totalCount(int age){ return em.createQuery("select count(m) from Member m where m.age = :age") .setParameter("age", age) .getSingleResult(); }totalCount 의 경우 클래스 타입을 안적어주면 바로 빤갈줄이 그어지는데 반환하는 클래스 타입이 생략이 가능한 경우도 있는건가요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
8:41 질문
@PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } 파라미터로 들어온 값으로 UpdateMemberResponse를 만들어주지 않고 memberService.findOne을 통해 하는 이유가 있을까요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
무결성 제약조건이 위배되는 경우에 대한 예외처리에 대해 질문드립니다
안녕하세요 강사님. Kotlin + JPA에 대해 마땅히 질문남길 곳이 없어서 질문드리게 되었습니다😅 Book 엔티티에서 name을 유니크 키로 지정해서 중복된 값을 설정하려고 하면 아래처럼IllegalArgumentException을 던져주게 하는 코드를 작성하고자 했습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }그런데 JPA의 영속성 컨텍스트로 인해 @Transactional이 붙은 메소드에서 DataIntegrityViolationException를 처리해주기 위해선 flush()를 직접 호출해서 쿼리를 실행시켜야 한다는 것을 알게되어 아래와 같이 코드를 수정했고, 테스트 코드에서 정상적으로 IllegalArgumentException이 처리되는 것을 확인할 수 있었습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) bookRepository.flush() } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }이렇게 코드를 작성해놓고 보니 하나의 메소드에서만 이렇게 무결성 제약조건 위배에 대한 처리를 한다면 상관이 없겠지만 여러 메소드에서 무결성 제약조건을 위배하는 경우에 대해 각기 다른 메시지를 담은 예외를 던지게 된다면 중복 코드가 너무 많이 발생할 것 같다는 생각이 들더라구요. 이런 경우에 아래처럼 확장함수와 람다를 사용해서 예외 처리를 해도 괜찮을까요?inline fun <reified T, ID, R> JpaRepository<T, ID>.flushOrThrow(exception: Throwable, block: JpaRepository<T, ID>.() -> R): R { try { val result = block() flush() return result } catch (e: DataIntegrityViolationException) { throw exception } }@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) bookRepository.flushOrThrow(IllegalArgumentException("이미 등록된 도서입니다.")) { save(book) } }이런 방법을 썼을 때 코드가 너무 복잡해지진 않을지, 협업을 하는 경우에 문제가 되진 않을지, 이런 경우가 발생하면 다른 분들은 어떤 방법을 사용하시는지 고민되어 질문 남깁니다!🙏