스프링 빈 생명주기(Bean LifeCycle)스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 종료 Spring Bean은 위와 같은 생명 주기를 가진다. 스프링 빈으로 등록되는 객체를 사용하기 위해서는 객체가 생성된 후 의존성 주입까지(Dependency Injection) 끝나야 해당 객체를 사용할 수 있게 된다. (생성자 주입 방식의 경우 '객체 생성' -> '의존 관계 주입'의 과정이 한 번에 처리된다.) 그리고 의존 관계가 주입된 후에 값을 설정해주는 단계를 초기화 단계라고 한다. 스프링에서는 스프링 빈이 의존 관계 주입이 완료되면 콜백 메서드를 통해 초기화 시점을 알려주는 기능을 제공하며(초기화 콜백), 이것을 통해 개발..
JPA를 공부하다보면 'JPA는 Entity로 사용할 객체에 반드시 기본 생성자가 있어야 합니다.' 라는 내용을 접한 적이 있을 것이다. 왜 필요해야 하는지 이유를 살펴보고자 한다. Reflection? 구체적인 클래스 타입을 알지 못해도 클래스의 메서드나, 타입, 변수들에 접근할 수 있도록 해주는 api 자바에서 제공하는 리플렉션(Reflection)은 C, C++과 같은 언어를 비롯한 다른 언어에서는 볼 수 없는 기능이다. 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있도록 한다. 그러니까, 컴파일 시간(Compi..
객체지향 쿼리 언어 소개 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발할 수 있다. 문제는 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 하지만 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다. 따라서 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다. 문법은 SQL과 유사하며, 둘의 가장 큰 차이점은 JPQL은 엔티티 객체를 대상으로, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 것이다. 즉, JPQL을 한마디로 정의하면 객체 지향 SQL이라고 말할 수 있다. //검색 String jpql = "select m From Member m w..
JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본 값 타입basic value type 자바 기본 타입(int, double) 래퍼 클래스(Integer, Double) String 임베디드 타입embeded type(복합 값 타입) 컬렉션 값 타입collection value type 기본 값 타입 예): String name, int age 생명주기..
상속관계 매핑 객체에서는 상속이라는 개념이 존재하지만, 관계형 데이터베이스는 상속 관계가 존재하지 않는다. 슈퍼타입, 서브타입 관계라는 모델링 기법이 상속과 유사하다. 상속관계 매핑 : 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑 각각의 테이블로 변환 : 조인전략 통합 테이블로 변환 : 단일 테이블 전략 서브타입 테이블로 변환 : 구현 클래스마다 테이블 전략 조인 전략 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 조회할 때 조인을 자주 사용한다. 주의할 점 : 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없다. 따라서 타입을 구분하는 컬럼을 추가해야 한다. 여기서는 DTYPE 컬럼을 구분 컬럼으로 사용한..
다대일[N:1] JPA에서 가장 많이 사용하고, 꼭 알아야 하는 다중성이다. DB설계상 일대다에서 '다' 쪽에 외래키가 존재해야한다. 다대일 단방향 매핑 JPA의 @ManyToOne 어노테이션을 사용해서 다대일 관계를 매핑 @JoinColumn은 외래키를 매핑할 때 사용한다. name은 매핑할 외래 키의 이름. public class Member{ ... @ManyToOne @JoinCoulmn(name="TEAM_ID") private Team team; } 다대일 양방향 매핑 반대쪽에서 일대다 단방향 매핑을 해주면 된다.(객체기준으로, 컬렉션을 추가하자) 반대에서 단방향 매핑을 한다고 해서 DB테이블에 영향을 전혀 주지 않는다. 다대일의 관계에서 다 쪽에서 이미 연관관계 주인이 되어서 외래키를 관리하..
단방향 연관 관계 객체 연관관계 객체는 단방향 관계다. 객체의 필드(멤버 변수)로 다른 객체와 연관관계를 맺는다. 테이블 연관관계 양방향 관계다. 테이블은 외래키로 다른 테이블과 연관관계를 맺는다. 두 테이블의 외래키를 통해서 서로 조인 할 수가 있다. 객체 연관관계와 테이블 연관관게의 가장 큰 차이 참조를 통한 연관관계는 언제나 단방향이다. 객체간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야한다. 결국 연관관계를 하나 더 만들어야 한다. 이렇게 양쪽에서 서로 참조하는 것을 양방향 연관관계라 한다. 하지만 정확히 이야기하면 이것은 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 반면에 테이블은 외래 키 하나로 양방향으로 조인할 수 있다. 객체 관계 매핑 @Enti..
엔티티 매핑 • 객체와 테이블 매핑: @Entity, @Table • 필드와 컬럼 매핑: @Column • 기본 키 매핑: @Id • 연관관계 매핑: @ManyToOne,@JoinColumn 객체와 테이블 매핑 • @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 • 주의 • 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) • final 클래스, enum, interface, inner 클래스 사용X • DB에 저장할 필드에 final 사용 X @Entity • 속성: name • JPA에서 사용할 엔티티 이름을 지정한다. • 기본값: 클래스 이름을 그대로 사용(예: Member) • 같은 클래스..
EntityManagerFactory와 EntityManager EntityManagerFactory - 애플리케이션에서 사용하는 DB 종류 하나 당 하나만 생성하는데, 이 한 개를 가지고 애플리케이션 전체에서 공유되도록 설계되어있다. (싱글톤 방식) - EntityManager를 생성하는 역할이 주 업무 - EntityManagerFactory는 thread-safe해서 동시성이 보장되지만, 생성 비용이 상당히 크다. - JPA는 DB접근 요청이 들어올 때마다 EntityManagerFactory에서는 EntityManager를 생성하여 DB연결 요청을 처리 EntityManager - Mapping한 Entity를 가지고 DB연결 요청을 처리하고 Entity 상태를 관리하는 클래스 - EntityMa..