1. 프로토타입과 상속 짚고 넘어가야할 Javascript 특징은 다음과 같습니다. Javascript에서 함수는 Javascript 내장 객체인 Function의 생성자로 생성된 객체입니다. Javascript에서 상속은 생성자 함수의 프로토타입을 활용합니다. Javascript에서 프로토타입은 다른 객체에 공유 프로퍼티를 제공하는 객체입니다. 함수 객체만이 프로토타입을 가집니다. 함수 객체만이 호출이 가능하고 다른 객체를 생성할 수 있기 때문입니다. ES6의 화살표 함수는 프로토타입을 가지지 않습니다. 함수는 공장으로, 프로토타입은 공장에서 생산된 제품의 명세로 간주할 수 있습니다. new 키워드로 함수를 호출할 때마다 해당 제품의 주문이 들어가고 공장은 프로토타입에 지정된 방식으로 생산합니다. //..
[Spring Framework] Spring 핵심 원리 - 컴포넌트 스캔과 의존관계 자동 주입
2022.02.03
1. 컴포넌트 스캔과 의존관계 자동 주입 스프링 빈을 등록할 때 Java 코드의 @Bean이나 XML의 등을 이용해 설정 정보에 직접 등록할 빈을 명시했습니다. 그런데, 이렇게 등록해야할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 파일도 커지는 문제가 발생합니다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공합니다. 탐색할 패키지의 시작 위치 지정 모든 Java 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸립니다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있습니다. @ComponentScan( basePackages = "com.demo.core", basePackageClasses = AutoConfig.cl..
1. 개요 Spring이 제공하는 핵심 가치와 원리를 이해해야 합니다. 왜 Spring을 만들었고, Spring이 왜 이런 기능들을 제공하는지를 살펴봅니다. 과거 오픈 소스는 ‘사파’라 불렸고, 표준이 ‘정파’ 기술로 불렸습니다. EJB는 ‘정파’였기 때문에 여러 기업들에서 EJB를 많이 도입했습니다. EJB가 이론적으로는 정말 좋았지만, 현실적으로 너무 어렵고, 느렸습니다. 그리고 비쌌습니다. EJB 엔티티빈 → 하이버네이트 → JPA 지금 시점에 Java로 개발할 때의 메인이 되는 두 축은 Spring과 JPA입니다. Spring 프레임워크의 역사 (로드 존슨이 최초 만들었던 3만줄의 Spring 코드로부터 시작하였습니다.) 2003년, Spring 프레임워크 1.0 출시 - XML로 설정 2006년..
0. Spring-Data-JPA 개요 기본 형태는 다음과 같습니다. public interface MemberRepository extends JpaRepository { } 위 코드에서 상속받는 JpaRepository의 상속 관계도는 다음과 같습니다. (모두 인터페이스) JpaRepository ---> PagingAndSortingRepository ---> CrudRepository ---> Repository JpaRepository 인터페이스에는 다음의 메서드가 정의되어 있습니다. findAll() findAllById() saveAll() getOne() 1. 쿼리 메서드 기능 Spring-Data-JPA에는 쿼리 메서드라고 하는 기능이 있습니다. 쿼리 메서드 기능은 총 세 가지가 있습니다..
1. 개요 JPA를 사용하면 Entity 객체를 중심으로 개발을 할텐데, 이때 문제는 검색 쿼리입니다. 따라서, 세심한 검색을 위해 쿼리를 짤 수 있어야 하고, JPA는 JPQL이라는 SQL을 추상화한 객체 중심 SQL을 제공합니다. JPQL은 테이블이 아닌 Entity 객체를 대상으로 검색합니다. JPQL은 ANSI 표준에 나와있는 모든 SQL을 지원합니다.(SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN) 2. 프로젝션 SELECT절에 조회할 대상을 프로젝션이라고 하고, Entity, Embedded 타입, 스칼라 타입(기본 데이터 타입)이 있습니다. SELECT m FROM Member m // 엔티티 프로젝션 SELECT m.team FROM Member m // 엔..
1. 개요 JPA는 데이터 타입을 크게 두 가지로 분류합니다. Entity 타입 Value 타입 이 중 Value 타입에 대해 살펴보겠습니다. 2. Value 타입 Value 타입은 값의 변경을 추적할 수 없는 타입을 말합니다. int, double와 같은 Primitive 타입뿐만 아니라, Integer, String과 같은 클래스도 참조는 가지지만 값의 변경을 추적할 수 없기 때문에 마찬가지로 Value 타입에 속합니다. (값의 변경을 추적할 수 없다는 말은 값을 변경할 수 없다는 의미입니다. Integer, String의 값을 변경하면 참조하는 주소가 바뀝니다.) JPA의 Value 타입은 세 가지로 나눠 생각해볼 수 있습니다. 기본 값 타입: int, double와 같은 Java의 Primitiv..
1. 프록시(Proxy) JPA의 Proxy 특징은 다음과 같습니다. 프록시 객체는 처음 사용할 때 한 번만 초기화합니다. 프록시 객체를 초기화할 때, 프록시 객체가 실제 Entity로 바뀌는 것은 아닙니다. (프록시 클래스의 필드로 Entity를 가집니다.) 초기화되면 Proxy 객체를 통해서 실제 Entity에 접근할 수 있습니다. Proxy 객체는 Entity 클래스를 상속받습니다. 따라서 타입 비교시 주의해야 합니다. (instance of 사용) 영속성 컨텍스트에 찾는 Entity가 이미 있으면 em.getReference()를 호출해도 실제 Entity가 반환됩니다. 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생합니다. (이 경우 Hibernate는..
[Spring Data JPA] 고급 매핑(상속 관계 매핑, @MappedSuperclass)
2021.11.16
1. 상속 관계 매핑 객체 모델에서 상속관계는 아주 흔합니다. 그런데 관계형 DB는 상속관계가 없는데 어떻게 해야 할까요? 관계형 DB에는 슈퍼타입-서브타입 관계라는 모델링 기법이 있는데, 이 모델로 객체의 상속관계와 매핑할 수 있습니다. 위 슈퍼/서브 타입 논리 모델을 가지고 설명해보겠습니다. 우선, 슈퍼/서브 타입 모델은 논리적인 데이터 모델에서만 이용되는 형태이기 때문에 물리적인 데이터 모델로 변환 작업이 필요합니다. 슈퍼/서브 타입 논리 모델을 물리 모델로 변환하는데에는 3가지 방법이 있습니다. 각각 테이블로 변환(JOINED 전략) - 위 형태 그대로 테이블을 만들어 item_id 와 같은 컬럼으로 JOIN하는 방법 통합 테이블로 변환(SINGLE_TABLE 전략) - 위의 예에서 ITEM 테이..
1. 개요 이전 포스팅에서 객체 연관관계에서의 단방향 관계, 양방향 관계에 대해 살펴봤습니다. 이제 DB 테이블 기준으로 경우의 수를 나눠서 생각해보겠습니다. DB 테이블의 관계는 총 4가지로 나뉩니다. 다대일 N:1 일대다 1:N 일대일 1:1 다대다 N:M 위 관계는 좌측 테이블을 기준으로 잡고 좌측에 외래 키가 있는 경우를 나타냈습니다. 예를 들어, N:1 관계는 N쪽에 외래 키가 있는 경우고, 1:N 관계는 1쪽에 외래 키가 있는 경우입니다. 위와 같은 4개의 DB 테이블 관계에 대해 나눠서 살펴보겠습니다. 2. N:1 이전 포스팅에서도 살펴봤듯이, 가장 일반적이고 대표적이고 직관적인 모델입니다. 아래 N:1 테이블을 기준으로 설명하겠습니다. 두 가지 경우로 나눠보겠습니다. Member->Team..
1. DB 테이블 중심으로 Entity 클래스를 설계했을 때의 문제점 다음과 같은 관계를 가지는 테이블을 가지고 설명하겠습니다. DB 테이블에 맞춰 Member Entity 클래스를 설계하면 다음과 같이 될 것입니다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long memberId; private String username; private Long teamId; } 보시면 테이블의 컬럼에 맞춰서 Entity 클래스의 필드를 정의했습니다. 이러면 멤버와 멤버가 속한 팀을 조회할 때 멤버를 우선 조회한 후, 가져온 teamId 값으로 다시 Team 테이블을 조회해야 합니다. Member..
1. Hibernate의 DB 테이블 자동 생성 들어가기에 앞서, 개발 및 로컬 환경에서 테스트를 용이하게 하는 DB 테이블을 자동으로 생성해주는 기능을 알아보겠습니다. 보통 개발할때 DB 테이블을 먼저 만드는데요, Hibernate에서 지원하는 DB 테이블 생성 기능을 사용하면 이 과정을 생략할 수 있습니다. /META-INF/persistence.xml 설정 파일에 다음과 같이 hibernate.hbm2ddl.auto 옵션을 설정해줍니다.
1. 영속성 컨텍스트 영속성 컨텍스트는 객체와 관계형 데이터베이스 사이에 위치하는 공간, 즉 중간 계층입니다. 영속성 컨텍스트라는 중간 계층을 둠으로써 얻는 이점은 다음과 같습니다. 1차 캐시 조회한 entity 객체의 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 위 5가지 이점을 차례로 살펴보겠습니다. 우선 1차 캐시부터 살펴보겠습니다. 1.1 1차 캐시 다음과 같이 entity 객체를 생성하고 .persist() 메서드를 이용해 entity 객체를 영속시킨다고 해보겠습니다. Member member = new Member(); member.setId("member1"); member.setUsername("회원..