본문 바로가기
728x90

전체 글196

[SQL] Primary Key, Unique 제약조건 DB에 not null unique 제약조건 걸어주면서 정리 Primary Key 테이블의 행을 구분하는 키워드로 사용하고, Not null + Unique index key가 자동으로 부여 된다.(index key : 책갈피와 유사한 역할, 검색속도 향상시킴) 반드시 데이터를 입력해야 하면서 값이 중복되면 안되는 필드에 사용한다. ex) ID, 사원번호(empno), 주민등록번호, 이메일 등 Unique 입력하지 않아도 되지만 중복된 값은 저장되지 못하게 하는 제약조건. null값('')은 허용하지만 동일한 값이 저장되는 것만은 허용하지 않는다. 2022. 10. 1.
[JPA] validMemberEmailDuplicate 문제점 다음 코드의 문제점 private void validMemberEmailDuplicate(String email) { if (memberRepository.existsByEmail(email)) throw new MemberEmailDuplicateException("이미 사용중인 이메일 입니다."); } 동일한 맴버 아이디가 중복 가입이 될 수 있다. was가 동시에 여러개 뜨는데(멀티스레드) 예를들어 "맴버A" 라는 사용자가 정말 동시에 DB insert를 하게 되면, 동시에 "맴버A"라는 회원이 두 명 가입된다. 이런 문제가 생길 때 최후의 방어를 위해 DB의 member email에 유니크 제약조건을 걸어야 한다. 2022. 9. 30.
[JPA] Spring Data JPA 반환 타입 Spring Data JPA Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈이다. 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결할 수 있게 해준다. CRUD 처리를 위한 공통 인터페이스를 제공해주고, 인터페이스만 작성하면 동적으로 구현체를 생성해서 주입해주기 때문에 인터페이스만 작성해도 개발을 완료할 수 있다. (설정과 구현에 대한 내용은 아래 링크 참고) https://blog.naver.com/ghdalswl77/222314410957 Spring Data JPA 1. Spring Data JPA Spring Data JPA는, JPA를 쓰기 편하게 만들어 놓은 모듈이다. 스프링 부... blog.naver.com 반환.. 2022. 9. 30.
[Spring Data JPA] extends JpaRepository VS @Repository 우선 extends JpaRepository는 Spring Data JPA라는 기술을 사용했다. 이에 대한 개념을 간단히 이해하고 둘을 비교해보자. Spring Data JPA Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈. CRUD 처리를 위한 공통 인터페이스를 제공해주고, 인터페이스만 작성하면 동적으로 구현체를 생성해서 주입해주기 때문에 인터페이스만 작성해도 개발을 완료할 수 있다. 설정과 구현에 대한 내용은 아래 링크 참고) https://blog.naver.com/ghdalswl77/222314410957 Spring Data JPA 1. Spring Data JPA Spring Data JPA는, JPA를 쓰기 편하게 만들어 놓은 모듈이다. 스프링 부.. 2022. 9. 30.
[JPA] 엔티티 설계 시 주의점 (setter 지양, 즉시로딩 지양) (1) 엔티티에는 가급적 Setter 지양 변경 포인트가 너무 많아서 유지보수가 어렵다.. (2) 지연로딩 지향, 즉시로딩 지양 모든 연관관계는 지연로딩으로 설정! 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제(의미상 1+N)가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다. 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다. 주의할 점으로, @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩 이므로 직접 지연로딩으로 설정해야 한다. (3) 컬렉션은 필드에서 초기화 하자. 컬렉션은 필드에서 바로 초기화 하는 것이 null 문제.. 2022. 9. 26.
[JPA] 값 타입 (자바 ORM 표준 JPA 프로그래밍 기본편) JPA의 데이터 타입 분류 📍엔티티 타입, 값 타입 ? 엔티티 타입은 @Entity로 정의하는 객체, @Entity를 붙여서 관리하던 클래스들이었다. 이 타입들은 pk값으로 관리가 되기때문에 데이터가 변해도 식별자로 지속적으로 추적이 가능하고 관리도 편리하다. (ex.회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능) 그에 반해 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체다. 식별자가 없고 값만 있으므로 변경시 추적이 불가하다. (ex. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체) 📍값 타입 분류 1. 기본값 타입 -자바 기본 타입(int, double) -래퍼 클래스(Integer, Long) -String 이런 기본 값 .. 2022. 9. 26.
[JPA] 영속성 전이, 고아 객체 (cascade 범위) JPA 영속성 전이 JPA는 CASCASE 옵션으로 영속성 전이를 제공한다. JPA 영속성 전이란, 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태가 되게(영속화), 혹은 함께 삭제가 이뤄지게 하는 것이다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 위와 같이 Parent와 Child가 일대다 관계를 맺었다고 하고 부모쪽에서 cascade옵션을 설정해보자. @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children = n.. 2022. 9. 24.
[JPA] 즉시로딩, 지연로딩 (JPA N+1문제) 앞서 프록시 포스팅에서 말했던 지연로딩에 대해 더 자세히 알아보자. Team과 Member가 일대다로 연관관계를 갖고있을 때 Member를 조회할 때 마다 해당 Member의 Team도 조회해할 필요가 없다면, 이 지연로딩을 사용하면 된다. 지연로딩은 실제로 Member를 통해 Team에 대한 정보를 읽어와야할 때까지 DB에서 조회를 미루는 개념이다. Member를 조회 할때 Team객체에 프록시 객체를 넣어오고, getTeam 처럼 실제로 team을 호출해야할 때 초기화가 이뤄진다. 지연로딩으로 설정해주기 위해서는 아래와 같이 간단하게 fetch옵션을 LAZY로 설정해주면 된다. public class Member { @ManyToOne(fetch = FetchType.LAZY) // 다대일(membe.. 2022. 9. 22.
[JPA] 프록시란? (지연로딩) 회원 정보만 출력하는 비지니스 로직과 회원과 팀 정보를 출력하는 비지니스 로직을 비교해보자. [회원 정보만 출력] public String printUser(String memberId) { Member member = em.find(Member.class, memberId); System.out.println("회원 이름 : " + member.getUserName()); } [회원과 팀 정보를 출력] public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름 : " + member.getU.. 2022. 9. 22.
728x90