//사용법
public class Account {
@Embedded
private com.cheese.springjpa.Account.model.Email email;
}
@Embeddable
public class Email {
@org.hibernate.validator.constraints.Email
@Column(name = "email", nullable = false, unique = true)
private String address;
}
# 풀어쓰는 것보다 묶는게 객체지향적으로 더 좋다!
{
"address": {
"address1": "string",
"address2": "string",
"zip": "string"
},
"email": {
"address": "string"
},
"name": {
"first": "name",
"last": "name"
},
"password": "string"
}
잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다!
null
보다 new ArrayList<>()
가 더 좋다!이것은 단방향일때만 해당하는 이야기이다!
OneToMany를 사용해서 저장하는 경우를 생각해보면, List에 객체들을 채워서 저장하게 될 것이다.
그런데, insert 쿼리만 나가야하는데, update 쿼리가 추가적으로 나가는 문제가 발생한다!
이것은 JPA 동작원리를 이해해야한다.
JPA는 영속성 컨텍스트에 SQL 쿼리들을 모아놓고, 한번에 flush한다.
그래서, Many 쪽의 객체도 영속성 컨텍스트에 저장되는데, 해당 엔티티엔 외래키가 담길 공간이 없다.
따라서, 엔티티가 먼저 저장되고, 이후에 외래키가 업데이트 되면서 update 쿼리가 발생한다!!!
결론은 단방향일 경우, ManyToOne을 사용하는게 좋다.
양방향일 경우, 연관관계의 주인을 외래키가 있는 곳으로 하는 것이 좋다.
src
- main
- Account
- api
- AccountController.java
- application
- AccountService.java
- dao
- AccountFindService.java
- AccountRepository.java
- AccountSearchService.java
- AccountSupportRepository.java
- AccountSupportRepositoryImpl.java
- domain
- Account.java
- Address.java
- Email.java
- Password.java
- dto
- AccountDto.java
- AccountSearchType.java
- exception
- AccountNotFoundException.java
- EmailDuplicationException.java
- PasswordFailedExceededException.java
- common
- config
- coupon
- delivery
- error
- order
- properties
- SpringJpaApplication.java
- resources
Layered Architecture 패턴
main 속 가장 큰 단위로 큰 주제별로 나누는 것을 확인할 수 있고,
Service 파일들이 왜 dao에 들어가 있는지 의문이다.