본문 바로가기

전체 글

(170)
[AngularJS] - AngularJS의철학 AngularJS의 철학 이번에 프로젝트를 하면서 프로젝트 구조를 잡는데 JHipster를 이용하게 되었다. JHipster의 프론트가 AngularJS(이하 angular)로 되어 있어서 처음으로 angular를 실무에서 사용하게 되었다. 내가 angular에 대해서 아는건 데이터 바인딩이 전부였기에 공부가 조금 필요하다는 것을 배웠다. angular는 document가 친절하지도 않고, 내가 영어를 잘 못하는 관계로 회사에 있는 책으로 공부를 하기로 했다.책이름은는 'AngularJS로 하는 웹애플리케이션 개발'이다. angular를 처음 접했을 때는 '이게 정말 효율적이야?? '라는 생각을 했었지만 조금씩 익숙해지면서 angular가 편리하게 느껴지기 시작했다. 하지만 여전히 직관적이지 못한 코드로..
[JPA] - 연관관계 매핑1 연관관계 매핑1 JPA는 엔티티가 핵심이라고 보면 되는데 앞의 포스팅에서는 단순히 테이블과 엔티티의 매핑만 확인을 했다. 이번에는 테이블과 테이블의 관계를 엔티티와 엔티티의 관계로 어떻게 표현할 수 있을지에 대해서 알아본다. MEMBER와 TEAM 테이블이 있다.MEMBER와 TEAM 테이블은 N:1의 관계에 있다. 테이블은 TEAM 테이블과 MEMBER 테이블로 나뉠테고 MEMBER에 TEAM ID가 외래키로 생성될 것이다.그리고 데이터베이스에서는 MEMBER.TEAM_ID와 TEAM.ID로 조인을 할 것이다. 바로 지금 다룰 연관관계가 바로 테이블과 테이블의 관계를 엔티티와 엔티티로 매핑하는 것을 의미한다.객체에는 조인이라는 개념이 없다. 그렇기 때문에 연관관계를 객체지향적으로 맺어줘야 하는데 코드를..
[JPA] - 기본 키(Primary Key) 매핑 기본키(Primary Key) 매핑 앞의 포스팅에서 기본 키는 @Id 어노테이션을 사용해서 직접 할당했다. 하지만 실제 업무에서는 직접할당이 아닌 자동할당을 많이 사용한다.오라클은 SEQUENCE를 사용하고 MySQL은 AUTO_INCREMENT를 사용한다. 데이터 베이스마다 기본키를 생성하는 방법이 다른데 JPA에서는 이것을 해결하기 위해 몇가지 전략이 존재한다. 직접할당 : 기본키를 어플리케이션에 직접 할당한다. (앞의 포스팅에서 사용한 전략)자동생성 : - IDENTITY : 기본 키 생성을 데이터베이스에 위임- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.- TABLE : 키 생성 테이블을 사용한다.- AUTO : 해당 테이블에 맞는 전략을 자동으로 선택- IDENTITY..
[JPA] - 엔티티 매핑(Entity Mapping) 엔티티 매핑(Entity Mapping) JPA의 가장 중요하고 기본적인 작업은 테이블과 엔티티를 매핑하는 것이다. JPA는 이를 위해서 다양한 매핑 어노테이션을 지원한다. 객체와 테이블 매핑 : @Entity, @Table 기본키 매핑 : @Id필드와 컬럼 매핑 : @Column, @Enumerated, @Temporal, @Lob연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 1. @Entity테이블과 매핑할 클래스에 필수로 붙여야한다.기본 생성자는 필수이다. final 클래스, enum, interface, inner 클래스에서는 사용할 수 없다.저장할 필드에 final을 사용하면 안된다. 2.@Table엔티티와 매핑할 테이블을 지정한다. 옵션으로 name을 주지 않..
[JPA] - 영속성 컨텍스트(persistence context)의 특징 영속성 컨텍스트(persistence context)의 특징 1. 1차캐시 영속성 컨텍스트는 내부에 가지고 있는 캐시. 영속 상태의 엔티티가 저장되는 곳이다. em.persist(member); 위의 코드를 실행하여 엔티티를 저장하면 1차캐시에 엔티티를 저장한다.em.find(Member.class, id); 위의 코드와 같이 엔티티를 조회해도 1차 캐시에 저장된다. 데이터 베이스를 조회할 때 1차 캐시를 먼저 조회하고 1차 캐시에 없으면 데이터베이스에서 조회를 한다. 2. 동일성 Member findMember = em.find(Member.class, id);Member findMember2 = em.find(Member.class, id);System.out.print(findMember == fi..
[JPA] - 영속성 컨텍스트(persistence context) 와 엔티티의 생명주기 영속성 컨텍스트(persistence context) JPA를 이해하는데 가장 중요한 용어는 영속성 컨텍스트(persistence context)다. 세미나에서 김영한님이 강조하신 부분이기도한데 이 부분을 정확히 이해하고 있어야 JPA를 잘 사용할 수 있다. 영속성 컨텍스트는 우리말로 변경하지면 '엔티티를 영구적으로 저장하는 환경'이라는 뜻이다. 앞의 포스팅에서 설명했더니 무조건 엔티티에 set한다고 저장이 되거나 하는 것이 아니었다. 해당 엔티티가 매니저를 통해서 트렌젝션을 시작해야만 데이터베이스와 커넥션을 맺고 해당 엔티티가 영속성을 가지게 된다. 그래야만 set을 하더라도 수정이 된다. 영속성을 가진다는 말은 이 엔티티가 현재 데이터 베이스와 연결되어 있는 것과 동일한 상태라고 보면 된다. 엔티티매..
[JPA] 엔티티 매니저 팩토리와 엔티티 매니저(EntityManagerFactory and EntityManager) 엔티티 매니저 팩토리와 엔티티 매니저(EntityManagerFactory and EntityManager) 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 역할을 하는데 앞의 포스팅에서 설명했지만 이것을 생성하는 비용은 아주 크다고 한다. 그렇기 때문에 애플리케이션 전체에서 공유하도록 설계되어 있다. 엔티티매니저팩토리는 여러 스레드가 접근해도 안전하지만 엔티티매너지는 동시성 문제가 발생할 수 있으므로 스레드간에 절대 공유하면 안된다. 엔티티 매니저 팩토리를 이용해서 엔티티 매니저를 만드는데 이 때 생성된 엔티티 매니저는 생성되었다고 무조건 데이터베이스 커넥션을 사용하는 것이 아니다. EntityManagerFactory emf = Persistence.createEntityManagerFac..
[JPA] - JPQL이란 JPQL 기본코드 : http://nanstrong.tistory.com/300 기본코드에 보면 회원 목록을 조회하는 코드가 있다. List members = em.createQuery("select m from Member m", Member.class).getResultList(); JPA를 사용할 때 기본적인 SQL은 JPA가 처리해주기 SQL을 사용할 일이 없다. 하지만 이것은 테이블을 대상으로 할 때 가능한 일이다. 만약 테이블에서 특정 데이터만 가져올 경우 엔티티 객체로만 처리하게 되면 모든 데이터를 가져와서 검색해야 하는데 이것은 너무 비효율적이다.어플리케이션에서 필요한 데이터만 가지고 올 경우는 조건이 포함된 SQL을 사용해야 한다. 이것을 해결하기 위해서 JPQL(Java Persiste..