Spring/spring_old

04. Data class 등 관련 코딩-01

slow333 2023. 1. 19. 15:59

Data class 패키지 : aggregate 패키지 구성

package spring.study.aggregate;

import lombok.Getter;
import lombok.Setter;

import java.util.UUID;

@Getter
@Setter
public abstract class Entity { // 상속 관계에서 부모로만 작동함
  String id;

  public Entity(){
    this.id = UUID.randomUUID().toString();
  }

  public Entity(String id) {
    this.id = id;
  }
}
package spring.study.aggregate.club.vo;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@NoArgsConstructor
public class Address {
  AddressType addressType;
  String country;
  String streetAddress;
  String zipAddress;
  String zipCode;

  public Address(String zipCode, String zipAddress, String streetAddress) {
    this.zipCode = zipCode;
    this.zipAddress = zipAddress;
    this.streetAddress = streetAddress;
    this.country = "대한민국";
    this.addressType = AddressType.Home;
  }

  @Override
  public String toString() {
    return "Address{" +
            "addressType=" + addressType +
            ", country=" + country + ", zipCode=" + zipCode +
            ", zipAddress='" + zipAddress + ", streetAddress='" + streetAddress + '}';
  }

  public static Address sampleHomeAddress(){
    return new Address("302-775", "주소 값", "세부 주소");
  }
  public static Address sampleOfficeAddress(){
    return new Address("모름", "주소", "2층");
  }

  public static void main(String[] args) {
    System.out.println(sampleHomeAddress());
  }
package spring.study.aggregate.club.vo;

public enum AddressType {
  Home,
  Office
}
public enum RoleInClub {
  Admin,
  Member,
  President
}

Club

@NoArgsConstructor
public class Club extends Entity {
  private final static int MIN_INTRO_LENGTH = 10;
  private final static int MIN_NAME_LENGTH = 4;

  private String name;
  private String intro;
  private String foundationTime;

  public Club(String id) {
    super(id);
  }
  public Club(String name, String intro) {
    super();
    setName(name);
    setIntro(intro);
    this.foundationTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    if (name.length() < MIN_NAME_LENGTH) {
      throw new IllegalStateException("이름 길이가 " + MIN_NAME_LENGTH + "보다 커야 합니다.");
    }
    this.name = name;
  }

  public String getIntro() {
    return intro;
  }

  public void setIntro(String intro) {
    if (intro.length() < MIN_INTRO_LENGTH) {
      throw new IllegalStateException("소개 글은 길이가 " + MIN_INTRO_LENGTH + "보다 커야 합니다.");
    }
    this.intro = intro;
  }

  public String getFoundationTime() {
    return foundationTime;
  }

  public void setFoundationTime(String foundationTime) {
    this.foundationTime = foundationTime;
  }
///** 위의 방식 보다 좀 복잡하고 설정시 적용이 안됨.. 왜 이렇게 했지 ???
  private void checkNameValidation(String name) {
    //
    if (name.length() < Club.MIN_NAME_LENGTH) {
      throw new IllegalArgumentException("\t > Name should be longer than " + Club.MIN_NAME_LENGTH);
    }
  }

  private void checkIntroValidation(String intro) {
    //
    if (intro.length() < Club.MIN_INTRO_LENGTH) {
      throw new IllegalArgumentException("\t > Intro should be longer than " + Club.MIN_INTRO_LENGTH);
    }
  }

  public void checkValidation(){
    checkNameValidation(name);
    checkIntroValidation(intro);
  }
//   서비스를 생성할때 변경해야 할 항목을 정하는 것임
  public void modifyValues(NameAndValueList nameValues) {
    //
    for (NameAndValue nameValue : nameValues.getList()) {
      String value = nameValue.getValue();
      switch (nameValue.getName()) {
        case "name":
          checkNameValidation(value);
          this.name = value;
          break;
        case "intro":
          checkIntroValidation(value);
          this.intro = value;
          break;
      }
    }
  }

  @Override
  public String toString() {
    return "Club{ 이름='" + name + ", 소개='" + intro + '\'' +
            ", 설립일='" + foundationTime + '}';
  }

  public static Club sampleClub(){
    return new Club("spring club", "처음으로 생성하는 클럽 입니다.");
  }
  public static void main(String[] args) {

    System.out.println(sampleClub());
  }
}

Member

@Getter
@Setter
public class Member extends Entity {

  String email; //중복 안됨, key
  String name;
  String phoneNumber;
  String birthDay;
  String nickName;
  List<Address> addresses;

  public Member(){
    super();
    this.addresses = new ArrayList<>();
  }
  public Member(String id) {
    super(id);
  }

  public Member(String email, String name, String phoneNumber, String nickName, String birthDay) {
    this();
    this.email = email;
    this.name = name;
    this.phoneNumber = phoneNumber;
    this.birthDay = birthDay;
    this.nickName = nickName;
    checkEmail(); // email 유효성 검사.. 중복 검사는 어디 에서 하지
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();

    builder.append("이름:").append(name);
    builder.append(", email:").append(email);
    builder.append(", 별명:").append(nickName);
    builder.append(", 전번:").append(phoneNumber);
    builder.append(", 생일:").append(birthDay);

    if (addresses != null) {
      int i = 1;
      for (Address address : addresses) {
        builder.append(", Address[").append(i++).append("]").append(address.toString());
      }
    }
    return builder.toString();
  }
  public void checkEmail(){
    checkEmailValidation(email);
  }

//  변경된 값을 찾아서 update 하는데 필요(????)
  public void modifyValues(NameAndValueList nameValues) {
    //
    for (NameAndValue nameValue : nameValues.getList()) {
      String value = nameValue.getValue();
      switch (nameValue.getName()) {
        case "email":
          this.email = value;
          break;
        case "name":
          this.name = value;
          break;
        case "phoneNumber":
          this.phoneNumber = value;
          break;
        case "nickName":
          this.nickName = value;
          break;
        case "birthDay":
          this.birthDay = value;
          break;
      }
    }
  }


  private void checkEmailValidation(String email) {
    String emailPattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
    Pattern p = Pattern.compile(emailPattern);
    Matcher m = p.matcher(email);
    boolean valid = m.matches();

    if (!valid) {
      throw new InvalidParameterException("이메일 이름 형식이 좀 그러 내요");
    }
  }
  public static Member sample() {

    Member member = new Member("myvms@vms.com", "저녁은 뭐지?", "010-3321-1001","fishburn","2004.02.22");
    member.setBirthDay("2003.01.07");
    member.getAddresses().add(Address.sampleHomeAddress());
    member.getAddresses().add(Address.sampleOfficeAddress());
    return member;
  }
  public static void main(String[] args) {
    //
    System.out.println(sample().toString());
  }
}

Membership

@Getter
@Setter
public class Membership extends Entity {

  String clubId; // 중복 허용 안함
  String memberId;
  RoleInClub role;
  String joinDate;

  public Membership(String id) {
    super(id);
  }
  public Membership(){
    super();
  }

  public Membership(String clubId, String memberId) {
    this.clubId = clubId;
    this.memberId = memberId;
    this.role = RoleInClub.Member;
    this.joinDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));;
  }

  @Override
  public String toString() {
    return "Membership{ clubId='" + clubId +
            ", memberId='" + memberId + '\'' +
            ", role=" + role +", joinDate='" + joinDate + '}';
  }

  public void modifyValues(NameAndValueList nameValueList) {

    for (NameAndValue nameValue : nameValueList.getList()) {
      String value = nameValue.getValue();
      switch (nameValue.getName()) {
        case "role":
          this.role = RoleInClub.valueOf(value);
          break;
      }
    }
  }
  public static Membership sampleMembership(){
    return new Membership(
            Club.sampleClub().getId(),  Member.sample().getId()
    );
  }

  public static void main(String[] args) {
    System.out.println(sampleMembership());
  }
}