묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
connect-distributed.bat 오류
안녕하세요. 윈도우 환경에서 강의를 듣던 중에 막히는 부분이 있어서요. PS C:\Users\hoirias\confluent-6.1.0> .\bin\windows\connect-distributed.bat .\etc\kafka\connect-distributed.properties Error: Could not find or load main class org.apache.kafka.connect.cli.ConnectDistributedCaused by: java.lang.ClassNotFoundException: org.apache.kafka.connect.cli.ConnectDistributed 아직 properties 파일 등을 수정하진 않은 상태인데요, 강의를 보면 수정 전에도 돌아는 가야 하는걸로 보여서요. 자바 버전은 현재 18.0.1.1을 사용하고 있으며, 컨플루언트 doc 참조하여 11.0.4까지 낮췄는데도 동일한 현상 입니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
GenerationType.SEQUENCE 전략
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 그 GenerationType.SEQUENCE 전략 일때 allocationSize를 지정하면 DB에 key값(id)을 얻기위해 디비에 매번 쿼리를 날리는게 아닌 일정 개수마다 쿼리를 날리기에 최적화가 된다고 하셨고, 그 원리는 메모리를 이용하기 떄문이다라고 하셨습니다. (질문1) 여기서 만약에 어플리케이션이 이중화가 되어있으면, 메모리를 이용한 key값(id) 설정이 조금 이상해질것 같기도한데, 이 부분에 대해서 이상이 없나요? (질문2) 이상이 없다면, 어떻게 처리하는지 알 수 있을까요?
-
해결됨스프링과 JPA 기반 웹 애플리케이션 개발
패스워드 수정 테스트 시 현재 인증된 사용자의 email, nickname 값을 mockMvc Parameter로 전달하는 방법에 대한 질문입니다.
안녕하세요. 이 질문은 이전에 제가 등록했던 https://www.inflearn.com/questions/595640와 연관지어 질문드립니다. '입력값 정상' 케이스의 패스워드 수정 테스트 코드를 아래와 같이 작성해 보았습니다. 위 코드에서 @WithAccount(value = "henu") 어노테이션을 통해 'value 값'을 통해 닉네임과 이메일(value + "@email.com")로 회원 정보를 생성하고, 이를 SecurityContext에 Authentication으로 넣어줌으로써 MockMvc에서도 인증된 사용자 정보를 자동으로 PasswordForm 클래스에 바인딩 시켜 패스워드 수정(POST)이 되었으면 합니다. 하지만 기대한 것과 달리 email, nickname 파라미터를 직접 설정해주지 않으면 테스트가 실패하는 상황입니다. 패스워드 수정(POST)은 View에 있는 Form을 통해 입력된 값들이 요청을 통해 넘어오면서 처리되지만, 테스트 코드에서는 아무리 인증된 사용자를 만들어 준다고 하더라도 실제로 요청 Parameter에서는 email과 nickname값이 누락된체 넘어가기 때문에 실패하는게 당연한 것이다라고 생각이 들었습니다. 결국 이 테스트가 실패한 원인은 패스워드 수정 시 '현재 패스워드' 와 '현재 인증된 회원의 DB에 저장된 패스워드'를 검사하는 로직을 포함시켰기 때문에 인 것 같은데요. 이런 상황에서도 테스트 코드를 성공시킬 방법이 있는지 조언 부탁드리겠습니다. 미리 답변 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberForm의 패키징 위치?
강의 초반부에 MemberForm객체를 domain 패키지가 아닌 controller 패키지에 생성하시는 이유가 MemberForm 객체의 주 사용 클래스가 controller여서가 맞는지 궁금합니다..!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
질문이 하나 있습니다
api gate way 서버에서 refresh를 해도 모든 서버에 다 적용이 되는건가요 ? 가령 ecommerce.yml파일에서 토큰 정보를 바꿨는데 api gate way 서버 api로 refresh를 해도 유저 서비스에 token도 바뀌는 건가요? 강의에서는 그렇게 나오긴했는데 맞는지 확시히 잘 몰라서 질문드립니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 매핑에 대해서 궁금한점이 있어서 질문드립니다.
안녕하세요. 연관관계 매핑에 있어서 일대다, 다대일, 다대다 관계를 정하는 기준이 따로 있는지가 궁금합니다. 예를 들어서, 제 생각에는 회원 - 주문이 관계에서 볼때 회원은 한번의 주문을 하므로 1:1 관계 주문 - 상품의 관계에서 볼때 여러 상품이 한번 주문되므로 1:n관계라고 생각됩니다. 그러면 member, order, orderItem, item 에서 member - order = 1:1 order - orderItem = 1:n orderItem - item = n:1 의 관계가 되는 것이라고 생각됩니다. 근데 현재가지의 수업 내용으로 볼 때에 member - order = 1:n order - orderItem = 1:n orderItem - item = n:1 으로 보고있는거 같은데 맞을까요??
-
해결됨스프링과 JPA 기반 웹 애플리케이션 개발
패스워드 수정 시 '현재 패스워드'를 추가로 인증시키는 방법에 대한 질문입니다.
안녕하세요. '패스워드 수정' 강의와 해당 강의에 등록된 질문(https://www.inflearn.com/questions/302863)을 통해 회원의 패스워드 수정 시 '현재 패스워드'를 추가로 인증시키도록 코드를 변경하던 중 옳바른 개발 방법(?)에 대해 질문드립니다. 우선 패스워드 변경 View에서 '현재 패스워드'를 입력할 수 있도록 'input[type="password"]' 태그를 추가하고, PasswordForm(DTO 역할) 클래스에 'oldPassword'라는 프로퍼티를 추가했습니다. 이후 제가 하고자 하는 것은 패스워드 변경 유효성 검사를 하기 위해 생성했었던 PasswordFormValidator 클래스에서 View에서 입력받은 '현재 패스워드 값'과 'DB에 저장된 회원의 현재 패스워드 값'을 비교하여 일치하지 않는다면 Custom한 Error 메시지를 View로 전달해주고 싶은 상황입니다. 여기서 고민되는 것은 '패스워드 변경 Form' 요청 핸들러 메소드에서는 현재 인증된 회원 정보를 Model에 담아주고 있기 때문에 View쪽에 'input[type="hidden"]' 태그를 추가한 뒤 회원의 이메일, 닉네임 값을 설정하고 패스워드 변경 요청 시 PasswordForm 클래스에 그 값이 바인딩 될 수 있도록 아래와 같이 이메일, 닉네임 프로퍼티를 추가하여 PasswordFormValidator 클래스에서 DB에 저장된 회원의 현재 패스워드 값을 비교해서 틀린 경우 Error를 생성해 줄 것인가 아니면 이를 Validator가 아닌 '패스워드 변경 비즈니스 로직'에서 할 것인가입니다. 만약, 비즈니스 로직에서 현재 비밀번호에 대한 유효성 검증을 진행하는 경우 PasswordForm 클래스에 굳이 필요 없는 email, nickname 프로퍼티를 추가하지 않아도 되는데요. 이 두가지 방법 중 어떤 경우가 좀 더 효율적인지, 제가 생각하지 못한 방법이 또 있는지(비슷한 상황들에 대한 노하우) 조언 부탁드리겠습니다. 미리 답변 감사합니다. 아래는 PasswordFormValidator을 통해 현재 패스워드 유효성 검사를 진행할 경우에 대한 예시 코드입니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
grouping과 Collectors.toList의 차이가 무엇이고 emtrySet()은 무슨 기능인가요?
grouping과 Collectors.toList의 차이가 무엇이고 emtrySet()은 무슨 기능인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
생성자 에러 발생합니다.
안녕하세요. 잘 작동하고 있는데, 클래스명부분에 빨간줄과 함께 에러 문구가 뜨더라구요. 혹시 무시해도 되는 에러인지 궁금해서 질문드립니다. 아래에 소스코드, 발생에러, 테이블 생성 여부 올렸습니다. - 에러코드: Class 'Order' should have [public, protected] no-arg constructor - Order 코드: @Entity@Table(name="ORDERS")public class Order { @Getter @Setter @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ORDER_ID") private Long id; @Getter @Setter @Column(name="MEMBER_ID") private Long memberId; @Getter @Setter @Transient private int discountPrice; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) @Getter @Setter private OrderStatus status; public Order(Long memberId, Integer discountPrice) { this.memberId = memberId; this.discountPrice = discountPrice; } @Override public String toString() { return "Order{" + "memberId=" + memberId + ", discountPrice=" + discountPrice + '}'; }}- Orders Table log
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요. flush 관련 질문드립니다
안녕하세요 만약 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 insert 문이 5개가 있는 상태에서 flush 한다면 5번의 insert sql과 1번의 커밋으로 총 6번을 데이터베이스와 통신하는 건가요? 아니면 5개 전부 한꺼번에 날리고 + 1번의 커밋으로 총 2번을 데이터베이스와 통신하는 건가요? (아니면 JDBC 의 SQL 배치 기능을 이용해야만 총 6번의 통신을 2번의 통신으로 줄일 수 있는 건가요?) 감사합니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원과 주문의 양방향 연관관계가 실무에서는 주문이 회원을 참조하는 것으로 충분하다면
아무래도 회원과 주문이 존재한다면 주문 내역 조회같은 로직이 거의 포함된다고 생각합니다! 이럴 때는 양방향 매핑 관계를 통해 조회하는 것이 좋은지, 아니면 주문 테이블에서 member.getId()로 select 쿼리문을 날려서 조회하는 것이 좋은지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate:drop table member if exists 오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이렇게 오류가 발생합니다! "C:\Program Files\Java\jdk-11.0.14\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.jar=59490:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\하늬하루\OneDrive - SangMyung University\바탕 화면\이 찬\스프링\JPA\ex1hellojpa\target\classes;C:\Users\하늬하루\.m2\repository\org\hibernate\hibernate-entitymanager\5.3.10.Final\hibernate-entitymanager-5.3.10.Final.jar;C:\Users\하늬하루\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\하늬하루\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\하늬하루\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\하늬하루\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\하늬하루\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\하늬하루\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\하늬하루\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\하늬하루\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\하늬하루\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\하늬하루\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\하늬하루\.m2\repository\net\bytebuddy\byte-buddy\1.9.5\byte-buddy-1.9.5.jar;C:\Users\하늬하루\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\1.1.1.Final\jboss-transaction-api_1.2_spec-1.1.1.Final.jar;C:\Users\하늬하루\.m2\repository\com\h2database\h2\2.1.212\h2-2.1.212.jar;C:\Users\하늬하루\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar" hellojpa.JpaMain7월 14, 2022 12:51:28 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...]7월 14, 2022 12:51:28 오후 org.hibernate.Version logVersionINFO: HHH000412: Hibernate Core {5.3.10.Final}7월 14, 2022 12:51:28 오후 org.hibernate.cfg.Environment <clinit>INFO: HHH000206: hibernate.properties not found7월 14, 2022 12:51:28 오후 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>INFO: HCANN000001: Hibernate Commons Annotations {5.0.4.Final}7월 14, 2022 12:51:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)7월 14, 2022 12:51:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/test]7월 14, 2022 12:51:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {user=sa}7월 14, 2022 12:51:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false7월 14, 2022 12:51:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH000115: Hibernate connection pool size: 20 (min=1)7월 14, 2022 12:51:29 오후 org.hibernate.dialect.Dialect <init>INFO: HHH000400: Using dialect: org.hibernate.dialect.H2DialectHibernate: drop table Member if existsHibernate: create table Member ( id bigint not null, name varchar(255), primary key (id) )7월 14, 2022 12:51:29 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@523d6bdb] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.7월 14, 2022 12:51:29 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@74294c1a] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.7월 14, 2022 12:51:29 오후 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSourcesINFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@7479b626'7월 14, 2022 12:51:30 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]7월 14, 2022 12:51:30 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections closeERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:h2:tcp://localhost/~/test
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
gradle 로 수업을 따라했을 때 문제가 발생해 질문남깁니다.
안녕하세요. gradle로 실습을 진행하다가 Entity 경로를 찾지 못하는 문제가 발생해서 질문 드립니다. 주제는 다음과 같습니다. persist 로 영속성 컨텍스트에 저장하려고 하는데 에러를 따라가보니 Entity 경로를 못찾는 에러가 발생했습니다. 그래서 persistence.xml 에 <class> 태그로 경로를 설정해줌으로써 에러는 해결되었습니다. 그런데 질문사항은 다음과 같습니다. 이렇게 해결하는 방식이 맞는 해결 방식일까요? gradle로 진행시 application.properties로 설정하는 방식을 사용하는게 나을까요?? <?xml version="1.0" encoding="UTF-8" ?><persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> <persistence-unit name="5xik"> <class>xik.ShoppingMall.Domain.Member</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpashop"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <!--property name="hibernate.id.new_generator_mappings" value="true"/--> </properties> </persistence-unit></persistence>package xik.ShoppingMall;import lombok.Getter;import lombok.Setter;import org.junit.jupiter.api.Test;import xik.ShoppingMall.Domain.Member;import javax.persistence.*;public class JpaTest{ @Test void JpaTest() { // 엔티티 팩토리 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("5xik"); // 엔티티 매니저 생성 EntityManager em = emf.createEntityManager(); // 트랜잭션 객체 생성 EntityTransaction tx = em.getTransaction(); tx.begin(); Member membertest = new Member(); //membertest.setId(1L); membertest.setName("parksung"); membertest.setPhoneNumber("01074724537"); em.persist(membertest); try{ Member findMember = em.find(Member.class, 1L); System.out.println("findMember,Id = " + findMember.getId()); System.out.println("findMember.Name = " + findMember.getName()); tx.commit(); } catch(Exception e){ tx.rollback(); } finally{ em.close(); } emf.close(); }}package xik.ShoppingMall.Domain;import lombok.Getter;import lombok.Setter;import javax.persistence.*;@Entity@Table(name="MEMBER")public class Member { @Getter @Setter @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 시스템에 저장하기 위해 시스템이 정하는 변수 @Getter @Setter @Column(name="name") private String name; // 고객이 입력한 데이터 @Getter @Setter @Column(name="phonenumber") private String phoneNumber; // 휴대폰 번호 @Getter @Setter @Enumerated(EnumType.STRING) @Column(name="grade") private Grade grade;}
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 주문시 에러가 발생합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery 어떤 부분에서 문제가 생기는지 못찾아서 전체 파일 첨부합니다.. https://drive.google.com/drive/folders/1I0oUU741fn4nApLLQ-e_16pY0H-dywyz?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
책에 페치 조인 대상에는 별칭을 줄수 없다. 라고 나와서 궁금증이 생겼어여
책 381쪽에 보면 페치 조인 대상에는 별칭을 줄 수 없다라고 나오고, 대신 하이버네이트같은 몇몇 구현체는 지원해 준다고 나와있더라구요 "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", 위와 같은 JPQL에서 o.orderItems 과 페치조인하고 oi로 별칭을 주었는데, 이 별칭을 활용하여 join fetch oi.item i 처럼 또 페치조인을 하는데... JPA에서 공식 스펙은 아니지만 하이버네이트가 잘 지원해주는 것 맞나요? 최종 질문은 저렇게 페치조인 대상에 별칭주고 거기서 또 페치조인해서... 잘 써도 되는지 궁금합니다. JPA의 공식스펙이 아닌것 같은데 문제없이 동작하는지.. (위 같은 경우는 당연 일대일이나 다대일에서만 쓸것입니다)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit5로 테스트 작성하기
메세지 검증방식으로 해보았습니다. Junit5로 시도하는분들에게 도움이 되길~ public class NotEnoughStockException extends RuntimeException{ @Override public String getMessage() { return "재고가 모자랍니다"; } } NotEnoughStockException thrown = assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), order)); assertEquals("재고가 모자랍니다", thrown.getMessage());
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
윈도우 명령어 관련 질문입니다.
윈도우는 h2.bat으로 접속을 했습니다. 2:08 부분에서 ll 와 ls - arlth 명령어를 통해 jpashop.mv.db가 생성되는 것을 확인할 때 윈도우 명령어로는 어떻게 진행해야 할까요? 보시는 것처럼 연결하게 되면 키 입력이 먹히지 않아 확인을 어떻게 해야할지... 윈도우 명령어랑 리눅스 명령어 비교를 해보려고 찾아봤는데 딱 맞는게 없는거 같아서 질문드립니다.
-
미해결실전! 스프링 데이터 JPA
현업에서 updatedAt 을 설계하나요?! (시스템/비즈니스 입장에서 )
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 영한님 혹은 서포터즈 여러분 안녕하세요!강의를 열심히 수강하고 있었는데..프로젝트를 수행하던 도중 의문이 들어 하나 질문할게요! ㅎcreatedAt이나 updatedAt을 이용하면 운영상에 발생한 이슈들을 추적할 때 도움이 되는 것으로 알고 있어요!다만 updatedAt은 Entity 객체 혹은, DB의 row 의 일부분이 변경되면 바뀌는 것으로 알고 있거든요!이부분에서 질문 드립니다 ! 게시글 조회수가 올라가는 로직이 있다는 가정하에 이로 인하여 게시글 수정일시가 변경되면 안된다고 할 때 JPA/스프링에서 제공하는 변경감지 updatedAt을 사용할 수가 없거든요!이때는 별도로 시스템차원에서 변경한 systemUpdatedAt 과 비즈니스 의미상으로 변경한 businessUpdatedAt 등으로 나누는 것이 좋을까요??기타)createdAt은 시스템 입장에서 변경 / 비즈니스 입장에서 변경한 내역이 똑같은 것 같아용!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
actuator/refresh 호출 시 오류 문의
안녕하세요. POSTMAN에서 POST방식으로 호출하는 경우, ConfigService쪽에 아래와 같은 오류가 발생합니다. 잘못 입력한 부분이 있는지 확인 부탁 드립니다. 1. user-service yml spring: application: name: user-service cloud: config: name: ecommerce config: import: optional:configserver:http://127.0.0.1:88882. config-service yml server: port: 8888spring: application: name: config-service cloud: config: server: git: uri: file://D:\\Projects\\intelliJ\\git-local-repo 3. 오류로그 org.springframework.cloud.config.server.environment.NoSuchLabelException: No such label: main at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:314) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:262) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:139) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOneFromCandidate(MultipleJGitEnvironmentRepository.java:188) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:173) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:134) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.defaultLabelIncludeOrigin(EnvironmentController.java:116) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.21.jar:5.3.21] at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:485) ~[spring-cloud-context-3.1.3.jar:3.1.3] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.cloud.config.server.environment.EnvironmentController$$EnhancerBySpringCGLIB$$dc31df60.defaultLabelIncludeOrigin(<generated>) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref main cannot be resolved at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:223) ~[org.eclipse.jgit-5.12.0.202106070339-r.jar:5.12.0.202106070339-r] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.checkout(JGitEnvironmentRepository.java:468) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:307) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] ... 65 common frames omitted
-
미해결실전! 스프링 데이터 JPA
안녕하세요 영한님! 네이티브 쿼리 사용이 적절한 상황인지 궁금해서 질문드려요
우선 제가 하려는 동작은 "특정 브랜드의 카테고리별 상품의 최저가의 합" 을 구하는 쿼리를 작성해야했었고 결과물 쿼리는 " select sum(temp_mins.mins) as total from ( select min(price) mins from product where brand_num = ? group by category_num) as temp_mins" 위처럼 작성했습니다. 코드는 @Query(value = "select sum(temp_mins.mins) as total from (select min(price) mins from product where brand_num = ? group by category_num) as temp_mins", nativeQuery = true)Integer sumLowestPriceEachCategoryByBrand(Long brandNum); 입니다. queryDsl이나 JPQL에선 from절의 서브쿼리 기능을 제공하지 않는다고 파악되어서 고민끝에 네이티브 쿼리까지 왔는데요.현재 강의에서 네이티브 쿼리의 대표적인 단점으로 뽑아주신게 반환타입 부분으로 학습했는데 제 생각으로는 단순한 박싱 타입으로 반환하기 때문에 크게 문제가 없다고 생각됩니다. 혹시 위 코드가 네이티브 쿼리를 사용하는데 적절한 상황일까요?