JPA
-
<Spring JPA> 1.13 단방향 연관관계JPA 2020. 4. 22. 09:50
연관 관계 매핑 시에는 객체와 테이블 간의 연관관계 차이를 이해하고 매핑해야 한다. 테이블에서는 외래키를 사용하여 매핑하고 JPA 에서는 객체의 참조를 통해 매핑하게 때문에 그 차이를 명확히 이해해야 한다. 객체 연관 관계 매핑만 본다면 방향(양방향, 단방향), 다중성(1:n), 연관관계의 주인 (mapped by) 이 세가지를 이해하고 매핑해야 한다. 연관관계가 왜 필요하냐고 궁금증이 생길 수도 있다. 사실 간단한다. JPA 를 쓰는 것부터 테이블에 있는 데이터를 객체지향적으로 이용하기 위해서 쓴다면, 객체지향적으로 쓰려면 당연히 entity 간의 참조가 되어야 객체지향 언어를 쓰는데 한계가 없지 않을까 싶다. 만약 회원/팀 간의 단방향 연관관계를 매핑한다고 생각해보자. 지금은 회원에서의 관점만 생각해..
-
<Spring JPA> 1.12 요구사항 분석과 기본매핑JPA 2020. 4. 21. 09:56
요구사항 분석에서는 그다지 쓸게 없다. 데이터 베이스 형태에 따라 entity 를 구성하였고, 그렇게 entity 를 구성하다보니 JPA 의 장점을 활용할 수 없다는 것을 확인하였다. 예를 들어, 외래키 관계의 값을 가져왔을 때 그 키만이 아닌 연관된 컬럼 전체를 가져오지 못한다. 이건 객체지향적이지 못하다 라고 설명하고 있는데... 이게 왜 객체지향적이 아닌지는 잘 모르겠다. 이게 된다고 객체지향인가..싶기도 하지만 어쨌든! 편리하게 객체를 가져올 수 있다는 점에서 객체지향적이라고 표현한 듯 하다.
-
<Spring JPA> 1.11 기본키 매핑JPA 2020. 4. 21. 09:52
기본키를 매핑하는 방법으로 두가지 어노테이션을 언급할 수 있다. @Id, @GeneratedValue 기본키로 지정하겠다는 표시는 @Id 로 충분하다. 다만 우리가 보통 키를 직접 넣어주기 보다는 자동증가하는 형태로 만들기 때문에 거의 대부분 @GeneratedValue 를 함께 하게 된다. @Id 는 다른 방법이 없다. 그냥 달아주면 된다. 다른 설정도 없다. @GeneratedValue 는 몇가지 설정이 있다. 따로 설정해주지 않는다면 AUTO 로 된다. AUTO 라고 해서 아 자동이구나 하고 넘어가면 안된다. 뭘 기준으로 자동으로 되는 지 알아야 한다. JPA 에서 @GeneratedValue 의 AUTO 는 데이터베이스의 방언에 따라 자동지정된다. AUTO 외에는 IDENTITY, SEQUENCE..
-
<Spring JPA> 1.10 필드와 컬럼매핑JPA 2020. 4. 18. 19:10
컬럼을 매핑하는 어노테이션은 다음과 같은 것들이 있다. @Column 이 필드가 이 컬럼이다 라고 알려준다. name 값을 통해서 이름을 지정해주고, insertable, updatable 을 통해 해당 엔티티값이 변경되거나 등록되는 경우 등록 변경을 할지 지정할 수 있다. nullable 도 설정하고, unuque 값도 지정할 수 있다. 하지만 필드에 @Column 을 통해 설정하면 유니크키값이름 지정이 안되므로 추천하지 않는다. 그리고 length 도 지정이 가능하다. @Enumerated 는 자바의 enum 을 매핑할 때 사용한다. 크게 ORDINAL 와 STRING 설정이 있는데, 무조건 STRING 을 사용한다고 보면 된다. ORDINAL 을 사용하는 경우 enum 의 순서값을 저장하는데, 음...
-
<Spring JPA> 1.9 데이터베이스 스키마 자동 생성JPA 2020. 4. 18. 19:02
JPA 는 데이터베이스는 애플리케이션 실행 시점에 자동생성해준다. 이렇게만 쓰면 무조건 생성해주는 것 같지만 그건 아니다. 설정이 되어 있는 경우에만 가능하다. JPA 는 Entity 에 설정해놓은 그대로, 설정값에 지정해놓은 데이터베이스 방언대로 테이블 생성쿼리를 날려준다. 이 방법은 개발 시에는 굉장히 유용하나, 운영 서버에 적용해놓았다가 데이터가 전부 날라가는 낭패를 볼 수도 있으니 개발 환경에서만 사용하는 것을 권장한다. 설정값에 지정해놓는 값은 hibernate.hbm2ddl.auto 를 사용한다. 여기에 create, create-drop, update, validate, none 을 설정할 수 있다. 이름만 봐도 느낌이 온다. create 는 생성이다. 무조건 생성이라서 원래 있던 것도 다 ..
-
<Spring JPA> 1.8 객체와 테이블 매핑JPA 2020. 4. 14. 09:53
엔티티를 매핑하는 순서에는 몇가지가 있다. 첫번째로 해줘야 하는 것이 @Entity 와 @Table 을 써주는 것이다. 당연하지 이걸 말이라고 하는거야? 라고 할 수 있지만 그렇다. ㅎㅎ @Entity 가 붙은 클래스는 JPA 가 관리한다. 따라서 JPA 와 관련해서 사용할 클래스는 엔티티를 꼭 붙여준다. 조건은 기본 생성자를 꼭 붙여준다. 그 생성자는 public 또는 protected 여야만 한다. 그리고 final, enum, interface, inner 클래스는 안된다. 뭔가 딱 봐도 안될 것 같다. 관리하려면 기본적인 클래스 여야한다 정도로 받아들이자. 그리고 모든 저장 필드에 final 을 사용하지 말자. @Entity 에는 name 을 지정할 수 있다. 가급적 기본값으로 냅두고 클래스 이름..
-
<Spring JPA> 1.6 플러시JPA 2020. 4. 14. 09:46
플러시는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것을 말한다. 쉽게 말하면 쿼리를 날린다. 플러시가 발생하는 경우는 더티체크를 통해 변경이 감지되거나, 다른 변경 요청을 받아서 1차캐시와 쓰기 지연 SQL 저장소에 등록되고 트랜잭션이 종료되는 경우에 쓰기 지연 SQL 저장소에 저장되어 있던 SQL 을 디비로 플러시 한다. 위의 경우가 일반적인 경우지만, 플러시가 일어나는 경우는 크게 세 가지로 나눌 수 있다. 첫번째는 직접 플러시 명령어를 하는 것이다. 아주 좋지 않아 보이지만... 기능이 있는 건 분명 사용처가 있을 터. 두번째는 트랜잭션 커밋이다. 위에서 말한 일반적인 경우를 뜻한다. 세번째는 JPQL 쿼리 실행한 경우이다. JPQL 쿼리가 조금 특이하다. 처음 든 생각은 아... JPA..