일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- stopPropogation
- gradle
- 리액트
- REACT
- SpringRESTDocs
- SpringBoot
- openapi3
- OpenStack
- AuthenticatoinProvide
- tasklet
- vue
- preventdefault
- Spring REST Docs
- Filter
- cloud native
- Spring Security
- SWAGGER
- UsernamePasswordAuthenticationFilter
- MFA
- axios
- Pender
- Flyway
- Crawling
- vuejs
- Reduxpender
- cheerio
- MSA
- T-OTP
- JavaScript
- Spring Batch
- Today
- Total
목록전체 글 (87)
Miracle Morning, LHWN
# Hibernate 와 Spring Data JPA 의 차이 Hibernate : JPA 의 구현체 Spring Data JPA = 사용하기 편한 모듈 JPQL 대소문자 구분 엔티티 이름 (테이블명이 아닌 그 테이블에 엔티티로서 설정한 명칭 review) 별칭 필수 # 기본 문법 String jpql = "select c from review c"; List result = em.createQuery(jpql, Review.class).getResultList(); # TypedQuery : Type 의 validation 이 추가 public static void typedQuery(EntityManager em) { String jpql = "SELECT b FROM review b"; TypedQ..
JPA (Java Persistence API) Java 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로, "프레임워크를 통해 데이터베이스에 쉽게 접근할 수 있는 통로"이다. 인터페이스이기 때문에 구현체로 JPA 를 구현하기 위한 라이브러리가 있다. Hibernate ✅ Eclipse Link ✅ Data Nucleus OpenJPA ✅ TopLink Essentials Hibernate JPA 의 구현체이다. HQL 이라는 강력한 쿼리 언어를 포함한다. 객체 지향적이며, 객체를 통한 데이터 바인딩으로 쉽게 데이터를 다룬다. # 장점 객체 지향적이라 객체에 집중하여 개발이 가능하다. 유지보수 및 생산성이 좋다. 데이터베이스 교체에 용이하다. # 단점 초기에 진입 장벽이 존재한다...
JPA 에서 제공하는 메서드를 통해 페이징 처리를 해본다. 우선 /companyList 페이지로 이동하면 companyList.html 페이지로 이동할 수 있도록 Controller 에 등록해준다. Pageable 를 생성해서 Service 에 만들어놓은 getCompanyPage 메서드에 넘겨준다. 그러면 Service 에서는 이를 받아서 페이징을 하면서데이터를 조회한다. 이때 page 는 0 부터 시작하기 때문에 1, 2, 3.... 을 누르면 -1 처리를 해서 0, 1, 2... 로 page 값을 가공한다. 그리고 page 를 pageRequest 로 만들어준다. 이때, 한 페이지의 데이터 수, 정렬기준 등등을 설정할 수 있다. 이후 JPA 의 findall 메서드를 이용해 자동으로 페이징 처리된 ..
AppInitializer 에서 사용했던 save 대신 saveAll 메서드를 사용해볼 것이다. 그러기 위해서는 Name 과 Nation 만 가지고 있는 Company Constructor 를 만들어줄 것인데, 이러한 생성자를 만들 때에는 "인자가 없는 생성자" 를 먼저 만들어주어야 한다. 이렇게 Name 과 Nation 로 생성자를 만들어놓으면, Name 과 Nation 만 넣어줘도 새로운 객체를 만들어준다. Company.java package com.springPractice.carInfo.domain; import lombok.Data; import javax.persistence.*; import java.util.Date; @Entity @Table(name="company") @Data pu..
DB 에 테이블 생성이 확인되면 Car 에 대한 클래스를 정의해준다. 이때 (1) @Table annotation 을 통해 어느 테이블과 매핑할지 설정한다. (2) 식별자는 DB 에게 위임하기 위해 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정한다. (3) 제조사 하나에 여러 자동차가 있을 수 있기 때문에 Company 요소에 @ManyToOne annotation 을 설정한다. (4) 승객수는 0명 일수도 있으니까 int 가 아닌 Wrapper class 인 Integer 로 설정한다. (5) 모든 getter/setter 를 직접 설정해주기 번거로우니 lombok 을 사용하여 @Data annotation 을 설정한다. Car.java packa..
차이에 앞서 Wrapper 클래스에 대해 알아본다. Wrapper Class Java 는 데이터를 클래스와 객체 외에 기초 타입을 가진다. 따라서 Java 는 (1) 기본형 타입(Primitive 자료형) 과 (2) 객체 참조(클래스) 로 두 가지 타입의 관리 데이터를 가진다. 경우에 따라 기본형 타입을 객↔체로 사용하는 경우가 있으며, 이러한 경우 기본형 타입 값을 객체로 표현해야 한다. 이때 Wrapper 클래스를 사용하는데, 특정 기본형 타입으로 나타낸다. 가령, Integer 클래스는 간단한 정수 값을 나타내며 객체는 하나의 int 값을 저장할 수 있다. Integer a = new Integer(10); Double b = new Double("4.57"); int Primitive 자료형으로 ..
지금까지 공부했던 것들을 직접 코딩하며 살펴본다. 우선 Spring 프로젝트의 생성은 Spring initializer 의 도움을 받았다. (URL : start.spring.io) 프로젝트를 열고 application.properties 의 설정 내용은 아래와 같다. // application.properties #H2 spring.h2.console.enabled=true spring.h2.console.path=/h2 spring.datasource.hikari.jdbc-url=jdbc:h2:~/test spring.datasource.username=sa spring.datasource.password= spring.datasource.initialization-mode=always #JPA sp..
트랜잭션 범위의 영속성 컨텍스트 # 스프링 컨테이너의 기본 전략 동일 트랜잭션엔 동일 영속성 컨텍스트를 사용한다. 트랜잭션이 다르면 영속성 컨텍스트도 다르다. # 트랜잭션 종료 이후 지연로딩 속성에 접근할 경우? (1) 뷰가 필요한 엔티티를 미리 로딩하는 방법 글로벌 페치 전략 수정 사용하지 않는 엔티티를 로딩 N + 1 문제 발생 JPQL 페치 조인 무분별한 사용 시 리포지토리 메서드가 증가한다. →프리젠테이션 계층이 데이터 접근 계층을 침범한다. 강제 초기화 프록시 초기화 역할을 서비스 계층이 담당하면 뷰가 필요한 엔티티에 따라 서비스 계층의 로직을 변경해야 한다. →프리젠테이션 계층이 서비스 계층을 침범한다. FACADE 계층 추가 (2) OSIV 를 사용하여 엔티티를 항상 영속 상태로 유지하는 방..
Spring Data JPA 스프링 프레임워크에서 JPA 를 편리하게 사용할 수 있도록 지원하는 프로젝트이다. 인터페이스만 작성하면 실행 시점에서 구현 객체를 동적으로 생성해서 주입해주기 때문에 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발이 가능하다. # 주요 메서드 save(S) : 새로운 엔티티는 저장, 기존 엔티티는 수정한다. 엔티티에 식별자가 없으면 새로운 엔티티로 판단해서 EntityManager.persist() 를 호출, 엔티티에 식별자가 있으면 EntityManager.merge() 를 호출 delete(T) : 엔티티 하나를 삭제한다. EntityManager.remove() 를 호출한다. findOne(ID) : 엔티티 하나를 조회한다. EntityMana..
# INNER JOIN String query = "SELECT" + "NEW com.jpapeeknapply.service.UserAndGroupDto(user.name, group.name)" + "FROM User user INNER JOIN user.userGroup group"; List userAndGroupDtoList = em.createQuery(query, UserAndGroupDto.class).getResultList(); String query = "SELECT user, group" + "FROM User user INNER JOIN user.userGroup group"; # OUTER JOIN String query = "SELECT" + "NEW com.jpapeeknapp..