본문 바로가기

스프링 부트/JPA8

[스프링] AOP와 JPA 트랜잭션 동작 방식 AOP란? AOP란 관점 지향 프로그래밍의 약자로 흩어진 관심사를 하나로 모듈화 한 것이다. OOP의 개념에서 더 확장된 개념이다. AOP를 구현하는 방법 1. AspectJ 2. Spring AOP AspectJ는 자바에서 제공하는 AOP 기술이다. 3가지 바이트 코드 위빙을 사용한다. 위빙이란? Aspect 를 대상 객체(Target)에 연결시켜 AOP 객체로 만드는 바이트 코드 및 객체 조작과정 1. Compile-time weaving: 소스 코드를 입력하고 클래스 파일을 생성한다. 2. Post-compile weaving: 컴파일 후 위빙, JAR와 클래스 파일을 위빙하는데 사용한다. 3. Load-time weaving: 클래스 로더가 클래스 파일을 JVM에 로드할 때까지 위빙이 연기된다. .. 2022. 11. 1.
[스프링] Hibernate란 Hibernate란? Hibernate는 ORM 프레임워크 중의 하나이다. JPA 인터페이스의 구현체이며, JDBC API를 사용해 DB와 통신한다. JPA란? 자바에서 RDBMS를 사용하는 방식을 정의한 인터페이스이다. 구현체로는 Hibernate가 있다. JDBC란? JPA와 DB를 연결해주는 표준이다. RDBMS는 JDBC 인터페이스를 구현해 제공된다. JDBC 드라이버라고 부른다. 프로그래머는 어떤 종류의 RDBMS를 사용하더라도 똑같은 개발 방법으로 구현하면 된다는 장점이 있다. JPA의 장점 1. SQL 반복 작업을 하지 않아도 되기에 생산성이 올라간다. 2. 인터페이스가 제공되기 때문에 특정 벤더에 종속되지 않는다. 3. 객체와 RDBMS의 패러다임 불일치 문제를 해결해준다. JPA의 단점 .. 2022. 10. 8.
[스프링] DATA JPA In절로 파라미터 넣기 JPA를 통해 in clause를 쉽게 사용할 수 있습니다. 아래처럼 in을 통해 한 개의 쿼리만 수행됩니다. List findByIdIn(List ids); select .... from Worker where id in (? ,? ,?) 여기서 문제는 ids가 고정된 크기의 객체가 아니라는 점입니다. 한번에 16개를 할당해 결과를 얻고 싶을때 너무 많은 데이터를 대비해 5개씩 짤라서 조회했다고 가정했을때, 여러 가지의 SQL이 생성되고 호출이 됩니다. JDBC에는 PreparedStatement 객체가 있는데 이 객체는 이미 생성된 SQL문을 활용해 지속해서 재사용을 통해 좋은 성능을 얻을 수 있도록 하는 객체입니다. in절을 통해 생성하다보면 호출마다 다른 SQL이 호출되고 저장되어 위의 장점을 활.. 2022. 8. 25.
[스프링] @Query에 ENUM 타입 쓰는 법 프로젝트 진행 중 ENUM으로 조건을 걸어야 할 일이 있어 찾아보았습니다. ENUM 타입의 모든 경로를 가져와 비교하면 String으로 변환되어 쿼리가 수행됩니다. @Query("SELECT w FROM Worker w WHERE w.region = com.detailretail.kurlyflow.common.vo.Region.UNASSIGNED) 2022. 8. 25.
@NotNull, @NotEmpty, @NotBlank 차이 엔티티의 필드 값을 정하다 Not Null 설정을 정하려다 @NotNull과 @NotBlank @NotEmpty라는 세 어노테이션이 있는 것을 알게 되었습니다. 세 어노테이션 모두 Bean Validation (Hibernate Validation) 에서 제공하는 표준 Validation 입니다. NotNull은 javax.validation.constraints.NotNull 으로 validation 패키지 안에 있는 어노테이션으로 기본적으로 Null 값을 허용하지 않으나 “”과 “ “으로 빈 칸과 공백을 허용합니다. NotEmpty는 null과 “”는 허용하지 않습니다. 그러나 “ “은 허용하게 됩니다. 공백 값 또한 정상 처리 되도록 하고 싶을때 사용하면 될 거 같습니다. NotBlank는 null.. 2022. 2. 19.
스프링 부분 수정 쿼리 @DynamicUpdate 개요 프로젝트를 진행하던 중에 수정 쿼리를 날려야 할 상황이 거의 모든 엔티티에 있었습니다. JPA의 기본 설정은 모든 컬럼을 업데이트하게 되어 있습니다. 대부분의 경우 엔티티마다 전부 수정하는 쿼리를 날리는 경우는 없습니다. 따라서 부분 수정쿼리를 날리는 어노테이션을 찾던중 @DynamicUpdate 을 발견하였습니다. 사용법 사용법은 간단합니다. 엔티티 클래스에 @DynamicUpdate만 붙여주면 변경된 컬럼만 찾아 업데이트를 해줍니다. 자주 사용되는 상태변경이나 조회 수 같은 경우에 사용하면 좋을거 같습니다. @Entity @DynamicUpdate public class Product { ... } 2022. 2. 18.
스프링 부트 JPA 기본 정리 @Entity = 테이블과 매핑하기 위해 필수 어노테이션 @Table = 엔티티와 매핑할 테이블을 지정 @Table(name=”student”) 기본 값은 엔티티의 이름을 소문자로 바꿔 사용한다. ex) public class Student → student hibernate.hbm2ddl.auto 옵션 설명 create 기존 테이블 삭제 후 다시 생성 create-drop create와 같으나 종료시점에 테이블 DROP update 변경분만 반영(운영DB에는 사용하면 안됨) validate 엔티티와 테이블이 정상 매핑되었는지만 확인 none 사용하지 않음 운영 장비에는 절대 create, create-drop, update 사용하면 안된다. 개발 초기 단계는 create 또는 update • 테스트 서.. 2022. 1. 19.
스프링부트 JPA N+1 문제와 해결 방법 N+1 문제??? 스프링에서 객체 간 연관 관계 설정시에 발생하는 문제로 조회한 데이터만큼의 SQL 쿼리가 추가적으로 발생해 읽어오는 문제를 말합니다. Fetch 전략을 Lazy나 Eager 어떤 전략과 상관없이 N+1 문제는 발생하게 됩니다. 원인 스프링에서 SQL 조회 쿼리를 날려주는 JPQL(Java Persistence Query Language)를 실행하게 되면 JPA가 분석해 쿼리를 작성하게 됩니다. 그러나 JPQL은 Fetch 전략에 대한 정보가 없기 때문에 개발자가 선택한 특성을 무시하고 쿼리를 작성하게 됩니다. 해결 방법 Fetch Join 사용법 @Query("select a from Account a join fetch a.product") List findAllByProducts().. 2022. 1. 18.