"인프런 - 실전! 스프링 부트와 JPA 활용1 강의를 보고 작성한 글 입니다."
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1#
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런
실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다. 초급
www.inflearn.com
Entity 를 설계할 때 주의할 점?
* 도메인 Entity 를 설계할 때는 가급적이면 Setter 를 사용하지 말자.
Setter 가 모두 열려있으면 변경 포인트가 너무 많아서 유지보수를 하기가 어렵다.
그렇다면 Setter 없이 어떻게 애플리케이션을 만들 수 있을까?
그 방법에 대해서는 후에 애플리케이션 개발 파트에서 실제 비즈니스 메소드를 하나씩 등록하는 코드를 통해 보여준다고 한다.
* 모든 연관관계는 지연 로딩으로 설정한다.
즉시 로딩은 예측이 어렵고, 어떤 SQL 이 실행될지 추적하기 어렵다. 특히 JPQL 을 실행할 때 N + 1 문제가 자주 발생한다.
(OneToOne, ManyToOne 의 경우 기본이 EAGER, 즉 즉시 로딩으로 설정되어 있으므로 반드시 LAZY 타입으로 바꿔주어야 한다. -> 가장 조심해야함)
* 컬렉션은 필드에서 초기화하자.
Hibernate 는 Entity 를 영속화할 때 컬렉션을 감싸서 Hibernate 가 제공하는 내장 컬렉션으로 변경한다.
(Hibernate 가 변경된 내용을 추적할 수 있어야 하기 때문에 추적할 수 있는 내장 컬렉션으로 바꿔버린다.)
이렇게 컬렉션이 Hibernate 에 맞게 내장 컬렉션으로 변경되었음 에도 불구하고 만약 getOrders() 처럼 임의의 메소드에서 컬렉션을 잘못 생성하면 Hibernate 내부 메커니즘에 문제가 발생할 수 있다.
따라서 필드 레벨에서 생성하는 것이 가장 안전하고 코드 또한 간결해진다.
생성한 이후에는 왠만하면 컬렉션 자체를 바꾸지 말도록 하자.
* 테이블, 컬럼명 생성 전략
기본적인 내용은 아래의 링크로 이동하여 읽어보는 것이 좋다고 한다.
Spring Boot Reference Guide
This section dives into the details of Spring Boot. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the "Part II, “Getting Started”" and "Part III, “Using Spr
docs.spring.io
docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming
Hibernate ORM 5.4.27.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
결론부터 얘기하자면 name 과 같은 속성을 이용하여 테이블이나 컬럼명을 따로 주는 것이 아니라 default 로 생성되게 놔둔다면 어떤일이 일어날까?
Hibernate 기존 구현방식은 Entity 의 필드명을 그대로 테이블 명으로 사용하는 것이다.
그런데 여기서 스프링 부트를 쓰면 어떻게 될까? (SpringPhysicalNamingStrategy)
스프링 부트의 신규 설정을 활용하면 다음과 같이 바뀌게 된다.(Entity(필드) -> 테이블(컬럼))
1. 카멜 케이스 방식으로 선언된 필드 명이나 테이블 명을 언더스코어 방식으로 변경한다.
(예시 : memberPoint -> member_point)
2. . (점) -> _ (언더스코어) 로 바뀐다.
3. 대문자들이 소문자로 변경된다.
위의 신규 설정은 아래와 같은 2단계로 적용시킬 수 있다.
1. 논리명 생성 : 명시적으로 컬럼, 테이블명을 직접 적지 않으면 ImplicitNamingStrategy 를 사용한다.
- application.yml
spring.jpa.hibernate.naming.implicit-strategy
2. 물리명 적용 : 모든 논리명에 적용되며, 실제 테이블에 적용된다.(username -> usernm 등으로 회사 룰로 바꿀 수 있다.)
- application.yml
spring.jpa.hibernate.naming.physical-strategy
'Spring boot' 카테고리의 다른 글
스프링 부트 - 회원 Repository 개발 학습내용 (0) | 2021.01.05 |
---|---|
스프링 부트 - Entity 설계 시 주의할 점(2) (0) | 2020.12.28 |
스프링 부트 - JPA 와 DB 설정 및 동작확인 - Tip (0) | 2020.12.20 |
스프링 부트 - JPA 와 DB 설정 및 동작확인 (0) | 2020.12.20 |
스프링 부트 View 환경 설정 (0) | 2020.12.19 |