728x90 ☕️자바 𝗝𝗔𝗩𝗔33 [JAVA] Optional 클래스 Spring Data JPA를 사용하며 CrudRepository의 findById 메서드 리턴 타입인 Optional 클래스를 살펴보았다. Optional은 Java 8에 추가된 새로운 API이며 'null일 수도 있는 객체'를 감싸는 일종의 Wrapper 클래스로, 여러 if 로직 대신 언어 차원에서 null 문제를 해결할 수 있게 해준다. 한마디로 null 처리를 세련되게 다룰 수 있게 도와주는 녀석이다. Optional optional 이러한 optional 변수 내부에는 null이 아닌 T 객체가 있을 수도 있고 null이 있을 수도 있다. Optional 클래스는 여러 가지 API를 제공하여 null일 수도 있는 객체를 다룰 수 있도록 돕는다. null 처리를 세련되게 다룰 수 있다고 했는데,.. 2022. 10. 6. 도메인 모델 패턴, 트랜잭션 스크립트 패턴 (Domain Model Pattern, Transaction Script Pattern) 도메인 모델 패턴, 트랜잭션 스크립트 패턴 마틴 파울러가 재창한 두개의 개념으로, 비즈니스 로직을 처리하는 2가지 패턴을 말한다. 책임 소재가 Domain Level이냐 Script Level이냐의 차이에 따라 구분된다. 1. 도메인 모델 패턴 (Domain Model Pattern) 이란 Domain 부분에서 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용 하는 것을 도메인 모델 패턴이라 한다. 대부분의 비즈니스 로직이 엔티티 안에 구성되어있다. 서비스 계층은 엔티티에 필요한 역할을 위임하는 역할을 한다. 엔티티 안에 비즈니스 로직을 가지고 객체지향을 활용하는 기법이다. 도메인 모델? 도메인을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것. 즉, 특정 도메인을 개념.. 2022. 10. 3. [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] 영속성 전이, 고아 객체 (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. 이전 1 2 3 4 다음 728x90