월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Wrong user name or password [28000-214] 오류
아래 사진처럼 설정을 해줬는데도 불구하고 아래 오류내용이 뜹니다. 어떻게 해결해야될지 모르겠습니다ㅠㅠ ERROR: Wrong user name or password [28000-214]Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) 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 org.example.Main.main(Main.java:9)Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:363) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:282) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:260) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:401) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:112) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:75) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:100) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 14 moreCaused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:510) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.message.DbException.get(DbException.java:188) at org.h2.engine.Engine.validateUserAndPassword(Engine.java:393) at org.h2.engine.Engine.createSession(Engine.java:206) at org.h2.server.TcpServerThread.run(TcpServerThread.java:175) at java.base/java.lang.Thread.run(Thread.java:1589) at org.h2.message.DbException.getJdbcSQLException(DbException.java:510) at org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at org.h2.engine.SessionRemote.done(SessionRemote.java:606) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:163) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:325) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.Driver.connect(Driver.java:59) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38) ... 29 moreProcess finished with exit code 1
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
remove 메서드 관련해서 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 엔티티 매니저 remove() 메서드 관련 질문이 있습니다.remove는 영속성 컨텍스트의 1차 캐시에서 엔티티를 삭제하고, DB의 데이터를 delete 해주는 메서드로 알고 있습니다. 여기서 문제는 1차 캐시에서 엔티티를 삭제한다는 것이 "전체 데이터를 지우는 것(key:value)"인지 아니면 "해당 식별자에 할당된 데이터(value)"를 지우는 것인지가 궁금합니다. 위에서 그림에서 member를 remove 한 후에 remove된 member id를 받아 조회를 수행했습니다.저는 1차 캐시에서 삭제된다고 알고 있었기에 select 쿼리가 실행될 것이라고 예상했으나 다음과 같이 select 쿼리가 실행되지 않았습니다.제가 remove를 제대로 이해못한 것 같은데, remove를 수행하면 1차 캐시에서 바로 삭제되지 않는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@JoinTable
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.Member, Post 연관관계 매핑할 때 다음처럼 MEMBER_POSTS 테이블이 자동으로 생성됩니다..JoinTable을 사용하지도 않았는데 왜 생기는 건가요?domain/Member , domain/Post 봐주시면 됩니다. 감사합니다!https://github.com/320Hwany/board
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 주인
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.두 개의 Parent, Child 엔티티가 있는데em.persist()로 엔티티를 영속상태로 만들 때 parent부터 저장했는데 연관관계의 주인이 child여서 child를 나중에 저장하는건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
서비스에서 외래 키 사용에 대해 질문 드립니다
안녕하세요!공부를 하다보니 실제 서비스에서는 외래 키 사용을 안하는 경우가 많다는데 외래 키가 없는 게 이해가 안 되어 질문 드립니다..연관관계 매핑 이런것들을 안 쓰는 건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본키 수정
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]게시판을 만들다가 궁금한 점이 생겨서 질문드립니다. 게시판에서 게시물을 삭제하면 그에 맞게 글 번호가 연속된 오름차순으로 재정렬되게 하는 것이 목적입니다. 저는 일단 view에서 페이징 정보를 이용해서 페이지마다 계산해서 제가 구현하고자 하는 기능을 만들기는 했습니다. 하지만 이를 db pk 값을 이용해서 구현할 수도 있을 거라 생각이 들었습니다. db의 pk값을 그대로 view에 뿌리고 게시물을 삭제하면 그에 따라 삭제된 게시물의 pk값 보다 큰 게시물의 pk를 1씩 감소하게 말입니다. 1씩 감소시키는 것은 서비스 로직에서 변경감지 기능을 사용했습니다. pk값을 다루는 거라 뭔가 위험하다는 생각은 들었으나 기술적인 부분에 집중하고자 했습니다.하지만 에러가 났고 저는 에러가 난 이유는 db의 외래키 제약조건이 on update restrict로 설정이 되어있다고 판단했습니다. 따라서 mysql에서 해당하는 테이블의 외래키 제약조건을 on update cascade로 수정을 해서 다시 실행해봤지만 그래도 여전히 에러가 났습니다. 구글링을 통해 알아봤는데 단순히 JPA에서는 기본키를 변경하는 것을 허용하지 않는다. 필요하다면 mybatis나 jdbctemplate을 써라정도만 나와있습니다. 여기서 제가 궁금한점은저는 직접 mysql에서 외래키 제약 조건을 수정했는데 jpa에서 쿼리를 날려서 외래키 제약 조건을 수정하는게 가능한가요? 다른 db접근 기술과 달리 jpa에서 기본키를 변경을 못하는 이유가 뭔지 알 수 있을까요? 그냥 JPA에서 무턱대고 막아둔게 아니라면 그 이유가 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실습 코드
실습 코드를 다운받을 수 있는 곳이 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 1차캐시
영속성 컨텍스트와 1차 캐시가 같은 개념인지 궁금합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
결국 영속성 컨텍스트가 중요한건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.강의를 듣다보니까 제 생각이 맞는지 궁금해서 질문남깁니다. 영속성 컨텍스트가 존재하는 이유는 결국에는 실제 DB를 거치지 않고 빠른 반환을 제공하기 위해 1차캐시에 필요한 데이터가 존재한다면 그걸 바로 사용하자! 인가요?PROXY객체를 생성하여 사용하는건 N+1문제를 해결하기 위한건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpql 로도 3중조인이 가능한가요?
JPQL로 3중 조인이 가능할까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계에서 연관관계 편의 메서드 위치에 대해 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 좋은 강의 덕분에 양질의 지식을 비교적 수월하게 습득하고 있습니다.양방향 연관관계에서 편의 메서드는 어디에 위치하는게 좋은지 여쭙고자 합니다.(비슷한 질문들을 봤지만 이러한 경우에 어떤게 가장 좋은 선택일지 궁금하여 질문드립니다.)비슷한 질문1 : https://www.inflearn.com/questions/16308비슷한 질문2 : https://www.inflearn.com/questions/99330 현재상태위와 같이 일대다(1:N) 관계가 있고 Team 을 애그리거트 루트로 잡았습니다.도메인 룰은 다음과 같습니다.Team 은 반드시 이름이 있어야한다.Player는 반드시 이름과 나이가 있어야한다.Player는 반드시 Team에 소속되어야하며, 하나의 Team 에만 소속될 수 있다.player 의 Team 은 변경될 수 없다.엔티티 코드 입니다. (연관관계 편의 메서드를 애그리거트 루트쪽에 두었습니다.)(두 엔티티는 동일한 패키지에 있습니다. package com.example.jpa.module.team.domain;)@Entity public class Team { @Id @GeneratedValue private Long teamNo; private String name; @OneToMany(mappedBy = "team", cascade = CascadeType.ALL) private List<Player> players = new ArrayList<>(); //생성자 public Team(String name) { this.name = name; } //연관관계 편의 메서드 public void addPlayer(Player player) { player.setTeam(this); this.players.add(player); } }@Entity public class Player { @Id @GeneratedValue private Long playerNo; private String name; private Integer age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_no") private Team team; //생성자 public Player(String name, int age) { this.name = name; this.age = age; } void setTeam(Team team) { this.team = team; } }service 계층 코드입니다.Team team = new Team("team1"); Player player = new Player("kim", 24); team.addPlayer(player); teamRepository.save(team);Team 이 Player 를 완전히 소유하는 관계이기 때문에 애그리거트 루트를 Team 으로 잡았고 연관관계 메서드 또한 Team 에 있는게 자연스러워 보입니다.(예시가 Team-Player라 결합도가 좀 떨어지는것 처럼 느껴지는데 주문-주문항목 이나 게시글-첨부파일 같은 관계로 봐주시면 감사하겠습니다.)문제점연관관계 편의 메서드 addPlayer(..)가 호출되기 전까지 Player의 도메인 룰이 깨진 상태가 됩니다.도메인 룰 3번 "Player 는 반드시 Team에 소속되어야 한다" 를 위반하게 됩니다.Player의 setTeam(..) 메서드를 클래스 외부에 공개해야 합니다.같은 패키지라 public 으로 공개하진 않았지만 해당 메서드로 인해 도메인 룰 4번 "player 의 Team 은 변경될 수 없다." 를 위반할 여지가 생겼습니다.setTeam(..) 메서드에 this.team != null 인 경우 예외를 발생시켜 도메인 룰을 지킬 수 있지만 좋은 방법인지 잘 모르겠습니다..시도한 방법Player의 생성자에 Team을 받도록 합니다.public Player(Team team, String name, int age) { this.team = team; this.name = name; this.age = age; }근데 이렇게 하니 그냥 연관관계 편의 메서드를 Player에 두는게 나은것 같아 생성될때 연관관계를 맺도록 정적 팩토리 메서드를 작성했습니다.public static Player createAndLink(Team team, String name, int age) { Player player = new Player(team, name, age); //생성자 private 으로 변경 team.getPlayers().add(player); //반대편 연관관계 설정 return player; }일단 도메인 룰은 모두 만족하는 듯 보이나 service 계층 코드가 뭔가 부자연스럽습니다.Team team = new Team("team1"); Player player = Player.createAndLink(team, "kim", 24); teamRepository.save(team);위 코드를 보면 player를 생성하고 사용하지 않는것 처럼 보여 불필요한 코드로 인식됩니다.(인텔리제이에서도 player가 미사용 중이라고 나옵니다.)혹시 위와 같은 상황에서 어떻게 해결하는게 가장 좋은 방법일까요?(긴 글 읽어주셔서 감사합니다.)
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
주 테이블 외래키 장,단점에 관해 질문이 있습니다.
"주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능" 이 부분을 저는 주 테이블만 봐도 일단 외래키가 있다는 것은 대상 테이블에 뭔가가 있다는 것이니까 대상 테이블의 데이터 존재 유무 확인이 가능하다 라고 이해를 하였고 "값이 없으면 외래 키에 null 허용" 이 부분을 저는 OneToOne 관계이므로 한 사람은 라커 하나를 사용할 수 있고 라커도 한 사람에게 할당될 수 있으므로 주 테이블의 외래키인 LOCKER_ID가 null 이라는 것은 이 사람에게 할당될 라커가 없고 고로 대상 테이블에도 데이터가 없다 라고 이해를 했습니다. 이런 상황에서 두 가지 질문이 있습니다.제가 이해한 것이 맞을까요?테이블 칼럼의 값이 null인 것이 왜 단점일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 관계에서 주테이블과 대상테이블은 어떤 기준으로 나누나요?
다대일 관계에선 다(N)쪽이 외래키를 가지고 있으니까 그 쪽을 기준으로 생각하면 될 거 같은데, 일대일 관계에선 따로 기준이 있나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
FK + 상수로 이루어진 조인
A 테이블에는A테이블의 PK 가 있고 B 테이블의 경우B 테이블 ID 컬럼(PK) , A테이블의 PK 값(FK) ,A테이블의 테이블명(상수)을 갖고있는 테이블이 있을때 A테이블과 B테이블과의 관계를엔티티 연관관계를 걸때 FK+A테이블의 테이블명(상수)(B테이블에는 FK+여러테이블명(A,C,D,E ...))으로 이루어진 다수의 ROW 존재 1줄로 요약하자면 FK + 상수 가 조인 조건일때이런경우 연관관계를 맺기 위한 정석적인 해결책이 있나요? 많은 구글링을 해보았지만1.https://stackoverflow.com/questions/28818511/jpa-hibernate-join-on-constant-value (@JoinColumnOrFormula)2.https://stackoverflow.com/questions/68341956/jpa-hibernate-how-to-define-custom-join-clause-on-entity(@JoinFormula)3.https://stackoverflow.com/questions/27945738/jpa-jointable-with-extra-join-conditions(@WhereJoinTable ) 4.https://stackoverflow.com/questions/30571450/jpa-many-to-one-with-constant-values-in-referenced-table@Where(clause=상수)5.혹은 연관관계를 맺지않고 별도쿼리로 처리 등등을 찾아보았지만맞는 방법이 무엇인지 잘 모르겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계의 주인에 대해서 질문드립니다.
연관관계의 주인을 보통 N쪽으로 하잖아요?강의 예시대로라면 Member.team이 연관관계의 주인이 되는 거 같은데 한 가지 헷갈리는 것이 있어 질문드립니다.연관관계의 주인이 Member가 되는 것인가요 아니면 Member에 있는 Team team 이 부분이 되는 것인가요?만약 Member에 있는 Team team 이 부분이 연관관계의 주인이면 Team 객체 자체가 주인이 된다고 봐야하는 것인가요?이 부분이 계속 헷갈리네요 ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL inner join에서 Team을 LAZY로 설정해도 같은 이슈발생에 대해서 문의드립니다.
안녕하세요 김영한님!좋은 강의 제공해주셔서 진심으로 감사합니다.다름이아니라 JPQL inner join으로 Member, Team 조인했을 때 inner join에서 추가로 team select 쿼리가 나가는 부분에서 이슈가 있어서 문의드리게 되었습니다.저는 kotlin으로 강의내용 코드를 작성해서 공부하고 있는데요.val resultList = em.createQuery("select m from Member m join m.team t", Member::class.java) .resultList강의내용대로 inner join JPQL 작성했고 Member Entity는@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") var team: Team? = null이렇게 LAZY로 설정하고 코드 실행했는데 team select 쿼리가 여전히 inner join 쿼리 이후에 추가로 실행되고 있었는데요.혹시 어디 부분에서 이런 상황이 계속 발생하는지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)<질문>하이버네이트 영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?영속성 컨텍스트에서 '쓰기 지연 SQL 저장소'와 '1차 캐시'가 어떻게 작동하는지 이해하는게 중요한것 같아서 영속성 컨텍스트 구현 클래스에서 SQL 저장소나 1차 캐시와 관련된 필드가 어떻게 생겼는지 확인하고, 엔티티매니저의 여러 메서드가 실행될 때 해당 필드들이 강의에서 배운 것처럼 변화하는지 확인하고자 했습니다.<궁금한 정보>하이버네이트 영속성 컨텍스트 구현 클래스의 필드 중 'SQL 저장소'나 '1차 캐시'의 역할을 하는 필드가 무엇인지Entity Manager의 CRUD 메서드나 flush() 등 실행시 SQL 저장소, 1차 캐시 필드의 변화 확인em.persist()em.find()em.remove()em.flush()Ex)em.persist(member)>>> 1차 캐시 필드에 member 엔티티 스냅샷이 저장 됐는지 확인>>> 쓰기 지연 SQL 저장소 필드에 member insert 쿼리가 생성됐는지 확인em.find(member2)>>> 1차 캐시 필드에 저장되지 않은 엔티티 조회시 DB에서 해당 엔티티 조회해서 1차 캐시에 저장하는지 확인em.flush()>>> 1차 캐시의 스냅샷과 현재 member엔티티와 비교하는 과정 확인>>> 변경 있다면 SQL 저장소 필드에 Update 쿼리 추가됨>>> 쓰기 지연 SQL 저장소 필드에 저장된 쿼리들 DB로 내보내는 과정 확인<조사 결과>아래처럼 영속성 컨텍스트 구현 클래스의 필드들 중 'SQL 저장소'나 '1차 캐시'의 역할을 하는 필드가 있을것이라고 가정하고 우선 해당 필드를 찾으려고 했습니다.1차 캐시entitiesByKey 필드에 엔티티가 저장돼서 해당 필드가 1차 캐시에 해당할수도 있겠다고 생각했는데엔티티 정보가 snapshot 처럼 저장된 것이 아니라 인스턴스 자체가 저장된 것이라서 1차 캐시가 아니라고 생각했습니다. 쓰기 지연 SQL 저장소SQL 쿼리가 String으로 저장된 필드 찾지 못함SingleTableEntityPersister 인스턴스에 엔티티 CRUD 쿼리 저장되는것 확인했지만,스프링부트 실행할 때 만들어지는 인스턴스기 때문에 쓰기 지연 SQL 저장소는 아니라고 생각했습니다.쓰기지연 SQL 저장소라면 em.persist() 실행시에 insert 쿼리가 만들어져야하기 때문에 (스프링부트 실행시점에 만들어지는 것이 아니라)결론적으로 영속성 컨텍스트 인스턴스에서 1차 캐시나 쓰기 지연 SQL 저장소에 해당되는 필드를 확인하지 못했습니다.디버거에서 entityManager.flush() persist() 등의 메서드 흐름을 쭉 따라가면서 전달되는 데이터를 보면서 1차 캐시나 SQL 저장소를 찾아보려고 했는데, 메서드 실행 과정이 너무 복잡해서 흐름을 따라가기가 어려웠습니다.<질문>영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?아니면 '1차 캐시'나 '쓰기 지연 SQL 저장소' 같은 개념들은 영속성 컨텍스트의 복잡한 작동을 추상화한 개념이라 실제 인스턴스에서 그 작동과정을 정확하게 확인하기는 어려울까요?스프링 강의에서부터 복잡한 개념은 위와 같은 방법처럼 인텔리제이 디버거에서 메서드 흐름에 따라서 주요 인스턴스 필드의 데이터가 어떻게 변하는지 확인하면서 이해가 잘 됐었습니다. JPA에서 중요한 부분도 이렇게 확인해보고자 했는데 위처럼 확인이 어려웠습니다. 그래서 이부분은 그냥 설명해주신 내용을 개념적으로 이해하고 넘어가야할지 고민입니다. ** 좋은 강의와 책 항상 감사드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동시성 문제
entitymanger를 proxy기술로 실제 호출시 실제 객체를 매핑한다는 것은 이해하였습니다.여기서 thread safe하다는 것은 제가 이해하기로는 "thread간에 entitymanger를 공유하지 않아 영속성 컨텍스트가 다른 thread에 의해 침범될 일이 없다" 입니다.하지만 이해가 되지 않는 부분은 동시성 문제를 해결할 수 있다는 부분입니다.동시성 문제를 해결한다는게 race condition 문제를 해결할 수 있다는 말일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제4 - 상속관계 매핑 13:20 새로 질문합니다.
스프링으로 새로 프로젝트 만들었습니다.영상에서 나오는 환경과 똑같이 따라했고요.현재 테이블 생성과 인서트 쿼리가 나오질 않고 있습니다ㅜㅜ 깃허브 링크입니다.https://github.com/InSuChoe/jpashop_test
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
객체.getXXXList().add(this) 관련
안녕하세요 스프링 1년정도 공부하고 출시까지 해본 수강생입니다.새로운 프로젝트 진행중에 의문이생겼는데 하단 사진보시면,일반적으로 객체의 컬럼들을 디비에 저장해서 프로그램이 종료되더라도 그 정보가 남아있는데, 하단 네모칸의 user.getProductSellList().add(this); -> User의 List<ProductSell>에 해당 객체가 추가될텐데.따로 디비에 저장하지 않고도 어떻게 프로그램 재실행시에 해당 리스트가 보존되어 있는건가요?user를 불러올때 최적화로 인해 2번째 사진처럼 불러옵니다. 이때 어떻게 List<ProductSell>이 보존되어 있는지 궁금하네요(스프링의 어떤기능으로 보존되어있는지)너무 당연하게 생각하다가 질문드립니다 감사합니다.