묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.detach 메서드와 관련하여 질문드립니다.
위의 로직을 보시면Member 객체를 생성후 persist() 메서드를 호출한 후에 detach() 메서드를 호출하였습니다.그러면 제 생각에는 persist()를 호출한 순간에 쓰기지연 SQL저장소에 insert문이 있기 때문에 flush하면 insert 쿼리가 console에 나와야하는데 왜 안나오는지 이유를 모르겠습니다.혹시 detach를하면 쓰기 지연 SQL저장소에 있는 insert가 사라지는건가요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
물리적인 트랜잭션을 처리하는 부분에 대해 헷갈리는 점이 있습니다.
안녕하세요.항상 강의잘 듣고있습니다!강의를 완강하고 복기하던 중에 궁금한 점이 있습니다. 강의에서는 커밋 또는 롤백을 하는 경우 트랜잭션 메니저로 요청을 보내 물리적인 부분을 처리한다 라고 학습했는데요, 가끔씩 강의를 듣다보면 트랜잭션 매니저 -> 트랜잭션 동기화 매니저 를 통해 물리적인 트랜잭션을 처리한다고 말씀하셔서 (스프링 트랜잭션 전파5 - 외부 롤백 6분 20초경)마지막 물리적으로 처리하는 부분이 트랜잭션 매니저단에서 끝나는지, 트랜잭션 매니저에서 트랜잭션 동기화 매니저를 통해 끝나는지 헷갈려서 질문남깁니다.! 감사합니다!!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional 과 entityManager 범위에 관해 질문 드립니다.
안녕하세요! 강의 수강 중 질문이 생겨 작성합니다.. 답변 부탁드립니다..!ㅠ.ㅠ -- MemberRepository 입니다. ( @Transactional 키워드 모두 지움 )@Repository public class MemberRepository { @PersistenceContext EntityManager em; public Member findMember( Long id ) { Member member = em.find(Member.class, id); return member; } public Member findMember2( Long id ) { Member member = em.find(Member.class, id); return member; } } -- 위 레파지토리를 호출하는 테스트 코드 입니다. ( 데이터는 미리 넣어둔 상태 입니다. )@SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository mRepo; @Test public void test2() { System.out.println("================================================="); System.out.println(mRepo.getClass()); //when Member found1 = mRepo.findMember(1L); Member found2 = mRepo.findMember2(1L); System.out.println("================================================="); //then assertEquals(found2, found1); } } 1 ) 테스트 코드에서 주입받은 mRepo의 클래스 타입을 확인하면 CGLIB로 생성한 프록시 클래스가 출력됩니다. 위 코드에서 보는 바와 같이 @Transactional 어노테이션은 존재하지 않는데도 실 클래스가 아닌 프록시 객체로 만들어지는 이유가 뭔가요?? 2 ) 테스트 코드에서 test2()를 실행하면 select를 2번 실행합니다. test2()에 @Transactional을 걸면 -> select 1번 -> 너무 당연한데MemberRepo 클래스 레벨에서 @Transactional -> 테스트 코드 실행 시 select 2번MemberRepo 클래스 각 메소드에 @Transactional -> 테스트 코드 실행 시 select 2번 2-1) 위와 같은 결과가 발생하는 이유를 모르겠습니다.. @Transactional을 어떻게 걸든 한 메소드가 종료하고 나면 PersistenceContext 가 닫히는 건가요?.. 2-2) MemberRepo 에서 주입받은 entityManager는 proxy 클래스가 맞는거죠..?@Transactional을 표기해주지 않아도, em을 사용하는 메소드가 호출되고 종료 될 때마다, 매번 proxy 객체 내부의 실제 entityManager 객체가 변경되는 건가요?? 2-3) em.find(Member.class, 1L) 같은 조회성 질의에서@Transactional(readOnly=true) 와 아예 해당 어노테이션을 사용하지 않았을 경우의 결과가 동일하였습니다. 그렇다면 readOnly를 사용하는 이유가 대체 무엇인가요?.. 질문이 많아서 죄송합니다 ㅠㅠ 머리에 정리가 되질 않아서요..답변 부탁드립니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Transaction과 영속성 컨텍스트
안녕하세요. 강의 전반을 보고 영속성 컨텍스트에 대한 궁금증이 있어 이것 저것 테스트 해보다가 질문 남깁니다.기본적으로 Spring Data JPA에서 제공하는 영속성 컨텍스트는 1.Transaction 단위로 생성되는 것으로 이해하고 있었습니다.또한, 서로 다른 영속성 컨텍스트에 대해서 1차 캐시를 공유하지 않는것으로 알 고 있어, 서로 다른 2개의 @transaction에 대해서는 같은 값을 조회하더라도 동등성을 보장하지 않을것이라고 생각합니다.먼저, 위에 대한 제 생각이 맞는지 궁금합니다. 두 번째로 제가 직접 Application을 띄우고 하나의 http 요청에 대해 서로 다른 2개의 @transaction을 처리하는 로직을 넣고 서로 다른 @transaction에서 같은 값을 조회 후 동등성을 테스트 해봤는데 동등하다는 결과가 반복되었습니다. 이에 혹시 위에서 언급한 1.Transaction이 http 요청 단위의 transaction을 의미하는 것인가 라는 궁금증이 들었습니다. 위 2개 질문 이외 혹시 제가 놓치거나 잘못 이해한 부분이 있다면 알려주시길 바랍니다.감사합니다.
-
해결됨실전! Querydsl
Hello 테이블 생성 안됨..
안녕하세요.. Hello Table이 생성이 안돼서 질문 드립니다. 모든 코드는 강의자료에 있는 코드를 복붙했습니다. (에러가 나서 ..) test코드를 돌려보면 에러는 안나는데 h2db테이블에서 생성이 안됩니다.에러 코드 > Task :compileJava UP-TO-DATE > Task :processResources > Task :classes > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test 15:47:24.714 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [study.querydsl.QuerydslApplicationTests]: QuerydslApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 15:47:24.762 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration study.querydsl.QuerydslApplication for test class study.querydsl.QuerydslApplicationTests . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.0) 2024-01-02T15:47:24.972+09:00 INFO 14318 --- [ Test worker] s.querydsl.QuerydslApplicationTests : Starting QuerydslApplicationTests using Java 17.0.6 with PID 14318 (started by gaheechoi in /Users/gaheechoi/Desktop/휴학/백앤드/querydsl) 2024-01-02T15:47:24.973+09:00 INFO 14318 --- [ Test worker] s.querydsl.QuerydslApplicationTests : No active profile set, falling back to 1 default profile: "default" 2024-01-02T15:47:25.274+09:00 INFO 14318 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2024-01-02T15:47:25.285+09:00 INFO 14318 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7 ms. Found 0 JPA repository interfaces. 2024-01-02T15:47:25.532+09:00 INFO 14318 --- [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2024-01-02T15:47:25.557+09:00 INFO 14318 --- [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.3.1.Final 2024-01-02T15:47:25.573+09:00 INFO 14318 --- [ Test worker] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled 2024-01-02T15:47:25.685+09:00 INFO 14318 --- [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer 2024-01-02T15:47:25.700+09:00 INFO 14318 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-01-02T15:47:25.796+09:00 INFO 14318 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced user=SA 2024-01-02T15:47:25.797+09:00 INFO 14318 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2024-01-02T15:47:25.908+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178045908 | took 3ms | statement | connection 1| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced select * from INFORMATION_SCHEMA.SEQUENCES select * from INFORMATION_SCHEMA.SEQUENCES; 2024-01-02T15:47:26.178+09:00 INFO 14318 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2024-01-02T15:47:26.186+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : drop table if exists hello cascade 2024-01-02T15:47:26.187+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046187 | took 0ms | statement | connection 2| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced drop table if exists hello cascade drop table if exists hello cascade ; 2024-01-02T15:47:26.187+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : drop sequence if exists hello_seq 2024-01-02T15:47:26.187+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046187 | took 0ms | statement | connection 2| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced drop sequence if exists hello_seq drop sequence if exists hello_seq; 2024-01-02T15:47:26.189+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : create sequence hello_seq start with 1 increment by 50 2024-01-02T15:47:26.191+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046191 | took 1ms | statement | connection 3| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced create sequence hello_seq start with 1 increment by 50 create sequence hello_seq start with 1 increment by 50; 2024-01-02T15:47:26.192+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : create table hello (id bigint not null, primary key (id)) 2024-01-02T15:47:26.194+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046194 | took 1ms | statement | connection 3| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced create table hello (id bigint not null, primary key (id)) create table hello (id bigint not null, primary key (id)); 2024-01-02T15:47:26.195+09:00 INFO 14318 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-01-02T15:47:26.268+09:00 WARN 14318 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2024-01-02T15:47:26.478+09:00 INFO 14318 --- [ Test worker] s.querydsl.QuerydslApplicationTests : Started QuerydslApplicationTests in 1.645 seconds (process running for 2.13) 2024-01-02T15:47:26.801+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : select next value for hello_seq 2024-01-02T15:47:26.803+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046803 | took 0ms | statement | connection 4| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced select next value for hello_seq select next value for hello_seq; 2024-01-02T15:47:26.974+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : insert into hello (id) values (?) 2024-01-02T15:47:26.976+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046976 | took 0ms | statement | connection 4| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced insert into hello (id) values (?) insert into hello (id) values (1); 2024-01-02T15:47:26.986+09:00 DEBUG 14318 --- [ Test worker] org.hibernate.SQL : select h1_0.id from hello h1_0 2024-01-02T15:47:26.987+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178046987 | took 0ms | statement | connection 4| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced select h1_0.id from hello h1_0 select h1_0.id from hello h1_0; 2024-01-02T15:47:27.014+09:00 INFO 14318 --- [ Test worker] p6spy : #1704178047014 | took 0ms | rollback | connection 4| url jdbc:h2:mem:a21f98cc-44fd-4380-bad2-49c71d2c5ced ; OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2024-01-02T15:47:27.025+09:00 INFO 14318 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-01-02T15:47:27.026+09:00 INFO 14318 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-01-02T15:47:27.027+09:00 INFO 14318 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. > Task :test Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD SUCCESSFUL in 3s 4 actionable tasks: 3 executed, 1 up-to-date 3:47:27 PM: Execution finished ':test --tests "study.querydsl.QuerydslApplicationTests"'. h2 db는 기존의 1.4 xx 대를 사용하다, spring boot3로 올리면서 강의자료 대로 2.2.224로 바꾸었습니다.db 생성은 잘 되었고, tcp로 db접근도 완료 했습니다.생성이 안되는 이유를 모르겠습니다 ㅠㅠ... tcp 접근 QHello 위치 application.yml
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
prometheus image 실행 시 에러가 발생합니다.
2024-01-02 15:45:16 ts=2024-01-02T06:45:16.877Z caller=main.go:487 level=error msg="Error loading config (--config.file=/etc/prometheus/prometheus.yml)" file=/etc/prometheus/prometheus.yml err="open /etc/prometheus/prometheus.yml: operation not permitted어떻게 해결해야할까요...?
-
해결됨실전! Querydsl
Q파일 생성 위치 질문
안녕하세요현재 프로젝트 세팅 및 테스트를 진행 중입니다. spring boot가 3이상으로 제한된 상황속에서 진행중이며, 강의 내용을 따라하고 있습니다! build.gradle은 https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.vfy9wirpglmx를 복/붙 하였습니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } 질문은 크게 3가지입니다. build/other/compileQuerydsl은 표기가 안되는데 다른 답변을 보니 springboot3으로 올라가며 compileQuerydsl은 표기가 안된다고 하신 것 같은데 맞을까요?정확한 Q파일의 생성 위치가 궁굼합니다.!강의상에서는 src/main에 둬도 괜찮지만, 버전관리 시스템(git)에는 추가 되지 않는게 좋다고 하셨던 것 같은데 맞나요?build에만 Q파일이 생성되는게 좋나요?올려주신 google doc의 build.gradle로 진행하면, Q파일이 build/annotationProcessor아래 생성됩다... 뭐가 문제일까요? docs에 올려주신 build.gradle에서 build clean을 진행할 때 'src/main/generated'의 폴더를 삭제하는 이유가 무엇일까요? (현재 저는 Q파일을 build/ 아래 관리하고있는데, src/main/generate 아래 Q파일을 생성하시는 분들에만 해당 되는 내용인가요?)답변해주시면 감사하겠습니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 변경 후 일대다
@JoinColumn(name = "MEMBER_ID) List<AddressEntity> addressHistory = ..다대일이 아닌 일대다로 매핑한 이유가 있을까요?앞에서 다쪽에 @JoinColumn하는 것을 추천하셨는데 일쪽에 연관관계 주인을 잡은 이유가 궁금합니다.
-
미해결실전! Querydsl
compileQuerydsl없음
안녕하세요현재 프로젝트 세팅부터 막혀서 질문 드립니다.질문은 크게 3가지입니다. build 잘됨Gradle Tasks other compileQuerydsl -> 없음 ( spring boot3이상으로 되면서 안보이는게 맞나요)? build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } def querydslSrcDir = 'src/main/generated' clean { delete file(querydslSrcDir) } tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory = file(querydslSrcDir) } https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit위의 docs 설정만 build.gradle에 기입하면 src/main/generated가 생성이 안되는데 이유가 뭔가용??build폴더 말고, main/generated폴더에 Q파일이 생성되었는데 잘못 생성된건가요.? 답변 주시면 감사하겠습니다.. 추가로,, 현재 build.gradle에 $buildDir은 사용이 안된다고 하네요..!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 컬렉션 HashSet 타입인 favoriteFoods를 수정할 때 궁금한 것이 있습니다.
<Member 클래스>@ElementCollection @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID") ) @Column(name = "FOOD_NAME") // 값이 하나라 가능 private Set<String> favoriteFoods = new HashSet<>();<JpaMain 함수>try { Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity", "street", "10000")); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("족발"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(new Address("old1", "street", "10000")); member.getAddressHistory().add(new Address("old2", "street", "10000")); em.persist(member); em.flush(); em.clear(); System.out.println("=========== START ==========="); //todo: 값 타입 수정 Member findMember = em.find(Member.class, member.getId()); Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode())); // HashSet이라서 set 메서드 활용 불가 findMember.getFavoriteFoods().remove("치킨"); findMember.getFavoriteFoods().add("한식"); tx.commit();위의 메인함수를 여러 번 실행했는데 HashSet임에도 불구하고 순서가 지켜진 체로 DB에 저장된 결과가 다음과 같습니다.그러나, em.flush()와 em.clear()를 주석처리하고 다시 실행해보면 DB로 조회할 때 순서가 지켜지지 않고 무작위로 저장이 됩니다. 제 예상은 em.flush()가 add()로 저장된 컬렉션 값을 먼저 DB에 반영하니까 순서가 보장되서 항상 같은 결과가 나오지 않나 생각됩니다. 이것이 맞나요?
-
미해결실전! 스프링 데이터 JPA
1.프로젝트 환경설정 Test 설정
import 가 안됩니다.. import 문을 지우고 다시 해도 된다는 글이 있어서 따라해봤는데 그대로입니다.캐시비우기 및 재시작 해도 그대로고 gradle rebuild 해도 그대로 원인조차 파악하기 어렵습니다. 도움주십쇼.깃 링크:git@github.com:choiinsoochoi/jpa.git
-
해결됨실전! Querydsl
gradle .gradle폴더 차이
안녕하세요!프로젝트 세팅을 하고 test파일을 실행해보니,gradle폴더와 .gradle폴더가 생성된 것을 확인했습니다. 혹시 두개의 폴더가 무슨 차이가 있나요?out 폴더에는 무슨 폴더고 어떤것들이 들어가나요? 답변 해 주시면 감사하겠습니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
생각한대로 실행이 되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.제 프로젝트 압축파일입니다.https://drive.google.com/file/d/1CsFmsNczcupxGIQTMM_-uA7EQFzu3KRq/view?usp=sharing JpaMain에서Movie movie = new Movie(); movie.setDirector("aaa"); movie.setActor("asdf"); movie.setName("바람과 함께 사라지다"); movie.setPrice(10000); em.persist(movie); em.flush(); em.clear();에 의해 movie가 insert되어야하는데 실제로 데이터베이스의 MOVIE테이블을 조회해보면 아무것도 없습니다. 그리고 아래와 같은 에러로그가 뜨는데 어떻게 해야할지 모르겠어서 질문드립니다!https://drive.google.com/file/d/1YCpr2ZBFSC84lw3wvn5wks22DVx1GHAM/view?usp=sharing
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
boot3 설정
spring boot3 에서 slueth를 사용할 수 없다고 합니다. 삽질 끝에 비슷하게 구현이 되긴 했는데 조금 다른 점 때문에 강사님이 의도하신바가 맞는지 정확히는 모르겠네요.첫 요청의 traceID와 spanID가 다른 점혹~시 필요하신분이 계시다면 참고해주세요!추가의존성 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> </dependency>기존 스타터 sleuth, zipkin 의존성 제거yml 변경점server: port: 0 spring: application: name: order-service # spring boot 3.0 이전 zipkin, sleuth 설정 # zipkin: # base-url: http://127.0.0.1:9411 # enabled: true # sleuth: # sampler: # probability: 1.0 jpa: hibernate: ddl-auto: update h2: console: enabled: true settings: web-allow-others: true path: /h2-console datasource: driverClassName: org.h2.Driver url: jdbc:h2:mem:testdb ## 추가 cloud: openfeign: micrometer: enabled: true eureka: instance: instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}} client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka management: endpoint: health: show-details: always endpoints: web: exposure: include: refresh, health, beans, busrefresh, info, metrics, prometheus ## 추가 tracing: sampling: probability: 1.0 propagation: type: b3 zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans logging: level: com.example.orderservice: DEBUG ## 추가 pattern: level: "%5p [%X{traceId:-},%X{spanId:-}]"추가 주석 부분만 추가Config Bean 추가@Configuration public class MoniterConfig { @Bean public Capability capability(final MeterRegistry registry) { return new MicrometerCapability(registry); } }이 Config 를 추가하지 않으시면, 요청 마다 TraceID가 달라집니다.액츄에이터도 필수 몇 가지 글을 참고하여 세팅한거라 몇몇 의존성이나 설정은 없어도 될수도 있지만 거의 필요한거 같습니다.그 외에 오류나 추적하는거는 동일하게 동작하는거 같습니다! 혹시 누군가 도움이 되시길!
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
스프링 시큐리티 질문
package kr.bit.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration //스프링 컨테이너 설정파일이라고 메모리에 올림 @EnableWebSecurity public class SecurityConfiguration { @Autowired private UserDetailsServiceImpl userDetailsService; //패스워드 인코딩 객체를 스프링 컨테이너에 등록 @Bean public PasswordEncoder PasswordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(csrfConfig -> csrfConfig.disable() ) .authorizeHttpRequests(authorizeRequests -> authorizeRequests .anyRequest().permitAll() ) .formLogin(login -> login .loginPage("/member/login") .defaultSuccessUrl("/board/list") ) .logout(logout -> logout .logoutUrl("/member/logout") .logoutSuccessUrl("/") ) .userDetailsService(userDetailsService); return http.build(); } } 모든 접근에 대해 permitAll()을 하면 http://localhost:8080/m15/http://localhost:8080/m15/member/login둘다 잘 접속 되지만package kr.bit.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration //스프링 컨테이너 설정파일이라고 메모리에 올림 @EnableWebSecurity public class SecurityConfiguration { @Autowired private UserDetailsServiceImpl userDetailsService; //패스워드 인코딩 객체를 스프링 컨테이너에 등록 @Bean public PasswordEncoder PasswordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(csrfConfig -> csrfConfig.disable() ) .authorizeHttpRequests(authorizeRequests -> authorizeRequests .requestMatchers("/", "/member/**").permitAll() .requestMatchers("/board/**").authenticated() ) .formLogin(login -> login .loginPage("/member/login") .defaultSuccessUrl("/board/list") ) .logout(logout -> logout .logoutUrl("/member/logout") .logoutSuccessUrl("/") ) .userDetailsService(userDetailsService); return http.build(); } } requestMatchers 로 permitAll()하면http://localhost:8080/m15/로 접속하면http://localhost:8080/m15/member/login로 이동하면서 에러가 발생합니다. 스프링 부트 버전은 3.2.1입니다.
-
미해결실전! Querydsl
DB결과가 다릅니다.
에러 없이 수행은 됩니다하지만 sql문에서는 제대로 실행되지 않고 있습니다.
-
미해결실전! Querydsl
Q hello가 작성되질 않습니다.
Q hello가 작성되질 않습니다. 다른 내용들을 참고해서 이것저것 설정을 해보았으나 외부라이브러리에 querydsl은 생성되었으나. generarted에는 큐쿼리가 생성되지 않습니다.
-
미해결실전! 스프링 데이터 JPA
스프링부트 3.2부터 빌드 설정
강의 자료에 스프링 부트 3.2부터는 빌드시 Intellij가 아닌 Gradle을 선택해야 한다고 나와있는데 이 부분 맞나요?
-
미해결실전! 스프링 데이터 JPA
객체 생성 관련 질문
영한님 안녕하세요.객체 생성과 관련한 내용으로 궁금한 점이 있어 작성하였습니다.객체 생성시 크게 생성자, 빌더, 정적 메소드 3가지 방식으로 알고 있습니다.영한님은 실무에서는 주로 어떤 방식을 선호하는지 궁금합니다.정적 메서드와 빌더를 같이 사용하는건 어떤지 영한님 생각이 궁금합니다. 예시)@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @NamedEntityGraph( name = "Member.roles", attributeNodes = @NamedAttributeNode(value = "roles", subgraph = "Member.roles.role"), subgraphs = @NamedSubgraph(name = "Member.roles.role", attributeNodes = @NamedAttributeNode("role"))) public class Member extends EntityDate { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @Column(nullable = false, length = 30, unique = true) private String email; private String password; @Column(nullable = false, length = 20) private String username; @Enumerated(EnumType.STRING) @Column(nullable = false) private SocialType socialType; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) private Set<MemberRole> roles; @Builder public Member(String email, String password, String username, SocialType socialType, List<Role> roles) { this.email = email; this.password = password; this.username = username; this.socialType = socialType; this.roles = roles.stream() .map(r -> new MemberRole(this, r)) .collect(toSet()); } }@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class MemberDto { private Long id; private String email; private String username; private SocialType socialType; private Set<RoleType> roles; @Builder public MemberDto(Long id, String email, String username, SocialType socialType, Set<RoleType> roles) { this.id = id; this.email = email; this.username = username; this.socialType = socialType; this.roles = roles; } public static MemberDto toDto(Member member) { return MemberDto.builder() .id(member.getId()) .email(member.getEmail()) .username(member.getUsername()) .socialType(member.getSocialType()) .roles(member.getRoles().stream() .map(r -> r.getRole().getRoleType()) .collect(Collectors.toSet())) .build(); } }@Getter @EqualsAndHashCode @NoArgsConstructor(access = AccessLevel.PROTECTED) public class SignUpRequest { @Email(message = "이메일 형식을 맞춰주세요.") @NotBlank(message = "이메일을 입력해주세요.") private String email; @NotBlank(message = "비밀번호를 입력해주세요.") @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$", message = "비밀번호는 최소 8자리아면서 1개 이상의 알파벳, 숫자, 특수문자를 포함해야합니다.") private String password; @NotBlank(message = "사용자 이름을 입력해주세요.") @Size(min = 2, message = "사용자 이름이 너무 짧습니다.") @Pattern(regexp = "^[A-Za-z가-힣]+$", message = "사용자 이름은 한글 또는 알파벳만 입력해주세요.") private String username; @Builder public SignUpRequest(String email, String password, String username) { this.email = email; this.password = password; this.username = username; } public Member toEntity(Role role, SocialType socialType, PasswordEncoder passwordEncoder) { return Member.builder() .email(email) .password(passwordEncoder.encode(password)) .username(username) .socialType(socialType) .roles(List.of(role)) .build(); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order와 Item간의 관계에 대해서 궁금한점이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Order와 Item은 다대다 관계입니다. 하나의 주문이 여러개의 상품을 담을 수 있고, 하나의 상품은 여러개의 주문에 속할 수 있다.여기서 궁금한 점이 있습니다.하나의 상품이 여러 개의 주문이 속할때예를 하나의 상품이라는 객체가 다음과 같이 구성될때id : 1name : 핸드폰stockQuantity : 3categories : 전자제품 이라는 하나의 객체가 주문( id : 2)에도 속하고다른 주문(id:3)에도 속할 수 있다는건가요?