묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
왜 delete 쿼리가 안나가는 걸까요?
Parent class@Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) private List<Child> childList = new ArrayList<>(); public void addChild(Child... childArray) { for (Child child : childArray) { child.setParent(this); childList.add(child); } }Child class@Setter @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "PARENT_ID") private Parent parent;Main 메서드Parent parent = new Parent(); Child child = new Child(); Child child1 = new Child(); parent.addChild(child, child1); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); Child findChild = findParent.getChildList().get(0); em.remove(findChild); tx.commit();Main메서드에서 findParent에서 자식 리스트를 가져와 첫번째 자식을 삭제해도 db에는 여전히 child, child1이 남아있는데 혹시 왜 그런지 알 수 있을까요?
-
미해결실전! Querydsl
resultFetch 테스트 시 em.flush()를 주석했는데도 insert 쿼리가 발생하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요.fetch 테스트 관련해서 제가 맞게 이해한 건지 확인차 질문 드립니다.resultFetch() 테스트를 해봤을 때, before()에서 flush를 주석하고 실행했는데도 insert쿼리가 발생했고, 그 insert 쿼리가 select 쿼리 직전에 실행되는 걸 확인했습니다. 이렇게 되는 이유가, em.persist로 인해 쓰기 지연 저장소에 들어있던 insert 쿼리가 JPQL에 의해 flush 된 거라고 생각이 되는데 맞게 이해한 걸까요? @SpringBootTest @Transactional @Commit class MemberTest { @PersistenceContext EntityManager em; JPAQueryFactory query; @BeforeEach void before() { query = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); Member member1 = new Member("1", 10, teamA); Member member2 = new Member("2", 20, teamA); Member member3 = new Member("3", 30, teamB); Member member4 = new Member("4", 40, teamB); em.persist(teamA); em.persist(teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); // em.flush(); // em.clear(); } @Test void resultFetch() { List<Member> fetch = query.selectFrom(member).fetch(); Member fetchOne = query.selectFrom(member).where(member.id.eq(1L)).fetchOne(); Member fetchFirst = query.selectFrom(member).fetchFirst(); Long totalCount = query.select(member.count()).from(member).fetchOne(); } }2024-01-17T23:34:46.349+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Team */insert into team (name, id) values (?, ?) 2024-01-17T23:34:46.355+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Team */insert into team (name, id) values (?, ?) 2024-01-17T23:34:46.356+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.357+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.358+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.360+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.402+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 2024-01-17T23:34:46.473+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 where member1.id = ?1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 where m1_0.id=? 2024-01-17T23:34:46.477+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 fetch first ? rows only 2024-01-17T23:34:46.512+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select count(member1) from Member member1 */ select count(m1_0.id) from member m1_0
-
미해결Practical Testing: 실용적인 테스트 가이드
스프링 부트 3.x 질문
현재 스프링 부트가 3.x 이상만 지원하고 있는데자바 17 스프링 부트 3.x 최신버전으로 들어도 문제 없을까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
불변객체에 대하여 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 우선 spring 부터 jpa 까지 수업 잘 듣고 있습니다! 명강의 항상 감사합니다. 임베디드 타입 공유 문제에 해결책으로 불변객체를 만들라는 말씀을 하셔서 궁금증이 생겼습니다. 제가 아는 바로는 불변의 의미가 상수의 개념과는 다르다고 알고 있습니다. "변수에 값을 바꿀 수 있냐"는 의미가 아니라 "처음 할당한 메모리 공간에서 값을 재 할당할 수 있느냐" 인걸로 알고 있습니다. 하여 , 아래와 같은 객체는 불변의 객체라고 볼 수 있느냐가 궁금합니다. 혹여라도 아래 객체가 불변 객체가 아니라고 한다면 컬럼이 수십 개인 실무에서는 어떻게 생성자 만으로 가독성 좋은 코드를 만드시는 지가 궁금합니다 ㅠ@GETTER@Embeddableclass Address { private String city; private String street; private String zipcode; Address() { } Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } // 세터 대신 Address changeCity(String city) { return new Address(city, this.street, this.zipcode) }} //사용member.setAddress(member.getAddress().changeCity("seoul"));
-
미해결실전! Querydsl
querydsl이 지원 중단되었다고 들었는데, 계속 사용할 메리트가 있을까요? 궁금해서 여쭤봅니다!
querydsl이 지원 중단되었다고 들었는데, 계속 사용할 메리트가 있을까요? 궁금해서 여쭤봅니다!
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
kakao token 발급 시 에러
안녕하세요 ! 강의 수강 중에 에러난 부분이 해결되지 않아 질문 남깁니다.지금 '카카오 토큰 발급 구현(2) - 토큰 받기' 강의 마지막까지 코드 작성 후 api 실행 했는데결과{"errorCode":"500 INTERNAL_SERVER_ERROR","errorMessage":"Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html]"}로 나오고 있습니다.콘솔창의 에러는feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html] at feign.InvocationContext.proceed(InvocationContext.java:40) ~[feign-core-11.10.jar:na] at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:116) ~[feign-core-11.10.jar:na] at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:89) ~[feign-core-11.10.jar:na] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:141) ~[feign-core-11.10.jar:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na] at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na] at com.sun.proxy.$Proxy109.requestKakaoToken(Unknown Source) ~[na:na] at com.app.web.kakaotoken.controller.KakaoTokenController.loginCallback(KakaoTokenController.java:39) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[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:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.20.jar:5.3.20] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.63.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.20.jar:5.3.20] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.63.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]Caused by: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html] at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:75) ~[spring-cloud-openfeign-core-3.1.8.jar:3.1.8] at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:61) ~[spring-cloud-openfeign-core-3.1.8.jar:3.1.8] at feign.optionals.OptionalDecoder.decode(OptionalDecoder.java:36) ~[feign-core-11.10.jar:na] at feign.InvocationContext.proceed(InvocationContext.java:36) ~[feign-core-11.10.jar:na] ... 57 common frames omitted 코드를 여러 번 봐도 강사님이랑 다른 부분이 없는 거 같아서 여쭤봅니다.감사합니다 !!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2에서 오류가 발생합니다.
MyBatis 버전도 낮춰보고 코드도 비교해보고 했는데 자꾸 Invalid bound statement오류가 발생합니다. 혹시 어떤 게 문제일까요.. 제가 잘 못 찾는 건가요..? 코드 : https://drive.google.com/file/d/14j1mBlyOWm9aELoBGtqbPQ6AAwla6DX5/view?usp=drive_link
-
미해결실전! Querydsl
프로젝션된 DTO의 필드 값으로 정렬이 가능할까요?
data class ShopSimpleResponse( val id: Long, val image: String, val name: String, val address: String, val introduce: String, val minPrice: Int, val checkCoupon: Boolean, ) { constructor(shop: Shop) : this( id = shop.id, image = shop.images[0].imgUrl, name = shop.name, address = shop.address, introduce = shop.introduce, minPrice = shop.products.minByOrNull { it.price }?.price ?: 0, checkCoupon = true ) }코틀린 코드인 점 죄송합니다!해당 DTO를 프로젝션해서 DB에서 바로 Page<ShopSimpleResponse> 로 반환하고 싶은데 아무리 찾아봐도 방법을 찾기 못했습니다....querydsl내에서나 @Query 를 사용해서 구현하는 방법이 있는지 궁금합니다.해당 부분을 엔티티의 필드 값으로 바꾸는 것도 고려하고 있는데, 우선 이 상태에서 해결 가능한 방법이 있는지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
maven vs gradle
springboot로 개발하려는데 gradle로 프로젝트 생성 시에는 META-INF 내에 persistence.xml을 작성하지 않고 @persistencecontext만 작성해도 되는 건가요?? @persistencecontext와 persistence.xml의 차이도 궁금합니다.
-
해결됨실전! 스프링 데이터 JPA
스프링 부트 3 - 하이버네이트 6 left join 최적화 설명 추가
안녕하세요 선생님제가 이해한 것이 맞는지 여쭤보고자 합니다. 제가 이해한 부분은 : 교재의 '여기서 만약 Member 와 Team 을 하나의 SQL로 한번에 조회하고 싶으시다면 JPA가 제공하는 fetch join 을 사용해야 한다. ( fetch join 은 JPA 기본편 참고) ' 이 부분에서 "select m from Member m left join fetch m.team t " 대신 "select m, t from Member m left join m .team t " 을 사용해도 되지 않을까 였습니다. 하지만 생각해보니 지연로딩으로 인해 아직 초기화 되지 않은 Team 엔티티의 Proxy 객체에서 Json Type Exception이 발생할 수 있어 fetch join을 사용하는 것을 추천하시는 것인지 하고 생각하고 있는데, 제가 생각하는 것이 맞나요?
-
미해결코드로 배우는 React with 스프링부트 API서버
테이블이 생성되지 않습니다
spring.datasource.driver-class-name=org.mariadb.jdbc.Driverspring.datasource.url=jdbc:mariadb://localhost:3306/malldbspring.datasource.username=malldbuserspring.datasource.password=malldbuserspring.jpa.hibernate.ddl-auto = updatespring.jpa.properties.hibernate.format_sql = true @Entity @ToString @Getter @Builder // Builder 를 사용하게 되면 아래 2개의 어노테이션도 함께 사용해야함 @AllArgsConstructor @NoArgsConstructor public class ToDo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; private boolean complete; private LocalDate dueDate; } 위처럼 properties 를 작성했는데 ToDo 테이블이 생성되지 않습니다...오류는 전혀 뜨지 않고 있습니다...무엇이 문제인지 잘 모르겠습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Enumerated와 hibernate 타입 검증 관련 해결을 어떻게 해야할지 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요 강의에서 설명해주신 대로 따라하려고 했습니다.단 , ddl-auto : create 대신 미리 SQL 문으로 테이블을 생성해놓고 ddl-auto: validate로 실행시 에러가 납니다. 이는 실제로 배운 것을 사용할 수 없는 아주 치명적인 부분이라고 생각하여 질문을 드립니다. [문제 설명]강의에서 설명해주신대로 위와 같이 Enumerated 를 사용하여 status 를 정의 하였습니다.말씀해주신대로 value = EnumType.STRING을 사용했습니다.UserStatus 는 당연히 enum 타입으로 했구요.@Column(name = "status", length = 32) @Enumerated(value = EnumType.STRING) private UserStatus status;이때 status 가 있는 테이블은 아래와 같은 SQL문으로 생성하였습니다.VARCHAR(255)로 생성한 점을 자세히 봐주세요!dbms: MySQLCREATE TABLE user ( `id` BIGINT NOT NULL AUTO_INCREMENT, `status` VARCHAR(255) NOT NULL check (status in ('CREATED', 'WITHDRAW')), PRIMARY KEY (id) ); 또한 application-yml 에는 아래와 같이 ddl-auto 를 validate 로 하였습니다.jpa: hibernate: ddl-auto: validate properties: hibernate: format_sql: true show-sql: true 하지만 이를 실행하면 아래와 같은 status의 타입 오류 에러가 나옵니다.Schema-validation: wrong column type encountered in column [status] in table [user]; found [varchar (Types#VARCHAR)], but expecting [enum ('created','withdraw') (Types#ENUM)]이는 db의 status 의 타입이 enum 이길 기대했지만 실제로는 VARCHAR이기 때문에 에러가 발생한다는 것입니다. (ddl-auto의 validate에 의해 검증 수행)MySQL에서 타입에 enum을 적용하면 해결되지만 쓰는 것을 최대한 지양해야 한다고 알고 있습니다.따라서 mysql 의 status 컬럼의 타입을 enum 대신 column 타입을 varchar(255)로 두고 사용하려고하는데 위와 같은 에러가 나서 실행이 되지 않습니다.ddl-auto : none 으로 설정하면 임시적으로 실행은 할 수 있지만 validate 로 검증을 항상 진행하려고 합니다. [질문 내용]1. mysql의 타입을 varchar로 두고, ddl-auto: validate 를 사용하면서 에러 없이 실행할 수 있는 방법이 궁금합니다.2. ddl-auto : create로 하게 되면 자동 생성되는 sql문에서는 status에 enum 대신 create table user (id bigint not null,status varchar(255) check (status in ('CREATED', 'WITHDRAW')),primary key (id))위처럼 varchar로 column 속성을 주면서 validate 할때만 에러가 나는것이 이상한 것 같은데 왜 그럴까요?3. 이를 현업에서는 어떻게 해결하고 계신지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 데이터 JPA 적용2 테스트 코드 위치 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해당 강의 테스트 코드 전체가 코드가 안보이던데 첨부된 소스코드에 없는드 싶습니다.강의 영상에는 전체 코드가 생략되어 있다보니 질문 드립니다.감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 왜 저는 v3쿼리가 다르게 나오는 걸까요?
public List<Order> findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .getResultList(); }이렇게 똑같이 했는데도 select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id조인이 이상하게 되고 있습니다@Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>();@Id @GeneratedValue @Column(name = "delivery_id") private Long id; @JsonIgnore @OneToOne(mappedBy = "delivery") private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; //READY, COMP잘못 연관 관계를 잘못 설정한걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
QueryDSL 도입후 개발 방향을 궁금해서 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.보통 QueryDSL과 Spring Data JPA를 같이 도입하게 되는데 여기서 궁금한점이 있습니다.QueryDSL을 도입하게 되면, 모든 DB관련 쿼리는 querydsl만 사용하나요?? 아니면 Spring data jpa도 혼용하시나요? 아니면 querydsl은 동적쿼리만 위한것인지? 혼용한다면 어떤 시기에 querydsl과 spring data jpa을 쓰는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
순수 객체 상태를 고려해서 항상 양쪽에 값을 설정 질문입니다.
Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); team.getMembers().add(member); //** //연관관계의 주인에 값 설정 member.setTeam(team); //** em.persist(member); 여기서 team.getMembers().add(member); 이것과member.setTeam(team); 이것이서로 순서가 바뀌어도 아무런 상관이없나요??둘의 차이가 아예없는걸까요?
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
아직 초반부분인데 질문이있습니다.
제가 타임리프말고 Vue를 사용하려고합니다 그리고 시큐리티를 사용하려고하는데 해당 강좌에 시큐리티가 없는건지요?궁금한게 시큐리티를 적용안하고 보통 프로젝트를 만드나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. https://drive.google.com/file/d/1o6p8SoEIhKZASTIlAnHRlSmc5F4gkK6s/view?usp=drive_link persistence부분과 h2버전 설정하는 부분에서 에러가 발생했는데 방법을 모르겠습니다.이것떄문인지 h2에 들어가서 연결시켜도Unsupported database file version or invalid file header in file "C:/Users/PC/jpashop.mv.db" [90048-224] 90048/90048 (도움말)라는 에러가 뜹니다.
-
미해결코드로 배우는 React with 스프링부트 API서버
챕터 3 임의로 URL에 size 값을 변경한 후 다른 페이지로 이동하면 size가 기본값 10으로 돌아갑니다.
안녕하세요 강사님 강의 수강중인 학생입니다. 일단 코드는 강의 내용이나 올려주신 부분하고 다른 점은 없는 것 같은데 원래 이렇게 되는 것인가요? page=1&size=1을 주면 글 하나씩 페이지가 생기는데 그 상태에서 페이지 번호 버튼을 눌러서 다른 페이지로 이동하면 size 파라미터 값이 기본값 10으로 돌아가네요 localhost:3000/todo/list?page=1&size=1인 상태에서 페이지 번호 2번 버튼을 눌러서 이동하면localhost:3000/todo/list?page=2&size=1이렇게 되어야 하는 것 아닌가요?localhost:3000/todo/list?page=2&size=10이렇게 되어버립니다. 코드를 계속 살펴보고 동작 방식을 생각해보니 클라이언트 쪽 코드상에서 page와 size값이 변하는 것을 받아변수에 저장하는 부분은 페이지 번호 버튼을 눌렀을때 useCustomMove의 size 변수와 sizeNum 변수인데 버튼을 통한 변화없이 임의로 URL에서 size를 바꾸고 페이지 번호 버튼을 누르면 저장된 size값은 10 그대로이기 때문에 그렇게 되는 것이 아닐까라는 추측을 해봅니다. size는 변동을 딱히 고려하지 않는 파라미터일 수도 있는데 여러가지로 궁금해져서 이런저런 시도를 해보다보니 의문이 생겼었네요. 실제로 웹개발을 할때 페이지를 나누는 경우 한 페이지의 size값은 변동이 없는 파라미터인가요? 기준을 정하기 위함인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 주인과 변경감지 그리고 cascade
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]강의 14분 26초에서 Order의 cancel() 메서드 내부에 OrderStatus 변경은 변경 감지로 변경되는것을 이해하고 있습니다. 그리고 for loop 내부에서 public void cancel() { if (delivery.getStatus() == COMPLETE) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다"); } this.setStatus(CANCEL); for (OrderItem orderItem : orderItems) { orderItem.cancel(); } }orderItem.cancel() 메서드가 호출되고 있습니다. orderItem.cancel()에서는 item 엔티티를 변경하고 있는데 // 비즈니스 로직 public void cancel() { getItem().addStock(count); }궁금한 점은 item 엔티티가 변경이 가능한것은 orderItem이 FK를 갖고 있는 연관관계의 주인이기 때문인가요? 만약 item이 아닌 orderItem의 필드가 변경된다면 변경 감지가 가능할까요? orderItem이 order의 FK를 가지고 있고 반대로 Order는 orderItem의 FK갖지 않기 때문에 읽기만 가능한걸로 알고 있습니다. 질문이 좀 복잡해졌네요. 정리하자면 Q1. order.cancel() 메서드 내부에서 orderItem.cance() 메서드를 호출합니다. 만약 orderItem.cancel()이 orderItem의 필드롤 수정한다면 DB에 반영이 될까요? 지금까지 배운내용이라면 연관관계의 주인이 OrderItem이기 때문에 읽기만 가능하다고 배웠습니다. Q2. 질문 1 상황에서 order 필드의 OrderItems에 cascade all이 붙어있다면 order에서 OrderItem을 수정이 가능할까요? Q3. 만약 질문 1에서 읽기만 가능한게 맞다면 Order.cancel()이 orderItem.cancel()을 호출하고 차례로 item 엔티티를 수정하는 경우order -> orderItem은 읽기만 가능하지만 orderItem -> item은 수정이 가능한 연관관계의 주인이기때문에 타고타고 넘어가서 수정이 가능한걸까요?