월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 데이터 JPA
java: Compilation failed: internal java compiler error
String url = "jdbc:postgressql://localhost:5431/springdata";String username = "soreal";String password = "pass";try (Connection connection = DriverManager.getConnection(url, username, password)) { System.out.println("Connection created: " + connection); 로 정상 작성하고 모듈 8로 설정해서 띄워봐도 java: Compilation failed: internal java compiler error 에러가 납니다 뭐가 문제일까요? ㅠㅠ (포트와 아이디는 제가 임의 설정했습니다 , intellij 에서 getConnection 자체에서 빨간줄이 그어지며 실행이 안됩니다)
- 해결됨스프링 데이터 JPA
영속성 공부하다가 궁금한게 생겼습니다 .
class A { @GeneratedValue @Id private Long id; } 일떄 아래 run 메서드에서 @Transactional @Component public class JpaRunnerManyToMany implements ApplicationRunner { @PersistenceContext EntityManager entityManager; @Override public void run(ApplicationArguments args) throws Exception { A a1 = new A1(); a1.setId(1l); <== 해당 부분 에러가 뜨는데요a1.setUsername("test"); entityManager.persist(1L); 이경우 detached entity passed to persist 에러가 생기는데요 제가 강의를 들을떄 persist()를 할떄 비로소 1차캐쉬에 들어가서 jpa가 관리중인 상태가 된다고 들었는데 그렇다면 persist()하기 전에 1L을 id로 셋팅을 하고 persist()와 동시에 영속성상태로 올라갔을떄 @GeneratedValue 라는 어노테이션이 주키의 자동생성을 위한것이라고 들었는데 그렇다면 1L로 persist 메소드를 적용했을떄 1l이 이미 있으면 @GeneratedValue가 적용이 안되서 에러가 발생하는것일까요. 해석하면 detached entity passed to persist detach가 persist상태로 넘겨졌다라는걸로 해석되는데 만약에 A a = new A(); a.setId(1L); 로 entityManager.persist(a); 실행하면 정확히 어떤흐름으로 가는지 궁금합니다 .
- 미해결스프링 데이터 JPA
jpa 연관관계에 대해서 질문드립니다 .
안녕하세요 Spring Data Jpa 강의들으며 김영한님 jpa책으로 독학을 하고 있는 개발자 입니다 . 공부하다가 궁금한게 . 다대일(@ManyToOne) 일대다(@OneToMany) 일대일(@OneToOne) 다대다(@ManyToOne) 이런식의 맵핑 종류가 있는데 저기서도 단방향 , 양방향 이 존재한다고 들었습니다 . 보통 다대일(@ManyToOne)과 일대다(@OneToMany) 관계를 가장 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 않습니다. 라는 구절과 단방향 보다는 양방향이 더 안정적이라는 걸 공부하다가 본거같습니다 .. 1. 그러면 단방향이 반드시 쓰여야 할 상황이 있을꺼 인데 가령 어떤것들이 있을까요 . 2. 양방향이 쓰여야 할 상황은 실무적으로 어떤 상황이 존재 할까요 .. 단편적인 코딩법은 알겠지만 실제 실무에서 어떤 상황에서 사용해야 할지 무조건 ManyToOne의 양방향 관계위주로 엔티티를 작성하면 되는건지 여부가 궁금해서요 .. ex ) Member(N)(fk키 포함)주인 : Team(1)
- 해결됨스프링 데이터 JPA
update 쿼리가 발생하는 이유
private Post savePost() { Post post = new Post(); post.setTitle("Spring"); Post saved = postRepository.save(post); return saved; } @Test void updateTitle(){ Post spring = savePost(); spring.setTitle("hibernate"); List<Post> all = postRepository.findAll(); assertThat(all.get(0).getTitle()).isEqualTo("hibernate"); } 위 코드에서 insert 후에 update 가 일어나는 이유가 헷갈리네요. 한 트랜잭션 안이니 Post spring 은 managed 상태일테고. 그럼 title을 hibernate로 변경한 상태로 insert 쿼리를 수행해 DB와 싱크를 맞추고 select 쿼리를 날려도 되지않나요? 그런데 insert 하고 update 를 통해 title을 변경하는 이유가 궁금합니다. 좋은 강의 정말 감사합니다 :)
- 해결됨스프링 데이터 JPA
비동기 쿼리
안녕하세요 기선님 항상 좋은 강의 감사드립니다! 매 영상마다 질문을 남기는 것 같아 죄송하네요.. 비동기 쿼리에 대한 내용을 제 나름대로 요약해서 해석해보려 노력중인데 곡해가 있을까 걱정이 되어 이렇게 글을 남깁니다. 비동기 쿼리를 사용하는 것을 보니, 쿼리를 날리고 데이터를 받아오기 전까지 메인 쓰레드를 놀리지 않기 위해 비동기 쿼리를 사용하는 것으로 보입니다. 그런데 Future 을 사용하면 결국 get 으로 받아오는 작업에서 메인쓰레드가 블로킹이 되니까 Future 보단 콜백메서드를 사용할 수 있는 ListenableFuture 을 사용하는 걸 추천하신거라고 이해 됩니다. 그렇다면 여기서 조금 쓸모없는(?) 작업이긴 하지만 Future 의 get 을 받는 Thread 를 직접 구현해도 되겠다는 생각도 듭니다. 그리고 비동기 쿼리에 대한 테스트 코드 작성이 어려운 이유는 테스트의 특성상 위 테스트는 작업 전체가 한 트랜잭션이 될 테고, save 된 데이터를 가져오기 위한 쓰레드가 작업을 마치기도 전에 메인쓰레드가 끝나버리면서 하이버네이츠의 DB에 변화를 가져오지 않는 쿼리는 날리지도 않는 특성에 의해 insert 쿼리 조차 날라가지 않는 테스트가 되는 거구요. 의도적으로 flush() 를 통해 insert 를 할 수 는 있으나, insert 와 같은 트랜잭션 안에서 시작된 select 쿼리는 그 트랜잭션 내에서 insert가 된 데이터를 인지할 방법은 없게 된다는 설명으로 이해했습니다. 그렇다면.. 테스트를 위해서 @BeforeEach 를 통해 데이터를 먼저 집어넣은 상태로 동작을 확인할 수 있진 않을까 했지만, 이 작업자체도 DB의 변화를 일으키는 작업이 아닌만큼 하이버네이츠가 insert 를 날리지조차 않더군요. 그래서 위 코드에서 flush()를 추가하여 insert를 날렸지만.. 결과는 이렇더군요... 그런데 제 나름대로의 해석으로는 마지막 결과가 조금 이해가 되지 않네요.. 데이터를 집어넣었고 select 를 하는게 보이는데, size 는 0 이뜨고 근데 또 테스트는 성공하네요.. @BeforeEach도 결국은 한 트랜잭션안에서 동작하여 기존의 테스트 코드처럼 내부에서 Comment를 insert 하는 것과 동일한 작업인것인지.. 근데 또 테스트는 어떻게 성공한건지... 어디가 잘못된걸까요? 또 만약,, 제가 이상하게 이해한 부분이 있는 것 같다면 알려주시면 너무 감사하겠습니다!!
- 해결됨스프링 데이터 JPA
Test 용 DB
이전 강의 중에 h2 db를 테스트용 db로 사용하기 위한 dependecy를 추가하였는데 강의 내용 중간에, 테스트를 위해 postgresql db가 살아있는 확인하는 부분이있어서 여쭤봅니다! h2 db의 scope 를 test로 설정했다면 테스트 종류와 상관없이 ( 슬라이싱 테스트나 통합테스트 ) 테스트시에는 h2 db를 사용하는게 맞겠죠? 로그를 살펴봐도 starting embadded dataource 에 h2 로 잡히는 것으로 보이지만 확답을 얻고싶어서 여쭤봅니다
- 해결됨스프링 데이터 JPA
스프링 데이터 Common
안녕하세요 기선님 언제나 좋은 강의 감사드립니다! 기선님이 올려주신 자료와 설명을 듣고, 스프링 데이터 Common은 스프링 데이터 JPA 뿐만 아니라 다른 스프링 데이터 프레임워크 에서도 전반적으로 사용되는 공통의 부분이라는걸 알 수 있었습니다. 그리고, JpaRepository 에서 Save(entity)를 하는것은 자연스럽게 이해가 됩니다 ORM 기반의 JPA를 사용하는 것이니까요 그런데 CrudRepository 인터페이스의 경우 스프링 데이터 Common 의 인터페이스로 JPA에서만 사용하는 인터페이스가 아닐텐데, save(entity)가 가능한 것은 결국, 스프링 데이터 JPA 가 아닌 다른 부분들 (스프링 데이터 MongoDB, 스프링 데이터 JDBC...) 들도 ORM 이 기반인건가요?? 다른건 몰라도 스프링 데이터 JDBC는 까보진 않았지만 이름 자체가 ORM 기반은 아닐 것 같아서요.. 아니면 제가 왜곡해서 이해하고 있는 부분이 있는지 궁금합니다! 항상 도움되는 답변 해주셔서 너무 감사합니다!!
- 해결됨스프링 데이터 JPA
converter에 관한 질문
기본적으로 DomainClassConverter 는 도메인의 id 를 기준으로 데이터바인딩을 해주는데, 만약 id 값이 아닌 다른 프로퍼티를 사용해 컨버팅하고싶다면 직접 컨터버를 만들어주면 되는거죠!? 예를들어 account 라는 도메인에서 id 는 long으로 auto generated 되는 값을 쓰되, accountEmail 이라는 String타입의 프로퍼티로 컨버팅을 하고싶다면 Formatter 를 커스터마이징하거나 다른 converter를 커스터마이징해 사용하면 되는게 맞나요?
- 미해결스프링 데이터 JPA
plugin not found
아래와 같이 오류가 나타나는데 어떤 걸 확인해보면 될까요? maven-plugins보면 processor가 없거든요..~~;
- 미해결스프링 데이터 JPA
@NonNull
save 함수에서는 파라미터에 @NonNull 을 붙이든 안붙이든 Assert.notNull 예외가 생기고, findBy... 의 파라미터에 붙이더라도 예외가 생기지 않습니다. 제가 잘못한걸까요?
- 해결됨스프링 데이터 JPA
findById() 메소드 관련 질문입니다.
기선님의 jpa 강의를 듣고 jpa 를 활용해보기 위한 연습용 프로젝트를 진행하고 있는 중입니다. DB에 데이터가 들어가 있는 상태에서 스프링 데이터 jpa 의 findById() 메소드를 활용해 select 쿼리를 보내봤습니다. 그런데 이상하게도 값이 받아와지지 않아 두번 연속 요청을 보냈더니 그 다음부터는 값을 받아오는데 이게 가능한 일인지 궁금해서 여쭤봅니다 .. 기본적으로 이런 일은 발생하지 않는게 맞고 어디선가 제가 코드를 잘못 작성해놓은거겠죠..? orderDetailRepository 에 findById() 를 재정의 하거나 다른 메서드를 구현해놓지도 않은 상태입니다 .
- 해결됨스프링 데이터 JPA
ORM에서 R의 의미에 관해서 질문드립니다
강의 너무 잘 듣고있습니다. 감사합니다. 질문이 하나 생겨서 여쭤보는데, ORM 에서 애플리케이션의 object 와 DB의 relation이 맵핑 된다고하셨습니다. 그럼 여기서 relation은 entity와 동일선상으로 생각해도 되는건지 궁금합니다.
- 미해결스프링 데이터 JPA
안녕하세요. 질문 드립니다.
안녕하세요. 단방향으로 설정시 관계 테이블이 보이고, 양방향 설정시 관계 테이블이 보이지 않습니다. 이게 정상인건가요? 제가 제대로 했는지 의심이 들어서 질문드립니다. [단방향] Schema | Name | Type | Owner --------+----------------+-------+------------ public | course | table | jihuni1026 public | member | table | jihuni1026 public | member_courses | table | jihuni1026 [양방향] Schema | Name | Type | Owner --------+----------------+-------+------------ public | course | table | jihuni1026 public | member | table | jihuni1026
- 미해결스프링 데이터 JPA
특정 repository를 이용해 save 후 DB에도 반영된 정보가 해당 repository 를 통해 find 시 DB반영된 정보를 가지고 오지 못하는 현상에 대한 질문드립니다.
아래와 같은 소스들이 있습니다. 1. 인터페이스기반의 repository public interface TestModelRepository extends JpaRepository<TestModel, Long>{ } 2. 서비스 @Service public class TestService { ... @Autowired TestModelRepository testModelRepository; public void test() { ... while(true) { Optional<TestModel> optTestModel = testModelRepository.findById(id); TestModel testModel; if(optTestModel.isPresent()) { testModel = optTestModel.get(); logger.info("testModel: {}", testModel.toString()); } } } ... } 3. worker thread를 통해 호출되는 코드 public class TestAction { ... public void act(TestModelRepository testModelRepository, TestModel testModel) { ... testModel.setComment("new comment"); TestModel savedTestModel = testModelRepository.save(testModel); logger.info("savedTestModel: {}", savedTestModel.toString()); } ... } 상태 TestService의 test()에 의해 다른 worker thread에서 동작하는 TestAction의 act()가 호출됩니다. TestAction.act에 전달된 testModelRepository는 TestService의 것과 동일한 레퍼런스입니다. TestAction.act()에 의해 정상적으로 DB에 저장된 것이 확인됩니다. 그런데, TestService의 test()에서 주기적으로 TestAction.act()호출 시에 전달한 testModel에 대한 id를 이용해서 `testModelRepository.findById(id)` 를 수행하면 저장된 값이 아닌 저장 이전의 값만 가지고 오고 있습니다. 질문(이해가되지 않는 부분) 위 상태 1.에 의해 저장에 의해 SimpleJpaRepository의 save()의 처리를 타면서 저장한 정보가 merge되었기 때문에 Persistence Context에 정상적으로 적용이 될 것이기 때문에 상태 3의 `testModelRepository.findById(id)` 코드를 통해 해당 entity를 가져오면 정상적으로 변경된 내용을 가지고 와야 할 것 같은데 이해가 되지 않습니다.(제가 Persistence Context관련하여 놓치고 있는 부분이 있는 것 같은데 잘 모르겠네요.) 왜 그럴까요?
- 미해결스프링 데이터 JPA
영속성 컨텍스트에 의해 관리되는 entity 확인 시 오작동 문의
안녕하세요. 제가 멀 잘못 했길래 아래 결과가 모두 false 가 나오는거죠? (2.Result : true 가 나와야 한다고 생각 합니다.) (Tester를 만들어 돌리는게 익숙치 않아 직접 돌렸습니다.) 소스는 test05() 수행 해서 Post table에 저장하고, 영속성컨텍스트에 관리 되는 Entity 가 어떤건지 확인 하는 코드 입니다. package com.example.JPA03;import com.example.JPA03.domain.Post;import com.example.JPA03.repository.PostRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.data.domain.Sort;import org.springframework.stereotype.Component;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.transaction.Transactional;import java.util.Date;import java.util.List;import java.util.Optional;@Componentpublic class JPA03Runner implements ApplicationRunner { @Autowired PostRepository postRepository; @PersistenceContext private EntityManager entityManager; @Override public void run(ApplicationArguments args) throws Exception { test05(); } @Transactional private void test05(){ Post post = new Post(); post.setTitle("ys.."); Post savedPost = postRepository.save(post); // persist System.out.println("1. result : " + entityManager.contains(post) ); System.out.println("2. result : " + entityManager.contains(savedPost) ); }} package com.example.JPA03.domain;import com.example.JPA03.event.PostPublishedEvent;import org.springframework.data.domain.AbstractAggregateRoot;import javax.persistence.*;import java.util.Date;@Entity//@NamedQuery(name="Post.testNamedQuery", query = "select * from Post as p where p.title = ?1")public class Post extends AbstractAggregateRoot<Post> { @Id @GeneratedValue private Long id; private String title; private Integer likeCount; @Temporal(TemporalType.TIMESTAMP) private Date creatDate; public Post publishPostEvent(){ this.registerEvent(new PostPublishedEvent(this)); return this; } public Integer getLikeCount() { return likeCount; } public void setLikeCount(Integer likeCount) { this.likeCount = likeCount; } public Date getCreatDate() { return creatDate; } public void setCreatDate(Date creatDate) { this.creatDate = creatDate; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }} package com.example.JPA03;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Jpa03Application { public static void main(String[] args) { SpringApplication.run(Jpa03Application.class, args); }} ==수행 결과 == . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.3.3.RELEASE) 2020-08-26 01:05:37.745 INFO 4260 --- [ main] com.example.JPA03.Jpa03Application : Starting Jpa03Application on DESKTOP-GOQMQQP with PID 4260 (D:\private\study\jpa_study\JPA03\target\classes started by BISTel in D:\private\study\jpa_study) 2020-08-26 01:05:37.748 INFO 4260 --- [ main] com.example.JPA03.Jpa03Application : No active profile set, falling back to default profiles: default 2020-08-26 01:05:38.147 INFO 4260 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode. 2020-08-26 01:05:38.208 INFO 4260 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 52ms. Found 1 JPA repository interfaces. 2020-08-26 01:05:38.563 INFO 4260 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-08-26 01:05:38.597 INFO 4260 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2020-08-26 01:05:38.639 INFO 4260 --- [ task-1] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.20.Final 2020-08-26 01:05:38.662 INFO 4260 --- [ main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories… 2020-08-26 01:05:38.749 INFO 4260 --- [ task-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final} 2020-08-26 01:05:39.206 INFO 4260 --- [ task-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2020-08-26 01:05:39.296 INFO 4260 --- [ task-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2020-08-26 01:05:39.324 INFO 4260 --- [ task-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect 2020-08-26 01:05:39.857 INFO 4260 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2020-08-26 01:05:39.862 INFO 4260 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2020-08-26 01:05:40.110 INFO 4260 --- [ main] DeferredRepositoryInitializationListener : Spring Data repositories initialized! 2020-08-26 01:05:40.115 INFO 4260 --- [ main] com.example.JPA03.Jpa03Application : Started Jpa03Application in 2.661 seconds (JVM running for 3.051) Hibernate: select nextval ('hibernate_sequence') Hibernate: insert into post (creat_date, like_count, title, id) values (?, ?, ?, ?) 2020-08-26 01:05:41.837 TRACE 4260 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [TIMESTAMP] - [null] 2020-08-26 01:05:41.837 TRACE 4260 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [INTEGER] - [null] 2020-08-26 01:05:41.838 TRACE 4260 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [ys..] 2020-08-26 01:05:41.838 TRACE 4260 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [BIGINT] - [66] 1. result : false 2. result : false ㅇㅇ
- 미해결스프링 데이터 JPA
insert -> select 와 update-> select 의 동작 차이가 이해가 안됩니다.
안녕하세요 계속 질문을 드르게 되네요. PostRepository 안에 a() 와 b() 라는 메소드를 두개 만들고, a() 메소드는 아래와 같이 save 한후, findById() 로 찾는것 입니다. Insert 쿼리와 select 쿼리가 모두 수행 됐습니다. ==a() 메소드 코드== @Transactionalprivate void test04(){ System.out.println("-------------- test 04 시작 ---------------"); Post post = new Post(); post.setTitle("test_04"); post.setLikeCount(1); post.setCreatDate(new Date()); Post savedPost = postRepository.save(post); Optional<Post> findPost = postRepository.findById(savedPost.getId()); System.out.println("Result====>"+ findPost.get().getTitle() );} ==수행결과== b() 메소드를 "스프링 데이타 JPA6 update쿼리 " 챕터에서 말씀 하신것처럼 만들면, 강의 하실때 말씀 하시길 update() <- (직접만든것은 권장안함) 수행 후 에 findById() 로 조회를 하게 되면, PersistenceContext 에 영속성으로 들어가 있어서 불필요한 쿼리 라고 생각 해서 update 만 수행 되고 select 쿼리는 수행 안된다고 하셨습니다. 왜 a() 와 b() 메소드가 서로 수행이 왜 틀린거죠? a() 메소드 역시 영속성 컨테이너에는 db에 저장한 내용이 남아 있으니, findByid 시에 쿼리를 날리지 않아도 되지 않나요? 지연 쿼리이고, 싱크를 맞추기 위해 findById() 수행 시점에 Insert 쿼리와 select 쿼리가 날라 간다고 여러 차례 말씀 하셨는데요 a() 와 b() 메소드 모두 db 작업을 했고, db 작업 후에 findById()를 하는것인데 insert 문은 수행한 a() 는 싱크를 맞추기 위해 select문을 수행하고 update문을 수행한 b()는 싱크를 맞추지 않고 영속성 context에서 가져오는 이유를 모르겠습니다.
- 미해결스프링 데이터 JPA
커스텀 리파지토리 만들기 질문 입니다.
안녕 하세요 계속 질문을 드리게 되네요. 코딩 하시는거 보니, 저는 지금까지 프로그래머도 아니고 그냥 코더 였네요. 스프링 데이터 Common 7. 커스텀 리포지토리 만들기 Chatper 보고 드리는 질문 입니다. 강의에 아래와 같이 나옵니다. 1. PostCustomRepository 란 Interface 만든다. 해당 Interface는 findMyPost()란 추상 메소드를 가진다 2. PostCustomRepository 를 구현한 PostCustomRepositoryImpl 에 findMyPost() 메소드를 구현 한다. 3. 사용할 PostRepository Interface 에 implement를 하나 더 추가 한다. public interface PostRepository extends JpaRepository<Post, Long>, PostCustomRepository {} 4. Test source 에서 @Autowired 로 PostRepository 를 DI 하고 findMyPost() 를 호출 한다. 여기부터 질문 입니다. 제가 debug를 걸어서 postRepository (변수) 를 보니 해당 Interface는 실제 SimpleJpaRepository 객체 더군요. 그럼 postRepository 객체가 DI 되서 생기는 일을 해주는 Spring Frameowork이 기존 SimpleJpaReposity class로 객체 생성시, custom으로 추가한 findMyPost() 를 class에 추가 한후 객체 만들어서 postRepository(변수)에 attach해주는 건가요? 즉. 아래와 같은 건가요? PostRepository postRepository = new SimpleJpaRepositoy() <- findMyPost()가 추가되어 생성된 객체
- 미해결스프링 데이터 JPA
상속 없는 Custom Repository Interface가 어떻게 동작이 가능 한 건가요??
안녕하세요 '스프링 DATA Common2- Interface 정의' 강좌가 이해가 안됩니다 강의내용 예제 처럼 CustomRepository를 만들었고 save() 와 findAll() 메소드에는 구현체가 없는데 어떻게 data가 저장이 되고 찾아 지는건가요? 이전 강좌에서 만는 Repository interface는 JpaRepository 를 extend 받았고, 그 위로 어찌어찌 찾아가다 보니 구현 체인 SimpleJpaRepository 란 놈에서 save()가 구현 되는걸 알았습니다. 근데 아래의 제가 만든 CommentRepsoity 는 상속 받은 interface가 하나도 없는데 됩니다. Interface 위에 붙은 Annotation (@RepositoryDefinition) 때문에 알아서 내부적으로 save(), findAll() 를 구현 해주는건가요??? package com.example.SpringDataJPATest.repository;import com.example.SpringDataJPATest.domain.Comment;import org.springframework.data.repository.Repository;import org.springframework.data.repository.RepositoryDefinition;import java.io.Serializable;import java.util.List;@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class)public interface CommentRepository { Comment save(Comment comment); List<Comment> findAll();}
- 미해결스프링 데이터 JPA
entityManager 객체가 null 입니다.
안녕하세요 질문이 있습니다. 선생님. "JPA 프로그래밍1 . 프로젝트 세팅을 따라 하고 있습니다." 그런데 아래 소스를 Intellij 에서 실행시 에러가 납니다. 에라가 나는 이유는 entityManager가 Null 이어서 그런데요. 왜 null 인지 모르겠습니다. 왜 entityManager가 null인지 모르겠습니다. 다 똑같이 했고, 다른점은 제가 local에 postgresql 이 있는것이 아니고, Oracle virtual box 의 centos 안에서 docker로 postgresql을 실행 했습니다. (물론 local에서 virtualbox 안의 가상머신에 telent으로 접속도 됩니다.) package com.example.SpringDataJPATest;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.transaction.Transactional;@Component@Transactionalpublic class JpaRunner implements ApplicationRunner { @PersistenceContext EntityManager entityManager; @Override public void run(ApplicationArguments args) throws Exception { Account account = new Account(); account.setUsername("robin"); account.setPassword("password01"); entityManager.persist(account); }} ==application.properties 내용== spring.datasource.url=jdbc:postgresql://192.168.xx.xxx:5432/springdataspring.datasource.username=xxxspring.datasource.password=uuuuspring.jpa.hibernate.ddl-auto=createspring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=truelogging.level.org.springframework=DEBUG ==pom.xml 내용== <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>SpringDataJPATest</artifactId> <version>0.0.1-SNAPSHOT</version> <name>SpringDataJPATest</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> <dependency> <groupId>jakarta.transaction</groupId> <artifactId>jakarta.transaction-api</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <version>2.3.2.RELEASE</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
- 미해결스프링 데이터 JPA
sort 관련해서 질문이 있습니다
스프링 데이터 JPA : 쿼리 메소드 Sort 강좌에서 @Query 사용시 Order by 절에서 함수를 호출하는 경우에는 Sort를 사용하지 못합니다. 그 경우에는 JpaSort.unsafe()를 사용 해야 합니다 라고 하셨으는데, 궁금한게 jpql이 아닌 repository 아래와 같은 메서드가 있을 때 sort 부분에 함수를 넣어줄 수 있나요? List<Post> findByTitleStartsWith(String title, Sort sort);