묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! Querydsl
2개 이상의 OneToMany 관계에서 fetch join 문제
안녕하세요 영한님! 좋은 강의 너무너무 잘 듣고 있습니다! 다름이 아니라 JPA와 Querydsl을 공부하던 중 궁금한 점이 생겨 이렇게 질문을 드립니다. OneToMany 관계에서는 N+1 문제를 해결하기 위해 fetch join을 사용해 자식 엔티티도 모두 함께 가져오는 것으로 배웠습니다. 만약 아래처럼 하나의 엔티티와 자식 엔티티, 자식 엔티티의 자식 엔티티가 모두 OneToMany 관계인 경우 최상위 엔티티를 가져올 때 한꺼번에 모든 자식 엔티티를 가져올 수 있는 방법이 있는지 여쭤보고 싶습니다..! @Entity public class Forest{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "forest_id") private Long id; @OneToMany(mappedBy = "forest") private List<Tree> trees= new ArrayList<>(); } @Entity public class Tree{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "tree_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "forest_id") private Forest forest; @OneToMany(mappedBy = "tree", cascade = CascadeType.ALL) private List<Leaf> leaves= new ArrayList<>(); } @Entity public class Leaf{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "leaf_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "Tree_id") private Tree tree; } 위 코드를 기준으로 제가 원하는 것은 모든 Forest을 가져올 때, Forest의 자식인 Tree와 Tree의 자식인 Leaf를 함께 가져오는 것인데, 처음엔 단순히 fetch join을 두번 사용하면 될 것이라고 생각했습니다. 따라서 코드를 다음과 같이 작성했습니다. public List<Forest> findAllFetch() { return queryFactory .selectFrom(forest) .leftJoin(forest.trees, tree).fetchJoin() .leftJoin(tree.leaves).fetchJoin() .fetch(); } 하지만 위 코드처럼 두개 이상의 OneToMany 관계에서 fetch join을 여러번 사용하면 MultipleBagFetchException이 발생했습니다. 찾아보니 JPQL에서는 xToMany에서는 일반적으로 fetch join은 한번만 허용된다고 하더라구요... 따라서 제가 생각한 해결책은 위 과정을 2번의 쿼리로 나누어 실행시키는 방법이었습니다. public List<Forest> findAllFetch() { List<Forest> result = queryFactory .selectFrom(forest).distinct() .leftJoin(forest.trees).fetchJoin() .fetch(); List<Long> selectedIds = result.stream() .map(Forest::getId) .collect(Collectors.toList()); queryFactory .selectFrom(tree).distinct() .leftJoin(tree.leaves).fetchJoin() .where(tree.forest.id.in(selectedIds )) .fetch(); return result ; } 혹시 위 코드보다 더 나은 방법이 있는지 아니면 한번의 쿼리로 모든 자식 엔티티를 받아올 수 있는 방법이 있는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티에 FK컬럼값 관련 질문입니다.
안녕하세요. 엔티티에 @ManyToOne, @OneToMany등과 같이 관계로 설정된 컬럼에 접근하는 방법에 대해 알고 싶습니다. 예를 들어 Order 엔티티가 - id(PK) - user(관계로 설정된 값) 로 설정되어있다고 가정한다면 실제 테이블에는 user_id(FK)가 들어가게 될텐데요. Order.getUser().getId()를 통해 user_id를 가져오게 된다면 불필요하게 user테이블에 쿼리가 한번 더 나가더라구요. 따라서 단순히 Order테이블을 조회한다음 user_id컬럼값을 가져오고 싶은데 이에 대한 방법이 궁금합니다. 인터넷을 좀 찾아보니 @Column(name = "user_id", insertable = false, updatable = false)private Long userId; 위와 같은 형태로 설정해준다음 Order.getUserId()를 통해 가져오라고 나와있던데 맞는 방식인지 헷갈리네요. <질문> 1. API작업을 하다보면 연관관계의 객체를 통해 접근하는게 아닌 위처럼 단순 FK컬럼의 값만 가져오고 싶을때가 있을 것 같은데 어떻게 접근하는게 옳은 방식일까요? 2. 관계를 같이 저장할 때 객체를 통한 저장이 아닌 FK키를 직접 입력해서 저장해주고 싶습니다. 위 코드를 예로 들자면 Order엔티티에 user객체를 직접 저장하는게 아닌 user_id를 입력시켜서 저장시키고 싶습니다. (user객체를 직접 저장하는 경우 무조건 user를 한번 가져와야하기 때문에) 이런 경우에는 어떻게 접근하는게 좋을까요? 감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Entity 지정 시, persistence.xml에 해당 클래스가 존재하지 않는다는 오류
안녕하세요, 강의를 들으면서 첫 실습 예제를 처음부터 생성해서 따라하던 도중 Entity 어노테이션을 이용하여 클래스를 매핑할 때, 위와 같은 오류가 나더라구요. 구글링을 통해서 해당 오류는 persistence.xml 설정에 <class> 속성을 이용해서 처리되긴 했는데, 제가 책이랑 강의를 다시 다 찾아봐도 해당 설정하신 것은 보질 못해서.. 설정 부분에서 차이가 있어서 그런지 확인 차 문의드립니다. 아! 그리고 프로젝트 생성 방식은 Dynamic Web Content로 첫 생성 -> Configure to Maven Project -> Configure to JPA 위와 같은 단계를 밟아서 생성했습니다. 혹시나 JPA버전과 library 설정 차이일까요...? DB를 오라클을 사용하고, 이클립스를 사용하면서 따라가다보니 설정 디테일 차이가 발생한 것 같은데.. 의견 부탁드리겠습니다..!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
강사님 데이터베이스 스키마 자동생성 실습에서 방언 테스트할때 MySQL로 하면 에러가 발생합니다.
<!-- 필수 속성 --><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/~/test"/><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/><!-- 옵션 --><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.jdbc.batch_size" value="10"/><property name="hibernate.hbm2ddl.auto" value="create" />Hibernate: drop table if exists Member Hibernate: create table Member ( id bigint not null, age integer not null, name varchar(255), primary key (id) ) engine=MyISAM 5월 01, 2021 2:29:55 오전 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@6bda1d19] 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. 5월 01, 2021 2:29:55 오전 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@671facee] 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. 5월 01, 2021 2:29:55 오전 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException WARN: GenerationTarget encountered exception accepting command : Error executing DDL " create table Member ( id bigint not null, age integer not null, name varchar(255), primary key (id) ) engine=MyISAM" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table Member ( id bigint not null, age integer not null, name varchar(255), primary key (id) ) engine=MyISAM" via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:10) Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement " CREATE TABLE MEMBER ( ID BIGINT NOT NULL, AGE INTEGER NOT NULL, NAME VARCHAR(255), PRIMARY KEY (ID) ) ENGINE=[*]MYISAM"; expected "identifier"; SQL statement: create table Member ( id bigint not null, age integer not null, name varchar(255), primary key (id) ) engine=MyISAM [42001-200]이런식으로 에러가 발생합니다 ㅜ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1:1 관계에서 대상 테이블에 외래키가 있는 경우의 질문입니다.
강의에서는 대상 테이블에 외래키가 있는 경우 양방향만 가능하다라고 설명 하셨는데, 강의의 예시는 어디에 FK가 있던 Member 는 Locker 를 가지고 있다는 가정인것 같습니다. 만약 Locker가 FK를 가지고 있는 상태에서 Member 는 Locker를 가지고 있지 않다면 이는 Locker를 주로 보는 것과 동일한 상황일테니 단방향 이어도 상관 없겠지요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring Security 관련 질문입니다.
안녕하세요! 로드맵대로 강의를 마치고 이제 실제로 토이 프로젝트를 구현해보고 있습니다. Authorization 헤더에 JWT토큰을 태워서 보내는 형태로 인증을 구현하려고 하는데요. 보통 Spring Security를 사용한다고 나와있어서 해당 라이브러리를 같이 설치한다음 작업하고 있습니다. 관련해서 검색하면서 살펴보고 있는데 제공하는 기능들이 너무나도 많아서 실무에서는 어떤걸 많이 사용하는지 정말 헷갈리네요. 찾아보니 @Secured, @PreAuthorize, @RolesAllowed 라는 3가지의 방법이 존재하는 것 같은데, 실무에서는 어떠한 방법을 사용하나요? (물론 요구사항에 따라 다르겠지만 일반적으로 사용하는걸 알려주시면 제가 검색해서 찾아보겠습니다ㅎㅎ개인적으로는 @PreAuthorize를 사용해서 엔드포인트마다 권한을 세분화하는게 좋다고 생각합니다.)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Controller DTO리턴 질문
안녕하세요. 영한님의 강좌에서는 컨트롤러에서 DTO를 리턴하는 방식을 사용하고 있더라구요. 그런데 인터넷을 찾아보니 ResponseEntity로 한번 감싸서 리턴하는 방식도 종종 사용하는 것 같습니다. (ResponseEntity를 사용하면 응답코드, 헤더등과 함께 좀 더 세밀하게 리턴값을 조절할 수 있기 때문인 것 같네요) 실무에서는 DTO를 그대로 반환하는 방식과 ResponseEntity로 감싸서 반환하는 방식 중 어떤 방식을 사용하나요? 감사합니다 :)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO의 위치에 관하여
Version 4 까지의 최적화를 하면서 Dto의 위치가 repository 까지 갔는데 DTO의 위치는 상황에 맞게 자유롭게 두는게 괜찮을까요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
메이븐말고 그래들로 만들어서하고싶은데
그래들로 만들어서 뷰를 그대로 넣고 따라하며 듣고있는데, 화면이 깨집니다. 기본 html은 나와서 사용이 가능한데, 흰화면에 html 밖에 안나오는데 해결방법이 없을까요??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
디버깅 시에 token.secret 값이 보이지가 않습니다.
계속 찾아보다가 이유를 모르겠어서 선생님한테 물어봐야될 것 같아서 이렇게 글남깁니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Unit Test가 더 좋다고했는데...
강의 중 통합 테스트도 좋지만 단위테스트가 더좋다고 하셨는데 Service에 대한 테스트 케이스를 작성할 때, 의존성이 있는 각각의 Repository 도 MockRepository를 생성해서 Service 자체만 테스트 하는게 더 좋은 방향일까요?
-
미해결실전! Querydsl
실무에서의 Projection 방식
안녕하세요. 실무에서는 프로퍼티 접근/필드 직접 접근/생성자/@QueryProjection 4가지 방식중 어떤걸 가장 많이 사용하나요? 상황에 따라 다르겠지만 일반적으로 실무에서 많이 사용되는 방법과 영한님의 생각을 듣고 싶습니다. 감사합니다.
-
미해결실전! 스프링 데이터 JPA
페이징 관련 질문입니다.
안녕하세요! 16:39초 정도까지 강의를 듣다보면 DTO로 변환해서 넘기는 모습을 볼 수 있습니다. 그런데 응답값을 확인해보면 totalElements, last, size, number, sort, first, empty 등 페이징에 관련한 모든 필드들이 나가더라구요. 그냥 클라이언트에서 필요한 부분만 정제해서 내보내야할 것 같은데 실무에서는 어떠한 방법을 사용하나요?
-
미해결실전! 스프링 데이터 JPA
slice 관련 질문입니다
slice 의 경우 size 3으로 요청하면 limit 가 4로 나가는데요, 이렇게 하면 실제로 쿼리를 돌려보면 결과가 4개가 나옵니다. 그런데 content.size() 가 3이 나오는 이유는 뭔가요? 스프링데이터 JPA 에서 알아서 마지막 결과는 날려버리는 건가요?
-
미해결실전! 스프링 데이터 JPA
CQRS 리포지토리 질문
안녕하세요. 이전부터 말씀해주신 CQRS에 관해서 간단한 질문이 있습니다. 예를 들어 Member엔티티에 관해 아래처럼 2개의 레포지토리로 쪼갠다고 가정할게요. - MemberQueryRepository(읽기) - MemberCommandRepository(쓰기) 저희가 JPA Data의 이점을 살리려면 JpaRepository를 상속받아서 사용한다고 강의에서 배웠는데요. 읽기 관련 쿼리가 들어있는 Query와 쓰기 관련 쿼리가 들어있는 Command 2개의 레포 모두 JpaRepository를 상속받아서 사용하나요? JpaRepository에는 단순 find~로 시작하는 읽기 메소드뿐만 아니라 delete, save등 쓰기에 관한 메소드도 같이 들어가있어서 읽기/쓰기 레포에서 모두 상속받아서 사용한다면 나중에 작업을 할 때 단순 조회/저장/삭제 등을 어떤 레포에서 사용해야할 지 혼란이 올 것 같습니다. CQRS에 대해서는 이론만 알고있었지 실제로 적용해본적이 없어서 많이 혼란스럽네요. 감사합니다 :)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
enum을 실무에서 어떻게 사용하시는가요?
안녕하세요. enum type에 대해 실무 사용은 어떻게 사용하시는지 질의드립니다. emum type을 대부분 string 으로 사용하시는데 실문에서도 동일하게 사용하시나요? 아니면 enum에 code를 지정해서 공통 코드로 DB에서 따로 관리하시는지 궁금합니다~!
-
미해결실전! Querydsl
InitMember.class의 패키지 위치 질문있습니다.
영한님 안녕하세요. 덕분에 점점 JPA가 재밋어지고 최적화에 재미를 들이고 있습니다. 강의 중에 데이터를 초기화 하는 클래스를 main 패키지 하단에 두셧는데요. 보통 저런 데이터 초기화 클래스를 test 패키지에 안두고 main에 두어도 상관 없는지 궁금합니다. 실무에선 보통 저런 초기화 데이터를 실제 어떻게 만들고 관리하는지도 궁금합니다. 감사합니다.
-
미해결실전! 스프링 데이터 JPA
PK값을 이미가지고 있는 Entity를 DB에 저장하는 방법 문의
안녕하세요. Jpa린이 입니다. 좋은 강의 감사합니다. MSA형태로 Application을 구성하려고 합니다. 아래와 같은 경우에 2번DB에 save할때 Jpa가 내부적으로 pk를 가지고 먼저 select하는것 같은데, 2번DB에는 당연히 해당데이터가 없으니 에러가 발생하는 군요. PK 값을 가지고 있지만 select없이 바로 저장하게 할 수 있을까요? --아래-- 1번DB와 2번DB의 위치는 다르지만, 테이블구조와 데이터는 동일해야합니다. Eqp1Tr과 Eqp1TrDet는 1:N 구조입니다. 1번 App - 1번 DB에 저장 -> Kafka Publish (ID포함) 2번 App - Kafka Consume (ID포함) -> 2번 DB에 저장 <2번 App Consumer 와 Service 코드> @KafkaListener(topics = "${app.topic.name}", groupId = "${spring.kafka.consumer.group-id}")public void receiveMessage(@Payload Eqp1Tr eqp1Tr, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) Integer partition, @Header(KafkaHeaders.OFFSET) Long offset) { log.info("Received message: data = {}, topic = {}, partition = {}, offset = {}", eqp1Tr, topic, partition, offset); eqp1TrService.createTr(eqp1Tr);} public Eqp1Tr createTr(Eqp1Tr eqp1Tr) { log.info("eqp1Tr : {} {}", eqp1Tr.getEqp1TrDets(), eqp1Tr.getName()); List<Eqp1TrDet> eqp1TrDets = eqp1Tr.getEqp1TrDets().stream() .collect(Collectors.toList()); // Save at Eqp1Tr, Eqp1TrDet trRepository.save(eqp1Tr); trDetRepository.saveAll(eqp1TrDets); return eqp1Tr;} <Error> ... Hibernate: select eqp1trdet0_.id as id1_1_0_, eqp1trdet0_.createdBy as createdb2_1_0_, eqp1trdet0_.createdDate as createdd3_1_0_, eqp1trdet0_.col1 as col4_1_0_, eqp1trdet0_.col2 as col5_1_0_, eqp1trdet0_.tr_id as tr_id6_1_0_ from Eqp1TrDet eqp1trdet0_ where eqp1trdet0_.id=? 2021-04-24 00:05:45.319 TRACE 19496 --- [ntainer#0-0-C-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [2] 2021-04-24 00:06:25.719 INFO 19496 --- [ntainer#0-0-C-1] o.a.k.clients.consumer.KafkaConsumer : [Consumer clientId=consumer-tr-consumer-service-1, groupId=tr-consumer-service] Seeking to offset 3 for partition eqp.tr.ic.eqp1-0 2021-04-24 00:06:27.013 ERROR 19496 --- [ntainer#0-0-C-1] essageListenerContainer$ListenerConsumer : Error handler threw an exception org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method 'public void me.kalpha.trconsumerservice.trmart.service.Eqp1TrConsumerService.receiveMessage(me.kalpha.trconsumerservice.trmart.entity.Eqp1Tr,java.lang.String,java.lang.Integer,java.lang.Long)' threw exception; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is javax.persistence.EntityNotFoundException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is javax.persistence.EntityNotFoundException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2 ...
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 커넥트 서버 기동시 발생하는 오류
안녕하세요 선생님, 좋은 강의 잘 듣고 있습니다. 오늘은 카프카 커넥션 서버 기동시 발생하는 오류가 있어 질문드립니다. 우선, 발생하는 오류에 대한 로그 정보는 아래와 같습니다. log4j:ERROR Could not read configuration file from URL [file:C:/kafka_demo/confluent-6.1.0/config/tools-log4j.properties]. java.io.FileNotFoundException: C:\kafka_demo\confluent-6.1.0\config\tools-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:526) at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66) 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:57) log4j:ERROR Ignoring configuration file [file:C:/kafka_demo/confluent-6.1.0/config/tools-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. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.RootResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.RootResource will be ignored. 4월 22, 2021 10:13:58 오후 org.glassfish.jersey.internal.Errors logErrors WARNING: The following warnings have been detected: WARNING: The (sub)resource method listLoggers in org.apache.kafka.connect.runtime.rest.resources.LoggingResource contains empty path annotation. WARNING: The (sub)resource method createConnector in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectors in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectorPlugins in org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource contains empty path annotation. WARNING: The (sub)resource method serverInfo in org.apache.kafka.connect.runtime.rest.resources.RootResource contains empty path annotation. 위 로그를 보고 confluent-6.1.0 폴더에 config\tools-log4j.properties 라는 파일이 없어 이 문제가 발생한다고 생각 했습니다. 그래서 카프카 서버를 설치한 곳에 있는 \config\tools-log4j.properties 파일을 복사해 생성해주었지만 또 다른 오류가 발생하고 해결이 되지 않았습니다. 하지만, 동작은 선생님께서 하신 실습처럼 정상적으로 동작합니다. 다만 로그가 발생하지 않고 있습니다. 검색을 해봤지만 해결하지 못해 도움 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 연관관계에서의 편의 메서드
강의중, 연관관계 편의 메서드는 연관관계의 주인으로 설정된 엔티티에서 형성하는 것이 좋다고 하셨는데 Order 엔티티에 //연관관계 메서드public void setMember(Member member) { this.member = member; member.getOrders().add(this);}public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this);}public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this);} 이렇게 메서드를 구성했습니다. 그러나 Order - OrderItem 두 엔티티가 갖는 연관관계에서 주인은 OrderItem입니다. 그렇다면 Order에 .addOrderItem()을 없애고 OrderItem 엔티티에 public void setOrder(Order order){ this.order = order; order.getOrderItems().add(this);} 위와 같은 편의 메소드를 추가하는것이 맞지 않을까 질문합니다!