2021년 12월 18일 토요일

(JPA동영상교육)스프링, JPA 엔티티(Entity)란?, 자바교육학원/스프링교육학원/자바동영상/JPA학원/JAVA학원

 

















엔티티(Entity)


  • JPA의 엔티티는 테이블을 객체로 표현한 자바 클래스이다.  이 엔티티의 인스턴스는 테이블의 행을 나타내고 대체로 다른 엔티티와 관계를 맺고 있으며 이러한 관계(오브젝트/관계) 메타데이터는 클래스에 어노테이션(@ManyToOne, @OneToMany, @OneToOne, @ManyToMany)을 기술하거나 XML 파일 등에서 설정할 수 있다. 이러한 엔티티는 구현 클래스 또는 추상 클래스가 될 수 있으며 특성 또는 필드를 사용하여 상태를 관리한다.
  • @Entity, @Table 어노테이션을 이용하여 엔티티와 테이블을 매핑한다.
  • JPQL(Java Persistence Query Language)은 지속적 엔티티를 저장하는 데 사용되는 메커니즘과 독립적으로 지속적 엔티티에서 검색을 정의하는 데 사용되는데  데이터베이스와 관련된 SQL을 사용하지 않고 오브젝트를 검색하는 언어이다.
  • 엔티티의 4가지 생명주기
  • 비영속 객체(new/transient) : new 키워드를 생성한 엔티티 객체이며 아직 Managed 상태가 아니다. 메모리 상의 객체로만 존재하고 데이터베이스와 관계가 맺어지지 않은 상태를 비영속 상태(transient state)라고 한다.
  • 영속 객체(managed) : new 키워드를 엔티티 객체를 perist 메소드를 이용해서 저장한 경우 또는 DB의 데이터를 find나 query등으로 조회한 경우인데 영속성 컨텍스트에 저장된 상태이다. 데이터베이스와 연관 관계를 가지고 있는 상태를 영속 상태(persistence state)라고 하며 이상태에 있을 때는 변경 사항이 자동감지 된다.
  • 삭제 객체(removed) : 영속객체 즉 Managed 상태인 객체를 remove 메소드로 삭제한 경우, 작업이 커밋되는 시점에 DB에 동기화 된다.
  • 준영속 객체(detached) : 트랜잭션이 커밋되었거나 clear, flush 메소드가 실행된 경우 모든 영속객체의 상태는 준영속 상태(Detached) 상태가 된다. 영속성 컨텍스트에서 분리된 상황이며 merge 메소드로 다시 영속객체가 될 수 있다.


  • 엔티티는 JPA가 생성할 때 기본 생성자를 이용하므로 반드시 기본 생성자를 가져야 하며 식별자 프로퍼티(@Id)가 반드시 존재 해야 한다.
  • final 클래스는 엔티티가 될 수 없다. Proxy를 생성할 때 자식클래스 형태로 만드는데 final 클래스는 상속되지 않는 클래스이므로 불가하다. 만약 final 메소드를 가진 클래스를 엔티티로 사용하려면 명시적으로 lazy=“false”로 설정해서 Proxy 생성을 막아야 한다.
  • 하이버네이트는 기본적으로 자바빈의 프로퍼티를 테이블의 칼럼에 매핑하며 getter/setter 메소드를 자동 인식한다.
  • 하이버네이트에서는 기본적으로 동일한 세션에서만 엔티티 객체에 대해 Persistent identity(데이터베이스 행의 식별)과 Java identity(데이터베이스행에 대응되는 자바객체의 식별)을 보장하므로 여러 세션에서 같은 객체로 인식되게 하기 위해서는 equals(), hashCode()를 오버라이딩 해야 한다. 특히 엔티티(영속 클래스)를 컬렉션 등에 담을 때는 반드시 equals(), hashCode()를 구현해야 한다.

[하이버네이트 예]

Session sessionA = sessionFactory.openSession();


// 사번(식별자)으로 데이터 읽기

Emp emp1 = sessionA.get(Emp.class, new Integer(7369) );

Emp emp2 = sessionA.get(Emp.class, new Integer(7369) );


// 이 경우 emp1과 emp2는 동일하다.(emp1 == emp2)

session1.close();

// 이때 emp1과 emp2는 영속성 컨덱스트에서 빠져나와 detached 상태가 된다. 


Session sessionB = sessionFactory.openSession();

Emp emp3 = sessionB.get(Emp.class, new Integer(7369) );

......

......

// 이 경우 emp1, emp2와 emp3 객체는 세션이 다르기 때문에 동일하지 않다.

// emp1, emp2는 detached 객체이고 emp3은 영속성 객체이다.

// 위 세개의 객체는 PK값 자체로 보면 모두 7369라는 사번을 가지는 객체이므로 사번으로 비교하면 같은 객체로 인식이 가능하다.


자바의 equals 메소드로 위 세객체를 비교한다고 했을 때 Emp 클래스가 equals 메소드를 구현하지 않았다면 Object 클래스의 equals로 비교하므로 == 와같은 의미이다.


위 세개의 객체를 자바 컬렉션(Set)에 emp1, emp2, emp3 순서로 추가한다고 가정해 보자. 

Set은 순서도 없고 중복도 허락하지 않는 객체이므로 추가 될 때 equals 메소드로 비교하여 같은 것이 없는 경우에만 추가한다. Emp 클래스가 equals를 구현하지 않았다면 == 로 비교하여 판단하므로 세 객체중 emp1, emp3 두객체가 저장 될 것이다. 만약 같은 사번의 객체가 하나만 저장되기를 원한다면 euqals 메소드를 구현해야 한다.



#JPA교육, #JPA강좌, #JPA학원, #엔티티, #JPA엔티티, #JPAEnrity, #JPA동영상, #스프링교육, #자바교육, #스프링학원, #자바학원, JPA교육, JPA강좌, JPA학원, 엔티티, JPA엔티티, JPAEnrity, JPA동영상, 스프링교육, 자바교육, 스프링학원, 자바학원,






오라클에서 소프트파싱,하드파싱이란? 리터럴SQL, 바인드변수SQL, Soft Parsing vs Hard Parsing, 오라클교육, ORACLE교육동영상, 오라클학원교육, 자바학원

 

오라클에서 소프트파싱,하드파싱이란? 리터럴SQL, 바인드변수SQL, Soft Parsing vs Hard Parsing, 오라클교육, ORACLE교육동영상, 오라클학원교육, 자바학원


http://ojc.asia/bbs/board.php?bo_table=LecOrccleTun&wr_id=161 


오라클에서 소프트파싱,하드파싱이란? 리터럴SQL, 바인드변수SQL, Soft Parsing vs Hard Parsing

오라클에서 소프트파싱,하드파싱이란? 리터럴SQL, 바인드변수SQL, Soft Parsing vs Hard ParsingORACLE SQL소프트 파싱 vs 하드 파싱(Soft Parsing vs Hard Parsing)Literal SQL & Bind Variable SQL에 대하여(Soft Parsing/Hard Parsin

ojc.asia

https://www.youtube.com/watch?v=2DjEl1PYzWo&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=33 

https://www.youtube.com/watch?v=e9lZ0oZNZDo&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=32 

https://www.youtube.com/watch?v=QPf_zMPShZg&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=31 

https://www.youtube.com/watch?v=oR_UKxk_HO4&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=30 

https://www.youtube.com/watch?v=b-IxbRmwpGE&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=29 

ORACLE SQL


소프트 파싱 vs 하드 파싱

(Soft Parsing vs Hard Parsing)



Literal SQL & Bind Variable SQL에 대하여

(Soft Parsing/Hard Parsing)


리터럴(Literal) SQL이란? SQL문장 작성시 WHERE절의 비교되는 값에 문자/숫자 상수값을 “하드코딩”해서 작성한 것을 말하며, Bind Variable SQL이란 WHERE절의 특정값을 표시하는 자리에 바인드 변수 형태(:B)로 표시한 것을 말한다.   


리터럴 SQL문을 많이 사용하면 하드 파싱의 빈도를 높이게 되어 Library Cache 내에서 Cache되는 SQL문들이 자주 age out 하게 되므로 주기를 빠르게 하고 Dictionary Cache의 사용률을 높이게 됩니다. 이러한 Shared SQL Area의 SQL문 중에서 리터럴 SQL 문들을 찾아서 Bind Variable을 이용한 방법으로 바꾸어야 성능향상에 도움이 됩니다.


Hard Parsing 


하드파싱이란 SQL 문장이 처음 실행 되는 경우엔 Shared Pool/Library Cache에 없으므로 완전히 전부 새로 파싱을 한다는 의미 입니다. SQL 실행의 4단계중 최적화(최적의 실행계획 생성), 로우 소스 생성(로우 소스 트리 생성) 과정을 수행한다는 의미 입니다. 


Soft Parsing


소프트 파싱이란 실행하고자 하는 SQL 문장이 이미 Shared Pool/Library Cache에 있으므로 이미 존재하는 SQL에 관련된 정보(파싱트리, 실행계획)를 그대로 재사용 하므로 SQL 실행 4단계중 최적화(최적의 실행계획 생성), 로우 소스 생성(로우 소스 트리 생성) 과정을 생략 합니다. 그래서 대부분의 SQL문장 실행시간은 처음보다 두 번째가 빠르다.


소프트 파싱 되려면 완벽하게 동일한 SQL 문장을 구사해야 하는데 하드 파싱의 대상에는 어떤 것이 있는지 알아 보겠습니다.


- 같은 테이블을 질의 하더라도 사용자 계정이 다른 경우 다른 SQL 문장으로 간주.

- SQL문장의 공백이 다른 경우

“select * from emp” 문장과 “select     *     from     emp” 문장은 다르다.

- SQL문장의 라인이 다른 경우

      “select * 

      from emp 

where empno = 7369” 문장과 “select * from emp where empno =  7369”문장은 다르다.

- 동일한 질의라도 SQL 문장의 대소문자가 다르면 이것 역시 하드 파싱의 대상이다. 

“select * from emp” 문장과 “select * from EMP” 문장은 다르다.


소프트 파싱 과 하드 파싱을 실습해 보겠습니다.


-- SHARD_POOL을 FLUSH하면 공유 SQL영역/PLSQL영역(SQL statements, stored procedures, function, packages, and triggers)이 CLEAR된다(현재 실행되는 부분은 제외). 또한 SHARED POOL에 적재된 딕셔너리 캐시를 삭제하므로 SQL을 실행하면 하드파싱하게 된다.

SQL> ALTER SYSTEM FLUSH SHARED_POOL;


SQL> SET SERVEROUTPUT ON


SQL> DECLARE

      v_sql VARCHAR2(500);

      v_cnt NUMBER;

    BEGIN

      FOR I IN 1..5 LOOP

        v_sql := 'SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = ' || i;

        DBMS_OUTPUT.PUT_LINE(v_sql);

        EXECUTE IMMEDIATE v_sql INTO v_cnt;

      END LOOP;

   END;

   /


SELECT COUNT(*) FROM MYEMP1 WHERE EMPNO = 1

SELECT COUNT(*) FROM MYEMP1 WHERE EMPNO = 2

SELECT COUNT(*) FROM MYEMP1 WHERE EMPNO = 3

SELECT COUNT(*) FROM MYEMP1 WHERE EMPNO = 4

SELECT COUNT(*) FROM MYEMP1 WHERE EMPNO = 5


-- 위에서 실행된 SQL문장은 전부 다른 SQL문장으로 인식되어 하드파싱 됨을 알수있다.

SQL> SELECT SUBSTR(sql_text,1,60) "SQL", COUNT(*),

            SUM(EXECUTIONS) "총실행횟수"

     FROM V$SQLAREA

     WHERE SQL_TEXT LIKE '%LITERAL%'

     GROUP BY SUBSTR(sql_text,1,60)

     HAVING COUNT(*) > 0

     ORDER BY 2;


SQL                                                           COUNT(*)     총실행 횟수

--------------------------------------------------------------------------------------------------------------

SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = 4     1            1

SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = 5     1            1

SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = 1     1            1

SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = 2     1            1

SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 WHERE EMPNO = 3     1            1


SQL> DECLARE

      v_sql VARCHAR2(500);

      v_cnt NUMBER;

    BEGIN

      FOR i IN 1..5 LOOP

        v_sql := 'SELECT /*+ BIND */COUNT(*) FROM MYEMP1 

                   WHERE EMPNO = :1';

        DBMS_OUTPUT.PUT_LINE(V_SQL);

        EXECUTE IMMEDIATE v_sql INTO v_cnt USING i;

      END LOOP;

   END;

   /


SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1

SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1

SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1

SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1

SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1


-- 위에서 실행된 SQL문장은 바인드 변수처리되어 동일한 SQL문장으로 인식되어 소프트파싱 되rh 파싱은 한번만, 실행은 5번 하였다.

SQL> SELECT SUBSTR(sql_text,1,60) "SQL", COUNT(*),

           SUM(EXECUTIONS) "총실행횟수"

    FROM V$SQLAREA

    WHERE SQL_TEXT LIKE '%BIND%'

    GROUP BY SUBSTR(sql_text,1,60)

    HAVING COUNT(*) > 0

    ORDER BY 2;


SQL                                                          COUNT(*)     총실행 횟수

-------------------------------------------------------------------------------------------------------------

SELECT /*+ BIND */COUNT(*) FROM MYEMP1 WHERE EMPNO = :1       1            5


#오라클교육, #소프트파싱, #하드파싱, #리터럴SQL, #바인드변수SQL, #SoftParsing, #HardParsing, #오라클동영상, #ORACLE교육, #오라클학원,오라클교육, 소프트파싱, 하드파싱, 리터럴SQL, 바인드변수SQL, SoftParsing, HardParsing, 오라클동영상, ORACLE교육, 오라클학원, 

(WPF동영상, WPF교육, WPF학원교육, WPF학원)데이터 바인딩(Data Binding) 이란?

 











(WPF동영상)데이터 바인딩(Data Binding) 이란?

  • 데이터 바인딩이란 “컨트롤 or 엘리먼트를 데이터에 연결시키는 기술”이다. 
  • 예문

//소스객체

<TextBox Name="txt1" Text="{Binding Mode=OneWay}" />


//타겟객체

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

  • 데이터 바인딩은 소스와 타겟이 필요하며 일반적으로 소스는 데이터(ViewModel)이고 타겟은 컨트롤 입니다. 하지만 어느 경우엔 소스와 타겟 둘다 컨트롤이 될수가 있어 구분이 모호할 때도 있습니다. 또 어떤 경우에는 반대로 타겟이 소스에게 데이터를 전달하기도 합니다.
  • 모든 바인딩에는 소스 객체, 소스 속성, 타겟 객체 및 타겟 속성이 있습니다.
  • 타겟 객체는 바인딩 할 속성, 즉 데이터를 렌더링하는 UI 컨트롤을 소유하는 객체이며 소스 객체는 Binding Source속성 또는 ViewModel 클래스인 경우 DataContext 속성으로 지정하면 됩니다.
  • Binding.Source 속성을 통해 지정되는 원본 개체없이 정의 된 바인딩은 대상 개체의 DataContext를 원본으로 사용한다. 
  • DataContext 값은 한 컨트롤에서 다른 컨트롤로 비주얼 트리 아래로 상속되는데, 하위 객체에서 사용가능 합니다.
  • 데이터 바인딩은 이벤트 핸들러를 대체할 수 있는데 이는 C#코드를 줄이는 역할을 합니다. XAML에서 정의된 데이터 바인딩은 C# 코드 비하인드 파일에서 이벤트 핸들러를 정의할 필요가 없으며 코드 비하인드 파일 자체가 필요 없는 경우도 있습니다.
  • 컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 두 가지 기능을 제공합니다. 최근 컨트롤과 데이터 사이의 많은 반복 작업들이 단순화 되면서 CheckBox를 Boolean 변수로 바인딩하고 사용자가 작업이 끝난 후 Boolean 변수를 다시 CheckBox 값으로 바인딩하는 코드들을 만들어야 했는데 아래처럼 CheckBox와 Bool 변수 사이를 데이터바인딩을 이용하게 간단하게 처리할 수 있습니다.
  • 예문.

[MainWindow.xaml]

<StackPanel Orientation="Vertical" Margin="20" >

        <Label Content="Which city do you love?"/>

        <CheckBox Content="SEOUL" IsChecked="{Binding Seoul}"/>

        <CheckBox Content="JEJOO" IsChecked="{Binding Jejoo}"/>

        <CheckBox Content="INCHEON" IsChecked="{Binding Incheon}"/>

        <Button Content="제출" Click="Sumit_Click"/>

</StackPanel>


[MainWindow.xaml.cs]

public partial class MainWindow : Window

{

//UI 컨트롤에서 바인딩으로 사용할 소스 속성들

public bool Seoul { get; set; }

public bool Jejoo { get; set; }

public bool Incheon { get; set; }


public MainWindow()

{

      this.InitializeComponent();

      //바인딩의 소스객체, UI컨트롤에서 별도의 소스 지정없이 사용가능

      //Window의 하위객체에서 소스 속성으로 사용가능

      this.DataContext = this; 

}


//버튼의 클릭 이벤트 핸들러

private void Sumit_Click(object sender, RoutedEventArgs e)

{

      MessageBox.Show(string.Format("SEOUL: {0}, JEJOO: {1}, INCHEON: {2}", Seoul, Jejoo, Incheon));

}


}




  • 다음은 TextBox간의 단방향 데이터 바인딩 예문을 살펴보자.
  • 아래 예문은 별도의 C#코드는 필요 없다. txt1이 소스 객체가 되고 txt2가 타겟 객체가 되어 소스의 Text 속성의 값을 타겟 txt2의 Text 속성에 바인딩 시킨다.

<StackPanel Orientation="Vertical" Margin="20" >

        <TextBox Name="txt1"  Text="{Binding Mode=OneWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

</StackPanel>

위쪽 TextBox에 값을 입력하며 아래쪽 TextBox에 자동 입력된다.

  • 위 코드를 수정하여 양방향바인딩으로 만들어보자.
  • 위쪽 TextBox에서 입력을 하면 아래에 자동 반영 되지만, 아래쪽 TextBox에서 입력을 하면 바로 반영은 안되고 포커스를 잃는경우에만 하는 경우에 상단의 TextBox에 반영된다. (양방향에서 타겟이 소스를 UPDATE하는 타이밍은 UpdateSourceTrigger 속성으로 지정하는데 대부분의 의존 속성 기본값이 PropertyChanged인 반면 Text 속성은 기본값이 LostFocus 입니다.)

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>


최종적으로 아래와 같이 UpdateSourceTrigger 절을 타겟객체쪽에 추가하자. 소스를 갱신할 타이밍을 지정하는 곳이고 Text 속성인 경우 기본값은 포커스를 잃을 때(LostFocus)이다.

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text, 

UpdateSourceTrigger =PropertyChanged}"/>

다른 예문을 살펴보자.

public partial class MainWindow {

public MainWindow()

{

  InitializeComponent();


  // create a model object

  _viewmodel = new MyViewModel()

  {

    Date = new DateTime(201171),

    Title = "WPF User Group"

  };


  // bind the Date to the UI

  this.DataContext = _viewmodel;

}

}


<Grid x:Name="LayoutRoot" Background="White">

  ...


  <TextBlock Text="Name:"

              Grid.Row="1"/>

  <TextBox Text="{Binding Path=Title, Mode=TwoWay}"

           Grid.Row="1" Grid.Column="1"/>


  <TextBlock Text="Date:"

              Grid.Row="2"/>

  <sdk:DatePicker SelectedDate="{Binding Path=Date, Mode=TwoWay}"

                  Grid.Row="2" Grid.Column="1"/>

</Grid>


#WPF데이터바인딩, #데이터바인딩, #DataBinding, #WPF교육, #WPF강의, #WPF동영상, #WPF학원,WPF데이터바인딩, 데이터바인딩, DataBinding, WPF교육, WPF강의, WPF동영상, WPF학원


(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...