yml파일, QueryDSL

전영덕·2023년 5월 1일
0

Springboot

목록 보기
11/13

day11

SpringShop이라는 프로젝트를 만든다.
Spring Web, Lombok, Thymeleafm Spring Data JPA, Oracle Driver
추가한다.

application properties셋팅 한 후에 기존 꺼에서 복붙을 하는데 확장자명을 .yml으로 바꾼다.
yml야믈 파일이라고 읽는다.
이게 더 편해서 이렇게 많이한다.
열어보면 규칙이 안맞아서 에러가 난다.
우리기준으로 설정파일이 2개가 있다.
원래있던 properties는 안쓸 것이다. 하지만 백업용으로 두려고 _bak를 추가해준다.

1. 설정 파일 *.yml

1-1. properties파일과 비교했을 때 yml의 장점

  • 한 눈에 보기에 가독성이 좋다.
  • 불필요한 코드의 반복을 피할 수 있다.
  • 계층 구조로 이해하기 쉽고 편하다.

1-2. 주의 사항

  • 띄어쓰기(spacebar) 2칸을 기준으로 계층을 만든다. 따라서 띄어쓰기 2칸을 필수로 적어주어야한다.
  • 2칸을 안지켜주면 설정파일 오류가 난다.

이부분은 실무에서 쓸수도있고 아닐 수 도 있지만 알고있으면 깔끔해진다.

근데 이 프로젝트로는 이 설정파일 셋팅하는 것만 하고 이 다음 임베디드 부터는 다시 jpaitem프로젝트에서 진행했다.

2. 임베디드 타입

  • 내장타입이라고도하는데 번역인거라 좀 애매하다. 그냥 임베디드라고 부른다.
  • 새로운 값 타입을 직접 정의할 수 있다.
  • JPA는 임베디드 타입(embedded type)이라고 한다.
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.
  • int, String과 같은 타입이다.

2-1. JPA에서 임베디드 타입 사용법

  • @Embeddable : 각 타입을 정의하는 곳에 표시
  • @Embedded : 각 타입을 사용하는 곳에 표시
  • 기본 생성자가 필수로 들어간다.

2-2. 임베디드 타입의 장점

  • 재사용률이 높다.
  • 높은 응집도
  • Period.isWork() 처럼 해당 값 타입만 사용하는 의미 있는 메서드를 만들 수 있다.(객체지향적인 설계가 가능한다)
  • 임베디드 타입을 포함한 모든 값과 타입은 값타입을 소유한 엔티티에 생명주기를 의존한다.(너무 당연한 이야기)

jpaitem 프로젝트에서 com.codingbox.japitem.embedded

도메인 패키지에있는 모든 테이블의 @Entity를 주석처리해야한다.
그래야 테이블이 새로 만들어진다.

2-3. 임베디드 타입과 테이블 매핑

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능해진다.
  • 잘 설계한 ORM애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.

2-4. @AttributeOverride : 속성 재정의

  • 한 엔티티에서 같은 값 타입을 사용하면 컬럼명이 중복된다.
  • @AttributeOverride , @AttributeOverride를 사용해서 컬럼 명 속성을 재정의 한다.

어떤 한 사람이 있을 때 그 사람의 주소가 집주소가 있을 수 있고, 회사주소가 있을 수 있다.

수 와 문자는 하나의 공간을 갖는다면 클래스및 객체는 원래있던 객체를 바라본다.

이걸 코드에서 본다면 member와 member2가 같이addr이라는 하나의 객체를 바라보고있다.
임베디드를 사용하면 객체 지향적인 설계가 가능하나 이런 점을 고려하지 않으면 부작용이 작용한다.

2-5. 객체 타입의 한계

  • 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 비할 수 있다.

  • 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.

  • 자바 기본 타입에 값을 대입하면 값을 복사한다.(int, boolean, 등등 primary type)

  • 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.

  • 객체의 공유 참조는 피할 수 없다.

  • address에서 @Setter를 만들지 않고 객체가필요할 때마다 항상 만들도록하는 방법이 있다.

정리 : 이런 오류를 피하는 2가지 방법

-> 새로운 객체를 무조건 만들어서 할당하도록 한다.
-> @Setter를 없앤다.
jpaitem프로젝트의 JpaMain5.java에 정리해놓았다.

0개의 댓글