본문 바로가기

백엔드

JPQL 중급문법 경로 표현식 점을 찍어서 객체 그래프를 탐색하는 것을 경로표현식이라고 한다. 상태필드는 단순히 값을 저장하기 위한 필드, 단일값 연관 필드는 엔티티, 컬렉션 값 연관 필드는 컬렉션을 말한다. List resultList = em.createQuery("select m from Member m join m.team", Member.class).getResultList(); System.out.println(resultList.get(0).getUsername()); System.out.println(resultList.get(0).getTeam().getName()); 단일값 연관 경로는 묵시적으로 내부 join이 발생한다는 특징이 있다. 이에 탐색이 가능하다. List resultList = em.cre.. 더보기
JPQL 기초 JPQL 소개 JPA가 지원하는 쿼리 방법에는 여러가지가 있다. JPQL, queryDSL, JPA Criteria, 네이티브 SQL. JPQL은 이 방법들 중 하나이며 엔티티를 대상으로 쿼리를 날린다는 특징을 가지고 있다. (참고로 Criteria는 공부할 일도, 쓸 일도 없을 듯하다) JPQL을 한마디로 정의하면 객체지향 SQL이다. //jpql 예시 List resultList1 = em.createQuery("select t from Team t join t.members", Team.class).getResultList(); 이렇게 엔티티를 대상으로 쿼리를 날리기때문에 디비에 있는 컬럼명으로 쓰지않고 그냥 클래스의 필드 이름으로 쿼리를 날릴 수 있는 매우 편한 도구이다. jpql의 결과를 가져오.. 더보기
JPA 값타입 JPA의 데이터타입 JPA에는 두가지 데이터타입이 있다. 하나는 지금까지 배운 엔티티이고 나머지 하나는 값타입이다. 엔티티 타입 @Entity로 정의하는 객체 데이터가 변하면 식별자를 가지고 변경감지가 가능 값타입 int, String 처럼 단순히 값으로 다루는 타입 데이터가 변하면 감지 불가능 값타입에도 종류가 있다! 기본값 타입 - int, double, Integer, Long, String 등등 임베디드 타입 컬렉션 값 타입 먼저 기본값 타입은 엔티티를 삭제할 경우에 같이 삭제되는 데이터들이다. 생명주기를 엔티티에 의존한다고 표현한다. 값타입은 당연히 공유가 되지 않는다. 이제 임베디드타입과 컬렉션 값 타입이라는 것에 대해서 알아보자 임베디드 타입 임베디드 타입이 무엇이고 왜 쓰이는지 예제를 통해.. 더보기
JPA 프록시와 영속성 전이 프록시에 대해 em.find()와 em.getReference() 의 차이는 프록시를 사용하고 안하고이다. find를 호출하면 select가 데이터베이스에 바로 날아가서 가져오는거고 getReference는 영속성 컨텍스트가 해당 객체에 대한 참조값만 들고있게 된다. 해당 객체에 접근하기 전까지는 select문이 나가지 않는다. getId()를 하면 select문이 나가지 않는데 이유는 처음에 em.getReference()에서 인자로 id를 줬기때문에 영속성 컨텍스트가 알고있는 값이라 select문을 실행하지 않는다. getUsername() 할때에서야 비로소 select문이 나간다. 프록시의 특징을 정리하면 다음과 같다. 프록시 객체는 처음 한번만 초기화 된다. 객체에 접근해서 select문이 나갈때.. 더보기
JPA 엔티티 매핑2 일대다 단방향 매핑 이전 정리글에서는 단방향 매핑은 보통 연관관계의 주인이 n쪽이므로 다대일 단방향 매핑에 대해서만 정리했다. 하지만 일대다 단방향도 가능하다고 한다. 우선 일대다에서는 객체의 데이터가 변경되면 디비에서 해당 엔티티의 테이블이 아닌 상대방 쪽의 테이블에 데이터가 수정된다. 무슨말인지 예시를 통해 보면. 만약 Team의 members에 새로운 멤버를 하나 추가한다고 하면 디비에서는 Team 테이블이 아닌 Member 테이블에 값이 추가되거나 변경된다는 말이다. @Entity @Getter @Setter public class Book { @Id @GeneratedValue private Long id; private String name; } @Entity @Getter @Setter pu.. 더보기
JPA 엔티티 매핑1 엔티티와 PK JPA를 사용해서 테이블과 매핑하고 싶은 클래스는 @Entity 어노테이션을 달아줘야한다. 테이블과 매핑을 할거니 pk가 필요한데 @Id 어노테이션을 필드위에 달아줌으로써 이 필드가 pk이다 라는 것을 jpa에게 알려줘야한다. @GeneratedValue 라고 하면 jpa가 알아서 id를 할당해준다. 여기서 JPA의 영속성을 통해서 id 값을 확인해보면 JPA가 알아서 id 값을 세팅해주었으므로 p.getId() 를 출력해보면 어떤 id 가 할당되었는지 확인이 가능하다. id 값을 생성하는 전략은 총 4가지가 있다. 수업에서는 SEQUENCE 만 알려주셨는데 나머지는 궁금해서 찾아봤다. 1. SEQUENCE 수업에서 알려주셨던 방법 이렇게 auto increment를 해주면서 id값이 정해.. 더보기
스프링부트 테스트 영속성과 JPQL 보호되어 있는 글입니다. 더보기
JPA와 영속성 https://www.inflearn.com/course/ORM-JPA-Basic 을 공부하며 정리한 글입니다. JPA의 등장배경 JPA는 sql을 하나하나 작성하지 않고도 데이터베이스에 CRUD 작업이 가능하도록 하고 무엇보다 객체적인 설계와 데이터베이스 모델링의 차이를 없애주기 위해서 등장했다. 이 JPA를 사용함으로써 객체를 컬렉션에 저장하듯이 저장하는 것이 가능하다. 객체적인 설계와 DB 모델링의 차이라고 하면 객체에서는 다른 객체에 대한 참조값을 지니게 되지만 디비 세상에서는 그런게 없다... 다른 테이블의 외래키를 들고 있을 뿐이다. 데이터 베이스 모델링대로 코딩하면 다음과 같이 된다는 말이다. //객체 모델링 class Student { private School school; private.. 더보기
Ecplise failed while installing Java 1.8 해결 스프링 공부 도중 jsp와 서블릿을 다시 복습해야겠다는 생각이 들어 오랜만에 이클립스에서 Dynamic Web Project 생성해서 공부해보려는데 생성 과정에서 문제가 발생했다. 경로도 잘 설정되어있는데 뭐가 문제지 하면서 삽질하다가 해결,, Default Output Folder 설정해주고 ( build/classes ) Content directory도 마찬가지로 WebContent로 설정했더니 문제없이 돌아간다. 더보기
스프링 mysql 연동 h2에서 mysql로 요즘은 백엔드 개발을 위한 스프링 프레임워크에 빠져서 공부하는 중인데 항상 디비는 H2랑 연동해서 공부하다가 H2가 가볍다는 장점은 있지만 아무래도 실서비스에서는 성능 문제로 안쓰다보니 실제로 많이 쓰이는 MySQL을(내가 가장 많이 썼고 제일 익숙하기도 한..) 연동해서 쓰려면 어떻게 해야하나 구글링을 해봤는데 간단하게 정리된 글이 없는 거 같아서 한번 남겨본다. 해야할 일 이 글에서 소개할 스프링과 MySQL을 연동하기 위한 방법으로 해야할 일은 딱 두가지이다. - build.gradle에 드라이버 추가, 코드작성 1. build.gradle에 드라이버 추가 compile 'mysql:mysql-connector-java' 코드를 추가해준다. 2. 코드 작성 이제 Connecti.. 더보기