일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- jscalendar
- springflow
- 자바서블릿
- values()
- javaservlet
- 페치조인
- JQuery
- fetchjoin
- Generic
- 페이징
- namedQuery
- jQuery값전송
- calendar
- jQueryUI
- joinfetch
- Hibernate
- 제너릭
- jQuery값전달
- 벌크연산
- paging
- javascriptcalendar
- JPA
- 프로젝트생성
- 대량쿼리
- fullcalendar
- 엔티티직접사용
- 스프링데이터흐름
- 제네릭
- JPQL
- LIST
- Today
- Total
목록공부/Java (57)
가자공부하러!
1. 조건 > 하나의 Market 엔티티는여러 개의 MarketEmployee 엔티티와 MarketItem 엔티티를 갖는다. 2. 목표 > Market, MarketEmployee, MarketItem CRUD 프로그램 작성을 통해 Hibernate 연관관계 매핑 연습 3. 코드 > Entity @Entity @Table(name = "market") @Getter @Setter @ToString public class Market { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "market_id") private Long id; private String name; @OneToMany(mappedBy = "market..
개발환경 Spring Boot 2.2.2 JDK 1.8 1. 디펜던시 org.springframework.boot spring-boot-starter-test test 2. 컨트롤러 @RestController @RequestMapping(value = "/member") public class MemberRESTController { @RequestMapping(value = "/chkConnection", method = RequestMethod.POST) public String chkConnection() { log.info("connection check"); return "ok"; } } 3. 테스트 import org.junit.Test; import org.junit.runner.RunWi..
@FixMethodOrder(MethodSorters.NAME_ASCENDING) @Slf4j @RunWith(SpringRunner.class) public class MemberTest { @Test public void a_createMember() throws Exception { create() ... } @Test public void b_updateMember() throws Exception { update() ... } @Test public void c_deleteMember() throws Exception { delete() ... } } a_createMember() -> b_updateMember() -> c_deleteMember 순서로 실행됨
1. select /** 이름으로 하나의 멤버를 찾아오는 메소드 */ public Member getOneMemberByName(String name) { JPAQuery query = new JPAQuery(entityManager); QMember member = QMember.member; query.from(member).where(member.name.eq(name)); query.orderBy(member.id.desc()); query.limit(1); return query.singleResult(member); } 2. update public void updateMemberName(Member mem) { QMember qMem = QMember.member; JPAUpdateClaus..
참고 : https://refactoring.guru/design-patterns/proxy 1. Proxy? 1.1. 프록시란? - 다른 객체를 대신할 수 있게 해주는 구조적 디자인 패턴 - 원본객체로의 접근을 제어 : 원본객체로의 요청전 또는 요청 후에 어떤 작업을 할 수 있게 해준다. - 프록시는 서비스 객체인 것 처럼 위장해서 지연로딩과 결과캐싱 등을 다룰 수 있다. 1.2. 프록시의 구조 - ServiceInterface : 프록시는 이 인터페이스를 따라서 자신을 서비스 객체로 위장 - Service : 유용한 비즈니스 로직을 제공하는 클래스 - Proxy > Proxy 클래스에는 서비스 객체(Service)를 가리키는 참조 필드가 존재 > 프록시가 처리를 마치면(지연 초기화, 로깅, 액세스 제..
1. 엔티티 직접 사용 1.1. 기본 키 값 - JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다. > 예) JPQL : select count(m) from Member m - 수행되는 쿼리 : select count(m.id) as cnt from Member m - 다음 JPQL도 수행되는 쿼리는 위와 같음 : select count(m.id) from Member m 1.2. 외래키 값 - 연관관계 매핑된 다른 엔티티를 쿼리의 파라미터로 사용할 수 있다. //@ManyToOne @JoinColumn(name = "TEAM_ID) private Team team; em.createQuery("select m from Member m where m.team = :te..
예제 : https://github.com/HyeongJunMin/SpringBootOnmacOS/tree/master/ex2-jpql-jpa 1. 경로표현식 1.1. .(점)을 찍어 객체 그래프를 탐색하는 것 - 상태 필드 : 단순히 값을 저장하기 위한 필드 > 경로 탐색의 끝, 더 이상 탐색이 불가능 - 단일 값 연관 필드 : 엔티티와의 연관관계를 위한 필드 > 묵시적 내부 조인이 발생하고 추가적인 탐색 가능 > 묵시적 내부 조인은 성능튜닝에 많은 영향을 주기 때문에 사용하지 않는것이 좋다 > 예) select m.team.name From Member m - 이 때 m.team까지 단일 값 연관필드이고 m.team.name은 상태필드이다. - 실제 쿼리 : select t.id, t.name fro..
1. JPQL(Java Persistence Query Language) 1.1. 등장배경 - JPA를 사용하면 엔티티 객체를 중심으로 개발을 하게됨 - 검색할 때 마다 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 - 필요한 데이터만 불러오려면 검색 조건이 포함된 SQL이 필요 1.2. 특징 - SQL을 추상화한 쿼리 언어이며, SQL이 지원하는 키워드는 모두 지원 - JPQL은 엔티티 객체를 대상으로 쿼리 수행(SQL은 DB 테이블 대상) - JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. - JPQL은 결국 SQL로 변환된다. 1.3. 사용방법과 예제 - 기초 사용법 > 엔티티와 속성은 대소문자 구분, JPQL 키워드(select, FROM, ...)는 대소문자..
1. JPA의 데이터 타입 분류 1.1. 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 나이를 변경해도 식별자로 추적 가능 1.2. 값 타입 - int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 자료형이나 객체 - 식별자가 없고 값만 있으므로 변경 시 추적 불가 ex) 회원 나이를 20에서 21로 변경하면 완전히 다른 값으로 대체 - 분류 > 기본값 타입 : primprimative type, Wrapper Class, String > 임베디드 타입 : embedded type, 복합 값 타입 > 컬렉션 값 타입 2. 타입 별 특징 2.1. 기본 값 타입 - 생명주기를 엔티티에 의존 - 값타입이 공유되어서는 안된다. ..
1. 프록시 > em.getReference() : DB조회를 미루는 가짜(프록시) 엔티티 객체 조회 - DB에 쿼리가 안나가는데 객체가 조회됨 -> 객체값이 실제 사용되는 시점에 DB에 쿼리를 날림 - class domain.Member$HibernateProxy$ojP0rbKz > 사용 목적 - 엔티티와 연결된 모든 정보를 가져올 필요 없이 일부만 활용하고 싶을 때 - ex) Member를 조회할 때 Team은 조회하고 싶지 않다. - 지연로딩 > 특징 - 프록시는 실제 클래스를 상속 받아서 만들어지므로 실제 클래스와 겉 모양이 같다. - 이론상 사용하는 입장에서 진짜 객체인지 프록시 객체인지 구분할 필요가 없다. - 프록시 객체는 최초 1회만 초기화되며, 실제 객체의 참조를(target) 보관 - ..
1. 문제점 > 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. - 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. - 객체는 참조를 사용해서 연관된 객체를 찾는다. 2. 단방향 연관관계 > 단방향 매핑으로 끝내는게 베스트 - 단방향 매핑만으로도 이미 연관관계 매핑은 완료된 것이기 때문 > 객체 지향 모델링 - Member가 필드로 Team타입의 변수를 가짐 - @ManyToOne, @JoinColumn(name = "TEAM_ID") 3. 양방향 연관관계 > FK로 엮인 DB 테이블 끼리는 JOIN을 통해 서로의 데이터를 쉽게 조회할 수 있다. > Entity가 테이블처럼 동작하기 위해서는 별도의 작업이 필요하다. > 객체는 가급적 단반향 연관관계를 갖게끔 ..
1. 엔티티 매핑 종류 > 객체와 테이블 매핑 : @Entity, @Table > 필드와 컬럼 매핑 : @Column > 기본 키 매핑 : @Id > 연관관계 매핑 : @ManyToOne, @JoinColumn 2. 객체와 테이블 매핑 > @Entity - NoArgs 생성자 필수 - final 클래스, enum, interface, inner 클래스 불가 - 필드에 final 불가 > @Table(name = "DB테이블이름", catalog = "", schema = "", uniqueConstraints = "") 3. DB스키마 자동 생성 > 애플리케이션 실행 시점에 테이블을 만들 수 있음 > 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 > 방법 : persistence.x..