도메인 생성 (DDD 도전,,?)
(1) 기획 측 요구 사항
•
회원가입시 기본 유형을 선수로 하고, 회원 업그레이드시 코치 유형으로 업그레이드
◦
일단 회원가입시 role을 선수(디폴트)로 설정
•
일단 회원가입시 무조건 선수로 가입하게하고, 코치도 선수와 동일하게 테이블생성
◦
player테이블의 코치 데이터는 선수의 중위값을 나타낼때 쓰면 좋겠음.
◦
Statistics 테이블 별개로
⇒ 내가 궁금한 점(회의 때 여쭤보자)
•
선수 중위값은 team의 training statistics에 현재 저장하고 있는데, 이것 외에 추가적으로 저장해야 할 게 있는가. 예를 들면 평균 같은?
•
코치도 동일하게 player 테이블을 생성하면 member랑 player 테이블 나눌 필요가 없어지지 않는가. 그냥 member랑 player테이블 합칠 것인가?
(2) 생성 과정 (base entity부터 연관관계 method까지)
1.
base entity 만들기 → 모든 도메인들에 넣어줄 공통 필드 추출
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@SuperBuilder
@NoArgsConstructor
public abstract class BaseEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
Java
복사
2.
각 도메인 클래스들 만들기
•
예시) Member 도메인
◦
Member.java
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@BatchSize(size = 50)
public class Member extends BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
// 기본 정보
private String name;
private Date birth;
private String email;
private Gender gender;
// 인증 정보
private String role;
private String provider;
private String provider_id;
}
Java
복사
◦
Gender.java → enum type
public enum Gender {
M, F, U
}
Java
복사
◦
결과
3.
연관 관계 넣어주기
•
예시) Member 도메인과 Player 도메인
◦
Player.java
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "player_id")
private Long id;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "member_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private Member member; // 선수 기본 정보 (Member:Record=1:1)
// 선수 추가 정보
@Builder.Default
private Boolean joined = false; // 팀 소속 여부(승인 전까진 false)
private Integer number; // 등번호
private String position; // 포지션
}
Java
복사
잠깐,,, 도메인 생성 중 int랑 Integer 차이가 헷갈린다면?
(참고) inv vs Integer
int : 자료형(primitive type)
•
산술 연산 가능함
•
null로 초기화 불가
Integer : 래퍼 클래스 (Wrapper class) - 기본형을 객체로 다루기 위해 사용하는 클래스
•
Unboxing하지 않을 시 산술 연산 불가능함
•
null값 처리 가능
(3) 엔티티 vs VO
•
도메인
◦
정의) 개발하는 기능에 필요한 객체들을 도출해낸 것
◦
특징) 도메인의 개념을 Entity와 VO(Value Object)로 나눌 수 있음
•
엔티티
◦
정의) 식별자를 가짐
◦
특징) 식별자를 제외한 것들은 값이 바뀌어도 바뀌기 전/후가 같은 객체임
•
VO
◦
정의) 식별자 없이 값만 가짐
◦
특징) 값이 변경되면 다른 객체가 되어 버림
하루 정리
TIL 작성하기
3시 30분 데브코스 면접
6시 GDSC 웹 강의 실습 보조
NOI
도메인 생성