spring 24

년/월 필터 Validation, 회원가입시 자동 이름과 랜덤 ID 생성

년/월 필터 Validation https://eggmomo.tistory.com/76 프로젝트 날짜 필터 구현 Reminder 클래스의 LocalDate 멤버 reminderDate를 년/월 별로 모아 List를 반환하는 API 구현 public interface ReminderRepository extends JpaRepository { List findAllByReminderDateBetween(LocalDate start, LocalDate end); } JPA를 활용해 s eggmomo.tistory.com 저번 구현한 필터의 년/월 유효값 체크를 위한 부분을 다음과 같이 추가했다. 회원가입시 자동 이름과 랜덤 ID 생성 회원가입 단계를 이메일(중복체크)과 비밀번호 등록 (SignUp) 아이디(..

프로젝트 날짜 필터 구현

Reminder 클래스의 LocalDate 멤버 reminderDate를 년/월 별로 모아 List를 반환하는 API 구현 public interface ReminderRepository extends JpaRepository { List findAllByReminderDateBetween(LocalDate start, LocalDate end); } JPA를 활용해 start 날짜와 end 날짜 범위에 해당하는 reminderDate 값을 갖는 Reminder 리스트를 반환하도록 Repository 내에 정의해놓았다. 서비스단의 findReminderByListByMonthAndYear 메서드 유저의 식별자와 찾고자 하는 리마인더의 년도와 월을 파라미터로 받는다. public List readRemin..

@Builder.Default

warning: @Builder will ignore the initializing expression entirely.프로젝트를 진행하던 도중 위와같은 경고를 마주치게 되었다 (에러는 아니다). 그리고 이어서 다음 조언들이 적혀 있었다.If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.@Builder 어노테이션의 Default 옵션을 사용하라는 말인데, 이를 이해하기 위해서 @Builder 어노테이션의 성질을 이해할 필요가 있었다. 생성자를 사용할 때에는 객체를 생성할 때 ..

기본 키 매핑

기본 키 매핑 어노테이션 @Id 기본키를 직접 할당하는 방법 ⇒ @Id만 사용하면 된다. @GeneratedValue 기본키 자동생성 기능을 위해서 사용한다. IDENTITY 전략 기본 키 생성을 DB에 위임한다. MySQL(AUTO_ INCREMENT), PostgreSQL, SQL Server, DB2에서 사용한다. 보통 JPA는 커밋 직전에 INSERT 쿼리를 실행하지만, IDENTITY 전략은 entityManager.persist() 시점에 즉시 INSERT쿼리를 실행하고 DB에서 식별자를 조회한다. 그 이유는 아래와 같다. PK값을 DB에 들어간 뒤에 알 수 있다. JPA 입장에서는 @Id(DB PK)를 알 수가 없으니 원래라면 1차캐시 안에 값을 넣을 수가 없다. 그래서 commit하는 시점..

필드와 컬럼 매핑

매핑 어노테이션 정리 @Column : 컬럼 매핑 @Temporal : 날짜 타입 매핑 @Enumerated : enum 타입 매핑 @Lob : BLOB, CLOB 매핑 @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시), DB랑 관계 없이 메모리에서만 사용한다. @Enumerated 자바 enum 타입을 매핑할 때 사용한다. 기본값은 EnumType.ORDINAL 인데, 이 떄 주의사항이 있다. ORDINAL은 0부터 시작하는 enum 순서를 DB에 저장하므로(Integer) 자바 enum타입을 매핑하기 위해 사용하려면 ORDINAL을 사용하면 안된다. enum 타입인 ROLETYPE에 순서 변화가 발생했을 때, 이전의 데이터들에게 영향을 미쳐 큰 문제가 발생하는 등 여러 곤란한 상황..

객체와 테이블 매핑

엔티티 매핑 소개 객체와 테이블 매핑 ⇒ @Entity, @Table 필드와 컬럼 매핑 ⇒ @Column 기본 키 매핑 ⇒ @Id 연관관계 매핑 ⇒ @ManyToOne, (…) , @JoinColumn 객체와 테이블 매핑 @Entity @Entity 어노테이션이 붙은 클래스는 JPA에 의해 관리되고, 엔티티라고 한다. 기본 생성자가 필수이다. (파라미터 없는 public 혹은 protected) final 클래스 ,enum, interface, inner 클래스 사용할 수 없다. 저장할 필드에 final을 사용할 수 없다. name 속성 기본값은 클래스 이름과 같다. 다른 패키지의 같은 이름의 클래스가 있는 경우, 다른 이름을 쓰기 위해 사용 가능하다. @Table @Table은 엔티티와 매핑할 테이블을..

준영속 상태

영속 상태 → 준영속 상태 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태이다. (detached) 준영속 상태에서는 영속성컨텍스트가 제공하는 기능을 사용할 수 없다. 준영속 상태로 만드는 법 entityManager.detach(entity) 특정 엔티티만 준영속 상태로 만든다. entityManager.clear() 엔티티 매니저 안의 영속성 컨텍스트를 초기화한다. entityManager.close() 영속성 컨텍스트를 종료한다. 준영속 상태가 되었는지 확인 UPDATE 쿼리 실행여부로 확인 저장되어있는 member의 이름을 변경한 후 준영속 상태로 만든 뒤 커밋하니, SELECT 쿼리는 실행되지만 UPDATE 쿼리는 실행되지 않는 것을 볼 수 있다. SELECT 쿼리 여러번 실행되는 것으로 ..

플러시

플러시(flush) 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 커밋 될 때 실행됨 영속성 컨텍스트의 변경 사항과 DB를 일치시키기 위해 쿼리를 날리는 과정 변경 감지 수정된 엔티티를 쓰기지연 SQL 저장소에 등록 쓰기지연 SQL 저장소의 쿼리를 DB에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 emtityManager.flush() → 직접 호출하는 방법, 거의 사용하지 않는다. 트랜잭션 커밋 → 플러시 자동호출 JPQL 쿼리 실행 → 플러시 자동호출 오류 방지를 위해 무조건 flush 실행 flush를 실행하면 1차 캐시가 지워지는가? 1차캐시는 유지된다. 영속성 컨텍스트 쓰기지연 SQL 저장소에 있는 쿼리들을 DB에 반영하는 과정이다. 플러시 모드 옵션 entityM..

영속성 컨텍스트 2

엔티티 조회, 1차캐시 JPA에서 1차 캐시는 엔티티를 영속성 컨텍스트에서 관리하는 캐시를 의미한다. find()나 getReference() 메서드로 조회한 엔티티 객체는 1차 캐시에 저장된다. 같은 엔티티를 다시 조회할 경우 1차 캐시에서 먼저 조회하게 되어 DB에서 조회하지 않고 캐시된 엔티티를 반환한다. 1차 캐시는 엔티티 매니저의 생명주기와 같이 유지된다. 1차 캐시에 저장된 엔티티의 상태가 변경되면 엔티티 매니저는 변경 내용을 즉시 DB에 반영하지 않아도 된다. 엔티티 저장 엔티티를 생성한 후 persist 메서드를 이용해 영속 상태로 만든다. DB PK로 지정한 값을 키로, 엔티티 자체를 값으로 1차 캐시에 저장한다. 엔티티 조회 - 1차 캐시에서 조회 find 메서드를 사용하면 우선 DB가..

영속성 컨텍스트 1

JPA에서 가장 중요한 2가지객체와 RDB 매핑하기영속성 컨텍스트  영속성 컨텍스트엔티티를 영구저장하는 환경이라는 뜻이다.EntityManager.persist(entity) 를 통해서 DB에 저장하는게 아니다Entity를 영속성 컨텍스트에 저장하는 것이다.영속성 컨텍스트는 논리적인 개념으로, 눈에 보이지 않는다.엔티티매니저를 통해서 영속성 컨텍스트에 접근한다.   엔티티의 생명주기비영속(new/transient) 영속성 컨텍스트랑 전혀 관계가 없는 새로운 상태위 예시는 Member 객체만 생성하고 EntityManager에 아무것도 넣지 않은 상태이므로 JPA와 상관 없는 상태이다. 영속(managed) 영속성 컨텍스트에 의해 관리되는 상태persist 메서드에 의해 EntityManager 안으로 들..