JPA: 42개의 글
개요 JPA를 사용하면서 개발하다보면 간혹 LazyInitializationException 이라는 예외를 접하게 될 것이다. 이번에 포스팅할 OSIV는 해당 예외와 밀접한 관련이 있다. 또한 OSIV의 활성화 여부에 따라 JPA를 사용해서 개발하는 애플리케이션 성능에 큰 영향을 미치게 된다. 이번 기회에 OSIV에 대한 개념을 이해해보자. 1. 영속성 컨텍스트 먼저 선행되어야 할 지식은 JPA의 영속성 컨텍스트이다. 영속성 컨텍스트는 JPA에서 가장 중요한 개념중 하나로, 쉽게 말해 눈에 보이지 않으며 Entity를 영구히 저장하는 환경이라는 뜻이다. 하나의 트랜잭션 안에서 이루어지는 데이터들은 영속화되어 데이터를 조회할때 1차캐시라는 공간에서 가져오게 된다. 아래 예제들을 보면서 이해해보자. 📝예제 ..
Lazy Loading JPA의 유일한 단점은 사용하기 쉬운만큼 성능적인 측면에서 발생할 수 있는 이슈를 간과하기 쉽다는 것인데, 성능이 안나올때 가장 먼저 고려해봐야할 부분이 즉시로딩(EAGER LOADING)으로 설정된 Fetch 전략이 있는지 확인하는 것이다. 하지만 @OneToOne 매핑시 Fetch 전략을 Lazy로 설정해도 EAGER로 동작하는 경우가 있다. 어떤 경우에 이러한 문제점이 발생하는지, 해결책은 무엇인지 예시를 통해 알아보도록 하자 예시 1. @OneToOne 단방향 매핑 @Entity public class User { @Id @GeneratedValue @Column(name = "USER_ID") private Long id; @OneToOne(fetch = FetchType..
컨트롤러 클래스 없이 특정 view에대한 컨트롤러를 추가할 수 있다. 아래와 같이 WebMvConfigurer를 구현하는 클래스를 만들고 addViewControllers(ViewControllerRegistry registry) 메소드를 오버라이딩 하면 된다. @Configuration @EnableWebMvc public class SpringMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { //시작페이지 url을 '/'가 아닌 home으로 registry.addRedirectViewController("/", "home"); } } 위 코드는 ..
1. build.gradle 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-validation' 스프링부트 버전 2.3 이전에는 web 의존성에 validation이 포함되어있었지만 2.3 버전 이후 분리되었습니다. 따라서 스프링부트 2.3 이후의 버전을 사용하시는 분들은 반드시 해당 의존성을 추가해야합니다. 2. 회원가입 DTO 사용자가 회원가입 폼에 입력한 정보들을 담을 DTO를 생성해야 합니다. 여기서는 간단하게 이메일,비밀번호,닉네임,휴대폰번호 정도만 받아보겠습니다. @Getter public class UserDto { @NotBlank(message = "닉네임을 입력해주세요.") @Size(min = 2, max = ..
Mybatis 1. 익숙한 SQL 쿼리문 사용 가능. 2. 쿼리문을 xml로 분리 가능 3. 복잡한 쿼리문 작성 가능 4 . 비슷한 쿼리 남발 JPA 1. SQL 쿼리문 구현 필요X 2. 구현할 소스코드의 양이 Mybatis보다 상대적으로 적다. 3. CRUD 메소드를 기본적으로 제공. 4. Mybatis는 쿼리가 수정되어 데이터 정보가 변경되면 그에 맞게 DTO또한 수정해야 하는데, JPA는 객체만 변경해주면 된다. 5. 복잡한 쿼리는 사용 불가능(JPQL 또는 Query dsl 사용) 출처 : https://1-7171771.tistory.com/66
쿼리 메소드는 스프링 데이터 JPA의 핵심적인 기능중 하나로 메소드 이름으로 쿼리를 생성할 수 있다는 장점이 있다. 메소드 이름으로 쿼리를 생성을 위해 인터페이스에서 사용할 사용자 쿼리 메소드를 정의해 준다. EmailAddress와 LastName의 칼럼을 where 절의 조건으로 질의하는 사용자 쿼리 메소드는 인터페이스에 다음과 같이 선언해 줄 수 있다. public interface UserRepository extends Repository { List findByEmailAddressAndLastname(String emailAddress, String lastname); } 위와 같이 인터페이스에서 먼저 사용자 쿼리 메서드를 정의해준 다음 인터페이스를 구현하는 서비스에서 구체적인 비즈니스 ..
스프링 데이터 JPA는 스프링프레임워크에서 JPA의 사용을 보다 쉽게 할 수 있도록 도와주는 프로젝트입니다. 스프링 데이터 JPA는 리포지토리 개발시 인터페이스를 상속 하는 것 만으로도 구현 클래스 없이도 데이터 접근을 가능하게 합니다. 보통 CRUD 메소드는 JpaRepository 인터페이스가 공통적으로 제공하는데 findByUserid()와 같은 메소드와 같이 인터페이스에 정의되어 있지 않은 메소드가 있다고 해 보겠습니다. UserRepository.findByUserid() 놀랍게도, 스프링 데이터 JPA는 위 메소드 이름을 분석해 적절한 JPQL 쿼리 문장으로 만들어 줍니다. select m from User u where userid =: userid 이어서 스프링 데이터 설정을 진행하겠습니다..
Pom.xml을 통해 관련 의존성을 추가하고 root-context.xml, servlet-context.xml 파일 설정을 통해 JPA와 스프링프레임워크를 연동합니다. 이어서 컨트롤러, 서비스, 도메인, 레파지토리 단위로 나눠 스프링프레임워크 애플리케이션을 개발합니다. pom.xml 의존성을 추가해 줍니다. 4.0.0 jpabook ch11-jpa-shop 1.0-SNAPSHOT jpa-shop war 1.6 UTF-8 UTF-8 4.1.6.RELEASE 4.3.10.Final 7.0.57 1.4.187 2.2 1.2 3.0.1 1.1.1 1.7.6 4.12 org.springframework spring-webmvc ${spring-framework.version} o..
JPQL JPQL(Java Persistence Query Language)은 JPA를 구현한 프레임워크에서 사용하는 언어입니다. JPA 구현 프레임워크에서는 JPQL을 SQL로 변환해 데이터베이스에 질의하게 됩니다. JPQL은 테이블을 대상으로 쿼리하지 않고 객체를 고려해 쿼리합니다. 이 때문에 JPQL은 데이터베이스 테이블에 직접적인 의존 관계를 맺고 있지 않습니다. JPQL은 SQL과 비슷한 구조로 구성 됐습니다. SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...] 이때 JQPL DELTE나 UPDATE는 다음과 같은 두개의 쿼리로 나타낼 수 있습니다. DELETE FROM ... [WHERE ...] UPDATE ...
엔티티 매핑 엔티티 맵핑은 JPA에서 제공하는 다양한 맵핑 애노테이션을 이용합니다. 대표적인 애노테이션을 살펴보면 다음과 같습니다. 테이블 맵핑 애플리케이션이 시작 되면 테이블 매핑 애노테이션이 있는 모든 클래스를 대상으로 적합성을 검사합니다. @Entity @Table(name="MEMBER") public class Product{ ... } 테이블 맵핑은 누락 되지 않도록 합니다. 누락 되면 엔티티를 식별할 수 없어 세션 팩토리를 생성할 수 없다는 에러가 발생합니다. Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: jpabook] Unable to build Hibernate SessionFact..