개발바닥곰발바닥
반응형
article thumbnail
JPA 및 Hibernate의 1차 캐시
JAVA/Spring 2023. 1. 10. 00:25

JPA 및 Hibernate의 1차 캐시 JPA(Hibernate)에서 엔티티 매니저를 사용해서 persist, merge, remove를 했을 때 엔티티의 상태는 변경(New, Managed, Removed,..)되지만, flush나 트랜잭션이 커밋될 때까지 데이터베이스에 동기화되지는 않는다. 트랜잭션이 커밋되었을 때 변경을 한 번에 데이터베이스에 반영하기 위해 JPA(Hibernate)의 영속성 컨텍스트 내부에는 엔티티를 저장하는 1차 캐시가 존재한다. 1차 캐시는 트랜잭션이 시작되고 종료될 때까지만 유효한 트랜잭션 단위의 캐시다. 애플리케이션 단위의 캐시를 사용하고 싶다면 2차 캐시를 활성화해야 한다. Hibernate의 1차 캐시 구현 내부적으로 Hibernate는 엔티티를 다음과 같은 Map에 ..

article thumbnail
JPA 영속성 컨텍스트와 엔티티 생명주기
JAVA/Spring 2023. 1. 8. 22:05

김영한님의 자바 ORM 표준 프로그래밍을 읽고 정리한 내용입니다. 지금껏 JPA를 사용해보며 영속성 컨텍스트에 대한 개념적인 이해는 하고 있었지만 엔티티의 생명주기까지 글로 정리해보면 더 기억에 남을 것 같아 작성하게 되었다. 영속성 컨텍스트란? JPA를 이해하는 데 가장 중요한 용어는 영속성 컨텍스트로 해석하자면 엔티티를 영구 저장하는 환경이라는 뜻이다. em.persist(member); 엔티티 매니저를 사용해서 위와 같은 코드를 실행했을 때, 단순히 회원 엔티티를 저장한다고 생각하지만 정확히는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장하는 것이다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나가 만들어지고 엔티티 매니저를 통해 영속성 컨텍스트에 접근하고 관리할 수 있다. 엔티..

Querydsl @DataJpaTest 테스트 오류
JAVA/Spring 2022. 12. 11. 01:41

Querydsl을 사용하면서 CustomRepository를 만들고 테스트할 때, @DataJpaTest 에서 테스트 코드 실행 시 아래와 같은 오류가 발생할 수 있다. java.lang.IllegalStateException: Failed to load ApplicationContext ... Error creating bean with name 'projectRepositoryImpl' defined in file 이는 SpringBootTest에서는 모든 빈이 주입이 되기 때문에 문제가 없지만 DataJpaTest의 경우는 QueryFactory Bean이 주입되지 않아서 발생한다. 이를 해결하기 위해서는 TestConfiguration에서 테스트 환경을 위한 Bean을 생성해주면 된다. TestC..

article thumbnail
Servlet과 ServletContainer
JAVA/Spring 2022. 11. 3. 02:01

Servlet 서블릿이란 클라이언트 요청을 처리하고, 그 결과를 반환하는 웹 프로그래밍 기술로 자바로 구현된 CGI (Common Gateway Interface)이다. 이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 이미 만들어진 정적인 페이지를 넘겨주었지만 웹 프로그래밍이 발전하면서 동적인 페이지를 제공할 수 있게 되었다. 동적인 페이지를 제공하기 위해서는 웹 서버가 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 한다. 여기서 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이며, 동적인 페이지를 생성하는 애플리케이션이 CGI이다. Servlet의 특징 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트 html을 사용하여 요청에 응답한다. Ja..

Spring Data JPA 원하는 필드만 Select하기(Projection)
JAVA/Spring 2022. 10. 29. 19:31

Spring Data JPA 원하는 필드만 Select 하기(Projection) JPA를 사용해서 Repository에서 Select 할 때, 보통 Entity를 통째로 조회하게 되는데, 일부 값만 필요한 경우 불필요한 데이터까지 모두 조회하게 된다. 오늘 진행하고 있는 프로젝트 기능 중에서 회원의 점수별로 정렬하여 조회하는 쿼리가 필요했는데, Member의 모든 필드를 가져올 필요가 없다고 생각하여 Projection을 사용해 보았다. Projection을 사용해서 원하는 필드만 가져올 수 있는데 기본적인 방법은 인터페이스를 이용하여 Projection 하는 방법이지만, DTO Class를 많이 사용하기 때문에 Class Projection도 사용이 가능하다. 오늘은 두 방법에 대해 알아보도록 하자...

[Spring] GlobalExceptionHandler와 Custom Exception으로 전역 예외처리하기
JAVA/Spring 2022. 10. 26. 23:39

GlobalExceptionHandler와 CustomException으로 전역 예외 처리하기 Spring을 사용해서 웹 애플리케이션 개발을 하다 보면, 예외가 발생했을 때 예외 종류에 따라 클라이언트 측에 다른 응답을 보내줘야 한다. 이때, 일일히 Controller마다 예외 처리해서 Response를 던져주는 작업을 하게 되면 서비스가 커질수록 중복 코드가 늘어나고 유지보수가 힘들어진다. 이를 해결하기 위해 Exception Handling을 전역적으로 관리할 수 있는 방법을 알아보자 ErrorCode Enum 에러에 대해서 Response를 전달할 때, 에러 메시지를 같이 전달하게 되는데 이 때 메시지를 String 값으로 하드 코딩하게 되면 관리가 힘들어진다. 그러므로 Http 상태 코드와 메시지..

[Spring Security] BCryptPasswordEncoder란?
JAVA/Spring 2022. 10. 15. 03:50

👀BCryptPasswordEncoder란? BCryptPasswordEncoder는 Spring Security 프레임워크에서 제공하는 클래스로 비밀번호를 암호화(해시)하는 데에 사용한다. 해시 함수에는 MD5나 SHA 등의 종류가 있지만 BCrypt는 단순히 입력을 1회 해시시키는 것이 아니라 솔트(salt)를 부여하여 여러번 해싱하므로 더 안전하게 암호를 관리할 수 있다. BCrypt는 같은 비밀번호를 암호화하더라도 해시 값은 매번 다른 값이 도출된다. 따라서 BCryptPasswordEncoder에서는 사용자가 제출된 비밀번호와 암호화되어 저장된 비밀번호의 일치 여부를 확인하는 메소드가 제공된다. BCryptPasswordEncoder는 BCrypt의 로그 라운드라고도 하는 강도(strength)..

Spring No property 'desc' found for type 'LocalDateTime’ 오류
JAVA/Spring 2022. 10. 8. 14:05

Spring Data JPA를 사용하는중, 생성 일자로 정렬을 하기 위해 아래와 같이 Repository에 선언을 했는데, No property 'desc' found for type 'LocalDateTime’라는 에러가 발생했다. Page findAllOrderByCreateDateDesc(Pageable pageable); LocalDateTime 타입에 desc 속성을 찾을 수 없다고 오류가 발생하는데, 해결 방법은 매우 간단하게 findAll 뒤에 'By'를 붙여주면 깔끔하게 동작한다. Page findAllByOrderByCreateDateDesc(Pageable pageable);

반응형