// Instagram.domain.member.entity
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
@Table(name = "members")
public class Member {
@Id
@Column(name = "member_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "member_username", nullable = false, length = 20, unique = true)
private String username;
@Column(name = "member_role")
@Enumerated(EnumType.STRING)
private MemberRole role;
@Lob
@Column(name = "member_introduce")
private String introduce;
@Column(name = "member_gender")
@Enumerated(EnumType.STRING)
private Gender gender;
@OneToMany(mappedBy = "member")
private List<Follow> followings;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "imageUrl", column = @Column(name = "member_image_url")),
@AttributeOverride(name = "imageType", column = @Column(name = "member_image_type")),
@AttributeOverride(name = "imageName", column = @Column(name = "member_image_name")),
@AttributeOverride(name = "imageUUID", column = @Column(name = "member_image_uuid"))
})
private Image image;
...
}
- @EntityListeners(AuditingEntityListener.class)
데이터베이스에서 누가, 언제, 무엇을 하였는지 기록하는것은 굉장히 중요한 일입니다. spring data jpa는 시간에 대해서 자동으로 값을 넣어주는 audit 기능이 있습니다. 엔티티가 수정되면 리스너 클래스를 받아서 audit을 해주는 기능을 합니다. - @Enumerated
JPA에서 열거형(Enum) 타입의 데이터를 매핑할 때 - @Lob
Lob = Large object
JPA에서 긴 텍스트나 바이너리 데이터를 매핑할 때, 업로드 데이터 저장할때 - @Embedded
JPA에서 엔티티 클래스에서 다른 엔티티 클래스를 포함할 때 (다른 엔티티 클래스에 @Embeddable이 되어있어야함)
그러면 데이터베이스상에서는 어떻게 테이블이 구성되나? - 다른 엔티티에 포함된 컬럼을 모두 포함시키면서 테이블이 구성됨 - @AttirbuteOverrides
JPA에서 엔티티 클래스에서 상속 관계에 있는 부모 클래스의 매핑 정보를 재정의
// Instagram.domain.member.entity.redis
@Getter
@RedisHash("RegisterCode")
public class RegisterCode implements Serializable {
@Id
@Indexed // Redis 에선 Indexed 어노테이션이 있어야 find 가능
private String username;
private String email;
private String code;
@TimeToLive(unit = TimeUnit.SECONDS)
private Long timeout = 300L;
@Builder
public RegisterCode(String username, String code, String email) {
this.username = username;
this.code = code;
this.email = email;
}
}
- @RedisHash
Java 객체를 Redis Hash 형태로 저장하기 위해 사용 - @Indexed
Nosql에서 특정 필드를 인덱스로 설정 - @TimeToLive
Redis에서 특정 키에 대한 만료 시간(TTL)을 설정하는데 사용
Redis는 메모리 기반 데이터 저장소이기 때문에, 데이터를 저장할 때 만료 시간을 설정하여 자동으로 삭제하도록 설정할 수 있습니다. 이를 통해 Redis의 메모리 사용량을 최적화하고, 만료된 데이터를 자동으로 삭제함으로써 저장소에서 데이터의 유효성을 유지합니다. - Serializable
Redis는 저장할 수 있는 데이터 형식이 제한되어 있기 때문에, 자바 객체를 그대로 저장할 수 없습니다. 따라서 Redis에 저장할 자바 객체를 직렬화하여 byte 배열 형태로 변환하고, 이를 Redis에 저장합니다.
# 이상한 궁금증
- JPA 어노테이션은 항상 자세하게 서술하는것이 무조건적으로 좋을까?
엔티티 매핑, 오류 방지에는 좋지만 지나치게 자세하면 가독성, 유지보수가 어려워집니다. 또 성능저하가 일어날 수도 있다고 합니다. - 그렇다면 Redis를 쓸때는 @Entity, @Table 같은것들은 안 붙여줘도 되는건가?
맞습니다. @RedisHash면 뚝딱
Entity 관련 코드들은 여기까지만 해도 될 듯...?
# reference
chatgpt
'Back-end > Spring 기초개념' 카테고리의 다른 글
Instagram-clone 분석 (3) Controller (0) | 2023.05.05 |
---|---|
Instagram-clone 분석 (3) DTO (0) | 2023.04.23 |
Instagram-clone 분석 (1) (2) | 2023.04.19 |
@Bean과 @Component (2) | 2023.03.29 |
SOLID 5원칙 (0) | 2023.03.21 |