Entity 활용

소개

엔티티 활용법을 작성한다
org.springframework.boot:spring-boot-starter-data-jpa 필수

Custom Converter

  • Column 값을 일정한 규칙으로 변경해서 저장할 때 사용
  • insert 또는 update 진행 바로 직전에 동작함
  • 주로 암복호화에 많이 사용

Converter Class

AES256

java
@Converter public class AES256Converter implements AttributeConverter<String, String> { @Value("${secret-key.aes}") private String encryptKey; @Override public String convertToDatabaseColumn(String attribute) { try { if (null == attribute) { return attribute; } // 암호화 진행. 아래는 예시 Aes256Utils utils = new Aes256Utils(encryptKey); return utils.encrypt(attribute); } catch (Exception e) { log.error("Encrypt exception : {}", e.getMessage()); return attribute; } } @Override public String convertToEntityAttribute(String dbData) { try { if (null == dbData) { return dbData; } // 복호화 진행. 아래는 예시 Aes256Utils utils = new Aes256Utils(encryptKey); return utils.decrypt(dbData); } catch (Exception e) { log.error("Decrypt exception : {}", e.getMessage()); return dbData; } } }

사용 방법

java
@Convert(converter = AES256Converter.class) String userPhone;

Auditing

  • 날짜 자동 입력을 해주는 기능

설정

Configuration

java
@EnableJpaAuditing

Entity 설정

java
@EntityListeners(AuditingEntityListener.class) public class SampleEntity {}

사용 방법

생성일

  • NULL이 되지 않게
  • Update 되지 않게
  • JPA, Builder에서 Setter가 되지 않도록
java
@CreatedDate @Setter(AccessLevel.NONE) @Column(nullable = false, updatable = false) LocalDateTime createdAt;

수정일

  • Insert 되지 않게
  • JPA, Builder에서 Setter가 되지 않도록
java
@LastModifiedDate @Setter(AccessLevel.NONE) @Column(insertable = false) LocalDateTime updatedAt;

Builder 활용

기본 사용

Entity 설정

  • 클래스 상단에 어노테이션을 추가한다.
  • @NoArgsConstructor@AllArgsConstructor는 필수로 추가한다.
    • @NoArgsConstructor의 AccessLevel은 PROTECTED로 설정하여 기본 생성자를 사용하지 않고, 지정한 생성자만 사용하도록 한다.
    • @AllArgsConstructor의 AccessLevel은 PRIVATE로 설정하여, 코드에서 Builder만 사용하여 생성할 수 있도록 강제한다.
java
@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class SampleEntity {}

Entity 생성

  • Class 뒤에 builder를 붙이면서, 필요한 컬럼을 바로 이어서 사용하면 된다.
java
SampleEntity.builder() .name("") .build();

toBuilder

  • 기존에 있던 Entity 값을 그대로 사용하면서 원하는 값만 수정할 수 있도록 해주는 함수

Entity 설정

  • Builder어노테이션에 toBuilder를 true로 사용 한다.
java
@Builder(toBuilder = true) @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class SampleEntity {}

사용 방법

java
// 예시 코드 MemberEntity original = memberRepository.findById(1L).orElse(null); if (null != original) { MemberEntity copied = original.toBuilder() .lastLoginAt(LoccalDateTime.now()) .build(); }

Signular

  • List 값 지정시, Item을 하나씩 넣을 수 있는 방식
  • 사용할 List 변수에 @Singular 작성
java
// 변수에 지정하는 예시 코드 @Singular private List<String> skills; // 사용방법 MemberEntity.builder() .skills("Java") .skills("Javascript") .build();

Custom ID Generator

Warning

Spring 6.5 (Spring boot 3.4) 이후 Deprecated 됨

  • ID를 기본 auto_increment가 아닌 UUID 를 설정할 때, 자동으로 입력 시켜주는 방법

기존 방법

java
@GeneratedValue(strategy = GenerationType.IDENTITY)

Generator Class

UUID

java
public class UuidGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { return UUIDGenerator.generateUUID(); } }

TSID

  • com.github.f4b6a3.tsid 추가 필요
java
public class TsidGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { return TsidCreator.getTsid(); } }

UUID + TSID

java
public class UuidGenerator implements IdentifierGenerator, Configurable { private String uuidType; @Override public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { uuidType = ConfigurationHelper.getString("type", params); } @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { if (type.toUpperCase().equals()"TSID")) { return TsidCreator.getTsid(); } return UUIDGenerator.generateUUID(); } }
  • 파라미터 미사용
java
@GenericGenerator( name = "uuidGenerator", // Generator 이름 strategy = "package.UuidGenerator", // Generator 경로 ) @GeneratedValue(generator = "uuidGenerator") // name에 지정된 값을 generator에 사용
  • 파라미터 사용
java
@GenericGenerator( name = "uuidGenerator", // Generator 이름 strategy = "package.UuidGenerator", // Generator 경로 parameters = @Parameter(name = "type", value = "TSID") // Parameter 값을 넣을 경우 ) @GeneratedValue(generator = "uuidGenerator") // name에 지정된 값을 generator에 사용