back

-
- Entity는 반드시 파라미터가 없는 생성자(기본 생성자)가 있어야 함 (public 또는 protected) - 기본 생성자가 필요한 이유는 스프링 데이터 JPA 에서 엔티티에 동적으로 객체 생성시 JAVA Reflection API를 활용하기 때문 (JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑 >> 기본 생성자가 없다면 Reflection은 해당 객체를 생성 할 수 없음) - setter는 사용하지 말아야 함!! >> 1. Entity의 모든 필드에 public setter 메소드를 생성하면 객체의 값의 변경이 개방되어 있기에 일관성을 보장할 수 없음 setter 메소드를 제공하는 것 보단 확실한 비즈니스가 드러나는 메..
JPA - 엔티티 기본 생성자- Entity는 반드시 파라미터가 없는 생성자(기본 생성자)가 있어야 함 (public 또는 protected) - 기본 생성자가 필요한 이유는 스프링 데이터 JPA 에서 엔티티에 동적으로 객체 생성시 JAVA Reflection API를 활용하기 때문 (JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑 >> 기본 생성자가 없다면 Reflection은 해당 객체를 생성 할 수 없음) - setter는 사용하지 말아야 함!! >> 1. Entity의 모든 필드에 public setter 메소드를 생성하면 객체의 값의 변경이 개방되어 있기에 일관성을 보장할 수 없음 setter 메소드를 제공하는 것 보단 확실한 비즈니스가 드러나는 메..
2023.05.15 -
0. - JPA는 다양한 쿼리 방법을 지원 (JPQL / JPA Criteria / QueryDSL / 네이티브SQL / JDBC API 직접 사용 등 ...) 조회 방법1 - EntityManager.find() - 객체 그래프 탐색(a.getB().getC()) - JPA를 사용하면 엔티티 객체를 중심으로 개발함 - 단, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 - 어플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요함 - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 - SQL과 유사한 문법(select, from, where, group by, having, joi..
Orm 표준 jpa 프로그래밍 (6) - 객체 지향 쿼리 언어0. - JPA는 다양한 쿼리 방법을 지원 (JPQL / JPA Criteria / QueryDSL / 네이티브SQL / JDBC API 직접 사용 등 ...) 조회 방법1 - EntityManager.find() - 객체 그래프 탐색(a.getB().getC()) - JPA를 사용하면 엔티티 객체를 중심으로 개발함 - 단, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 - 어플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요함 - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 - SQL과 유사한 문법(select, from, where, group by, having, joi..
2023.05.10 -
0. JPA의 데이터 타입 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 (식별자: DB에서 인스턴스의 집합인 엔티티를 구분할 수 있는 논리적인 값, 하나의 엔티티에 구성되어 있는 여러가지 속성중에 대표할 수 있는 속성) ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 - int, integerm String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 - 기본값 타입: 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String - 임베디드 타입 - 컬렉션 ..
Orm 표준 jpa 프로그래밍 (5) - 값 타입0. JPA의 데이터 타입 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 (식별자: DB에서 인스턴스의 집합인 엔티티를 구분할 수 있는 논리적인 값, 하나의 엔티티에 구성되어 있는 여러가지 속성중에 대표할 수 있는 속성) ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 - int, integerm String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 - 기본값 타입: 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String - 임베디드 타입 - 컬렉션 ..
2023.05.08 -
1. 상속관계 매핑 - 관계형 DB는 상속관계가 없음 - 슈퍼타입 / 서브타입 관계의 모델링 기법이 객체의 상속과 유사 - 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 / 서브타입 관계를 매핑 슈퍼타입 / 서브타입 논리 모델을 물리 모델로 구현하는 방법 1. @Inheritance(strategy=InheritanceType.XXX) - 각각 테이블로 변환 => 조인 전략 (JOINED) - 통합 테이블로 변환 => 단일 테이블 전략 (SINGLE_TABLE) - 서브타입 테이블로 변환 => 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS) 2. @DiscriminatorColumn(name=“DTYPE”) 3. @DiscriminatorValue(“XXX”) 조인 전략 - 장점: 테..
Orm 표준 jpa 프로그래밍 (4) - 매핑, 프록시1. 상속관계 매핑 - 관계형 DB는 상속관계가 없음 - 슈퍼타입 / 서브타입 관계의 모델링 기법이 객체의 상속과 유사 - 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 / 서브타입 관계를 매핑 슈퍼타입 / 서브타입 논리 모델을 물리 모델로 구현하는 방법 1. @Inheritance(strategy=InheritanceType.XXX) - 각각 테이블로 변환 => 조인 전략 (JOINED) - 통합 테이블로 변환 => 단일 테이블 전략 (SINGLE_TABLE) - 서브타입 테이블로 변환 => 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS) 2. @DiscriminatorColumn(name=“DTYPE”) 3. @DiscriminatorValue(“XXX”) 조인 전략 - 장점: 테..
2023.05.08 -
ex1. 객체를 테이블에 맞추어 모델링 // (참조 대신에 외래키를 그대로 사용) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; ... } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; ... } // (외래 키 식별자를 직접 다룸) //팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team);..
Orm 표준 jpa 프로그래밍 (3) - 연관관계 매핑ex1. 객체를 테이블에 맞추어 모델링 // (참조 대신에 외래키를 그대로 사용) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; ... } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; ... } // (외래 키 식별자를 직접 다룸) //팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team);..
2023.05.08 -
- 객체와 테이블 매핑: @Entity, @Table - 필드와 컬럼 매핑: @Column - 기본 키 매핑: @Id - 연관관계 매핑: @ManyToOne, @JoinColumn, ... 1. @Entity - @Entity가 붙은 클래스는 jpa가 관리하고, 엔티티라 부른다. - jpa를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의점 1. 기본 생성자 필수( 파라미터가 없는 public 또는 protected 생성자 ) 2. final 클래스, enum, interface, inner 클래스는 사용하지 않는다 3. 저장할 필드에 final 사용하지 않는다. 속성 1. name: jpa에서 사용할 엔티티 이름을 지정하며, 기본값으로 클래스 이름을 그대로 사용하고, 중복된 이름의 클래스가 ..
Orm 표준 jpa 프로그래밍 (2) - 엔티티 매핑- 객체와 테이블 매핑: @Entity, @Table - 필드와 컬럼 매핑: @Column - 기본 키 매핑: @Id - 연관관계 매핑: @ManyToOne, @JoinColumn, ... 1. @Entity - @Entity가 붙은 클래스는 jpa가 관리하고, 엔티티라 부른다. - jpa를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의점 1. 기본 생성자 필수( 파라미터가 없는 public 또는 protected 생성자 ) 2. final 클래스, enum, interface, inner 클래스는 사용하지 않는다 3. 저장할 필드에 final 사용하지 않는다. 속성 1. name: jpa에서 사용할 엔티티 이름을 지정하며, 기본값으로 클래스 이름을 그대로 사용하고, 중복된 이름의 클래스가 ..
2023.05.08 -
1. 영속성 컨텍스트 (PersistenceContext) - jpa를 이해하는데 가장 중요한 용어 - 엔티티를 영구 저장하는 환경 - 'EntitiyManger.persist(entity);'를 통해 생성 - 영속성 컨텍스트는 논리적인 개념이다 (눈에 보이지 않으며, 엔티티매니저(필자 약칭 EM)을 통해서 접근) - J2EE, 스프링 프레임워크와 같은 컨테이너 환경에서는 EM과 영속성 컨텍스트가 다대일 관계 2. 엔티티 생명주기 엔티티의 생명주기는 4가지로 분류된다 - 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 영속(managed): 영속성 컨텍스트에 관리되는 상태 - 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(remove..
Orm 표준 jpa 프로그래밍 (1) - 영속성 관리 (주석 내용 추가 예정)1. 영속성 컨텍스트 (PersistenceContext) - jpa를 이해하는데 가장 중요한 용어 - 엔티티를 영구 저장하는 환경 - 'EntitiyManger.persist(entity);'를 통해 생성 - 영속성 컨텍스트는 논리적인 개념이다 (눈에 보이지 않으며, 엔티티매니저(필자 약칭 EM)을 통해서 접근) - J2EE, 스프링 프레임워크와 같은 컨테이너 환경에서는 EM과 영속성 컨텍스트가 다대일 관계 2. 엔티티 생명주기 엔티티의 생명주기는 4가지로 분류된다 - 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 영속(managed): 영속성 컨텍스트에 관리되는 상태 - 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(remove..
2023.05.07 -
- 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요 - ex: 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정 (실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록)NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊음 public class NetworkClient { private String url; public NetworkClient() { System.out.prin..
스프링 핵심6 - 빈 생명주기 콜백 / 빈 스코프- 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요 - ex: 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정 (실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록)NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊음 public class NetworkClient { private String url; public NetworkClient() { System.out.prin..
2023.03.22