
티스토리 블로그
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 10. 객체지향 쿼리 언어1 - 기본 문법 (JPQL)
다양하게 있는데 진짜 왠만하면 JPQL, QueryDSL로 대부분 해결되고 진짜 안되는게 있을 땐 SpringJdbcTemplate로 해결한다. 거의 무조건 QueryDSL 사용을 추천. jpql은 쌩 sql과 매우 유사하며 대상이 테이블 객체가 아니라 jpa 객체라는데에 있다. 위 jpql의 경우 쌩 string을 넣기 때문에 동적 쿼리가 힘듬. 그래서 criteria라고 공식으로 지원하는 스펙이 있고, 자바 코드로 짜기 때문에 문법 오류 잡아주고 동적쿼리 하기 쉽고 하다는 장점이 있지만 진짜 뒤지도록 복잡하다.. 걍 안쓴다. querydsl은 진짜 직관적이고 정말 좋다. 자바코드라 문법도 잡아주고 동적도 정말 쉽고 왠만한건 다 이걸로 해결된다. 그냥 이거 써라. jpal말고 진짜 쌩 sql도 날릴 수..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 9. 값 타입
기본값이랑 임베디드 값 알아볼건데, jpa하며 엔티티가 나오고 엔티티를 엔티티 타입이라고 설정해놓아서 순수 자바 객체 값들을 일반값이라고 정의한거다. 자바에서 순수 int, string같은 타입은 값에 클래스 주소값을 넣는게 아니라 막 0x00001010 이런걸 넣어서 실제 값을 저장한다는걸 알고있을거다. 근데 이제 Integer는 클래스라 주소값 &형식으로 저장할텐데 다른 변수도 이 주소값을 공유하도록 정의하면 이 클래스 안에있는 값이 바뀔경우 의도하지 않았는데 바뀌는 사이드 이펙트가 될거다. 하지만 이런 경우는 자바가 Integer같은 클래스를 만들 때 ㅅset으로 설정 자체가 불가능하게 막아놓았기 때문에 괜찮다. 즉 순수 자바 타입들을 사용하면 사이드 이펙트가 생길 일이 없다. 이걸 알아야 임베디드..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 8. 프록시와 연관관계 관리
즉시 로딩과 지연 로딩 개념을 이해하기 위해 우선 프록시 개념부터 알아보자. 프록시는 지연 로딩을 하기 위해 나왔는데, 사실 EntityManager는 find 말고도 getReference가 있다. 얘는 실제 db를 조회하는건 아니고, 그 실제 db 객체의 target 위치만 저장하고 실제로 불러올 때 가져오는 거. 이걸 가짜 엔티티 객체를 조회하는 방식으로 만들어서 이 가짜 엔티티가 프록시이다. 클래스를 출력하면 진짜 다르고, getId같은 실제로 불러올 때야 select해서 가져오는걸 볼 수 있다. 이 그림이 중요한데, 프록시 클래스가 만들어질 때 영속성 컨텍스트가 이를 관리하기 위해 일반 클래스도 캐시에 저장했던 것 처럼 프록시 클래스도 캐시에 저장한다. 그래서 실제로 요청할 경우 이 프록시 클래..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 7. 고급 매핑
자바 객체에는 상속 개념이 있지만 db에는 없다. 그래서 마치 상속인것 처럼 사용하는 전략 3가지가 있는데, 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 구현 전략이다. 실습을 위해 한번 만들어보자. 일단 이렇게만 하고 돌려보면 jpa의 기본 전략은 한 테이블에 다 때려박는 단일 테이블 전략인걸 알 수 있다. Inheritance로 JOINED를 넣으면 join방식으로 바뀐다. 저장하는걸 보면 부모가 가지고 있는 정보도 다 가지고 있으면서 자기만의 정보고 가지고 있어야 하기 때문에 정보를 불러오면 join을 해준다. 부모에게서 가져온 id를 자신의 id로 하고 join도 이걸로 한다. 사실 DTYPE이 생략되어 있었는데 @DiscriminatorColumn 어노테이션 추가하면 추가된다. 왠만하..
pt 13일차 복기 - 팔(이두근) 운동
준비운동 전신 하라고 해서 했더니 팔만 함... 운동 어디에 무릎으로 비스듬이 누워서 봉을 팔 앞쪽 이두만으로 들어올림. 이두 근육이 작다보니 2세트만 해도 힘이 없어진다. 2세트 중간부터 힘이 없어서 3세트, 4세트는 그냥 올라가는건 보조받고 내려가는거에만 힘줬음. 갈수록 세트 수 줄어서 마지막엔 4세트 8회 한듯. 무게는 봉에 양쪽 합해서 5kg한듯. 어디 누워서 팔은 밑으로 하고 이두로만 올려서 명치까지 들어올리는 운동. 얘도 3세트 15회 한 거 같은데. 그 다음은 파워밴드 가지고 어떻게든 이두 힘들 짜낼려고 노력하신듯.. 마지막으로 누워서 당겼던 거를 서서 위로 올렸음. 이두에만 힘을 주려고 하는게 포인트. 그럴려면 손목을 올린다는 느낌으로 하라는데 잘 모르겠음. 사이클링 15분.
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 6. 다양한 연관관계 매핑
다양한 연관매핑을 알아보자고 했는데 사실 다대일, 일대다 일대일, 다대가가 전부다. 특히 거의 다대일만 쓰고 다대다는 쓰지 말자. 그럼 어떻게 해야하는지는 이따 나온다. 다대일 방 db의 경우, 방향이라는 개념이 없고, 다른 테이블이랑 연관하려면 자바 객체와 달리 한쪽만해도 연결이 된다. join을 그쪽으로 하면 그냥 된다. 그래서 객체 연관관계와 테이블 연관관계의 차이가 생기는 것. 근데 team는 가지면 안되냐? 할 수 있지만 team에 새로운 member를 넣을때마다 안은 리스트로 만들어서 증가해야 하고... 거기다 그걸 위한 새로운 team을 만든다고 해도 그건 중복이다. 그냥 설계가 잘못된거임. 그래서 db 설계상 team쪽에 들어갈 수 없다. 여기까지 다대일은 전에 배운 내용이다. 일대다부터 ..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 5. 연관관계 매핑 기초
전 마지막에 id로 해서 가져와 데이터 지향이 되서 결국엔 객체지향적으로 못하는 문제가 있었는데 이를 해결해본다. 그 전에 사실 객체지향 자체에 대해 이해하는게 더 중요함. 이걸 이해하는데 시간이 더 들거다.. https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=60550259 객체지향의 사실과 오해 위키북스 IT Leaders 시리즈 23권. 객체지향이란 무엇인가? 이 책은 이 질문에 대한 답을 찾기 위해 노력하고 있는 모든 개발자를 위한 책이다. www.aladin.co.kr https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=193681076 오브젝트 역할, 책임, 협력에 기반해 객체지향 프로그램을 설계하고 구현하는 방법..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 4. 엔티티 매핑
JPA에서 중요한게 영속성 개념이랑 엔티티 매핑 개념이다. 여기선 이게 뭔지 좀 소개한다. @Entity는 JPA에서 관리해주는 클래스다. 그래서 JPA를 사용해서 테이블과 매칭할 때는 @Entity를 붙여야 한다. 주의점은 얘가 동적인 작업을 내부에서 수행하기 때문에 기본 생성자는 만들어야 하고, fianl, enum, interface, inner는 안되고 필드 안에서 final 사용은 안된다. 속성은 name이 있는데 jpa 내부에서 구분하기 위한 거다. 그냥 기본값 쓰거나 겹치면 바꾸면 된다. @Table이 붙은건 엔티티와 매핑할 테이블을 지정해주는 것. @Entity만 해도 테이블을 만들지만 테이블 이름을 다르게 해야 하는 등의 문제가 있을 때 속성을 직접 바꿔줄 수 있다. @Entity이 붙은..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 3. 영속성 관리 - 내부 동작 방식
JPA에 대한 개념적인 얘기를 좀 할거다. JPA에서 가장 중요한 2가지가 ORM이랑 영속성 컨텍스트인데, 이 중 영속성 컨텍스트 개념을 배울거임. 전 시간에 실습한 내용을 보면 엔티티메니저 팩토리가 트랜잭션을 실행할 때마다 그 트랜잭션을 실행하는 엔티티 메니저를 만들어야 하고 이 메니저로 트랜잭션을 실행한다. 그래서 저장할 때 persist란 함수를 썼는데 사실 persist 할 때 바로 저장이 되는게 아니다. 실제로는 커밋을 수행해야 저장이 된다. 그럼 왜 persist할 때 저장하는것 처럼 얘기하고 persist를 하면 무슨 일이 일어나는 건가. 여기서 영속 개념이 나온다. 엔티티메니저니 뭐니 아무것도 없이 평소처럼 그냥 쌩 자바로 객체를 만들었을 때. 정말 아무 상태도 아니지만 영속 개념을 설명하..
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 2. JPA 시작하기
옛날 강의라 maven 쓴다. 근데 얘는 설정법이 좀 복잡한듯. java persistence api인 인터페이스를 구체화한 게 hibernate이다. 그럼 각 db에 따라 각 언어마다 다른 방언이 있는데 그걸 hibernate가 구체화 해준다. 나머진 별로 안중요한듯. 폴더 경로가 정해져 있어서 꼭 resources 바로 밑에 META-INF 밑에 persistence.xml로 파일명을 만들어야 한다. maven은 이걸로 db랑 연결한다. 엔티티를 만들긴 하지만 아직까지 실습 단계에선 테이블까진 만들어주진 않는듯. 테이블은 직접 db에 들어가서 create로 만들어준다. 그럼 할 준비가 됐는데, 방식은 엔티티 매니저를 만드는 애로 엔티티 매니저를 만드는데, 각 트랜잭션 마다 엔티티 메니저 하나씩 부여하..