<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>FORDO가 가는 개발자의 길</title>
    <link>https://fordo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 11 Aug 2026 22:11:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>fordo</managingEditor>
    <item>
      <title>JPA(11) - 스키마 자동 생성</title>
      <link>https://fordo.tistory.com/71</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 4-2강을 듣고 정리한 글입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 스키마 자동 생성&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DDL을 애플리케이션 실행 시점에 자동 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테이블 중심 &amp;rarr; 객체 중심&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 생성된 DDL은 개발 장비에서만 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 스키마 자동 생성 - 속성&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;create : 기존테이블 삭제 후 다시 생성(DROP + CREATE)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;create-drop : create와 같으나 종료시점에 테이블 drop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;update : 변경분만 반영(운영DB에는 사용하면 안됨)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;validate : 엔티티와 테이블이 정상 매핑되었는지만 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;none : 사용하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 스키마 자동 생성 - 주의&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;운영 장비에는 절대 create, create-drop, update 사용하면 안된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;개발 초기 단계는 create 또는 update&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테스트 서버는 update 또는 validate&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스테이징과 운영 서버는 validate 또는 none&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DDL 생성 기능&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제약조건 추가 : 회원 이름은 필수, 10자 초과X&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Column(nullable = false, length = 10)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유니크 제약조건 추가&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Table(uniqueConstraints = {@UniqueConstraint( name = &quot;NAME_AGE_UNIQUE&quot;, columnNames = {&quot;NAME&quot;, &quot;AGE&quot;})})&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DDL 생성 기능은 DDL을 자동 생상할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/71</guid>
      <comments>https://fordo.tistory.com/71#entry71comment</comments>
      <pubDate>Thu, 14 Sep 2023 14:43:05 +0900</pubDate>
    </item>
    <item>
      <title>JPA(10) - 객체와 테이블 매핑</title>
      <link>https://fordo.tistory.com/70</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 4-1강을 듣고 정리한 글입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Entity&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;주의&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본 생성자 피루(파라미터가 없는 public 또는 protected 생성자)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;final 클래스, enum, interface, inner 클래스 사용 X&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저장할 필드에 final 사용 X&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Entity 속성 정리&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;name&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JPA에서 사용할 엔티티 이름을 지정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본값 : 클래스 이름을 그대로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;같은 클래스 이름이 없으면 가급적 기본값을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Table&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Table은 엔티티와 매핑할 테이블 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Table 속성 정리&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;name&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;매핑할 데이터 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;catalog&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 catalog 매핑&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;schema&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터베이스 schema 매핑&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;uniqueConstraints(DDL)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DDL 생성 시에 유니크 제약 조건 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/70</guid>
      <comments>https://fordo.tistory.com/70#entry70comment</comments>
      <pubDate>Thu, 14 Sep 2023 09:30:25 +0900</pubDate>
    </item>
    <item>
      <title>JPA(9) - 준영속 상태</title>
      <link>https://fordo.tistory.com/69</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 3-4강을 듣고 정리한 글입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;준영속 상태&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속 &amp;rarr; 준영속&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속성 컨텍스트가 제공하는 기능을 사용 못함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;준영속 상태로 만드는 방법&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.detach(entity) - 특정 엔티티만 준영속 상태로 전환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.clear() - 영속성 컨텍스트를 완전히 초기화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.close()&amp;nbsp; - 영속성 컨텍스트를 종료&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/69</guid>
      <comments>https://fordo.tistory.com/69#entry69comment</comments>
      <pubDate>Wed, 13 Sep 2023 12:04:19 +0900</pubDate>
    </item>
    <item>
      <title>JPA(8) - 플러시</title>
      <link>https://fordo.tistory.com/68</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 3-3강을 듣고 정리한 글입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;플러시&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;플러시 발생&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;변경 감지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;수정된 엔티티 쓰기 지연 SQL 저장소에 등록&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속성 컨텍스트를 플러시하는 방법&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.flush() - 직접 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;트랜잭션 커밋 - 플러시 자동 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JPQL 쿼리 실행 - 플러시 자동 호출&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;플러시 모드 옵션&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FlushModeType.AUTO - 커밋이나 쿼리를 실행할 떄 플러시 (기본값)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FlushModeType.COMMIT -&amp;nbsp; 커밋할 때만 플러시&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;플러시는?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속성 컨텍스를 비우지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속성 컨텍스트의 변경내용을 데이터베이스에 동기화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;트랜잭션이라는 작업 단위가 중요 &amp;rarr; 커밋 직전에만 동기화하면 됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/68</guid>
      <comments>https://fordo.tistory.com/68#entry68comment</comments>
      <pubDate>Wed, 13 Sep 2023 11:41:49 +0900</pubDate>
    </item>
    <item>
      <title>JPA(7) - 영속성 컨텍스트2</title>
      <link>https://fordo.tistory.com/67</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 3-2강을 듣고 정리한 글입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1차 캐시&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1694565728484&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Member member = new Member();
member.setId(&quot;member1&quot;);
member.setUsername(&quot;회원1&quot;);
//1차 캐시에 저장됨
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, &quot;member1&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.persist를 하면 영속 컨텍스트에 등록을 하는 개념이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그다음 em.find를 하게되면 먼저 1차 캐시에서 조회를 하게 된다. 없다면 DB에서 조회한 후 가져오게 된다. 이때에도 영속 컨텍스트에 등록이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속 엔티티의 동일성 보장&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1694565874162&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Member a = em.find(Member.class, &quot;member1&quot;); 
Member b = em.find(Member.class, &quot;member1&quot;);
System.out.println(a == b); //동일성 비교 true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;영속 컨텍스트에 member1이 등록되어있다고 가정하면 a와 b는 같은 객체를 가지고 오기 때문에 비교를 했을 때 true를 반환한다. 내가 알고 있는 mybatis에서는 DB에 종속되어있기 때문에 DB에서 조회한 후 객체에 넣기 때문에 a == b를 했을 때는 false를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1694566129858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin();
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;엔티티 수정 - 변경 감지&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1694571219555&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// 영속 엔티티 조회
Member memberA = em.find(Member.class, &quot;memberA&quot;);
// 영속 엔티티 데이터 수정
memberA.setUsername(&quot;hi&quot;);
memberA.setAge(10);
transaction.commit();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;em.find해서 찾아온 객체를 em.persist할 필요없이 객체의 필드를 변경하게 되면 commit이 이뤄질 때 영속 컨텍스트에 있는 객체와 비교하여 자동으로 변경을 감지해 update 구문을 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이점은 JPA가 참 편한 것 같다. 계속해서 mybatis와 비교하게 되는데 나는 처음 배울때부터 지금 현업을 할 때까지 mybatis 밖에 사용하지 않았기 때문에 더 차이를 느끼는 것 같다. mybatis에서는 update 쿼리를 직접 짜두고 수정이 필요할 때마다 해당 서비스를 호출해 직접 update를 시켰지만 JPA는 위와 같이 영속 컨텍스트에 있는 것과 자동으로 비교해서 update 쿼리를 실행하니 말이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;엔티티 수정이 되는 과정&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0G0bn/btstVglwm16/UKL23Z6Kf1ngxDMqHUtpZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0G0bn/btstVglwm16/UKL23Z6Kf1ngxDMqHUtpZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0G0bn/btstVglwm16/UKL23Z6Kf1ngxDMqHUtpZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0G0bn%2FbtstVglwm16%2FUKL23Z6Kf1ngxDMqHUtpZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;700&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스냅샷은 처음에 조회했을 때의 정보를 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;변경된 엔티티와 스냅샷과 비교한 후 update 쿼리를 생성해 마지막 commit되는 시점에 쿼리를 실행시킨다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/67</guid>
      <comments>https://fordo.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 13 Sep 2023 11:25:43 +0900</pubDate>
    </item>
    <item>
      <title>JPA(6) - 영속성 컨텍스트</title>
      <link>https://fordo.tistory.com/66</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 3-1강을 듣고 정리한 글입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;영속성 컨텍스트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔티티를 영구 저장하는 환경&lt;/li&gt;
&lt;li&gt;EntityManager.persist(entity);&lt;/li&gt;
&lt;li&gt;영속성 컨텍스트는 논리적인 개념&lt;/li&gt;
&lt;li&gt;엔티티 매니저를 통해서 영속성 컨텍스트에 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;J2SE 환경 - 엔티티매니저와 영속성 컨텍스트가 1:1 관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;엔티티의 생명주기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비영속(new/transient) - 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태&lt;/li&gt;
&lt;li&gt;영속(managed) - 영속성 컨텍스트에 관리되는 상태&lt;/li&gt;
&lt;li&gt;준영속(detached) - 영속성 컨텍스트에 저장되었다가 분리된 상태&lt;/li&gt;
&lt;li&gt;삭제(removed) - 삭제된 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;영속성 컨텍스트의 이점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차 캐시&lt;/li&gt;
&lt;li&gt;동일성(identity) 보장&lt;/li&gt;
&lt;li&gt;트랜잭션을 지원하는 쓰기 지연(transactional write-behind)&lt;/li&gt;
&lt;li&gt;변경 감지(Dirty Checking)&lt;/li&gt;
&lt;li&gt;지연 로딩(Lazy Loading)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/66</guid>
      <comments>https://fordo.tistory.com/66#entry66comment</comments>
      <pubDate>Tue, 12 Sep 2023 15:40:04 +0900</pubDate>
    </item>
    <item>
      <title>JPA(5)</title>
      <link>https://fordo.tistory.com/65</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 2-2강을 듣고 정리한 글입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MEMBER TABLE 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAtrhz/btstOiEegsi/USFb3IklsvQbJ87cvCR0oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAtrhz/btstOiEegsi/USFb3IklsvQbJ87cvCR0oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAtrhz/btstOiEegsi/USFb3IklsvQbJ87cvCR0oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAtrhz%2FbtstOiEegsi%2FUSFb3IklsvQbJ87cvCR0oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;110&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 컬럼과 name 컬럼을 생성해주고 id는 primary key(pk)로 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MemberVO 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1694496422485&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hellojpa.VO;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = &quot;MEMBER&quot;)
public class Member {
    @Id
    private Long Id;

    @Column(name = &quot;name&quot;)
    private String name;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Entity - 테이블과 매핑할 클래스에 사용하여 JPA가 해당 클래스를 관리하게한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Table - 테이블명과 객체명이 서로 다른 경우 테이블 이름을 지정해 매핑할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Column - 컬럼명과 필드명이 서로 다른 경우 컬럼명을 지정해 매핑할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Id - 테이블의 기본키가 지정된 컬럼과 매핑된 필드에 사용한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JPA 기본 문법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터 Insert&lt;/h4&gt;
&lt;pre id=&quot;code_1694496665356&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hellojpa;

import hellojpa.VO.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = new Member();
            member.setId(1L);
            member.setName(&quot;HelloA&quot;);
            em.persist(member);
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }
       
        emf.close();
        System.out.println(&quot;Hello world!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EntityManagerFactory는 절대 공유해선 안되고 상황에 따라 만들어야한다. - 동시에 접근이 가능하게하면 하나를 수정하고 있을 때 다른 사용자도 수정할 수 있기 때문. 사용이 끝나면 close()로 만납해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EntityManager는 Entity를 관리하는 역할이다. 엔티티 매니저 내부에 영속성 컨텍스트를 만들어서 관리한다. 사용이 끝나면 close()로 반납해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EntityTransaction은 하나의 트랜잭션을 생성한다. tx.begin()을 통해 트랜잭션 시작을 알리고 로직을 수행 후 commit 또는 rollback을 해주어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.데이터 Update&lt;/h4&gt;
&lt;pre id=&quot;code_1694497630427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hellojpa;

import hellojpa.VO.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = em.find(Member.class, 1L);
            member.setName(&quot;HelloB&quot;);
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 점은 위에서 설명한 것과 같고 try-catch-finally 구문을 구면 em.find로 해당 객체를 조회한 후 객체의 필드를 변경하고 commit하면 update 구문이 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터 Delete&lt;/h4&gt;
&lt;pre id=&quot;code_1694497760648&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hellojpa;

import hellojpa.VO.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = em.find(Member.class, 1L);
            em.remove(member);
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em.find로 해당 데이터를 조회 한 후 em.remove()를 실행하면 데이터가 삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JPQL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JPA를 사용하면 엔티티 객체를 중심으로 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문제는 검색 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요&lt;/p&gt;
&lt;pre id=&quot;code_1694499787578&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hellojpa;

import hellojpa.VO.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member as m where name = 'HelloB'&quot;, Member.class)
                    .getResultList();
            System.out.println(result.get(0).getName());
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/65</guid>
      <comments>https://fordo.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 12 Sep 2023 15:27:29 +0900</pubDate>
    </item>
    <item>
      <title>JPA(4)</title>
      <link>https://fordo.tistory.com/64</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 2-1을 듣고 정리한 글입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m597n/btstCX9e7ND/47lu7MQ2tT6kke4Upqan30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m597n/btstCX9e7ND/47lu7MQ2tT6kke4Upqan30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m597n/btstCX9e7ND/47lu7MQ2tT6kke4Upqan30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm597n%2FbtstCX9e7ND%2F47lu7MQ2tT6kke4Upqan30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;615&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 - 새로만들기 - 프로젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 명 : ex_hello_jpa&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 ID : org.jpa-basic&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아티팩트ID : ex1_hello_jpa&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;porm.xml 설정&lt;/p&gt;
&lt;pre id=&quot;code_1694494459256&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;jpa-basic&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;ex1-hello-jpa&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;maven.compiler.source&amp;gt;8&amp;lt;/maven.compiler.source&amp;gt;
        &amp;lt;maven.compiler.target&amp;gt;8&amp;lt;/maven.compiler.target&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;!-- JPA 하이버네이트 --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;hibernate-entitymanager&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;5.3.10.Final&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- H2 데이터베이스 --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.h2database&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;h2&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.4.200&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA 하이버네이트와 H2 데이터 베이스 라이브러리를 빌드 시켜준다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;persistence.xml 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1694494492974&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;persistence version=&quot;2.2&quot;
             xmlns=&quot;http://xmlns.jcp.org/xml/ns/persistence&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xsi:schemaLocation=&quot;http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd&quot;&amp;gt;
    &amp;lt;persistence-unit name=&quot;hello&quot;&amp;gt;
        &amp;lt;properties&amp;gt;
            &amp;lt;!-- 필수 속성 --&amp;gt;
            &amp;lt;property name=&quot;javax.persistence.jdbc.driver&quot; value=&quot;org.h2.Driver&quot;/&amp;gt;
            &amp;lt;property name=&quot;javax.persistence.jdbc.user&quot; value=&quot;sa&quot;/&amp;gt;
            &amp;lt;property name=&quot;javax.persistence.jdbc.password&quot; value=&quot;&quot;/&amp;gt;
            &amp;lt;property name=&quot;javax.persistence.jdbc.url&quot; value=&quot;jdbc:h2:tcp://localhost/./jpaBasic&quot;/&amp;gt;
            &amp;lt;property name=&quot;hibernate.dialect&quot; value=&quot;org.hibernate.dialect.H2Dialect&quot;/&amp;gt;

            &amp;lt;!-- 옵션 --&amp;gt;
            &amp;lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot;/&amp;gt;
            &amp;lt;property name=&quot;hibernate.format_sql&quot; value=&quot;true&quot;/&amp;gt;
            &amp;lt;property name=&quot;hibernate.use_sql_comments&quot; value=&quot;true&quot;/&amp;gt;
            &amp;lt;!--&amp;lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;create&quot; /&amp;gt;--&amp;gt;
        &amp;lt;/properties&amp;gt;
    &amp;lt;/persistence-unit&amp;gt;
&amp;lt;/persistence&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H2 데이터 베이스의 드라이버, 유저명, 패스워드, URL 모두 기입해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 옵션은 다음에 기술하겠다.&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/64</guid>
      <comments>https://fordo.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 12 Sep 2023 13:57:03 +0900</pubDate>
    </item>
    <item>
      <title>JPA(3)</title>
      <link>https://fordo.tistory.com/63</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 1-2강을 듣고 정리한 글입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ORM이란?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Object-relational mapping (객체 관계 매핑)&lt;/li&gt;
&lt;li&gt;객체는 객체대로 설계&lt;/li&gt;
&lt;li&gt;관계형 데이터베이스는 관계형 데이터베이스대로 설계&lt;/li&gt;
&lt;li&gt;ORM 프레임워크가 중간에서 매핑&lt;/li&gt;
&lt;li&gt;대중적인 언어에는 대부분 ORM 기술이 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JPA는 애플리케이션과 JDBC 사이에서 동작&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIyUXq/btstsMFUTew/6FaiI5upNaxikZyqk53JEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIyUXq/btstsMFUTew/6FaiI5upNaxikZyqk53JEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIyUXq/btstsMFUTew/6FaiI5upNaxikZyqk53JEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIyUXq%2FbtstsMFUTew%2F6FaiI5upNaxikZyqk53JEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;392&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 다른 프레임워크와 비슷한 형태를 지닌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;JPA 동작 - 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMap8/btsts1JNZV6/sQhlwxCKcUaNy3Au15ktlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMap8/btsts1JNZV6/sQhlwxCKcUaNy3Au15ktlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMap8/btsts1JNZV6/sQhlwxCKcUaNy3Au15ktlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMap8%2Fbtsts1JNZV6%2FsQhlwxCKcUaNy3Au15ktlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;448&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;JPA 동작 - 조회&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mMyBj/btstmIY2KfP/rBHC5s8KwhTrk6ETMlR6Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mMyBj/btstmIY2KfP/rBHC5s8KwhTrk6ETMlR6Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mMyBj/btstmIY2KfP/rBHC5s8KwhTrk6ETMlR6Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmMyBj%2FbtstmIY2KfP%2FrBHC5s8KwhTrk6ETMlR6Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;483&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JPA이 탄생하기까지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EJB -엔티티 빈(자바 표준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실용성이 매우 떨어져 잘 사용하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하이버네이트(오픈 소스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;개빈 킹(Gavin King)이 개발&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- EJB에 비해 복잡한 테이블 관계도 적합하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;&amp;darr;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;JPA(자바 표준)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;JPA는 표준 명세&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- JPA는 인터페이스의 모음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- JPA 표준 명세를 구현한 3가지 구현체 &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;하이버네이트, ElipseLink, DataNucleus&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;JPA를 사용해야하는 이유&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- SQL 중심적인 개발에서 객체 중심으로 개발&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 생산성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 유지보수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 패러다임의 불일치 해결&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 성능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 데이터 접근 추상화와 벤더 독립성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 표준&lt;/span&gt;&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/63</guid>
      <comments>https://fordo.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 11 Sep 2023 11:51:17 +0900</pubDate>
    </item>
    <item>
      <title>JPA(2)</title>
      <link>https://fordo.tistory.com/62</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 1-1강을 듣고 정리한 글입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SQL 중심적인 개발의 문제점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 무한 반복, 지루한 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;객체를 영구 보관하는 다양한 저장소&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. RDB&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. NoSQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. File&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. OODB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;객체를 관계형 데이터 베이스에 저장&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwUBd/btstqFtFoqv/95gZpu7lJtRkOIs4wYy1QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwUBd/btstqFtFoqv/95gZpu7lJtRkOIs4wYy1QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwUBd/btstqFtFoqv/95gZpu7lJtRkOIs4wYy1QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwUBd%2FbtstqFtFoqv%2F95gZpu7lJtRkOIs4wYy1QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;437&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;객체와 관계형 데이터베이스의 차이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 연관관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 데이터 식별 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연관관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체는 참조를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) member.getTeam()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블은 외래 키를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) JOIN ON M.TEAM_ID = T.TEAM_ID&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체답게 모델링를 할수록 ? &amp;rarr; 매핑 작업만 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까? &amp;rarr; JPA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lecture/JPA</category>
      <category>JPA</category>
      <category>공부</category>
      <category>김영한</category>
      <author>fordo</author>
      <guid isPermaLink="true">https://fordo.tistory.com/62</guid>
      <comments>https://fordo.tistory.com/62#entry62comment</comments>
      <pubDate>Fri, 8 Sep 2023 14:22:30 +0900</pubDate>
    </item>
  </channel>
</rss>