페이징 기능 JPA에서 페이징을 할려면, public List findByUsernameAndAgeGraterThen(String username, int age) { return em.createQuery("select m from Member m where m.userName =:username and m.age >:age") .setFirstResult(1) .setMaxResults(10) .getResultList(); } 이런식으로 first와 max를 지정해야 할 수 있다. 코드 상에서는 하드코딩으로 박아두고 있지만, 이것을 밖으로 빼면 될거다. 근데 문제 가 있다. 그건 바로 전체값을 알 수 없다는 점이다. 결국 계산해야 된다는 건데 솔직히 말하면 귀찮다. 이것을 spring data JP..
springData에서는 인테페이스를 통해서 쿼리를 작성한다. public interface MemberRepository extends JpaRepository { } 이상하다. 분명히 아무것도 없는데 이렇게만해도 기본적인 insert라던지 delete update가 전부 된다. (update같은 경우는 jpa의 특별한 방법을 사용하고 있다.) @Override public List findAll() { return getQuery(null, Sort.unsorted()).getResultList(); } 요런식으로 미리 구현되어 있다. 그래서 비슷하게 만들려고 했지만, 잘 만들어지지 않았다. 이걸 만드는게 중요한게 아니기 때문에 넘어가자. @Override public T getById(ID id) ..
이번주에 진행할 주제는 값 타입이다. 이번장에서 가장 중요한 키워드는 '공유'라고 생각한다. 자바에는 수 많은 타입들이 존재한다. 기본형, 객체형 ..까지 다양한 타입들이 존재한다. 이들에 대해 자세하게 설명하고 싶지만 글이 길어질 수 도 있기 때문에 작성하지는 않을 예정이다. 아무튼 기본형 같은 경우는 공유가 되지 않는다. int a = 10이고 int b = 20일때 b =a // a = 30를 했을 경우에는 어떻게 될까? 바로 b = 10이 되버린다. 이는 공유가 된것이 아니라 값 자체가 복사가 되서 발생한 결과다. 그러니까 b의 입장에서는 20이라는 값이 의미가 없어지고 a의 값이 복사가 되서 그 값을 이용한다. 다른 타입들은 어떨까? 이거는 약간의 실습이 필요 하다. Box boxA = new ..
생각보다 시간이 빨리 지나갔다. 내가 스터디를 진행하면 가장 정상적인? 스터디라 생각이 든다. 이번에 공부한 주제는 [프록시와 연관관계 관리] 부분이다. 프록시 프록시는 과연 무엇을 말하는 것일까? 프록시는 대리자라는 뜻을 가지고 있다. 그렇다면 프록시 서버, 프록시 클래스 등등 이런 용어를 해석해보면, 대리 서버, 대리 클래스 뭐 이런식으로 해석이 가능하다. 더 깊게 공부를 하면 이것 보다 더 복잡하겟지만, 알다시피 프록시를 공부하는 시간이 아니라 JPA를 공부하는 시간이기 때문에 언급만 하고 넘어갈 예정이다. 그러면 JPA에서는 프록시라는 걸 어디에서 이용을 하게 될까? 바로 지연로딩 (FetchType.LAZY)이곳에서 사용된다. 근데 이름이 지연 로딩일까? 이건 어쩔 수 없이 프록시라는 것을 다시..
1. 조인 테이블 전략 : 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 장점 : - 테이블이 정규화된다. - 외래 키 참조 무결성 제약조건을 활용할 수 있다. - 저장공간을 효율적으로 사용한다. 단점 : - 조인할 때 조인이 많이 사용되므로 성능이 저하 될 수 있다. - 조회 쿼리가 복잡하다. - 데이터를 등록할 INSERT SQL을 두번 실행한다. 특징: 구분 칼럼 @DiscriminatorColumn(name = "DTYPE") /** * (Optional) The name of column to be used for the discriminator. */ String name() default "DTYPE"; /** * (Optional) The type of object/..
크게 JPA에서 연관관계는 3가지로 구분이 되어진다. 다대일 // 다 : 1 일대다 // 1 : 다 다대다 // 다 : 다 여기서 다대다는 사용을 금지하고 있다. 그러니까 굳이 사용하지 않아도 된다는 뜻이다. 애초에 다대다라는게 다대일과 일대다를 하나로 묶는 방법이라 다대다로 만든다고 한들 결과는 같기 때문이다. 그러면 어째서 다대다를 사용하지 말고 일대다 + 다대일을 합쳐서 사용해야 하는 것일까? 이건 내 생각인데 다대다로 묶게 되면 내가 생성하지 않는 테이블이 만들어진다. 그 테이블은 내가 관리할 수 없다. 그렇기 때문인가 아닐까 라는 조심스런 추측을 해본다. @Entity public class Team { @Id @GeneratedValue private Integer teamIdx; privat..
방향, 다중성, 연관관계 주인 JPA에는 단방향과 양방향이 존재한다. 양방향은 무조건 필요할까? 객체는 참조를 사용해서 연관관계를 탐색할 수 있는데 이것을 객체 그래프 탐색이라고 한다. 팀 -> 맴버 1. 팀에 맴버 한명을 추가한다. 2. 맴버가 어떠한 팀에 들어간다. @JoinColumn 외래키를 매핑할때 사용한다. name : 매핑할 외래 키 이름 referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 foreignKey(DDL) 외래 키 제약 조건을 직접 지정할 수 있다. 연관관계 사용 - 저장 JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다. - 조회 객체 그래프 탐색 : 연관된 엔티티를 조회하는 것 객체지향 쿼리 사용 JPQL - 수정 단순히 불러온..
create : 기존 테이블을 삭제하고 새로 생성한다. DROP + CRERE create-drop : create 속성에 추가로 애플리케이션을 종료할 때 생선한 DDL을 제거한다. - DROP + CRERE + DROP update : 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다. validate : 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정은 DDL을 수정하지 않는다. none : 아무것도 하지 않는다. WARN: Unrecognized hbm2ddl_auto value : cressssssate. Supported values include 'create', 'create-drop', 'update..
이제 마지막이다.! 최근 부터 제목 짓는게 어려워서 그냥 목차를 사용하고 있다. 경로 표현식 이것을 이해 하기 위해 잠시 sql을 작성해보자. select * from A; 대충 이런 sql이 존재한다고 가정하자. 이것을 JPQL로 바꾼다면 select m from A m 이런식으로 수정할 수 있다. 여기서 m이 경로 표현식이다. m은 * 즉 와일드 카드로 대체가 되어진다. 그 말은 이것은 엔티티라는 뜻이 된다. 그럼 결국은 m다음에 나올 수 있는 값들이 어떤것이 있을까? 엔티티는 다음으로 준비하였다. @Id @GeneratedValue private Long id; private String server; private String name; @OneToMany(mappedBy = "school", f..
지금까지 JPA를 학습하면서 어떻게 쿼리를 이용할 수 있는지에 대해 학습했다. 근데 의문이 생겼다. 의문의 정체는 바로 조인이다. 물론 JPA자체에서도 조인을 제공하지 않는것은 아니다. 엔티티로만으로도 조인만을 사용하는 것은 가능하다. 하지만 조건문이 들어간 조인도 가능할까? 가능할 수 도 있겠지만 내가 알기로는 불가능한걸로 알고 있다. 예를들어 다음과 같이 학교와 학생이 존재한다고 가정해보자. @Entity public class School { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "school", fetch = FetchType.LAZY) private List students = new Arr..
자바를 학습을 하게 되면 늘 기본적으로 primitive를 학습하게 된다. 이들의 특징은 공유 대신에 복사를 이용한다는 점인데 이 점때문에 안전한 코딩을 할 수 있다고 한다. 예를들어 int a = 3; int b = a; b = 5; System.out.println(a); System.out.println(b); 이런코드가 존재할때 a와 b가 서로 다르다는 것을 알 수 있다. 이점은 복사가 이뤄졌기 때문이라고 한다. 하지만 이것을 객체로 작성하게 된다면 얘기가 달라진다. 객체를 이용하게 되면 값을 복사하는 것이 아니라 주소값을 복사해온다는 점이 달라진다. 이게 위에서 말한 공유인데 위 코드를 다시 작성하면 Integer a = 3; Integer b = a; b = 5; System.out.print..
프록시 프록시란 과연 무엇일까? JPA에서 프록시를 이용한다고 하는데 도대체 어디에서 이용을 하는 걸까? 들어가기전에 프록시에 대해 간략하게 소개하면 프록시의 역할은 총 2가지로 구분이 되어진다. 1. 대리 기능 2. 추가 기능 대리 기능은 우리가 흔히 아는 캐싱 기능이고 추가 기능은 부가적인 기능을 추가할 수 있는 기능이다. 과연 JPA는 언제 프록시 기능을 사용하는 것일까? 내가 생각할때는 대리 기능을 사용하는 것으로 생각이 들어진다. 그 이유는 추후에 얘기를 해보자. 그전에 GOF의 디자인 패턴을 살펴보는 것이 좋을 것 같다. 왜냐하면 프록시를 설명하고 있는 패턴이 존재하기 때문이다. 디자인 패턴 중 프록시 패턴과 데코레이터 패턴이 프록시 역할을 한다고 한다. 근데 이상하다 프록시 패턴은 그려려니 ..