<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://justdojeon.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://justdojeon.github.io/" rel="alternate" type="text/html" /><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/feed.xml</id><title type="html">Just Do Jeon</title><subtitle>한걸음씩 꾸준한 개발자</subtitle><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-HTTP-%EA%B8%B0%EB%B3%B8/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-HTTP%20%EA%B8%B0%EB%B3%B8</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-HTTP-%EA%B8%B0%EB%B3%B8/">&lt;h1 id=&quot;-의존-관계-자동-주입&quot;&gt;📌 의존 관계 자동 주입&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C%EC%99%80-%ED%99%9C%EC%9A%A9/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-HTTP%20%EB%A9%94%EC%84%9C%EB%93%9C%EC%99%80%20%ED%99%9C%EC%9A%A9</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C%EC%99%80-%ED%99%9C%EC%9A%A9/">&lt;h1 id=&quot;-의존-관계-자동-주입&quot;&gt;📌 의존 관계 자동 주입&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-HTTP-%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-HTTP%20%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-HTTP-%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C/">&lt;h1 id=&quot;-의존-관계-자동-주입&quot;&gt;📌 의존 관계 자동 주입&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-HTTP-%ED%97%A4%EB%8D%94/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-HTTP%20%ED%97%A4%EB%8D%94</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-HTTP-%ED%97%A4%EB%8D%94/">&lt;h1 id=&quot;-의존-관계-자동-주입&quot;&gt;📌 의존 관계 자동 주입&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-URI%EC%99%80-%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9A%94%EC%B2%AD%ED%9D%90%EB%A6%84/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-URI%EC%99%80%20%EC%9B%B9%20%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%20%EC%9A%94%EC%B2%AD%ED%9D%90%EB%A6%84</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-URI%EC%99%80-%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9A%94%EC%B2%AD%ED%9D%90%EB%A6%84/">&lt;h1 id=&quot;-uri&quot;&gt;📌 URI&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html"></title><link href="https://justdojeon.github.io/2022-02-04-%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/" rel="alternate" type="text/html" title="" /><published>2022-03-21T11:01:03+09:00</published><updated>2022-03-21T11:01:03+09:00</updated><id>https://justdojeon.github.io/2022-02-04-%EC%9D%B8%ED%84%B0%EB%84%B7%20%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</id><content type="html" xml:base="https://justdojeon.github.io/2022-02-04-%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/">&lt;h1 id=&quot;-의존-관계-자동-주입&quot;&gt;📌 의존 관계 자동 주입&lt;/h1&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;👉 참조 : &lt;a href=&quot;https://www.inflearn.com/&quot;&gt;인프런&lt;/a&gt;의 &lt;strong&gt;김영한님&lt;/strong&gt;강의&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author></entry><entry><title type="html">[JPA] JQPL (1)</title><link href="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-15/" rel="alternate" type="text/html" title="[JPA] JQPL (1)" /><published>2022-03-19T00:00:00+09:00</published><updated>2022-03-19T00:00:00+09:00</updated><id>https://justdojeon.github.io/jpa/JPA%20%ED%95%99%EC%8A%B5%2015</id><content type="html" xml:base="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-15/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;jqpl-소개&quot;&gt;JQPL 소개&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;JPA를 사용하면 엔티티 객체를 중심으로 개발을 해야함.&lt;/li&gt;
  &lt;li&gt;문제는 검색쿼리 !&lt;/li&gt;
  &lt;li&gt;검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 해야함&lt;/li&gt;
  &lt;li&gt;모든 DB데이터를 객체로 변환해서 검색하는것은 불가능하다.&lt;/li&gt;
  &lt;li&gt;애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jpa의-다양한-쿼리-방법&quot;&gt;JPA의 다양한 쿼리 방법&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;JPQL&lt;/li&gt;
  &lt;li&gt;JPA Criteria&lt;/li&gt;
  &lt;li&gt;QueryDSL&lt;/li&gt;
  &lt;li&gt;네이티브 SQL&lt;/li&gt;
  &lt;li&gt;JDBC API 직접사용, MyBatis, SpringJdbcTemplate 함께 사용가능&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;가장 단순한 조회 방법&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;EntityManager.find()&lt;/li&gt;
    &lt;li&gt;객체 그래프 탐색(a.getB().getC())&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;만약, 나이가 18살 이상인 회원을 모두 검색하고 싶다면?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;JPQL로 위의 문제를 해결&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.&lt;/li&gt;
    &lt;li&gt;SQL과 문법이 유사하고 SELECT,FROM,WHERE,GROUP BY,HAVING,JOIN을 지원한다.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;JPQL은 엔티티 객체를 대상으로 쿼리&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;SQL은 데이터베이스 테이블을 대상으로 쿼리&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt; // 주의 ! 엔티티 객체를 대상으로 한다.
  List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member m where m.username like '%kim'%&quot;, Member.class).getResultList();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리&lt;/li&gt;
  &lt;li&gt;SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지않는다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;JPQL을 한마디로 정의하면 객체 지향 SQL 이다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;critrial-소개&quot;&gt;Critrial 소개&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;문자가 아닌 자바코드로 JQPL을 작성할 수 있음&lt;/li&gt;
  &lt;li&gt;JPQL 빌더 역할&lt;/li&gt;
  &lt;li&gt;JPA 공식기능&lt;/li&gt;
  &lt;li&gt;Criteria 대신 QueryDSL 추천 !&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//Criteria 사용 준비&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;CriteriaBuilder&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getCriteriaBuilder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;CriteriaQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//루트 클래스 (조회를 시작할 클래스)&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;Root&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//쿼리 생성 CriteriaQuery&amp;lt;Member&amp;gt; cq =&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;“&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kim&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;”&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resultList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getResultList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
  &lt;p&gt;동적쿼리작성시 문자열이 아닌 자바형식으로 작성되기 때문에 오류를 잘 잡을순 있지만 너무 복잡하고 실용성이없다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;네이티브-sql-소개&quot;&gt;네이티브 SQL 소개&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;JPA가 제공하는 SQL을 직접 사용하는 기능&lt;/li&gt;
  &lt;li&gt;JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능&lt;/li&gt;
  &lt;li&gt;EX) 오라클  CONNECT BY, 특정 DB만 사용하는 SQL 힌트&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt;String sql =
&quot;SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = ‘kim’&quot;;
List&amp;lt;Member&amp;gt; resultList = em.createNativeQuery(sql, Member.class).getResultList(); 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author><category term="JPA" /><category term="JPA" /><summary type="html"></summary></entry><entry><title type="html">[JPA] JQPL 기본문법과 API</title><link href="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-16/" rel="alternate" type="text/html" title="[JPA] JQPL 기본문법과 API" /><published>2022-03-19T00:00:00+09:00</published><updated>2022-03-19T00:00:00+09:00</updated><id>https://justdojeon.github.io/jpa/JPA%20%ED%95%99%EC%8A%B5%2016</id><content type="html" xml:base="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-16/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;jqpl&quot;&gt;JQPL&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지않는다 + JPQL은 결국 SQL로 변환된다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;jqpl-문법&quot;&gt;JQPL 문법&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;SELECT M FROM MEMBER AS M WHERE M.AGE &amp;gt; 18&lt;/li&gt;
  &lt;li&gt;엔티티와 속성은 대소문자를 구분한다.&lt;/li&gt;
  &lt;li&gt;JPQL 키워드는 대소문자 구분 안한다.&lt;/li&gt;
  &lt;li&gt;엔티티 이름 사용, 테이블이름이 아님! (FROM MEMBER 부분)&lt;/li&gt;
  &lt;li&gt;별칭 필수 ! 대신 AS 생략가능&lt;/li&gt;
  &lt;li&gt;집합과 정렬 , GROUP BY , HAVING, ORDER BY 모두 사용 가능하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;typequery-query&quot;&gt;TypeQuery, Query&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;TypeQuery : 반환타입이 명확할 때 사용&lt;/li&gt;
  &lt;li&gt;Query : 반환 타입이 명확하지 않을때 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;member&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setUsername&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;도현&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setAge&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;//2번째에 타입정보(클래스) 명시&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;TypedQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;select m from Member m &quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;TypedQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;select m.username from Member m&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;//타입 정보를 받을 수 없음 &lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Query&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;select m.username, m.age from Member m&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;결과-조회-api&quot;&gt;결과 조회 API&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;query.getResultList() : &lt;strong&gt;결과가 하나 이상일때&lt;/strong&gt;, 리스트 반환
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;결과가 없으면 빈 리스트 반환한다. nullpointException 걱정은 안해도됨..&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;query.getSingleResult() : &lt;strong&gt;결과가 정확히 하나&lt;/strong&gt;, 단일 객체 반환
결과가 없으면 : javax.persistence.NoResultException
결과가 여러개면 : javax.persistence.NonUniqueResultException&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;프로젝션&quot;&gt;프로젝션&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;SELECT 절에 조회할 대상을 지정하는 것&lt;/li&gt;
  &lt;li&gt;프로젝션의 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자등 기본데이터 타입)&lt;/li&gt;
  &lt;li&gt;SELECT &lt;strong&gt;M&lt;/strong&gt; FROM MEMBER M -&amp;gt; 엔티티 프로젝션&lt;/li&gt;
  &lt;li&gt;SELECT &lt;strong&gt;M.team&lt;/strong&gt; FROM MEMBER M -&amp;gt; 엔티티 프로젝션&lt;/li&gt;
  &lt;li&gt;SELECT &lt;strong&gt;m.address&lt;/strong&gt; FROM Member m -&amp;gt; 임베디드 타입 프로젝션&lt;/li&gt;
  &lt;li&gt;SELECT &lt;strong&gt;m.username, m.age&lt;/strong&gt; FROM Member m -&amp;gt; 스칼라 타입 프로젝션&lt;/li&gt;
  &lt;li&gt;Distinct로 중복 제거&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;프로젝션---여러-값-조회&quot;&gt;프로젝션 - 여러 값 조회&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;SELECT m.username, m.age FROM Member m&lt;/li&gt;
  &lt;li&gt;
    &lt;ol&gt;
      &lt;li&gt;Query 타입으로 조회&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;ol&gt;
      &lt;li&gt;Object[] 타입으로 조회&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;ol&gt;
      &lt;li&gt;new 명령어로 조회
        &lt;ul&gt;
          &lt;li&gt;단순값을 DTO로 바로조회&lt;/li&gt;
          &lt;li&gt;SELECT new jpaxxx.jpql.UserDTO(m.username, m.age) FROM Member m&lt;/li&gt;
          &lt;li&gt;패키지명을 포함한 전체 클래스 명 입력&lt;/li&gt;
          &lt;li&gt;순서와 타입이 일치하는 생성자 필요하다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;페이징-api&quot;&gt;페이징 API&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;JPA는 페이징을 두 API로 추상화&lt;/li&gt;
  &lt;li&gt;setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작함)&lt;/li&gt;
  &lt;li&gt;setMaxResults(int maxResult) : 조회할 데이터 수&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//페이징 쿼리&lt;/span&gt;
 &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jpql&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;select m from Member m order by m.name desc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resultList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jpql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setFirstResult&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setMaxResults&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getResultList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;조인&quot;&gt;조인&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;내부 조인 : SELECT m FROM Member m [INNER] JOIN m.team t&lt;/li&gt;
  &lt;li&gt;외부 조인 : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t&lt;/li&gt;
  &lt;li&gt;세타 조인 : select count(m) from Member m, Team t where m.username = t.name&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;조인 - ON 절&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;ON절을 활용한 조인(JPA2.1부터 지원)
      &lt;ul&gt;
        &lt;li&gt;
          &lt;ol&gt;
            &lt;li&gt;조인 대상 필터링&lt;/li&gt;
          &lt;/ol&gt;
        &lt;/li&gt;
        &lt;li&gt;
          &lt;ol&gt;
            &lt;li&gt;연관관계 없는 엔티티 외부 조인(하이버네이트 5.1 부터)&lt;/li&gt;
          &lt;/ol&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;조인대상 필터링
      &lt;ul&gt;
        &lt;li&gt;예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인할때&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt;//JPQL
SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'

//SQL
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;연관관계가 없는 엔티티 외부조인
      &lt;ul&gt;
        &lt;li&gt;예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt;// JPQL
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name

// SQL
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.username = t.name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;서브-쿼리&quot;&gt;서브 쿼리&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;나이가 평균보다 많은 회원&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;SELECT M FROM Member M WHERE M.age &amp;gt; (SELECT AVG(M2.age) FROM Member m2)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;서브쿼리 지원 함수&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;[NOT] EXIST (서브쿼리) : 서브쿼리에 결과가 존재하면 참
    &lt;ul&gt;
      &lt;li&gt;
        &lt;table&gt;
          &lt;tbody&gt;
            &lt;tr&gt;
              &lt;td&gt;{ALL&lt;/td&gt;
              &lt;td&gt;ANY&lt;/td&gt;
              &lt;td&gt;SOME} (서브쿼리)&lt;/td&gt;
            &lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/li&gt;
      &lt;li&gt;ALL : 모두 만족하면 참&lt;/li&gt;
      &lt;li&gt;ANY,SOME : 같은의미, 조건을 하나라도 만족하면 참&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;[NOT] IN (서브쿼리) : 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;JPA 서브 쿼리의 한계&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;JPA는 WHERE , HAVING 절에서만 서브쿼리 사용가능&lt;/li&gt;
  &lt;li&gt;SELECT 절도 가능(하이버네이트에서 지원)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;FROM 절의 서브쿼리는 현재 JPQL 에서 불가능하다!!&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;조인으로 풀어서 해결가능 함&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;JPQL 타입 표현&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;문자 : ‘HELLO’, ‘SHE”S’&lt;/li&gt;
  &lt;li&gt;숫자 : 10L(Long), 10D(Double), 10F(Float)&lt;/li&gt;
  &lt;li&gt;Boolean : TRUE, FALSE&lt;/li&gt;
  &lt;li&gt;ENUM : 패키지경로.이넘타입&lt;/li&gt;
  &lt;li&gt;엔티티 타입 : TYPE(m) = Member ( 상속 관계에서 사용)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;조건식 - CASE 식&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;COALESCE : 하나씩 조회해서 NULL이 아니면 반환&lt;/li&gt;
  &lt;li&gt;NULLIF : 두 값이 같으면 NULL 반환, 다르면 첫번째 값 반환&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jpql-기본함수&quot;&gt;JPQL 기본함수&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;CONCAT&lt;/li&gt;
  &lt;li&gt;SUBSTRING&lt;/li&gt;
  &lt;li&gt;TRIM&lt;/li&gt;
  &lt;li&gt;LOWER,UPPER&lt;/li&gt;
  &lt;li&gt;LENGTH&lt;/li&gt;
  &lt;li&gt;LOCATE&lt;/li&gt;
  &lt;li&gt;ABS,SQRT,MOD&lt;/li&gt;
  &lt;li&gt;SIZE,INDEX(JPA 용도)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author><category term="JPA" /><category term="JPA" /><summary type="html"></summary></entry><entry><title type="html">[JPA] JQPL (2)</title><link href="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-17/" rel="alternate" type="text/html" title="[JPA] JQPL (2)" /><published>2022-03-19T00:00:00+09:00</published><updated>2022-03-19T00:00:00+09:00</updated><id>https://justdojeon.github.io/jpa/JPA%20%ED%95%99%EC%8A%B5%2017</id><content type="html" xml:base="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-17/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;경로-표현식&quot;&gt;경로 표현식&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;. 점을 찍어 객체 그래프를 탐색하는것&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;SELECT m.username -&amp;gt; 상태필드로 객체 그래프를 탐색했다.&lt;/li&gt;
  &lt;li&gt;from  Member m&lt;/li&gt;
  &lt;li&gt;join m.team t -&amp;gt; 단일값 연관필드&lt;/li&gt;
  &lt;li&gt;join m.orders o -&amp;gt; 컬렉션 값 연관 필드&lt;/li&gt;
  &lt;li&gt;where t.name = ‘팀A’&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;경로 표현식 용어정리&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;상태 필드 : 단순히 값을 저장하기 위한 필드&lt;/li&gt;
  &lt;li&gt;연관 필드 : 연관관계를 나타내기 위한 필드
    &lt;ul&gt;
      &lt;li&gt;단일값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 ( ex : m.team )&lt;/li&gt;
      &lt;li&gt;컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 ( ex : m.orders )&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;경로 표현식 특징&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;상태 필드 : 경로 탐색의 끝, 더 이상 탐색이 안됨&lt;/li&gt;
  &lt;li&gt;단일 값 연관 필드 : 묵시적 내부조인(inner join) 발생, 탐생 O ( m.team.. …멤버에서 팀으로 팀에서 네임 )&lt;/li&gt;
  &lt;li&gt;컬렉션 값 연관 필드 : 묵시적 내부조인 발생, 탐색 x
    &lt;ul&gt;
      &lt;li&gt;FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능하다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;명시적 조인, 묵시적 조인&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;명시적 조인&lt;/strong&gt; : JOIN 키워드 직접 사용
    &lt;ul&gt;
      &lt;li&gt;SELECT m FROM Member m join m.team t&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;묵시적 조인 : 경로 표현식에 의해 묵시적으로 SQL 조인 발생 (내부적 조인만 발생)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;SELECT m.team FROM Member m&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;select t.members.username from Team t - &amp;gt; 실패&lt;/li&gt;
  &lt;li&gt;select m.username from Team t join t.members m - &amp;gt; 성공&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;**실무에선 명시적 조인을 사용하는것이 좋다 !! **&lt;/em&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;왜냐하면 select o.member.team from Order o -&amp;gt; 조인이 2번 발생한다.&lt;/li&gt;
    &lt;li&gt;조인은 sql 튜닝에 중요한 포인트고 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵기 때문!&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;페치조인---중요&quot;&gt;페치조인 - 중요&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;SQL 조인의 종류가 아니다.&lt;/li&gt;
  &lt;li&gt;JPQL에서 성능 최적화를 위해 제공하는 기능이다.&lt;/li&gt;
  &lt;li&gt;연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능!&lt;/li&gt;
  &lt;li&gt;JOIN FETCH 명령어로 사용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;엔티티 페치 조인&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;회원을 조회하면서 연관된 팀도 함께 조회(SQL 한번에)&lt;/li&gt;
    &lt;li&gt;SQL을 보면 회원 뿐만 아니라 팀(T.*)도 함께 SELECT됨&lt;/li&gt;
    &lt;li&gt;JPQL : select m from Member m join fetch m.team&lt;/li&gt;
    &lt;li&gt;SQL : SELECT M.* , T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID 로 실행됨&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt;    String jpql = &quot;select m from Member m join fetch m.team&quot;;
    List&amp;lt;Member&amp;gt; members = em.createQuery(jpql, Member.class)
     .getResultList();
    for (Member member : members) {
     //페치 조인으로 회원과 팀을 함께 조회해서 지연 로딩X
     System.out.println(&quot;username = &quot; + member.getUsername() + &quot;, &quot; +
     &quot;teamName = &quot; + member.getTeam().name());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;컬렉션 페치 조인&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;일대다 관계, 컬렉션 페치 조인&lt;/li&gt;
  &lt;li&gt;JPQL : select t from Team t join fetch t.members where t.name=’팀A’;&lt;/li&gt;
  &lt;li&gt;SQL 상 : SELECT T.&lt;em&gt;, M.&lt;/em&gt; FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = ‘팀A’&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;페치조인과 DISTINCT&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;SQL의 DISTINCT는 중복된 결과를 제거하는 명령&lt;/li&gt;
  &lt;li&gt;JPQL의 DISTINCT 2가지 기능 제공
    &lt;ul&gt;
      &lt;li&gt;
        &lt;ol&gt;
          &lt;li&gt;SQL에 DISTINCT를 추가&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;ol&gt;
          &lt;li&gt;애플리케이션에서 엔티티 중복 제거&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;페치조인과 일반 조인의 차이&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;JPQL은 결과를 반환할때 연관관계 고려X&lt;/li&gt;
  &lt;li&gt;단지 SELECT 절에 지정한 엔티티만 조회한다.&lt;/li&gt;
  &lt;li&gt;페치 조인은 객체 그래프를 SQL 한번에 조회하는 개념&lt;/li&gt;
  &lt;li&gt;페치 조인을 사용할 때만 연관된 엔티티도 함께 조회(즉시 로딩)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;페치 조인의 특징과 한계&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;페치 조인 대상에는 별칭을 줄 수 없다.
    &lt;ul&gt;
      &lt;li&gt;하이버네이트는 가능하지만 가급적 사용하지 않는다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;둘 이상의 컬렉션은 페치 조인 할 수 없다. ( 데이터 정합성에 안맞을수 있음)&lt;/li&gt;
  &lt;li&gt;컬렉션을 페치 조인하면 페이징API를 사용할 수 없다.&lt;/li&gt;
  &lt;li&gt;연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화&lt;/li&gt;
  &lt;li&gt;실무에서 글로벌 로딩 전략은 모두 지연 로딩&lt;/li&gt;
  &lt;li&gt;최적화가 필요한 곳은 페치 조인 적용&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;페치 조인 - 정리&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;페치 조인은 객체 그래프를 유지할 때 사용하면 효과적이다.&lt;/li&gt;
  &lt;li&gt;여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야하면, 페치 조인보다는 일반조인을 사용하고 필요한 데이터들만 조회해서 DTO로 반환하는것이 효과적이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;벌크-연산&quot;&gt;벌크 연산&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?&lt;/li&gt;
  &lt;li&gt;JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행
    &lt;ul&gt;
      &lt;li&gt;
        &lt;ol&gt;
          &lt;li&gt;재고가 10개 미만인 상품을 리스트로 조회&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;ol&gt;
          &lt;li&gt;상품 엔티티의 가격을 10% 증가&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;ol&gt;
          &lt;li&gt;트랜잭션 커밋 시점에 변경감지가 동작한다.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;변경된 데이터가 100건이라면 100번의 update SPQ 실행해야함..&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;벌크 연산 예제&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-JAVA&quot;&gt;int resultCount = em.createQuery(&quot;update Member m set m.age = 20&quot;)
                    .executeUpdate();
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
  &lt;li&gt;쿼리 한 번으로 여러 테이블 로우 변경(엔티티)&lt;/li&gt;
  &lt;li&gt;executeUpdate()의 결과는 영향 받은 엔티티 수 반환&lt;/li&gt;
  &lt;li&gt;UPDATE , DELETE 지원&lt;/li&gt;
  &lt;li&gt;INSERT(insert into …select..도 하이버네이트가 지원)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;벌크 연산 주의 !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리&lt;/li&gt;
  &lt;li&gt;해결법
    &lt;ul&gt;
      &lt;li&gt;벌크 연산을 먼저 실행&lt;/li&gt;
      &lt;li&gt;벌크 연산 수행 후 영속성 컨텍스트 초기화&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재&lt;/p&gt;

&lt;p&gt;🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author><category term="JPA" /><category term="JPA" /><summary type="html"></summary></entry><entry><title type="html">[JPA] 값 타입</title><link href="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-14/" rel="alternate" type="text/html" title="[JPA] 값 타입" /><published>2022-03-18T00:00:00+09:00</published><updated>2022-03-18T00:00:00+09:00</updated><id>https://justdojeon.github.io/jpa/JPA%20%ED%95%99%EC%8A%B5%2014</id><content type="html" xml:base="https://justdojeon.github.io/jpa/JPA-%ED%95%99%EC%8A%B5-14/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;기본값-타입&quot;&gt;기본값 타입&lt;/h4&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;JPA의 데이터 타입 분류 (최상위 부터 표기)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;엔티티 타입&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;@Entity로 정의하는 객체&lt;/li&gt;
      &lt;li&gt;데이터가 변해도 식별자로 지속해서 추적 가능&lt;/li&gt;
      &lt;li&gt;예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;값 타입&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체&lt;/li&gt;
      &lt;li&gt;식별자가 없고 값만 있으므로 변경시 추적이 불가하다.&lt;/li&gt;
      &lt;li&gt;예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체가 가능하다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;값타입의 분류&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;기본값 타입
      &lt;ul&gt;
        &lt;li&gt;자바 기본 타입 (int, double)&lt;/li&gt;
        &lt;li&gt;래퍼 클래스 (Integer,Long)&lt;/li&gt;
        &lt;li&gt;String&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;임베디드 타입(embedded type, 복합 값 타입)&lt;/li&gt;
    &lt;li&gt;컬렉션 값 타입(collection value type)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;기본값 타입&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;생명주기를 엔티티에 의존한다.
    &lt;ul&gt;
      &lt;li&gt;회원을 삭제하면 이름, 나이 필드도 함께 삭제된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;값 타입은 공유가 안된다.
    &lt;ul&gt;
      &lt;li&gt;회원 이름 변경시 다른회원의 이름도 함께 변경X&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경자체가 불가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;임베디드-타입복합값-타입&quot;&gt;임베디드 타입(복합값 타입)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;새로운 값 타입을 직접 정의할 수 있다.&lt;/li&gt;
  &lt;li&gt;JPA는 임베디드 타입이라고 한다.&lt;/li&gt;
  &lt;li&gt;주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.&lt;/li&gt;
  &lt;li&gt;int, String과 같은 값 타입&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158947999-b38e3d74-7319-4e93-953f-74ab15aab058.PNG&quot; alt=&quot;임베디드1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158948002-1e9e1d17-4417-4295-a017-99e42fbb92e9.PNG&quot; alt=&quot;임베디드2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158948003-fc80b6df-b922-4abe-971f-67b5a09828d8.PNG&quot; alt=&quot;임베디드3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;임베디드 타입의 장점&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;재사용이 가능하다.&lt;/li&gt;
    &lt;li&gt;높은 응집도&lt;/li&gt;
    &lt;li&gt;Period.isWork() 처럼 해당 값 타입만 사용하는 의미있는 메소드를 만들 수 있다.&lt;/li&gt;
    &lt;li&gt;임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존한다.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;임베디드 타입과 테이블 매핑&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158948005-41b5ab82-01db-4c6c-83e4-242b8bf588c6.PNG&quot; alt=&quot;임베디드4&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;임베디드 타입은 엔티티의 값일 뿐이다.&lt;/li&gt;
  &lt;li&gt;임베디드 타입을 사용하기 전과 후에 &lt;strong&gt;매핑하는 테이블은 같다.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.&lt;/li&gt;
  &lt;li&gt;잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;임베디드 타입과 연관관계&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158948009-6993b0d1-bdb3-4c8a-90bb-1ce633865da3.PNG&quot; alt=&quot;임베디드5&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;@AttributeOverride : 속성 재정의&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;한 엔티티에서 같은 값 타입을 사용하기 위함&lt;/li&gt;
    &lt;li&gt;컬럼명이 중복되는경우에 사용한다.
      &lt;ul&gt;
        &lt;li&gt;private Address workAddress;&lt;/li&gt;
        &lt;li&gt;private Address homeAddress; 한 클래스에서 위와 같은 경우&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;@AttributeOverrides, @AttributeOvverride를 사용해서 컬럼명 속성을 재정의한다.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;임베디드 타입의 값이 null이면 매핑한 칼럼값은 모두 null이다.&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;값-타입과-불변-객체&quot;&gt;값 타입과 불변 객체&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다.&lt;/li&gt;
  &lt;li&gt;값 타입은 단순하고 안전하게 다룰 수 있어야한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;값-타입-공유-참조&quot;&gt;값 타입 공유 참조&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.&lt;/li&gt;
  &lt;li&gt;부작용 발생&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;값-타입-복사&quot;&gt;값 타입 복사&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158951842-57209960-dbc6-4448-8542-b8186b6e204a.PNG&quot; alt=&quot;임베디드6&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;값 타입의 실제 인스턴스인 값을 공유하는 것은 위험하다.&lt;/li&gt;
  &lt;li&gt;대신 값(인스턴스)를 복사해서 사용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;객체-타입의-한계&quot;&gt;객체 타입의 한계&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다.&lt;/li&gt;
  &lt;li&gt;하지만 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.&lt;/li&gt;
  &lt;li&gt;자바 기본 타입에 값을 대면 값을 복사한다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;객체의 공유 참조는 피할 수 없다&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;기본 타입&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// 하면 b =10이고 a=20으로 변경된다. &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;객체 타입&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;Adress&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;old&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;Address&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//객체 타입은 참조를 전달한다.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setCity&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;new&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;불변-객체&quot;&gt;불변 객체&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단할 수 있다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;값 타입은 불변 객체로 설계해야한다.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;불변 객체 : 생성 시점 이후 절대 값을 변경할 수 없는 객체&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;생성자로만 값을 설정하고 수정자를 만들지 않으면된다. (setter 안만들면됨)&lt;/li&gt;
  &lt;li&gt;참고 : Integer,String은 자바가 제공하는 대표적인 불변 객체&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;값-타입의-비교&quot;&gt;값 타입의 비교&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은것으로 봐야함&lt;/li&gt;
  &lt;li&gt;동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용한다.&lt;/li&gt;
  &lt;li&gt;동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용한다.&lt;/li&gt;
  &lt;li&gt;값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야한다.&lt;/li&gt;
  &lt;li&gt;값 타입의 equals() 메소드를 적절하게 재정의(주로 모든 필드 사용)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;값-타입-컬렉션&quot;&gt;값 타입 컬렉션&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;값 타입을 컬렉션에 담아서 사용하는것&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52389219/158951845-b999be9f-0779-449c-b071-5e5c9af7fd9e.PNG&quot; alt=&quot;임베디드7&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;값 타입을 하나 이상 저장할 때 사용한다.&lt;/li&gt;
  &lt;li&gt;@ElementCollection, @CollectionTable 사용&lt;/li&gt;
  &lt;li&gt;데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.&lt;/li&gt;
  &lt;li&gt;컬렉션을 저장하기 위한 별도의 테이블이 필요하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;값-타입-컬렉션-사용&quot;&gt;값 타입 컬렉션 사용&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;값 타입 저장 예제&lt;/li&gt;
  &lt;li&gt;값 타입 조회예제
    &lt;ul&gt;
      &lt;li&gt;값 타입 컬렉션도 지연 로딩 전략을 사용한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;값 타입 수정 예제&lt;/li&gt;
  &lt;li&gt;값 타입 컬렉션은 영속성 전이(Cascade) + 고아 객체 제거 기능을 필수로 가진다고 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;값-타입-컬렉션의-제약사항&quot;&gt;값 타입 컬렉션의 제약사항&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;값 타입은 엔티티와 다르게 식별자 개념이 없다.&lt;/li&gt;
  &lt;li&gt;값은 변경하면 추적이 어렵다.&lt;/li&gt;
  &lt;li&gt;값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다.&lt;/li&gt;
  &lt;li&gt;값 타입 컬렉션을 매핑하는 테이블은 모든 칼럼을 묶어서 기본키를 구성해야한다. (null 입력 X, 중복 저장 X)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;값-타입-컬렉션의-대안&quot;&gt;값 타입 컬렉션의 대안&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;실무에서는 상황에 따라 값 타입 컬렉션 대신에 일대다 관계를 고려한다고한다.&lt;/li&gt;
  &lt;li&gt;일대다 관계를 위한 엔티티를 만들고, 여기에서 값 타입을 사용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;개인메모&lt;/strong&gt;&lt;/p&gt;</content><author><name>Just Do Jeon</name><email>abcehgus@gmail.com</email></author><category term="JPA" /><category term="JPA" /><summary type="html"></summary></entry></feed>