월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA가 결국엔 내부적으로 JDBC API를 사용하는 것인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] JPA가 결국 JDBC API를 사용해서 DB와의 접근을 하는 것이라고 설명하신 것 같은데 그럼 JPA 라이브러리 내부에 JDBC API도 가지고 있는 걸까요? 아니면 하이버네이트 라이브러리 내부에 JDBC API를 가지고 있는 걸까요? 패키지를 직접 확인해보고 싶은데 잘 모르겠어서 질문드립니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
roletype값 관련 질문
JpaMain 코드 2. Member 부분 코드 package hellojpa;import javax.persistence.*;import java.time.LocalDate;import java.time.LocalDateTime;import java.util.Date;@Entitypublic class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Lob private String description; //Getter, Setter… public Member() { } public void setId(Long id) { this.id = id; } public void setUsername(String username) { this.username = username; } public void setAge(Integer age) { this.age = age; } public void setRoleType(RoleType roleType) { this.roleType = roleType; }}3. rolltype 부분4. persist 설정 이렇게 설정을 두고, db 저장 부분을 실행해 보았을때, 다음과 같은 결과가 나왔습니다. 또한, 설정값을 update로 바꾸었을때는, 다음과 같이 에러가 발생했습니다. 왜 rolltype부분이 강사님처럼 숫자가 아닌 텍스트가 그대로 뜨는지, 왜 update에서 강사님처럼 성공적으로 뜨지 않고 에러가 나는지 알 수 있을까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
정수형 필드 사용시 래퍼 클래스 사용 여부 문의
Item 클래스에서 id 필드는 래퍼 클래스인 Long으로 선언되고 price나 stockQuantity 필드는 기본 타입인 int로 선언되었는데 이렇게 차이를 두는 이유가 있나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
9분 45초 부분부터 말씀하시는 순수한 객체 상태
안녕하세요. 순수한 객체 상태라는 게 무슨 말인가요? Team 객체를 생성하고 set 해준 후에 persist를 작성하면 영속성 컨택스트에서 해당 set 데이터가 저장되는 걸로 이해하고 있습니다. Member 객체를 생성하고 Team 객체를 set 해줌으로써 join 관계를 정의한 걸로 이해했고요. 쿼리가 날아가는 시점은 flush를 사용한 이후이고, 이 때 쿼리가 콘솔에 안 나온 이유는 flush를 주석처리하고 1차캐시에만 관리되고 있어서 라고 생각했는데 제가 잘못생각하고 있는 건가요? 말씀하시는 내용을 제가 제대로 이해한게 맞는 지 헷갈려서 질문드립니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 책 - 10장 조건식 타입표현 (날짜)
책 388쪽 날짜 예제를 보면 m.createDate = {d '2012-03-24'}로 DATE타입을 명시하면 된다고 나와있는데 List<Member> resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.birth > {d'2000-01-1'}", Member.class).getResultList(); 이러한 코드를 작성하고 코드를 돌리니까 java.lang.IllegalArgumentException: org.hibernate.QueryException: unexpected char: '{' [SELECT m FROM JPA.QueryPractice.domain.Member m WHERE m.birth > {d'2000-01-1'}] 이러한 오류가 발생하였고 이 오류에서는 "{"라는 문자를 인식할 수 없다고 나오는데 그러면 어떻게 날짜 타입을 작성해야 하는건가요?? List<Member> resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.birth > '2000-01-01'", Member.class).getResultList(); 이 코드는 정상적으로 실행됩니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@GeneratedValue() table이 생성이 안돼요 && Insert 쿼리가 안나가요
환경 1. h2 version 1.4.199 2. JPA 하이버네이트 5.3.10.Final 3. <property name="hibernate.hbm2ddl.auto" value="create"/> Member.class package hellojpa;import javax.persistence.*;@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @Column(name = "name", nullable = false) private String username; public Member() { } public Member(String id, String username) { this.id = id; this.username = username; } /** * getter setter */ public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }}JpaMain.java package hellojpa;import javax.persistence.*;@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @Column(name = "name", nullable = false) private String username; public Member() { } public Member(String id, String username) { this.id = id; this.username = username; } /** * getter setter */ public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }}에러코드 WARN: GenerationTarget encountered exception accepting command : Error executing DDL " create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, primary key (id) )" via JDBC Statementorg.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, primary key (id) )" 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.JdbcSQLFeatureNotSupportedException: Feature not supported: "CHARACTER VARYING(255)"; SQL statement: create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, [50100-210] at org.h2.message.DbException.getJdbcSQLException(DbException.java:575) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.get(DbException.java:227) at org.h2.message.DbException.get(DbException.java:203) at org.h2.message.DbException.getUnsupportedException(DbException.java:291) at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:316) at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:244) at org.h2.schema.Sequence.<init>(Sequence.java:101) at org.h2.table.Column.initializeSequence(Column.java:459) at org.h2.command.ddl.CommandWithColumns.generateSequences(CommandWithColumns.java:103) at org.h2.command.ddl.CreateTable.update(CreateTable.java:110) at org.h2.command.CommandContainer.update(CommandContainer.java:174) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:834) at org.h2.message.DbException.getJdbcSQLException(DbException.java:507) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:228) at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201) at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 15 more
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
foreign key 수정 질문
안녕하세요. 연관관계에 대해서 의문이 생겼습니다. 24분 쯤에 foreign key를 update 한다고 하셨는데 foreign key가 업데이트 되는 것이 실무적으로 발생해도 되는 경우인가요? pk를 참조하고 있기 때문에 개념상으로는 update 되어서는 안되는 데이터라고 생각했는데 상황적으로(팀을 바꾸는 상황)는 update 되는 것이 맞다고 여겨져서 제가 잘못 알고 있는 것인지 궁금해졌습니다. 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
SEQUENCE와 WS,WAS의 동시성 해결 관련 질문
안녕하세요? 강의의 기본 값 매핑 부분에서 GeneratedValue에 대해 수강 중에 질문이 생겼습니다. 1. sequence 전략을 사용하게 되면 미리 값을 증가 값 만큼 땡겨서 사용한다고 배웠는데요, 동시성 문제가 일어나지 않을 수 있는 이유는 여러 웹서버가 동시에 호출 하면 증가 값 만큼 가져올때 서로 다른 범위가 할당 되기 때문이라고 이해했습니다. 예로 두 대의 서버가 동시에 요청하고 증가값이 50이라면 A는 1~50 B는 51~100 범위를 할당 받는 거죠. 마치 pk 버퍼라고 할까요? 그리고 웹 서버가 중단 될 경우. 즉, A를 중간에 내려버리면 25까지 썻다고 하면 26~50은 사용 불가라고 이해했습니다.. 이때 db 관련 값은 WAS에서 처리하니깐 WAS에 값을 저장하는게 더 좋아 보이는데요. WS에 저장하는 이유가 있을까요? 그러니깐 코드는 하나고 하나의 코드를 여러대의 서버에서 사용하는데 서버 당 WAS가 하나씩 연결 되어 있고 디비에서 sequnce 땡겨오는 건 WAS가 하고 값 저장은 WS가 하는 식으로 둘이 같이 협력하는 방식인건가요? 2. 뿐만 아니라, sequnce 값을 맨 처음이거나 시작 값+allocationSize을 넘어서면 두 번의 조회 쿼리를 통해 시작값과 상한값을 알게 되는데 이때 동시성 문제가 생길 수 있지 않나요? 예를 들자면! allocationSize가 50이라고 할때 A가 들가서 첫 조회 쿼리로 1받고 다음 조회 쿼리로 상한인 50을 받기 직전에 B가 들가서 첫 조회 쿼리로 51을 받고 두 번째 조회 쿼리로 상한인 100을 받았는데 이때 A의 두번째 조회 쿼리가 날라가서 100을 받아버리면 A는 1~100을 사용하게 되는 문제가 생길 거 같은데, 차라리 두 번의 조회 쿼리보다 한번의 조회 쿼리 이후에 db에서 설정한 allocationSize를 보고 자신의 상한을 아는 것이 더 좋을 거 같지 않나요? 3. 추가적으로 WS와 WAS는 1대1 관계인가요? N:M 관계는 될 수 없는 걸까요? 좋은 하루 보내세요!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
createQuery시 쿼리가 날라가지 않고 rollback이 되는 문제
package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ List<Member> result = em.createQuery("select m from Member", Member.class) .getResultList(); for(Member member : result){ System.out.println("member.name = " + member.getName()); } tx.commit(); } catch (Exception e){ tx.rollback(); //쿼리가 전송되지 않을때, 다음과 같이 rollback을 시킨다 } finally { em.close(); } emf.close(); } } 다음과 같이 코드를 강좌와 똑같이 따라 했는데, print문과 쿼리가 나오지 않아 코드 결과물을 잘 뜯어보니, 21:56:20.511 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - rolling back ... 21:56:20.517 [main] DEBUG org.hibernate.internal.SessionFactoryImpl - HHH000031: Closing 이렇게 뜨는 것을 알 수 있었습니다. except문으로 가서 rollback된다는 의미인것 같은데 어디가 문제인지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
시퀀스 전략에 대해 질문이 있습니다
엔티티를 만들어서 @Id 와 @GeneratedValue 를 붙여주면 이게 자동으로 시퀀스로 등록되어 db에서 관리해주는 거고, 테이블 전략보다는 많이 쓴다고 하셨는데요. 테이블 전략 역시 db에서 seq를 저장해서 증가하는 방식을 사용하는 것 같은데 두 가지가 큰 차이가 있나요? 결국 둘다 db를 사용하는 것 같은데 성능적으로 무슨 차이인지 궁금합니다. 혹시나 제가 뭔가를 잘못 이해하거나 빠뜨려서 생각한 부분이 있다면 지적해주시면 감사드려요!
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
메이븐으로 프로젝트를 만들때 강의처럼 만들어지지가 않습니다
안녕하세요. 이번에 새로 다시 프로젝트를 만들어 실행해보려고 강의에서 보여주신 대로 메이븐으로 만들어봤는데 강사님께서 만드시는 화면과 제가 만드는 화면이 다르더라고요. Archetype 과 version 을 필수로 입력해야 넘어가지던데 여기에 뭘 추가해줘야하나요? 혹시 몰라 jpa-maven-archetype 을 선택해봤는데 아래처럼 에러가 납니다. 자바 8로도 해봤는데 똑같은 증상을 보입니다!
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성의 대한 질문입니다.
안녕하세요 항상 좋은 강의 만들어 주셔서 정말 감사합니다. 영속성에 대해 궁금한 것이 생겨 질문을 남기게 되었습니다. 컨트롤러, 서비스, 리파지토리의 계층이 있다고 할 때, 먼저 컨트롤러에서 유저를 조회한 후, 조회된 유저를 다른서비스 계층으로 보내서 로직을 처리하려고 하는데 해당 유저 객체를 영속성컨텍스트로 관리해주고싶으면 em.persist로 직접넣어줘야하나요 ? 읽어주셔서 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
3분53초쯤(콘솔화면)
select member0_.username as col_0_0_, 'HELLO' as col_1_0_, 1 as col_2_0_ from Member member0_ where member0_.type='USER' 여기에서 1 as col_2_0_가 나오는데 1이 의미하는게 무엇인가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
GenerationType.SEQUENCE allocationSize 질문
시퀀스 증가값이 50이라고 가정했을때 최초실행시 시퀀스를 두번 불러와서 1과 51을 가져오는것으로 이해했습니다. 이때 만약 allocationSize = 1 이여도 최초실행했을때는 1~51까지 insert를 모았다가 보낸다고 생각해도 될까요? 최초인 1~51이 지난후에는 52,102,152,,,로 한개씩 insert로 보낸다고 생각이들어서요. 즉 최초 실행시 allocationSize가 시퀀스 증가값보다 작다면 jpa는 1부터 1+[시퀀스증가값]을 사용할 수 있기때문에 allocationSize보다 더 많은 값인 1부터 1+[시퀀스증가값]만큼 보낼 수 있다 라고 이해해도 될까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 편의 메서드 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 양방향 연관관계 대해 이해가 잘 안되서 질문 드립니다. 양방향 연관관계는 연관관계 주인 생성 시 자식 객체에 값을 동시에 넣어 생성할 때 편하게 쓰려고 만든게 맞습니까? 만약 연관관계 주인을 생성하고 굳이 동시에 값을 넣어주지 않는 상황이라면 양방향 연관관계는 안쓰는건가요? 예를 들어 게시물의 추천이나 댓글 같은 경우 게시물이 작성될 때 댓글을 쓸 상황도 없고 쓸 이유도 없지만 멤버의 팀 같은 경우에는 멤버 생성 시 바로 어떤 팀에 들어갈 수도 있기때문에 사용하는거라 이해해도 괜찮을까요? 추가로 혹시 실무에서는 양방향 연관관계랑 단방향 연관관계를 사용하는 비율이 어느정도 될까요? 두서없이 질문해서 죄송합니다 글이 이해가 안되신다면 댓글 남겨주시면 감사하겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
임베디드 타입 내에서 엔티티 타입을 지정할 수 있다고 하셨는데, 정확한 방법이 궁금합니다.
1. MailMan이라는 Entity를 만들었습니다. package hellojpa; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class MailMan { @Id @GeneratedValue private Long id; } 2. Address에서 해당 Entity를 사용해보기로 했습니다. package hellojpa; import javax.persistence.*; @Embeddable // 임베디드 타입, 해당 타입을 쓰는 엔티티의 DB 테이블에는 Address 로 들어가는 게 아닌, 각자의 필드가 스키마로 들어가게 된다. 임베디드 타입은 엔티티의 값일 뿐이다! public class Address { private String city; private String street; @Column(name = "ZIPCODE") private String zipcode; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MY_MAILMAN_PK", insertable = false, updatable = false) private MailMan mailMan; // 임베디드 타입에서 엔티티 타입을 들고 있을 수 있다! 근데 안되네..? public Address() { } ...이하 생략 3. insertable = false, updatable = false 를 해제하면 코드가 돌지 않습니다. 4. 해당 설정을 제외하고서도 돌릴 수 있는 방법이 있을 것 같은데, 제가 어떠한 부분을 빼먹은건지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
25분20초쯤
findMember.getAddressHistory().remove(new Address("old1", "street", "10000")); 이 부분을 equals와 hashcode를 오버라이딩한 덕분에 new를 써도 같은 참조(주소)값으로 인지하고 내용물이 같은 객체를 지우게 되는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence.createEntityManagerFactory 부분 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 강의 그대로 따라가여 실행을 해봤는데 이러한 오류가 발생합니다. 구글에 찾아봤지만 해결방법이 나오지 않아서 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 사용시 DB 설계 관련 질문입니다!
안녕하세요 강사님. 보통의 프로젝트를 할 경우 DB 테이블 설계를 먼저 하는것으로 알고있는데요. JPA를 사용할 시에 테이블을 먼저 설계하고 그에 맞춰 엔티티를 작성하는지, 또는 먼저 엔티티를 중심으로 설계하는지 궁금합니다! 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
DDD 와 엔티티 매핑
안녕하세요. JPA를 사용해서 엔티티 매핑할 때 DDD에서 말하는 엔티티, 즉 도메인 객체를 바로 매핑하시나요? 아니면 JPA 엔티티를 도메인 객체와는 별개로 만들어서 매핑하시나요? 예제로 가르쳐주시는 건 바로 매핑하시는데, 혹시 실무에선 또 다른지 궁금해서 질문 드립니다.