소개
엔티티 활용법을 작성한다
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
- 이 페이지 참조 >> 자주 쓰는 Config - BaseConfig
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를 붙이면서, 필요한 컬럼을 바로 이어서 사용하면 된다.
javaSampleEntity.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
javapublic class UuidGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { return UUIDGenerator.generateUUID(); } }
TSID
- com.github.f4b6a3.tsid 추가 필요
javapublic class TsidGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { return TsidCreator.getTsid(); } }
UUID + TSID
javapublic 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에 사용