본문 바로가기

전체 글147

11장 DSL 만들기 1. API에서 DSL로 깔끔한 API란 어떤 의미일까? 코드 읽는 독자가 명확하게 이해할 수 있어야 한다(이름, 개념) 코드가 간결해야 한다. 코틀린의 깔끔한 API를 다시 복습해보자 자바 코틀린 사용한 언어 특성 1-1. DSL : 영역 특화(declarative) 언어 영역 특화 언어 : 범용 프로그래밍 언어를 기반으로 하여, 필요하지 않은 기능을 없앰 → 범용(imperative) 프로그래밍 언어와 달리 declarative 이다. 하지만, 범용 언어와 조합하기 어렵다. 이를 극복하기 위해 internal DSL 개념이 유명해졌다! 예) SQL, 정규식 1-2. 내부 DSL (internal DSL) external DSL : 독립적인 문법구조 internal DSL : 범용 언어로 작성된 프로그.. 2022. 7. 18.
10장 애노테이션과 리플렉션 1. 애노테이션 1.1 애노테이션 적용 애노테이션의 인자 원시 타입의 값 문자열 enum 클래스 참조 @MyAnnotation(MyClass::class)처럼 ::class를 클래스 이름 뒤에 뒤에 넣어야 함 다른 애노테이션 클래스 : @를 넣지 않음 지금까지의 요소들로 이뤄진 배열 @RequestMapping(path = arrayOf("/foo", "/bar"))처럼 arrayOf 함수를 사용 1.2 애노테이션 대상 프로퍼티의 getter에 해당 애노테이션을 붙이고 싶은 경우 사용 시점 대상을 지정할 때 지원하는 목록 property : 프로퍼티 전체 field : 프로퍼티에 필드 get : 프로퍼티 게터 set : 프로퍼티 세터 receiver : 확장 함수나 프로퍼티의 수신 객체 파라미터 para.. 2022. 7. 18.
[JPA] 페치 조인 🐱‍🏍페치 조인🐱‍🏍 JOIN FETCH (즉시로딩) SQL 조인 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능 N+1 문제를 해결한다. 회원 리스트를 가져온 후, 각 회원이 속한 팀을 출력한다. 각 회원이 속한 팀을 호출할때마다 추가로 쿼리가 발생한다. 1. 엔티티 페치 조인 회원을 조회하면서 연관된 팀도 함께 조회 [SQL] SELECT M.*, T.* FROM MEMBER M // select M.*, T.* INNER JOIN TEAM T ON M.TEAM_ID=T.ID 코드로 적용 String jpql = "select m from Member m join fetch m.team"; List members = em.cre.. 2022. 7. 18.
[JPA] 쿼리 문법 JPQL JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리언어 지원 테이블이 아닌 객체를 대상으로 검색 객체 지향 SQL Creteria 유지보수 어려움 대신, QueryDSL 사용 JPQL 문법 1. TypeQuery, Query TypeQuery: 반환 타입이 명확할 때 사용 Query: 반환 타입이 명확하지 않을 때 사용 TypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class); Query query = em.createQuery("SELECT m.username, m.age from Member m"); 1-1. query.getResultList() 결과가 하나 이상일 때, 리스트 반환 1-2. query.getS.. 2022. 7. 18.
[JPA] 값 타입 @Embeddable public class Period { private LocalDateTime startDate; private LocalDateTime endDate; } JPA의 타입 분류 엔티티 타입 : @Entity 값 타입 : int, Integer, String 처럼 자바 타입 객체 값타입 기본 값타입 기본타입 : int, double 래퍼 클래스 : Integer, Long String 기본 생성자 필수임베디드 타입 : JPA는 임베디드 타입 컬렉션 값 타입 : 컬렉션을 새로운 테이블로 만듦 기본키를 사용할 수 없어서, 이 대신 1:N 엔티티를 생성하자 @ElementCollection // 기본값으로 LAZY이다. @CollectionTable(name = "FAVORTIE_FOOD".. 2022. 7. 2.
[JPA] 프록시와 연관관계 관리(지연로딩) 프록시 em.find() : DB를 통한 실제 엔티티 객체 조회 em.getReference() : DB조회를 미룬 가짜(프록시) 엔티티 객체 조회 사용되는 시점에 조회함 프록시 특징 실제 클래스를 상속받아 만들어진다. 프록시 객체를 통해 실제 객체에 접근하는 것이다. 처음 사용시 한번만 초기화한다. 즉시로딩과 지연로딩 지연로딩 : 프록시로 조회 LAZY 즉시로딩 EAGER Member와 Team을 보통 동시에 사용한다면 사용한다. 프록시를 사용하지 않는다. 즉시로딩 주의 가급적 지연로딩만 사용한다(특히 실무에서) 즉시로딩은 N+1 문제를 일으킨다. OneToMany, ManyToMany은 default가 LAZY이다. ManyToOne, OneToOne은 default가 즉시로딩이다. → LAZY로 설.. 2022. 7. 2.