[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 수정, 삭제 벌크 연산의 6:20 부분에서 update쿼리로 인한 영속성컨텍스트 문제를 설명해주셨는데요. 전 강의에서 em.flush()실행되는 조건들을 설명해주실 때, 직접 호출 시 트랜잭션 커밋 시 JPQL쿼리 실행 시 em.flush()가 실행된다고 설명해주신 것으로 기억하고 있습니다. querydsl도 결국 JPQL기반으로 작동된다고 알고 있는데, querydsl을 통한 select쿼리 실행을 하면 자동으로 em.flush()가 실행되지 않고, 직접 해주어야 하는 메커니즘이 궁금합니다!
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 5강의 GET 부분 진행하는데 404 오류가 계속 떠서 문의드립니다. 서버도 정상적으로 실행되고 타 프로젝트에서는 정상적으로 localhost :8080이 동작하는데 이 프로젝트만 계속 404 오류가 발생하네요.. Java 11 사용중이고 Gradle Reload 해봐도 해결이 안돼 질문글 남깁니다..
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요! 에서 커밋되지 않기 때문에 INSERT문 안나가는건 이해 되는데요. persist()에 의해 영속성 컨텍스트에는 저장이 되어서 SELECT문도 안나가고 그냥 영속성 컨텍스트에서 가져와야 하는거 아닌가 라는 의문이 생겨서요. 커밋 직전에 플러시 되면서 디비로 쿼리 나가는 건 알고 있었는데, 혹시 영속성 컨텍스트에 저장되는 것도 커밋이 되어야 일어나는 일인가요?? 어느 부분을 잘못 생각하고 있는건지 모르겠어요. 답변 부탁드려요!!
기존 프로젝트(spring X)에 jpa를 적용하는 중인데, persistence.xml 파일로 설정 후 Persistence.createEntityManagerFactory("test"); 호출 시 아래의 예외가 발생하는 이슈가 있습니다. java.lang.NoSuchMethodError: org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar([Lorg/apache/xerces/xni/parser/XMLInputSource;)V xml 파싱 중 프로젝트에서 사용중인 xerces...jar 파일과 jdk의 rt.jar가 충돌되어 메서드를 찾지 못하는 현상으로 파악중입니다. (일반적인 jpa 예제에서는 rt.jar를 참조해야하지만, 해당 코드에서는 xerces...jar를 참조함) 해당 라이브러리를 걷어내기엔 기존 코드의 dependency가 염려되어 다른 파일(yml/properties)로 설정을 관리할 수는 없을까 싶은데, 검색 결과는 대부분 spring jpa 관련 내용이었습니다. jpa 설정 시 xml 파일이 아닌, yml 또는 properties 파일로 관리하는 방법이 있는지 궁금합니다.
안녕하세요! 질문 좀 드리려고 합니다 엔티티 매니저 프록시는 프록시를 싱글톤으로 주입해서 동시성 문제를 해결하고 실제 엔티티 매니저 인스턴스를 ThreadLocal로 관리하는 역할 정도로 생각해도 괜찮을까요? 추가적으로 실제 엔티티 매니저는 @Transactional을 사용하면 JpaTransactionManager에서 생성이 되는데 @Transactional을 사용하지 않으면 처음 엔티티 매니저를 사용할 때 생성이 되나요?
다른 블로그 참고하여 강의에 맞게 설정을 조금 수정하였습니다. 새롭게 강의 듣는 분들의 시간을 아낄 수 있을까 싶어 공유드립니다. 장점 QEntity 생성 경로가 강의와 같습니다. src/main 하위가 아닌 generated 하위에만 QEntity 가 생성 되어 git ignore설정을 따로 해주지 않아도 됩니다. 저도 이 강의의 이 회차를 듣고 알아본 것이기 때문에 QEntity 가 잘 생성되어 Run이 잘되는 것만 확인했지 다른 것까지 모두 테스트 해보진 못했습니다. compileQueryDsl 동작 없이 Application Run 하시면 되겠습니다. 아래 설정의 잘못된점이 있다면 댓글 달아주시면 모두에게 도움이 될 것 같습니다. 내 블로그 : https://elastinn.tistory.com/11 블로그 광고해도 되나 모르겠습니다. 감사합니다. plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' // queryDSL 설정 implementation "com.querydsl:querydsl-jpa" implementation "com.querydsl:querydsl-core" implementation "com.querydsl:querydsl-collections" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" // java source set 에 querydsl QClass 위치 추가 sourceSets { main.java.srcDirs += [ querydslDir ] } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file(querydslDir) } //querydsl 추가 끝
QueryDSL 강의 예제 모델에서 , @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); 이 부분에서 public void changeTeam(Team team) { this.team.getMembers().remove(this); this.team = team; team.getMembers().add(this); 아래와 같이 해당 팀의 멤버 삭제도 해줘야 하는것 아닌가요? public void changeTeam(Team team){ if(this.team != null) { // this.team이 null이 아니면 이 member객체는 team이 있음을 의미 this.team.getMembers().remove(this); // 해당 팀의 멤버에서 삭제 } this.team = team; team.getMembers().add(this); }
안녕하십니까 강사님. 좋은 강의 정말 감사합니다. 이번에 강사님께 강의를 듣고 현업에 적용하는 도중 궁금한 사항이 있어 문의하게 되었습니다. 저희는 현재 DDD 를 적용하려고 합니다. DDD 에서는 애그리거트끼리의 관계를 맵핑하는 것을 지양하는 것으로 알고 있습니다. 따라서 저희는 ERD 기준으로 도메인을 설계해보니 실제 나온 도메인을 보면 테이블이 전부 도메인 클래스가 되었고 서로간의 관계를 코딩으로 맺는 부분 (@ManyToOne 등)이 존재 하지 않습니다. 현업에서도 ERD 를 기준으로 도메인 클래스를 나누면 테이블 당 하나의 애그리거트가 나오는 것이 보편적인 사항일까요? DDD 로 개발하다보면 도메인 클래스에 관계를 맺는 부분이 없는게 보편적일까요?
엔티티 클래스 개발2 강의 8분까지의 내용을 따라하는 중인데 cmd로 db실행해도 db과 최신화 되어있지 않습니다. 그리고 intellij에서 메인 클래스 실행하면 강의와 다르게 자동 종료됩니다. 해결 방법 문의 드립니다. https://drive.google.com/drive/folders/1UcqCYHfwffTcVLU7QlbHylGEY2djBH9f?usp=sharing
1차 시도로 강의자료를 보고 그대로 따라한 후 우측 Gradle Tasks/orther/compileQueryDsl 누르니 plugins { id 'java' id 'org.springframework.boot' version '2.7.12' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' //querydsl 추가 implementation 'com.querydsl:querydsl-jpa' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 아래와 같은 에러가 발생했습니다. Unable to load class 'com.mysema.codegen.model.Type'. This is an unexpected error. Please file a bug containing the idea.log file. 그래서 커뮤니티에 올라온 질문에 대한 답을 보고 따라해봤습니다. plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거 clean { delete file('src/main/generated') } 노란박스 안에 compileQueryDsl 버튼이 생기지 않습니다. 어떻게 해결해야될까요???
https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar 제 경우 mariadb 커넥터 대신 mysql 커넥터 사용해서 해결했습니다. (... confluentXXX/share/java/kafka 폴더에 위치) 정말.. 하루종일 아래 예외로 애먹었네여.. Error while starting connector ... No suitable driver found for jdbc:mysql:// localhost:3307/mydb mariadb 버전별 커넥터를 5개정도 해봐도 안되어서 자포자기한 채로 mysql 커넥터를 사용하니 되었습니다 ㅠㅠ 자세한 버전 정보입니다. (윈도우) kafka : 2.13-3.4.0 kafka-connect-jdbc : 10.7.2 confluent : 7.4.0 mariaDB : 10.11 java : 17 설정 정보입니다. confluent/etc/kafka/connect-distributed.properties 89번 행 근처 plugin.path=\C:\\Work\\confluentinc-kafka-connect-jdbc-10.7.2\\lib confluent/bin/windows/kafka-run-class.bat 97번 행 근처 rem classpath addition for LSB style path if exist "%BASE_DIR%\share\java\kafka\*" ( call :concat "%BASE_DIR%\share\java\kafka\*" ) (...) 122번 행 근처 rem Log4j settings IF ["%KAFKA_LOG4J_OPTS%"] EQU [""] ( if exist %~dp0../../etc/kafka/tools-log4j.properties ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%~dp0../../etc/kafka/tools-log4j.properties ) else ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%BASE_DIR%/etc/kafka/tools-log4j.properties ) ) ELSE ( rem create logs directory IF not exist "%LOG_DIR%" ( mkdir "%LOG_DIR%" ) set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%~dp0../../etc/kafka/tools-log4j.properties ) confluent/bin/windows/connect-distributed.bat 28번 행 근처 rem Log4j settings IF ["%KAFKA_LOG4J_OPTS%"] EQU [""] ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%BASE_DIR%/etc/kafka/connect-log4j.properties -Dlog4j.config.dir=%BASE_DIR%/etc/kafka ) POST Request { "name":"my-source-connect", "config":{ "connector.class" : "io.confluent.connect.jdbc.JdbcSourceConnector", "connection.url":"jdbc:mysql://localhost:3307/mydb", "connection.user":"root", "connection.password":"1234", "mode":"incrementing", "incrementing.column.name":"id", "table.whitelist":"users", "topic.prefix":"my_topic_", "tasks.max":"1" } }
좋은 강의 정말 감사드립니다. 강의 수강 도중 서비스 로직 관련 궁금한 점이 있어 문의드리게 되었습니다. 제가 DDD 를 공부하면서 알게된 부분이 DDD 에서는 비즈니스 로직을 도메인에 몰아서 작성하라고 했는데 본 강의에서는 절대 서비스 정책을 도메인에 둬서는 안된다고 말씀하신 걸로 알고 있습니다. 호돌맨님께서 말씀하신 서비스 정책을 두지 말라는 조언은 DDD를 적용하지 않았기 때문인지 두지 말라고 하신건지 알고 싶습니다. (서비스 정책 == 비즈니스 로직으로 이해했습니다. 혹시 제가 이해한 부분이 잘못 됐을까요?) 감사합니다.